RSTORSSP
Restaurar Sombra Salvada puntero de pila
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
F3 0F 01 /5 (mod!=11, /5, memory only) | RSTORSSP m64 | M | Valido | Valido | Restaurar SSP. |
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.
M
modrm.rmlectura y escriturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pide
Coste medido
Cargando las mediciones de arch-data...
Banderas nombradas
CFAcarreoPFParidadAFAcarreo auxiliarZFCeroSFSignoOFDesbordamiento
Descripción
Restores SSP de la token de la tienda de sombras apuntada por m64. Si la restauración SSP fue exitosa entonces la instrucción reemplaza el token de la tienda de sombras con un token de punta previa. La instrucción establece la bandera de CF para indicar si la dirección SSP grabada en el token de la tienda de sombras que fue procesada fue alineada de 4 byte, es decir, si se creó un agujero de alineación cuando se empujó el token de la plataforma de restauración.
Después de RSTORSSP, si se necesita guardar un token restaurador-shadow-stack en la anterior pila de sombras, utilice la instrucción SAVEPREVSSP.
Si empujar un token de la sombra de restauración en la pila de sombras previa no es necesario, el token de la salida anterior se puede colocar utilizando la instrucción INCSSPQ. Si la bandera CF se estableció para indicar la presencia de un agujero de alineación, se necesita una instrucción adicional INCSSPD para avanzar en el SSP pasado el agujero de alineación.
Operación
IF CPL = 3
IF (CR4.CET & IA32_U_CET.SH_STK_EN) = 0
THEN #UD; FI;
ELSE
IF (CR4.CET & IA32_S_CET.SH_STK_EN) = 0
THEN #UD; FI;
FI;
SSP_LA = Linear_Address(mem operand)
IF SSP_LA not aligned to 8 bytes
THEN #GP(0); FI;
previous_ssp_token = SSP | (IA32_EFER.LMA AND CS.L) | 0x02
Start Atomic Execution
restore_ssp_token = Locked shadow_stack_load 8 bytes from SSP_LA
fault = 0
IF ((restore_ssp_token & 0x03) != (IA32_EFER.LMA & CS.L))
THEN fault = 1; FI; (* If L flag in token does not match IA32_EFER.LMA & CS.L or bit 1 is not 0 *)
IF ((IA32_EFER.LMA AND CS.L) = 0 AND restore_ssp_token[63:32] != 0)
THEN fault = 1; FI; (* If compatibility/legacy mode and SSP to be restored not below 4G *)
TMP = restore_ssp_token & ~0x01
TMP = (TMP - 8)
TMP = TMP & ~0x07
IF TMP != SSP_LA
THEN fault = 1; FI; (* If address in token does not match the requested top of stack *)
TMP = (fault == 0) ? previous_ssp_token : restore_ssp_token
shadow_stack_store 8 bytes of TMP to SSP_LA and release lock
End Atomic Execution
IF fault == 1
THEN #CP(RSTORSSP); FI;
SSP = SSP_LA
// Set the CF if the SSP in the restore token was 4 byte aligned, i.e., there is an alignment hole
RFLAGS.CF = (restore_ssp_token & 0x04) ? 1 : 0;
RFLAGS.ZF,PF,AF,OF,SF := 0;Banderas afectadas
CF se establece para indicar si la sombra puntero de pila en el token de restauración fue 4 byte alineado, de lo contrario se pone a cero. ZF, PF, AF, OF y SF están despejados.
C/C++ Compiler Intrinsic Equivalent RSTORSSP void rstorssp(void *);
Excepciones
Modo protegido
#UD | Si se utiliza el prefijo LOCK. Si CR4.CET = 0. IF CPL = 3 y IA32_U_CET.SH_STK_EN = 0. IF CPL < 3 y IA32_S_CET.SH_STK_EN = 0. |
#GP(0) | Si dirección lineal de operando de memoria no 8 byte alineada. 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 escrito. Si el registro DS, ES, FS o GS se utiliza para acceder a la memoria y contiene un NULL selector de segmento. |
#SS(0) | Si un operando de memoria dirección efectiva está fuera del límite del segmento SS. |
#CP(rstorssp) | Si L bit in token no coincide (IA32_EFER.LMA & CS.L). Si la dirección en token no coincide con la dirección lineal de operando de memoria. Si en modo de 32 bits o compatibilidad y la dirección en token no está por debajo de 4G. #PF(fault-code) Si un fallo de pagina ocurre. |
Modo real
#UD | La instrucción RSTORSSP no se reconoce en modo de direccion real. |
Modo virtual-8086
#UD | La instrucción RSTORSSP no se reconoce en modo virtual-8086. |
Modo de compatibilidad
| Igual que las excepciones modo protegido. |
Modo de 64 bits
#UD | Si se utiliza el prefijo LOCK. Si CR4.CET = 0. Si CPL = 3 y IA32_U_CET.SH_STK_EN = 0. Si CPL < 3 y IA32_S_CET.SH_STK_EN = 0. |
#GP(0) | Si la dirección lineal de operando de memoria no 8 byte alineada. Si una dirección de memoria está en forma no canónica. |
#SS(0) | Si una dirección de memoria que hace referencia al segmento SS está en forma no canónica. |
#CP(rstorssp) | Si L bit in token no coincide (IA32_EFER.LMA & CS.L). Si la dirección en token no coincide con la dirección lineal de operando de memoria. #PF(fault-code) Si un fallo de pagina ocurre. |