UIRET

Retorno interrumpido del usuario

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
F3 0F 01 ECUIRETZOValidoNo validoRegrese del manejo de una interrupción del usuario.

Coste medido

Cargando las mediciones de arch-data...

Descripción

UIRET regresa del manejo de una interrupción del usuario. Se puede ejecutar independientemente de CPL.

La ejecución de UIRET dentro de una región transaccional causa un aborto transaccional; el aborto carga EAX ya que habría sido debido a una ejecución de IRET.

UIRET puede ser rastreado por Architectural Last Branch Records (LBRs), Intel Processor Trace (Intel PT), y Performance Monitoring. Para Intel PT y LBRs, UIRET se registra de la misma manera que IRET. Por lo tanto, para LBRs, los UIRETs entran en la categoría OTHER BRANCH, lo que implica que IA32_LBR_CTL.OTHER_BRANCH[bit 22] debe establecerse para registrar la entrega interrumpida del usuario, y que el campo IA32 LBR x INFO.BR TYPE indicará OTHER BRANCH para cualquier interrupción del usuario registrada. Para Intel PT, el rastreo de flujo de control debe ser habilitado mediante el ajuste IA32_RTIT_CTL.BranchEn[bit 13].

UIRET también aumentará los contadores de rendimiento para los que cuenta BR_INST_RETIRED.FAR_BRANCH está habilitado.

Operación

    Pop tempRIP;
    Pop tempRFLAGS; // see below for how this is used to load RFLAGS
    Pop tempRSP;
    IF tempRIP is not canonical in current paging mode

          THEN #GP(0);
    FI;
    IF ShadowStackEnabled(CPL)

          THEN
                PopShadowStack SSRIP;

             IF SSRIP  tempRIP

                      THEN #CP (FAR-RET/IRET);
                FI;
    FI;
    RIP := tempRIP;
    // update in RFLAGS only CF, PF, AF, ZF, SF, TF, DF, OF, NT, RF, AC, and ID
    RFLAGS := (RFLAGS & ~254DD5H) | (tempRFLAGS & 254DD5H);
    RSP := tempRSP;
    IF CPUID.07H.01H:EDX.UIRET_UIF[17] = 1
          THEN UIF := tempRFLAGS[1];
          ELSE UIF := 1;
    FI;
    Clear any cache-line monitoring established by MONITOR or UMONITOR;

Banderas afectadas

Vea la sección Operación.

Excepciones

Modo protegido
#UDLa instrucción UIRET no se reconoce en modo protegido.
Modo real
#UDLa instrucción UIRET no se reconoce en modo de direccion real.
Modo virtual-8086
#UDLa instrucción UIRET no se reconoce en modo virtual-8086.
Modo de compatibilidad
#UDLa instrucción UIRET no se reconoce en modo de compatibilidad.
Modo de 64 bits
#GP(0)Si el retorno puntero de instruccion no es canónico.
#SS(0)Si un intento de sacar un valor de la pila hace que una dirección no canónica sea referenciada. #PF(fault-code) Si un fallo de pagina ocurre.
#AC(0)Si la comprobación de alineación está habilitada y se hace una referencia de memoria no alineada mientras que el nivel de privilegio actual es 3.
#CPSi devuelve puntero de instruccion de la pila y la pila de sombra no coinciden.
#UDSi se utiliza el prefijo LOCK. Si se ejecuta dentro de un enclave. Si CR4.UINTR = 0. Si CPUID.07H.00H:EDX.UINTR[5] = 0.

Fuentes