ENQCMD

队列命令

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
F2 0F 38 F8 !(11):rrr:bbbENQCMD r32/r64, m512A有效有效从源代码内存操作数到目标代码的64字节用户命令原子化排队,在寄存器操作数指定的ES段中抵消,在ES段中抵消.

操作数编码

每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。

A

  1. modrm.reg escrituraModRM 字节的 reg 字段(第 5-3 位)
  2. modrm.rm lecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移

实测开销

正在从 arch-data 加载实测数据...

涉及的标志位

说明

ENQCMD指令允许软件编写命令来排队注册,这些是使用内存映射的I/O(MMIO)访问的特殊设备注册.

排队登记簿的写法如下:

511 32 31 30 20 19 0 DEVICE SPECIFIC COMMAND

                                                                        PRIV RESERVED     PASID

图3-11. 64-Byte 数据写入序列

比特19:0传达过程地址空间标识符(PASID),这个值是系统软件可以指定给单个软件线索的. Bit 31包含特权识别(0=用户;1=主管). 执行 queue 登记器的设备可以使用这两个值,同时在上 60 字节中使用一个设备特定命令。

ENQCMD指令从它的源代码内存操作数读取64字节的命令数据开始. 这是一个普通的负载,具有缓存性,内存顺序通常由内存类型所暗示. 源操作数不需要对齐,也不能保证所有64字节都是在解剖上加载的. 源操作数的位数31:0必须是0.

该指令然后将64字节格式化为命令数据,格式与图3-11中给出的格式一致:

ENQCMD指令使用一个序列存储器(下面定义)将这个命令数据写入目标操作数. 目标操作数的地址在一个通用寄存器中被指定为抵消到ES段(该段不能被覆盖). 2 目的地线性地址必须是64字节对齐. Queue store的操作忽略了目的地内存地址的内存类型.

  1. 联合国 预计系统软件将加载IA32 PASID MSR,从而使比特19:0包含当前软件线程的PASID. MSR的有效位点IA32 PASID[31],必须是1. 关于IA32 PASID MSR的其他细节,参见Intel(R)64和IA-32架构软件开发者手册,第4卷.
  1. 国家 在64位模式下,寄存器操作数的宽度为64位(32位带有67H前缀). 在CS.D=1时的64位模式外,宽度为32位(16位带有67H前缀). CS.D=0时的64位模式外,宽度为16位(32位带有67H前缀).

相对于较旧的商店来说,对于WB或WC内存(包括非时态商店)或CLFLUSHOPT或CLWB的处决(当应用到除Enqueue商店以外的地址时),没有命令一个排队商店. 软件可以通过在排队商店前执行SFENCE或MFENCE等栅栏指令来强制执行这样的命令.

Enqueue store不将数据写入缓存层级,也不将任何数据获取到缓存层级. Queue store的指令数据从不与任何其他商店的指令数据合并到同一地址.

与其他商店不同,一个 queue store 返回一个状态, ENQCMD 指令在 RFLAGS 登记册中将它加载到 ZF 旗中 :

并已被设备接受。 (它不能保证设备已经按照命令行事;它可能已经排队等待以后执行.

地址是一个排队登记册,但由于能力或其他时间原因,该命令未被接受。 如果目的地地址不是排队登记册(包括内存地址的情况),此状态也会被返回;在这种情况下,商店被丢弃,既不写给MMIO,也不写给内存.

ENQCMD指令的可用性通过CPUID特征旗ENQCMD(CPUID.07H.00H:ECX[29])的存在来表示.

行动

IF IA32_PASID[31] = 0
    THEN #GP;

ELSE
    COMMAND := (SRC & ~FFFFFFFFH) | (IA32_PASID & FFFFFH);
    DEST := COMMAND;

FI;

Intel C/C++ 内在编译器

ENQCMD int_enqcmd(void *dst, const void *src);

受影响的旗帜

ZF 旗如果 queue- store 完成返回重试状态,则被设定;否则会被清除. 所有其他旗帜都被清除.

SIMD 浮点 例外

None.

异常

保护模式
#GP(0)对于 CS, DS, ES, FS 或 GS 片断中非法的 内存操作数 有效地址, 如果目标线性地址未与64字节边界对齐。 如果 PASID 有效字段( 位 31) 在 IA32 PASID MSR 中为 0 , 如果 源操作数 中的 31: 0 并不是全部为 0 。
#SS(0)用于在党卫军部分的一个非法地址. #PF(fault-code) for a 页面错误.
#UD如果 CPUID.07H.00H: ECX.ENQCMD[29] = 0. 如果使用 LOCK 前缀.
实地址模式
#GP如果操作数的任何部分位于有效地址空间之外,从0到FFFFH.
#UD如果目标线性地址不与64字节边界对齐。如果 PASID 有效字段(bit 31)在 IA32 PASID MSR 中为 0,如果 源操作数 中的 31:0 并不是全部为 0,如果 CPUID.07H.00H: ECX.ENQCMD[29] = 0,如果使用 LOCK 前缀 。
虚拟 8086 模式
与实地址模式的例外情况相同。
兼容模式
与保护模式中的例外相同.
64 位模式
#SS(0)如果引用SS部分的内存地址是非冠状的.
#GP(0)如果内存地址是非名称式的。 如果目标线性地址未与64字节边界对齐 。
#PF(fault-code)如果 PASID 有效字段(bit 31)在 IA32 PASID MSR 中为 0.
#UD如果 源操作数 的位数为 31: 0 , 则不是全部为 0。 对于 页面错误 , 如果 CPUID.07H.00H : ECX.ENQCMD[29] 。 如果使用 LOCK 前缀 。

来源