MNRET

RISC-V MNRET 指令详解

指令手册I-type

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

指令语法

mnret
操作数说明
MNRET 没有显式汇编操作数;它是固定的 SYSTEM I-type 编码。
imm[11:0] 固定为 011100000010,rs1=x0、funct3=000、rd=x0,opcode=1110011。
mnepc、mnstatus 与 mstatus 是隐式架构状态,而非汇编寄存器或立即数操作数。
PrivilegedSmrnmi系统与特权

指令行为说明

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

MNRET 指令解析与返回动画

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

mnret
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
pc=0x0000000000008040; mode=S; NMIE=1; MPRV=0

快速理解与检索要点

MNRET 是特权架构定义的系统级指令,页面说明只覆盖官方规定的架构语义,不推断平台固件策略。

MNRET 仅可在 M-mode 执行,并要求实现 Smrnmi。
它从 mnepc 恢复 PC,从 mnstatus 恢复 MNPV/MNPP,并把 NMIE 置为 1。
当 MNPP 小于 M 时,MNRET 清除 mstatus.MPRV。

常见使用场景

分支与跳转

结合 «mnret # Return from NMI handler» 等实际代码理解该场景。

操作系统接口

结合 «mnret # Return from NMI handler» 等实际代码理解该场景。

使用前检查清单

语法检查
  • 确认立即数字段在有效范围内。
  • 确认源寄存器 rs1 指向正确的操作数。
语义检查
  • 确认立即数符号扩展是否符合预期。
  • 确认结果寄存器 rd 的用途是否明确。

容易混淆 / 常见误区

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

常见问题

MNRET 会改变 MRET 或 SRET 吗?

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

MNRET 何时清除 MPRV?

当 mnstatus.MNPP 指示的返回特权级低于 M-mode 时,MNRET 会清除 mstatus.MPRV。