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

RISC-V SRET 指令详解

指令手册I-type

S 模式陷阱返回:pc<-sepc,特权级<-sstatus.SPP,SIE<-SPIE;S-mode 下 TSR=1 时触发非法指令异常。

指令语法

sret
操作数说明
目标寄存器 rd:存放运算结果的通用寄存器。
源寄存器 rs1:第一个操作数所在的寄存器。
立即数 imm:12 位有符号立即数,符号扩展后与 rs1 进行运算。
Privileged系统与特权

指令行为说明

SRET 是 supervisor 陷阱处理程序使用的特权返回指令。执行时,pc 设置为 sepc,当前特权级恢复为 sstatus.SPP,SIE 恢复为 SPIE,SPIE 置 1,SPP 清零。SRET 可在 S-mode 或更高特权级执行;若 mstatus.TSR=1,在 S-mode 执行 SRET 会触发非法指令异常,U-mode 执行也会触发非法指令异常。

SRET 指令解析与返回动画

从 SYSTEM 固定编码开始,展示 xRET 的权限检查、EPC 到 PC 的恢复,以及 previous interrupt-enable 和 previous privilege 字段更新。

无显式操作数
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
SPP
SPP=U -> privilege=U
SPIE
SIE=SPIE=1; SPIE=1
final
0x0000000000004040; mode=U

该动画只展示特权架构定义的 ISA 可见返回状态;不模拟操作系统调度、handler 内容、流水线、延迟或平台策略。

快速理解与检索要点

SRET 把 supervisor trap handler 保存的返回上下文恢复到架构状态:PC 来自 sepc,返回特权级来自 SPP,中断使能来自 SPIE。TSR 可让 S-mode 中的 SRET 陷入非法指令异常。

SYSTEM 编码中 funct12=000100000010,rs1=x0、rd=x0、funct3=000。
执行后 pc<-sepc,特权级<-SPP,SIE<-SPIE,SPIE<-1,SPP<-0。
S-mode 下 mstatus.TSR=1 会让 SRET 触发非法指令异常;M-mode 执行不受该 TSR 限制。

常见使用场景

OS内核异常/中断返回

结合 «sret # Return from S-mode trap» 等实际代码理解该场景。

使用前检查清单

语法检查
  • 确认当前指令格式为 I-type。
  • 确认操作数排列顺序与示例一致。
语义检查
  • 确认目标寄存器用途和调用约定兼容。
  • 确认该指令不是伪指令展开后的底层形式。

容易混淆 / 常见误区

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

常见问题

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

SRET 使用 sepc 和 SPP/SPIE 恢复 supervisor trap 返回状态;MRET 使用 mepc 和 MPP/MPIE 恢复 machine trap 返回状态。

TSR 对 SRET 有什么影响?

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