ENQCMDS
队列命令主管
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
F3 0F 38 F8 !(11):rrr:bbb | ENQCMDS r32/r64, m512 | A | 有效 | 有效 | 从源代码内存操作数到目的地的PASID的原子化静态64字节命令在寄存器操作数指定的ES段中抵消,在ES段中抵消. |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
A
modrm.regescrituraModRM 字节的 reg 字段(第 5-3 位)modrm.rmlecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
实测开销
正在从 arch-data 加载实测数据...
涉及的标志位
ZF零
说明
ENQCMDS指令允许系统软件编写命令来排队注册,这些是使用内存映射的I/O(MMIO)访问的特殊设备注册.
Enqueue registers期望在图3-11中给出格式,并在"ENQCMD-Enqueue Command"的章节中解释.
ENQCMDS指令从它的源代码内存操作数读取64字节的命令数据开始. 这是一个普通的负载,具有缓存性,内存顺序通常由内存类型所暗示. 源操作数不需要对齐,也不能保证所有64字节都是在解剖上加载的. 源操作数中的位数30:20必须是0.
ENQCMDS格式化其源数据与ENQCMD不同. 具体而言,它将其格式化为命令数据如下:
- 命令[19:0]从内存中读取的源操作数中的位数为19:0. 这20个比特
一个进程地址-空间标识符(PASID).
- 命令[30:20]为零. * 指令[511:31]从内存中读取的源操作数中的位数为511:31. 位数 31 通信 a
特权识别(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 旗中 :
- ZF = 0( 成功) 报告说, 64 字节命令数据在解剖时被写入设备的排队登记器
并已被设备接受。 (它不能保证设备已经按照命令行事;它可能已经排队等待以后执行.
- 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 前缀. |