CLRSSBSY
在主管阴影堆栈托肯中清除忙碌旗
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
F3 0F AE /6 | CLRSSBSY m64 | M | 有效 | 有效 | M64在主管阴影堆栈中清除繁忙的旗子参考. |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
M
modrm.rmlectura y escrituraModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
实测开销
正在从 arch-data 加载实测数据...
涉及的标志位
CF进位PF奇偶AF辅助进位ZF零SF符号OF溢出
说明
M64在主管阴影堆栈中清除繁忙的旗子参考. 在标记阴影堆栈后, SSP 被装入值为 0 。
启用 FRED 转换时无法执行此指令 。 FRED 转换不使用主管阴影堆栈符号.
行动
IF CR4.CET = 0 OR CR4.FRED = 1
THEN #UD; FI;
IF IA32_S_CET.SH_STK_EN = 0
THEN #UD; FI;
IF CPL > 0
THEN GP(0); FI;
SSP_LA = Linear_Address(mem operand)
IF SSP_LA not aligned to 8 bytes
THEN #GP(0); FI;
expected_token_value = SSP_LA | BUSY_BIT (* busy bit - bit position 0 - must be set *)
new_token_value = SSP_LA (* Clear the busy bit *)
IF shadow_stack_lock_cmpxchg8b(SSP_LA, new_token_value, expected_token_value) != expected_token_value
invalid_token := 1; FI
(* Set the CF if invalid token was detected *)
RFLAGS.CF = (invalid_token == 1) ? 1 : 0;
RFLAGS.ZF,PF,AF,OF,SF := 0;
SSP := 0受影响的旗帜
如果检测到无效的令牌, CF 会被设定, 否则它将被清除 。 ZF、PF、AF、OF和SF被清除。
异常
保护模式
#UD | 如果使用 LOCK 前缀,如果 CR4.CET = 0. IF IA32_S_CET.SH_STK_EN = 0. |
#GP(0) | 如果 内存操作数 线性地址不与 8 字节对齐。 如果 内存操作数 的有效地址位于 CS, DS, ES, FS, 或 GS 区段限制之外。 如果目的地位于不可写入区段内。 如果使用 DS, ES, FS, 或 GS 的寄存器访问内存, 并含有 NULL 段选择子 。 如果 CPL 不是 0 。 |
#SS(0) | 如果 内存操作数 有效地址在 SS 段限制之外. #PF(fault-code) 如果 页面错误 发生. |
实地址模式
#UD | CLRSSBSY指令在实地址模式中不被识别. |
虚拟 8086 模式
#UD | CLRSSBSY指令在虚拟 8086 模式中不被识别. |
兼容模式
#UD | 如果使用 LOCK 前缀,如果使用 CR4.CET = 0. IF IA32_S_CET.SH_STK_EN = 0,如果使用 CR4.FRED = 1. |
#GP(0) | 如果 内存操作数 线性地址不与 8 字节对齐。 如果 内存操作数 的有效地址位于 CS, DS, ES, FS, 或 GS 区段限制之外。 如果目的地位于不可写入区段内。 如果使用 DS, ES, FS, 或 GS 的寄存器访问内存, 并含有 NULL 段选择子 。 如果 CPL 不是 0 。 |
#SS(0) | 如果 内存操作数 有效地址在 SS 段限制之外. #PF(fault-code) 如果 页面错误 发生. |
64 位模式
#UD | 如果使用 LOCK 前缀,如果使用 CR4.CET = 0,如果使用 CR4.FRED = 1. IF IA32_S_CET.SH_STK_EN = 0. |
#GP(0) | 如果 内存操作数 线性地址不与 8 字节对齐。如果 CPL 不是一个 0。如果内存地址是非冠状的 。 |
#SS(0) | 如果引用SS段的内存地址为非冠状形式. #PF(fault-code) 如果发生 页面错误. |