SETSSBSY
标记阴影堆栈忙碌
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
F3 0F 01 E8 | SETSSBSY | ZO | 有效 | 有效 | 由 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 。 如果 页面错误 发生 。 |
实地址模式
#UD | SETSSBSY指令在实地址模式中不被识别. |
虚拟 8086 模式
#UD | SETSSBSY指令在虚拟 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 位模式
| 与兼容模式例外相同(除非没有检查令牌地址). |