UIRET

用户中断返回

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
F3 0F 01 ECUIRETZO有效无效处理用户中断后返回 。

实测开销

正在从 arch-data 加载实测数据...

说明

UIRET 从处理用户中断返回 。 无论CPL,都可以执行.

在交易区域内执行UIRET会导致交易中止;中止负载EAX,因为如果执行IRET的话.

UIRET可以通过建筑最后分支记录(LBRs),英特尔处理器追踪(英特尔PT)和性能监测来跟踪. 对于英特尔PT和LBR,UIRET的录制方式与IRET完全相同. 因此,对于LBR,UIRETs属于其他 BRANCH类别,这意味着必须设定IA32_LBR_CTL.OTHER_BRANCH[bit 22]来记录用户中断的发送,并且IA32 LBR x INFO.BR TYPE字段会为任何被记录的用户中断表示其他 BRANCH. 对于Intel PT,控制流跟踪必须通过设置IA32_RTIT_CTL.BranchEn[bit 13]来实现.

UIRET还将启用计数BR_INST_RETIRED.FAR_BRANCH的递增性能计数器.

行动

    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;

受影响的旗帜

见行动科。

异常

保护模式
#UDUIRET指令在保护模式中不被识别.
实地址模式
#UDUIRET指令在实地址模式中不被识别.
虚拟 8086 模式
#UDUIRET指令在虚拟 8086 模式中不被识别.
兼容模式
#UDUIRET指令在兼容模式中不被识别.
64 位模式
#GP(0)如果返回的 指令指针 是非卡通的。
#SS(0)如果试图将一个值从堆栈中弹出, 则会引用一个非日历地址 。 #PF(fault-code) 如果 页面错误 发生 。
#AC(0)如果启用了对齐检查,并且在当前特权级别为3时会给出不对齐的内存引用.
#CP如果从堆栈返回 指令指针 和 阴影堆栈不匹配 。
#UD如果使用 LOCK 前缀。如果在飞地内执行。如果 CR4.UINTR = 0。如果 CPUID.07H.00H: EDX.UINTR[5] = 0。

来源