Extensions
Forms
1 (1 Legacy)
Data
Intel XED v2026.08.23

SETSSBSY gives the kernel a shadow stack after SYSCALL. Interrupts, exceptions and far CALLs that raise the privilege level switch shadow stacks themselves, but SYSCALL does not: with supervisor shadow stacks on, it saves the user’s SSP in IA32_PL3_SSP and, by AMD’s manual, sets SSP to 0. AMD’s Volume 2 therefore has the system call entry point run SETSSBSY before anything pushes a return address, and the way back run CLRSSBSY before SYSRET.

The token

SETSSBSY takes no operand. It reads the 8-byte supervisor shadow-stack token at the address in IA32_PL0_SSP, which the kernel set, and checks it in one locked step: the token must hold its own address with bit 0, the busy bit, clear. Then it sets the busy bit and loads SSP with that address. A token in use, or one that holds another address, raises #CP and is written back unchanged. The busy bit keeps one supervisor shadow stack on one logical processor at a time; an interrupt, exception or far CALL that switches to a supervisor shadow stack makes the same check itself.

The manuals number the error code of that #CP differently: 5 in Intel’s list, where 3 is the missing ENDBRANCH of indirect branch tracking, and 4 in AMD’s, which has no such entry.

Where it runs

Only at CPL 0: elsewhere SETSSBSY raises #GP(0), and #UD comes first when CR4.CET or supervisor shadow stacks (SH_STK_EN in IA32_S_CET) are off. With FRED enabled it raises #UD too: FRED’s event delivery loads SSP from an MSR of the event’s stack level, and its return instructions check those MSRs instead of busy bits in tokens (Intel’s Volume 3).

AMD’s Zen 5 guide lists SETSSBSY among the shadow-stack instructions Zen 5 supports, as microcoded. The probe runs at CPL 3 in a KVM guest that reported no shadow stacks in CPUID (leaf 07H, ECX bit 7); both recorded cases raised #UD, the fault that the manuals check before the privilege level.

Forms

Every encoding of SETSSBSY that Intel XED knows, one row per XED instruction form (iform). How to read the notation.
InstructionEncodingRequires
SETSSBSY SETSSBSYF3 0F 01 E8CET

Operation

What the forms do, in pseudocode that our tests run against results recorded on real processors. How to read.

if not cr4 >> 23 & 1:            # CR4.CET; clear without CET
    fault(UD)
if cr4 >> 32 & 1:                # CR4.FRED
    fault(UD)
if not s_cet & 1:                # supervisor shadow stacks off
    fault(UD)
if CPL > 0:
    fault(GP, 0)
a = pl0_ssp                      # the shadow stack of CPL 0
if a & 7:
    fault(GP, 0)
t = ss_load(a, 64)               # locked until the store below
ok = t == a                      # its own address, not busy
ss_store(a, 64, a | 1 if ok else t)
                                 # marked busy
if not ok:
    fault(CP, 5)                 # #CP(SETSSBSY)
ssp = a

Run on AMD Zen 5 (EPYC 9645): 2 cases. Its cases ran where CPUID reported no CET, and every one raised an exception.

Operands

None: XED lists no operands for this form.

Flags

None: XED records no flag that the forms test or change.

Attributes

What else XED records about the forms. How to read.

All forms
privileged: CPL 0 only; not in real-address mode

Intrinsics

The C intrinsics of Clang 23.1.2 that compile to SETSSBSY, each with the form it compiles to and the Clang options it needs. The forms come from compiling every intrinsic and decoding the result with Intel XED; all intrinsics A–Z explains the method.

IntrinsicCompiles to
_setssbsy void _setssbsy(void)

SETSSBSY Legacy -mshstk

CPUID and processors

Each form belongs to an XED ISA set. A form can be used when the processor reports every CPUID bit of one of its ISA set's alternatives.

CPUID requirements and processors of the XED ISA sets above. Alternatives are separated by “or”; processors follow XED’s chip model, whose AMD processors end with Zen 2, and the CPU data of this site for Zen 3 to Zen 6.
ISA setCPUIDProcessors
CET

CET
CPUID.(EAX=07H,ECX=0):ECX[7] CET

Tiger Lake, Alder Lake, Arrow Lake, Panther Lake, Nova Lake, Sapphire Rapids, Emerald Rapids, Granite Rapids, Diamond Rapids, Sierra Forest, Clearwater Forest, Zen 3, Zen 4, Zen 5, Zen 6

Note: Zen 3 to Zen 6 have the shadow stacks of CET but not its indirect branch tracking, so ENDBR32 and ENDBR64 run on them as hint NOPs. AMD's references for Zen 3, Zen 4 and Zen 5 (55898, 55901, 57238) set CPUID_Fn00000007_ECX_x00[CET_SS] (bit 7) and leave bit 20 of CPUID_Fn00000007_EDX_x00, which Intel gives to indirect branch tracking, reserved and clear.

Note: Zen 6 is listed because Zen 5 has these instructions. GCC's -march sets, which give the other features of Zen 6, leave them out, and AMD has not yet published a Processor Programming Reference for Zen 6.

More CET instructions

Sources

  1. Intel XED v2026.08.23 (commit 0bcb6237345c): forms, encodings, operands, flags, exception classes, attributes, ISA sets, CPUID bits and chip model.
  2. The CPU data of x86-64.net: Zen 3 to Zen 6, from GCC’s -march feature sets and AMD’s Processor Programming References, which the page of each processor cites.
  3. Clang's x86 intrinsic headers, LLVM 23.1.2 (commit 85ac56026243): the intrinsics, their signatures and doc comments, and the Clang of that release, which compiled each of them.
  4. Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 2 (325383-093, September 2026): Volume 2B, page 4-626 (SETSSBSY)
  5. Linux kernel documentation: Control-flow Enforcement Technology (CET) Shadow Stack
  6. Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 1 (253665-093, September 2026)
  7. Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 3 (325384-093, September 2026)
  8. AMD64 Architecture Programmer's Manual, Volume 2: System Programming (24593, rev. 3.42, March 2024), Wayback Machine copy of AMD's PDF
  9. AMD64 Architecture Programmer's Manual, Volume 3: General-Purpose and System Instructions (24594, rev. 3.36, March 2024), Wayback Machine copy of AMD's PDF
  10. Software Optimization Guide for the AMD Zen5 Microarchitecture (58455, rev. 1.00, August 2024), Wayback Machine copy of AMD's ZIP

The tables are derived from Intel XED, Copyright Intel Corporation, licensed under the Apache License 2.0; x86-64.net converted and reformatted them. The intrinsics and their signatures come from Clang, part of the LLVM Project, licensed under the Apache License 2.0 with LLVM Exceptions. The text is our own.