CLRSSBSY
Bandera Busy clara en un Supervisor Shadow Stack Token
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
F3 0F AE /6 | CLRSSBSY m64 | M | Valido | Valido | Bandera ocupada clara en la referencia token de la pila de sombra de supervisor por m64. |
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
Bandera ocupada clara en la referencia token de la pila de sombra de supervisor por m64. Después de marcar la pila de sombras como no ocupado el SSP está cargado con el valor 0.
Esta instrucción no se puede ejecutar cuando las transiciones FRED están habilitadas. Las transiciones FRED no utilizan tokens de apilamiento de sombras supervisor.
Operación
IF CR4.CET = 0 OR CR4.FRED = 1
THEN #UD; FI;
IF IA32_S_CET.SH_STK_EN = 0
THEN #UD; FI;
IF CPL > 0
THEN GP(0); FI;
SSP_LA = Linear_Address(mem operand)
IF SSP_LA not aligned to 8 bytes
THEN #GP(0); FI;
expected_token_value = SSP_LA | BUSY_BIT (* busy bit - bit position 0 - must be set *)
new_token_value = SSP_LA (* Clear the busy bit *)
IF shadow_stack_lock_cmpxchg8b(SSP_LA, new_token_value, expected_token_value) != expected_token_value
invalid_token := 1; FI
(* Set the CF if invalid token was detected *)
RFLAGS.CF = (invalid_token == 1) ? 1 : 0;
RFLAGS.ZF,PF,AF,OF,SF := 0;
SSP := 0Banderas afectadas
CF se establece si se detecta una ficha inválida, de lo contrario se pone a cero. ZF, PF, AF, OF y SF están despejados.
Excepciones
Modo protegido
#UD | Si se utiliza el prefijo LOCK. Si CR4.CET = 0. IF IA32_S_CET.SH_STK_EN = 0. |
#GP(0) | Si una dirección efectiva de memoria operando no está alineada a 8 bytes. Si una dirección efectiva de memoria 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 selector de segmento NULL. 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 un fallo de pagina ocurre. |
Modo real
#UD | La instrucción CLRSSBSY no se reconoce en modo de direccion real. |
Modo virtual-8086
#UD | La instrucción CLRSSBSY no se reconoce en modo virtual-8086. |
Modo de compatibilidad
#UD | Si se utiliza el prefijo LOCK. Si CR4.CET = 0. IF IA32_S_CET.SH_STK_EN = 0. Si CR4.FRED = 1. |
#GP(0) | Si una dirección efectiva de memoria operando no está alineada a 8 bytes. Si una dirección efectiva de memoria 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 selector de segmento NULL. 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 un fallo de pagina ocurre. |
Modo de 64 bits
#UD | Si se utiliza el prefijo LOCK. Si CR4.CET = 0. Si CR4.FRED = 1. IF IA32_S_CET.SH_STK_EN = 0. |
#GP(0) | Si operando de memoria dirección lineal no alineada a 8 bytes. Si CPL no es 0. Si la dirección de memoria está en una forma no canónica. |
#SS(0) | Si una dirección de memoria que hace referencia al segmento SS está en forma no canónica. #PF(fault-code) Si ocurre un fallo de pagina. |