ERETS

Evento Volver al Supervisor

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
F2 0F 01 CAERETSZOValidoNo validoRetorno del evento para eventos ocurridos en el anillo 0.

Coste medido

Cargando las mediciones de arch-data...

Banderas nombradas

Descripción

ERETS regresa de un manipulador de eventos, estableciendo el estado basado en el contenido de la pila (típicamente, que estaba en vigor antes de la entrega de eventos FRED). ERETS se puede ejecutar sólo si CPL = 0, y no cambia CPL. Por esta razón, ERETS se utiliza para regresar de los eventos de manejo que ocurrieron mientras CPL = 0.

ERETS no toma argumentos explícitos; su funcionamiento depende del contenido de la pila regular y (cuando está habilitado) la pila de sombras.

La ejecución de ERETS causa una excepción de código de operación no válido (#UD) si las transiciones FRED no están habilitadas o si CPL > 0. Por esta razón, ERETS se puede ejecutar sólo en modo de 64 bits.

Sección 8.4.1, "ERETS (Event Return to Supervisor)," del Manual del desarrollador de software Intel(R) 64 e IA-32 Architectures, Volumen 3 incluye una discusión detallada de ERETS.

Ordenación de instrucciones. Las instrucciones después de la ejecución de ERETS pueden ser arrebatadas de memoria antes de que las instrucciones anteriores completen la ejecución, pero no ejecutarán (incluso especulativamente) hasta que todas las instrucciones anteriores a ERETS hayan completado la ejecución (las instrucciones posteriores pueden ejecutarse antes de que los datos almacenados por las instrucciones anteriores se hayan vuelto mundialmente visibles).

Operación

IF CR4.FRED = 0 OR CPL > 0

    THEN #UD;
FI;
// CR4.FRED = 1 and CPL = 0 implies IA32_EFER.LMA = CS.L = 1

// pop old state from regular stack and check it

RSP := RSP + 8;    // skip over error code so that RSP references the return state

pop8B newRIP;

pop8B tempCS;      // not used to load CS

pop8B newRFLAGS;

pop8B newRSP;

pop8B tempSS;      // not used to load SS

IF newRIP is not paging canonical OR

     tempCS & FFFFFFFF_FFF8FFFFH  current CS selector OR

     newRFLAGS & FFFFFFFF_FFC2802AH  2 OR                // enforce bit 1 set; VM, reserved bits clear

     tempSS & FFF8FFFFH  current SS selector OR          // do not check bits 63:32

     THEN #GP(0);

FI;

// ERETS will not numerically increase stack level
newCSL := min{CSL,tempCS[17:16]};
IBT_restore := tempCS[18];
STI_block := tempSS[16];
pend_DB := tempSS[17];
NMI_unblock := tempSS[18];


// If supervisor shadow stacks are enabled, pop and check values from the shadow stack

IF CR4.CET = 1 AND IA32_S_CET.SH_STK_EN = 1

     THEN

     IF SSP & 7  0                           // require 8-byte alignment

           THEN #CP(FAR-RET/IRET);

     FI;

     popSS_8B newSSP;

     popSS_8B checkSSLIP;

     popSS_8B checkSSCS;

     IF checkSSCS  tempCS                    // 64-bit compare

           OR checkSSLIP  newRIP

           OR newSSP & 3H  0

           THEN #CP(FAR-RET/IRET);

     FI;

     IF newSSP not CPU canonical

           THEN #GP(0);

     FI;

     // If the stack level is changing, compare SSP to the FRED SSP MSR for the old stack level

     IF newCSL < CSL AND IA32_FRED_SSPi  SSP // where i = CSL

           THEN #CP(FAR-RET/IRET);

     FI;

FI;

// update registers for return state

RIP := newRIP;

RFLAGS := newRFLAGS;                         // ERETS can set RFLAGS.RF to 1

RSP := newRSP;

CSL := newCSL;                               // reflect in IA32_FRED_CONFIG[1:0]

IF CR4.CET = 1 AND IA32_S_CET.SH_STK_EN = 1

     THEN SSP := newSSP;

FI;

IF CR4.CET = 1 AND IA32_S_CET.ENDBR_EN = 1 AND IA32_S_CET.SUPPRESS = 0 AND IBT_restore = 1

     THEN IA32_S_CET.TRACKER := 1;

FI;

// update event-related state
IF STI_block = 1 AND RFLAGS.IF = 1 AND STI blocking was not in effect prior to ERETS

    THEN establish STI blocking after ERETS;
FI;
IF pend_DB = 1 AND RFLAGS.TF =1

    THEN pend a single-step debug exception (#DB) to be delivered after ERETS;
FI;
IF NMI_unblock = 1

    THEN unblock NMIs;
FI;

Banderas afectadas

Todas las banderas y campos definidos en el registro RFLAGS son potencialmente modificados excepto para la bandera VM.

Excepciones

Modo protegido
#UDLa instrucción ERETS no se reconoce en modo protegido.
Modo real
#UDLa instrucción ERETS no se reconoce en modo de direccion real.
Modo virtual-8086
#UDLa instrucción ERETS no se reconoce en modo virtual-8086.
Modo de compatibilidad
#UDLa instrucción ERETS no se reconoce en modo de compatibilidad.
Modo de 64 bits
#UDSi CR4.FRED = 0. Si CPL > 0. Si el prefijo LOCK es usado.
#GP(0)SiRIPla imagen en la pila es un no paging canónico.RFLAGSimagen en los conjuntos de la pila de bits reservados o el bit VM (o no se fija bit 1). Si los bits 15:0 de la imagen CS en la pila difiere del valor del selector actual de CS. Si la imagen CS en la pila establece bits indefinidos (bits 63:19). Si los bits 15:0 de la imagen SS en la pila difiere del valor del selector actual de SS.SSPimagen en la pila de sombras noCPUcanónico. Si un acceso a la sombra de la cama usaría una dirección que no está paging canónico o que causaría unLASSviolación.
#SS(0)Si un acceso a pila ordinario utilizaría una dirección que no está paging canónico o causaría unLASSviolación.#CP(FAR-RET/IRET)Si la dirección está enSSPno está alineado de 8 bytes. Si la imagen CS de 64 bits en la pila de sombras difiere de la de la pila regular.SSLIPimagen en la pila de sombras difiere de laRIPimagen en la pila regular.SSPla imagen en la pila de sombras no está alineada de 4 bytes.CSLes yo, el nivel de pila está cambiando, ySSPdifiere del valor de IA32 FRED SSPi.

Fuentes