SRET 和 MRET 的主要区别是什么?
在 V=0 的基础路径中,SRET 使用 sepc 和 SPP/SPIE;MRET 使用 mepc 和 MPP/MPIE。虚拟化的 SRET 还必须遵守 hstatus/vsstatus/vsepc 的专门规则。
监督者陷阱返回:在 V=0 基础路径中 pc<-sepc、特权级由 sstatus.SPP 恢复、SIE<-SPIE;S-mode 下 TSR=1 时触发非法指令异常。虚拟化路径改用 hstatus/vsstatus/vsepc 的规则。
SRET 是监督者陷阱返回指令。无虚拟化的 V=0 路径先由 hstatus.SPV 与 sstatus.SPP 决定返回模式,然后清 hstatus.SPV、清 SPP、令 SIE<-SPIE、SPIE<-1,最后 pc<-sepc;未实现 H 时该路径退化为通常的 SPP/SPIE/sepc 恢复。V=1 的 VS-mode 路径改用 vsstatus.SPP/SPIE 和 vsepc。若 mstatus.TSR=1,在 S-mode 执行会触发非法指令异常;在低于 S 的模式执行 xRET 也触发非法指令异常。
从 SYSTEM 固定编码开始,展示 V=0 基础 SRET 的权限检查、sepc 到 PC 的恢复,以及 SPP/SPIE 状态更新。
SRET 动画仅建模 V=0 的基础路径(不含 H 虚拟化):不展示 hstatus.SPV、VS-mode 的 vsstatus/vsepc、VTSR 或 Ssdbltrp 条件状态;不应将该简化视图用于虚拟化返回。
SRET 在 V=0 路径恢复 trap handler 保存的返回上下文:PC 来自 sepc,返回特权级来自 SPP,中断使能来自 SPIE。TSR 可让 S-mode 中的 SRET 陷入非法指令异常;VS-mode 使用其专门的 vsepc/vsstatus 规则。
结合 «sret # Return from S-mode trap» 等实际代码理解该场景。
在 V=0 的基础路径中,SRET 使用 sepc 和 SPP/SPIE;MRET 使用 mepc 和 MPP/MPIE。虚拟化的 SRET 还必须遵守 hstatus/vsstatus/vsepc 的专门规则。
当 mstatus.TSR=1 且当前在 S-mode 执行 SRET 时,规范要求触发非法指令异常,而不是完成返回。