WRSSD, WRSSQ
Escribe a Shadow Stack
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
0F 38 F6 !(11):rrr:bbb | WRSSD m32, r32 | MR | Valido | Valido | Escribe 4 bytes para apilar sombra. |
REX.W 0F 38 F6 !(11):rrr:bbb | WRSSQ m64, r64 | MR | Valido | No codificable | Escribe 8 bytes para apilar sombra. |
Codificacion de operandos
Cada modo es un valor de la columna Op/En de arriba. Dice en que campo de la instruccion codificada va cada operando, en el orden en que se escriben, y si la instruccion lo lee, lo escribe o ambas cosas.
MR
modrm.rmescriturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pidemodrm.reglecturabyte ModRM, campo reg (bits 5-3)
Coste medido
Cargando las mediciones de arch-data...
Descripción
Escribe bytes en fuente de registro a la pila de sombras.
Operación
IF CPL = 3
IF (CR4.CET & IA32_U_CET.SH_STK_EN) = 0
THEN #UD; FI;
IF (IA32_U_CET.WR_SHSTK_EN) = 0
THEN #UD; FI;
ELSE
IF (CR4.CET & IA32_S_CET.SH_STK_EN) = 0
THEN #UD; FI;
IF (IA32_S_CET.WR_SHSTK_EN) = 0
THEN #UD; FI;
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;
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;
FI;Banderas afectadas
None.
C/C++ Compilador Equivalente Intrínseco
WRSSD void wrssd( int32, void ); WRSSQ void wrssq( int64, void );
Excepciones
Modo protegido
#UD | SiLOCKprefijo es usado.CR4.CET0. SiCPL= 3 yIA32_U_CET.SH_STK_EN0. SiCPL <3 y 3IA32_S_CET.SH_STK_EN0. SiCPL= 3 yIA32_U_CET.WR_SHSTK_EN0. SiCPL <3 y 3IA32_S_CET.WR_SHSTK_EN = 0. |
#GP(0) | Si un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS. Si el destino se encuentra en un segmento no editable. Si el registro DS, ES, FS o GS se utiliza para acceder a la memoria y contiene un NULL selector de segmento. Si la dirección lineal de destino no es 4 byte alineado. |
#SS(0) | Si un operando de memoria dirección efectiva está fuera del límite del segmento SS. |
#PF(fault-code) | Si un fallo de pagina ocurre si el destino no es una sombra de usuario cuando CPL3 y no una pila de sombra supervisor cuando CPL < 3. Otros defectos terminales y no terminales. |
Modo real
#UD | La instrucción WRSS no se reconoce en modo de direccion real. |
Modo virtual-8086
#UD | La instrucción WRSS no se reconoce en modo virtual-8086. |
Modo de compatibilidad
#UD | SiLOCKprefijo es usado.CR4.CET0. SiCPL= 3 yIA32_U_CET.SH_STK_EN0. SiCPL <3 y 3IA32_S_CET.SH_STK_EN0. SiCPL= 3 yIA32_U_CET.WR_SHSTK_EN0. SiCPL <3 y 3IA32_S_CET.WR_SHSTK_EN = 0. |
#PF(fault-code) | Si un fallo de pagina ocurre si el destino no es una sombra de usuario cuando CPL3 y no una pila de sombra supervisor cuando CPL < 3. Otros defectos terminales y no terminales. |
Modo de 64 bits
#UD | SiLOCKprefijo es usado.CR4.CET0. SiCPL= 3 yIA32_U_CET.SH_STK_EN0. SiCPL <3 y 3IA32_S_CET.SH_STK_EN0. SiCPL= 3 yIA32_U_CET.WR_SHSTK_EN0. SiCPL <3 y 3IA32_S_CET.WR_SHSTK_EN = 0. |
#GP(0) | Si una dirección de memoria está en forma no canónica. Si la dirección lineal de destino no es 4 byte alineado. |
#PF(fault-code) | Si un fallo de pagina ocurre si el destino no es una sombra de usuario cuando CPL3 y no una pila de sombra supervisor cuando CPL < 3. Otros defectos terminales y no terminales. |