UIRET
用户中断返回
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
F3 0F 01 EC | UIRET | ZO | 有效 | 无效 | 处理用户中断后返回 。 |
实测开销
正在从 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;受影响的旗帜
见行动科。
异常
保护模式
#UD | UIRET指令在保护模式中不被识别. |
实地址模式
#UD | UIRET指令在实地址模式中不被识别. |
虚拟 8086 模式
#UD | UIRET指令在虚拟 8086 模式中不被识别. |
兼容模式
#UD | UIRET指令在兼容模式中不被识别. |
64 位模式
#GP(0) | 如果返回的 指令指针 是非卡通的。 |
#SS(0) | 如果试图将一个值从堆栈中弹出, 则会引用一个非日历地址 。 #PF(fault-code) 如果 页面错误 发生 。 |
#AC(0) | 如果启用了对齐检查,并且在当前特权级别为3时会给出不对齐的内存引用. |
#CP | 如果从堆栈返回 指令指针 和 阴影堆栈不匹配 。 |
#UD | 如果使用 LOCK 前缀。如果在飞地内执行。如果 CR4.UINTR = 0。如果 CPUID.07H.00H: EDX.UINTR[5] = 0。 |