CLRSSBSY

在主管阴影堆栈托肯中清除忙碌旗

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
F3 0F AE /6CLRSSBSY m64M有效有效M64在主管阴影堆栈中清除繁忙的旗子参考.

操作数编码

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

M

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

实测开销

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

涉及的标志位

说明

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) 如果 页面错误 发生.
实地址模式
#UDCLRSSBSY指令在实地址模式中不被识别.
虚拟 8086 模式
#UDCLRSSBSY指令在虚拟 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) 如果发生 页面错误.

来源