SETSSBSY

标记阴影堆栈忙碌

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
F3 0F 01 E8SETSSBSYZO有效有效由 IA32 PL0 SSP 在主管阴影堆栈中设置繁忙的旗子 。

实测开销

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

说明

SETSSBSY指令在IA32 PL0 SSP MSR的地址上验证一个非繁忙的主管阴影堆栈符号的存在,并标记它繁忙. 在成功执行指令后,SSP设定为IA32 PL0 SSP MSR的值.

启用 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 = IA32_PL0_SSP
If SSP_LA not aligned to 8 bytes

    THEN #GP(0); FI;

expected_token_value = SSP_LA              (* busy bit must not be set *)

new_token_value  = SSP_LA | BUSY_BIT       (* set busy bit; bit position 0 *)

IF shadow_stack_lock_cmpxchg8B(SSP_LA, new_token_value, expected_token_value) != expected_token_value

THEN #CP(SETSSBSY); FI;

SSP = SSP_LA

受影响的旗帜

None.

C/C++ 汇编器等效 SETSSBSYvoid setssbsy(void);

异常

保护模式
#UD如果使用 LOCK 前缀,如果 CR4.CET = 0. IF IA32_S_CET.SH_STK_EN = 0.
#GP(0)如果 IA32 PL0 SSP 不与 8 字节对齐。 如果 CPL 不是 0 。
#CP(setssbsy)如果设置了繁忙的字节 。
#PF(fault-code)如果符号中的地址不低于 4 GBytes 。 如果 页面错误 发生 。
实地址模式
#UDSETSSBSY指令在实地址模式中不被识别.
虚拟 8086 模式
#UDSETSSBSY指令在虚拟 8086 模式中不被识别.
兼容模式
#UD如果使用 LOCK 前缀,如果使用 CR4.CET = 0. IF IA32_S_CET.SH_STK_EN = 0,如果使用 CR4.FRED = 1.
#GP(0)如果 IA32 PL0 SSP 不与 8 字节对齐。 如果 CPL 不是 0 。
#CP(setssbsy)如果设置了符号中的繁忙位。 如果符号中的地址不低于 4 GBytes. #PF(fault-code) 如果出现 页面错误 。
64 位模式
与兼容模式例外相同(除非没有检查令牌地址).

来源