CLRSSBSY

Bandera Busy clara en un Supervisor Shadow Stack Token

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
F3 0F AE /6CLRSSBSY m64MValidoValidoBandera 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

  1. modrm.rm lectura 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

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 := 0

Banderas 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
#UDSi 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
#UDLa instrucción CLRSSBSY no se reconoce en modo de direccion real.
Modo virtual-8086
#UDLa instrucción CLRSSBSY no se reconoce en modo virtual-8086.
Modo de compatibilidad
#UDSi 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
#UDSi 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.

Fuentes