MNRET

RISC-V MNRET 指令详解

指令手册SYSTEM I-type fields

从 Smrnmi RNMI 处理程序返回:从 mnepc 恢复 PC,并从 mnstatus 恢复特权级/虚拟化状态。

指令语法

mnret
操作数说明
Smrnmi 1.0;仅 M-mode;RV32/RV64 的 32 位固定 SYSTEM 编码 0x70200073,没有显式操作数或可变立即数。
funct12=011100000010、rs1=00000、funct3=000、rd=00000、opcode=1110011。
PC 来自 mnepc,特权/虚拟化模式来自 mnstatus.MNPP/MNPV;NMIE←1,返回低于 M 时 MPRV←0。
支持切换 IALIGN 的实现中,IALIGN=32 的隐式 mnepc 读取屏蔽 bit 1;bit 0 恒为零。条件性 ELP/双重 trap 状态见规范要点。
PrivilegedSmrnmi系统与特权

指令行为说明

MNRET 是 Smrnmi 增加的仅 M-mode 可执行返回指令。它使用 mnepc 和 mnstatus 返回到被 RNMI 打断时的 PC、特权级和虚拟化模式,设置 mnstatus.NMIE;若返回到低于 M-mode 的特权级,还会清除 mstatus.MPRV。

MNRET 指令解析与返回动画

仅展示 Smrnmi 定义的 mnepc、MNPP/MNPV、NMIE 与条件性 MPRV 状态。

mnret

假定 Smrnmi、U/S/M 和 H 已实现,支持切换 IALIGN;输入为已存储的 MXLEN 位 mnepc,bit 0 必须为零。MNPV 在 MNPP=M 时忽略。仅建模核心返回;不建模条件性 Zicfilp ELP 与 Smdbltrp/Ssdbltrp MDT/SDT 更新。步骤是教学视图。

31..20
19..15
14..12
11..7
6..0
011100000010
funct12
00000
rs1=x0
000
funct3
00000
rd=x0
1110011
SYSTEM
instruction
0x70200073
permission
M-mode -> execute
mnepc
0x0000000000008042 -> 0x0000000000008040 (bit 1 masked)
mnstatus
MNPP=S, MNPV=0 -> S
architectural state
尚未提交 MNRET 状态

快速理解与检索要点

MNRET 仅在 M-mode 执行,使用 mnepc 与 mnstatus 恢复 RNMI 打断的执行上下文,并置 NMIE=1。

MNRET 仅可在 M-mode 执行,并要求实现 Smrnmi。
它从 mnepc 恢复 PC,按 mnstatus.MNPP/MNPV 恢复特权级和虚拟化模式,并把 NMIE 置为 1。
当 MNPP 小于 M 时,MNRET 清除 mstatus.MPRV。
mnepc 是已存储的 MXLEN 位值,bit 0 为零;支持切换 IALIGN 的实现中,IALIGN=32 时隐式读取屏蔽 bit 1。
若实现 Zicfilp,ELP←yLPE AND MNPELP。若实现双重 trap 状态,返回非 M 清 MDT;返回 U/VS/VU 清 sstatus.SDT,返回 VU 还清 vsstatus.SDT。

常见使用场景

RNMI 处理程序返回

假定 Smrnmi、M-mode、支持切换 IALIGN、已存储 mnepc=0x8042、当前 IALIGN=32、MNPP=S、MNPV=0。MNRET 返回 PC=0x8040、S-mode,置 NMIE=1 并清 MPRV;若 IALIGN=16,返回 PC=0x8042。条件性 ELP/双重 trap 状态未在此例建模。

使用前检查清单

语法检查
  • Smrnmi 1.0;仅 M-mode;RV32/RV64 的 32 位固定 SYSTEM 编码 0x70200073,没有显式操作数或可变立即数。
  • funct12=011100000010、rs1=00000、funct3=000、rd=00000、opcode=1110011。
语义检查
  • PC 来自 mnepc,特权/虚拟化模式来自 mnstatus.MNPP/MNPV;NMIE←1,返回低于 M 时 MPRV←0。
  • 支持切换 IALIGN 的实现中,IALIGN=32 的隐式 mnepc 读取屏蔽 bit 1;bit 0 恒为零。条件性 ELP/双重 trap 状态见规范要点。

容易混淆 / 常见误区

需要 Smrnmi,且只能在 M-mode 执行。
用于可恢复 NMI(RNMI)处理程序返回,不是通用 trap return。
MRET/SRET 不受 mnstatus.NMIE 影响;从 RNMI 恢复应使用 MNRET。

常见问题

MNRET 会改变 MRET 或 SRET 吗?

不会。MRET 和 SRET 不受 mnstatus.NMIE 影响,也不会改变它;RNMI 返回由 MNRET 完成。