WRUSSD, WRUSSQ

Escribe a User Shadow Stack

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
66 0F 38 F5 !(11):rrr:bbbWRUSSD m32, r32MRValidoValidoEscribe 4 bytes para apilar sombra.
66 REX.W 0F 38 F5 !(11):rrr:bbbWRUSSQ 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 la fuente de registro a una pila de sombras de usuario pag.

Operación

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;

Banderas afectadas

None.

C/C++ Compilador Equivalente Intrínseco

WRUSSD void wrussd( int32, void ); WRUSSQ void wrussq( int64, void );

Excepciones

Modo protegido
#UDSi el prefijo LOCK es usado. Si CR4.CET = 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. Si CPL no es 0.
#SS(0)Si un operando de memoria dirección efectiva está fuera del límite del segmento SS. #PF(fault-code) Si el destino no es una pila de sombra de usuario.
Modo real
#UDLa instrucción WRUSS no se reconoce en modo de direccion real.
Modo virtual-8086
#UDLa instrucción WRUSS no se reconoce en modo virtual-8086.
Modo de compatibilidad
#UDSi el prefijo LOCK es usado. Si CR4.CET = 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. Si CPL no es 0.
#SS(0)Si una dirección de memoria que hace referencia al segmento SS está en forma no canónica. #PF(fault-code) Si el destino no es una pila de sombras de usuario.
Modo de 64 bits
#UDSi el prefijo LOCK es usado. Si CR4.CET = 0.
#GP(0)Si una dirección de memoria está en forma no canónica. Si la dirección lineal de destino no está alineada con 4 bytes. Si CPL no es 0. #PF(fault-code) Si el destino no es una pila de sombra de usuario.

Fuentes