WRUSSD, WRUSSQ
Escribe a User Shadow Stack
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
66 0F 38 F5 !(11):rrr:bbb | WRUSSD m32, r32 | MR | Valido | Valido | Escribe 4 bytes para apilar sombra. |
66 REX.W 0F 38 F5 !(11):rrr:bbb | WRUSSQ 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 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
#UD | Si 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
#UD | La instrucción WRUSS no se reconoce en modo de direccion real. |
Modo virtual-8086
#UD | La instrucción WRUSS no se reconoce en modo virtual-8086. |
Modo de compatibilidad
#UD | Si 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
#UD | Si 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. |