ENQCMDS

队列命令主管

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
F3 0F 38 F8 !(11):rrr:bbbENQCMDS r32/r64, m512A有效有效从源代码内存操作数到目的地的PASID的原子化静态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 加载实测数据...

涉及的标志位

说明

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

Enqueue registers期望在图3-11中给出格式,并在"ENQCMD-Enqueue Command"的章节中解释.

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

ENQCMDS格式化其源数据与ENQCMD不同. 具体而言,它将其格式化为命令数据如下:

一个进程地址-空间标识符(PASID).

特权识别(0=用户;1=主管).

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

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

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

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

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

地址是一个排队登记册,但由于能力或其他时间原因,该命令未被接受。

  1. 联合国 在64位模式下,寄存器操作数的宽度为64位(32位带有67H前缀). 在CS.D=1时的64位模式外,宽度为32位(16位带有67H前缀). CS.D=0时的64位模式外,宽度为16位(32位带有67H前缀).

如果目的地地址不是排队登记册(包括内存地址的情况),此状态也会被返回;在这种情况下,商店被丢弃,既不写给MMIO,也不写给内存.

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

行动

DEST := SRC;

Intel C/C++ 内在编译器

ENQCMDS int_enqcmds(void *dst, const void *src);

受影响的旗帜

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

SIMD 浮点 例外

None.

异常

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

来源