WRSSD, WRSSQ

Escribe a Shadow Stack

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
0F 38 F6 !(11):rrr:bbbWRSSD m32, r32MRValidoValidoEscribe 4 bytes para apilar sombra.
REX.W 0F 38 F6 !(11):rrr:bbbWRSSQ m64, r64MRValidoNo codificableEscribe 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

  1. modrm.rm escriturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pide
  2. modrm.reg lecturabyte 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
#UDSiLOCKprefijo 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
#UDLa instrucción WRSS no se reconoce en modo de direccion real.
Modo virtual-8086
#UDLa instrucción WRSS no se reconoce en modo virtual-8086.
Modo de compatibilidad
#UDSiLOCKprefijo 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
#UDSiLOCKprefijo 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.

Fuentes