SRET 和 MRET 的主要区别是什么?
在 V=0 的基础路径中,SRET 使用 sepc 和 SPP/SPIE;MRET 使用 mepc 和 MPP/MPIE。虚拟化的 SRET 还必须遵守 hstatus/vsstatus/vsepc 的专门规则。
Supervisor 陷阱返回:无 H 时从 sepc、SPP/SPIE 恢复 PC、模式与 SIE,清 SPP、置 SPIE;S-mode 受 TSR 限制。
扩展条件:需要实现 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 和扩展条件状态仍适用。
从 SYSTEM 固定编码开始,展示 V=0 基础 SRET 的权限检查、sepc 到 PC 的恢复,以及 SPP/SPIE 状态更新。
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 限制。
假设无 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 等扩展状态。
在 V=0 的基础路径中,SRET 使用 sepc 和 SPP/SPIE;MRET 使用 mepc 和 MPP/MPIE。虚拟化的 SRET 还必须遵守 hstatus/vsstatus/vsepc 的专门规则。
当 mstatus.TSR=1 且当前在 S-mode 执行 SRET 时,规范要求触发非法指令异常,而不是完成返回。