首页/指令库/监管者模式返回
SRET

RISC-V SRET 指令详解

指令手册I-type

Supervisor 陷阱返回:无 H 时从 sepc、SPP/SPIE 恢复 PC、模式与 SIE,清 SPP、置 SPIE;S-mode 受 TSR 限制。

指令语法

sret
操作数说明
无显式汇编操作数;32 位 SYSTEM 固定编码 0x10200073,rs1/rd=00000、funct3=000。
需要实现 S-mode;基本路径可在 S/M-mode 执行,S-mode 的 TSR=1 会引发非法指令异常。
无 H 时,SPP 选择 U/S,SIE←SPIE、SPIE←1、SPP←0、PC←sepc,并清 MPRV。
sepc[0]=0;可切换 IALIGN 的实现中,IALIGN=32 时隐式读取屏蔽 bit 1。H 和 SDT/ELP 等条件状态须另按规则处理。
Privileged系统与特权

扩展条件:需要实现 S-mode;可在 S-mode 或 M-mode 执行。H 扩展的 VS/VU 返回与 VTSR 限制另有规则。

指令行为说明

SRET 无显式操作数,固定编码为 0x10200073。未实现 H 时,返回模式由 sstatus.SPP 选择(0→U、1→S),SIE←SPIE、SPIE←1、SPP←0、PC←sepc,并清 mstatus.MPRV。sepc[0] 恒为零;支持切换 IALIGN 的实现中,IALIGN=32 时隐式读取屏蔽 bit 1。S-mode 中 TSR=1 时引发非法指令异常;M-mode 不受该 TSR 检查限制,低于 S 执行不合法。H 下,V=0 使用 hstatus.SPV/SPP 选择返回模式并清 SPV,V=1 使用 vsstatus/vsepc;VTSR 和扩展条件状态仍适用。

SRET 指令解析与返回动画

从 SYSTEM 固定编码开始,展示 V=0 基础 SRET 的权限检查、sepc 到 PC 的恢复,以及 SPP/SPIE 状态更新。

无显式操作数
sretsret
执行环境mode=S
31..20
19..15
14..12
11..7
6..0
000100000010
funct12
00000
rs1=x0
000
funct3
00000
rd=x0
1110011
SYSTEM
instruction
0x10200073
opcode
1110011 -> SYSTEM
funct3
000 -> privileged return form
fixed
funct12=000100000010, rs1=x0, rd=x0
permission
S-mode may execute SRET
sepc
sepc=0x0000000000004040 -> pc=0x0000000000004040 (bit 1 masked)
SPP
SPP=U -> privilege=U
SPIE
SIE=SPIE=1; SPIE=1
final
尚未提交返回状态

SRET 动画假定实现 U/S/M,仅建模 V=0 的基础路径(不含 H 虚拟化);sepc 为已存储的 XLEN 位值,bit 0 必须为零,IALIGN=32 隐式读取屏蔽 bit 1,成功返回清 MPRV:不展示 hstatus.SPV、VS-mode 的 vsstatus/vsepc、VTSR 或 SDT/ELP 等扩展条件状态;不应将该简化视图用于虚拟化返回。

快速理解与检索要点

Supervisor 陷阱返回:无 H 时从 sepc、SPP/SPIE 恢复 PC、模式与 SIE,清 SPP、置 SPIE;S-mode 受 TSR 限制。

SYSTEM 编码中 funct12=000100000010,rs1=x0、rd=x0、funct3=000。
实现 H 的 V=0 路径执行后 pc<-sepc,特权级由 hstatus.SPV/SPP 确定,SIE<-SPIE,SPIE<-1,SPP<-0;VS-mode 路径使用 vsepc/vsstatus。
S-mode 下 mstatus.TSR=1 会让 SRET 触发非法指令异常;M-mode 执行不受该 TSR 限制。
成功返回低于 M 的模式会清 mstatus.MPRV;sepc 的隐式读取遵守 IALIGN 的 bit 1 屏蔽规则。

常见使用场景

OS内核异常/中断返回

假设无 H、实现 U/S/M、支持切换 IALIGN、S-mode 且 TSR=0,sepc=0x4042、IALIGN=32、SPP=U、SPIE=1:sret 写 PC=0x4040、模式 U、SIE=1、SPIE=1、SPP=0、MPRV=0;不展示 SDT/ELP 等扩展状态。

使用前检查清单

语法检查
  • 无显式汇编操作数;32 位 SYSTEM 固定编码 0x10200073,rs1/rd=00000、funct3=000。
  • 需要实现 S-mode;基本路径可在 S/M-mode 执行,S-mode 的 TSR=1 会引发非法指令异常。
语义检查
  • 无 H 时,SPP 选择 U/S,SIE←SPIE、SPIE←1、SPP←0、PC←sepc,并清 MPRV。
  • sepc[0]=0;可切换 IALIGN 的实现中,IALIGN=32 时隐式读取屏蔽 bit 1。H 和 SDT/ELP 等条件状态须另按规则处理。

容易混淆 / 常见误区

U-mode 执行触发非法指令异常。
mstatus.TSR=1 时,S-mode 执行 SRET 触发非法指令异常。
V=0 的基础路径不是普通跳转:目标 PC 来自 sepc,返回特权级和中断使能来自 SPP/SPIE;VS-mode 路径使用 vsepc/vsstatus。
xRET 允许但不要求清除 LR/SC 保留;需要时陷阱处理程序应显式清除。

常见问题

SRET 和 MRET 的主要区别是什么?

在 V=0 的基础路径中,SRET 使用 sepc 和 SPP/SPIE;MRET 使用 mepc 和 MPP/MPIE。虚拟化的 SRET 还必须遵守 hstatus/vsstatus/vsepc 的专门规则。

TSR 对 SRET 有什么影响?

当 mstatus.TSR=1 且当前在 S-mode 执行 SRET 时,规范要求触发非法指令异常,而不是完成返回。