# SETSSBSY — Mark Shadow Stack Busy

Opcode/Instruction | Op/En | 64/32 bit Mode Support | CPUID Feature Flag | Description
--- | --- | --- | --- | ---
F3 0F 01 E8 SETSSBSY | ZO | V/V | CET_SS | Set busy flag in supervisor shadow stack token reference by IA32_PL0_SSP.

## Instruction Operand Encoding ¶

Op/En | Operand 1 | Operand 2 | Operand 3 | Operand 4
--- | --- | --- | --- | ---
ZO | N/A | N/A | N/A | N/A

## Description ¶

The SETSSBSY instruction verifies the presence of a non-busy supervisor shadow stack token at the address in the IA32_PL0_SSP MSR and marks it busy. Following successful execution of the instruction, the SSP is set to the value of the IA32_PL0_SSP MSR.

## Operation ¶

    IF (CR4.CET = 0)
        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
    new_token_value = SSP_LA | BUSY_BIT
    IF shadow_stack_lock_cmpxchg8B(SSP_LA, new_token_value, expected_token_value) != expected_token_value
        THEN #CP(SETSSBSY); FI;
    SSP = SSP_LA

## Flags Affected ¶

None.

## C/C++ Compiler Intrinsic Equivalent ¶

    SETSSBSYvoid _setssbsy(void);

## Protected Mode Exceptions ¶

#UD | If the LOCK prefix is used.
If CR4.CET = 0.
IF IA32_S_CET.SH_STK_EN = 0.
#GP(0) | If IA32_PL0_SSP not aligned to 8 bytes.
If CPL is not 0.
#CP(setssbsy) | If busy bit in token is set.
If in 32-bit or compatibility mode, and the address in token is not below 4G.
#PF(fault-code) | If a page fault occurs.

## Real-Address Mode Exceptions ¶

#UD | The SETSSBSY instruction is not recognized in real-address mode.

## Virtual-8086 Mode Exceptions ¶

#UD | The SETSSBSY instruction is not recognized in virtual-8086 mode.

## Compatibility Mode Exceptions ¶

Same as protected mode exceptions.

## 64-Bit Mode Exceptions ¶

Same as protected mode exceptions.