WRUSSD/WRUSSQ
— Write to User Shadow Stack
Opcode/Instruction |
Op/En |
64/32 bit Mode Support |
CPUID Feature Flag |
Description |
66 0F 38 F5 !(11):rrr:bbb WRUSSD m32, r32 |
MR |
V/V |
CET_SS |
Write 4 bytes to shadow stack. |
66 REX.W 0F 38 F5 !(11):rrr:bbb WRUSSQ m64, r64 |
MR |
V/N.E. |
CET_SS |
Write 8 bytes to shadow stack. |
Instruction Operand Encoding
¶
Op/En |
Operand 1 |
Operand 2 |
Operand 3 |
Operand 4 |
MR |
ModRM:r/m (w) |
ModRM:reg (r) |
N/A |
N/A |
Description
¶
Writes bytes in register source to a user shadow stack page. The WRUSS instruction can be executed only if CPL = 0, however the processor treats its shadow-stack accesses as user accesses.
Operation
¶
IF CR4.CET = 0
THEN #UD; FI;
IF CPL > 0
THEN #GP(0); FI;
DEST_LA = Linear_Address(mem operand)
IF (operand size is 64 bit)
THEN
(* Destination not 8B aligned *)
IF DEST_LA[2:0]
THEN GP(0); FI;
Shadow_stack_store 8 bytes of SRC to DEST_LA as user-mode access;
ELSE
(* Destination not 4B aligned *)
IF DEST_LA[1:0]
THEN GP(0); FI;
Shadow_stack_store 4 bytes of SRC[31:0] to DEST_LA as user-mode access;
FI;
Flags Affected
¶
None.
C/C++ Compiler Intrinsic Equivalent
¶
WRUSSD void _wrussd(__int32, void *);
WRUSSQ void _wrussq(__int64, void *);
Protected Mode Exceptions
¶
#UD |
If the LOCK prefix is used. |
If CR4.CET = 0. |
#GP(0) |
If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit. |
If destination is located in a non-writeable segment. |
If the DS, ES, FS, or GS register is used to access memory and it contains a NULL segment selector. |
If linear address of destination is not 4 byte aligned. |
If CPL is not 0. |
#SS(0) |
If a memory operand effective address is outside the SS segment limit. |
#PF(fault-code) |
If destination is not a user shadow stack. |
Other terminal and non-terminal faults. |
Real-Address Mode Exceptions
¶
#UD |
The WRUSS instruction is not recognized in real-address mode. |
Virtual-8086 Mode Exceptions
¶
#UD |
The WRUSS instruction is not recognized in virtual-8086 mode. |
Compatibility Mode Exceptions
¶
#UD |
If the LOCK prefix is used. |
If CR4.CET = 0. |
#GP(0) |
If a memory address is in a non-canonical form. |
If linear address of destination is not 4 byte aligned. |
If CPL is not 0. |
#SS(0) |
If a memory address referencing the SS segment is in a non-canonical form. |
#PF(fault-code) |
If destination is not a user shadow stack. |
Other terminal and non-terminal faults. |
64-Bit Mode Exceptions
¶
#UD |
If the LOCK prefix is used. |
If CR4.CET = 0. |
#GP(0) |
If a memory address is in a non-canonical form. |
If linear address of destination is not 4 byte aligned. |
If CPL is not 0. |
#PF(fault-code) |
If destination is not a user shadow stack. |
Other terminal and non-terminal faults. |