DRET

RISC-V DRET 指令详解

指令手册I-type

从调试模式返回:PC←dpc,恢复 dcsr 记录的 prv/v(以及适用时的 pelp)状态。仅在 D-mode 且不从 Program Buffer 执行时有定义。

指令语法

dret
操作数说明
无显式汇编操作数;调试规范给出的推荐编码为 0x7b200073。
仅在 D-mode 且不从 Program Buffer 执行时有定义;不能推断其他上下文的固定异常。
从 dpc 恢复 PC,按 dcsr.prv/v 恢复模式;适用时 ELP 从 pelp 恢复。
恢复到低于 M 的模式清 MPRV;Zicfilp、Smdbltrp 和 Ssdbltrp 的条件更新见调试恢复规则。
Debug系统与特权

扩展条件:调试规范 Sdext 的调试模式返回;推荐的 DRET 机制仅在 D-mode 且不从 Program Buffer 执行时有定义。

指令行为说明

DRET 由 Debug Module 用于恢复正常执行。它的推荐编码为 0x7b200073;执行时 PC 从 dpc 恢复,正常执行按 dcsr 中的 prv 和 v 恢复,适用时 ELP 从 pelp 恢复。DRET 仅在 D-mode 且不从 Program Buffer 执行时有定义;其他上下文的行为不由这段 DRET 定义规定。

快速理解与检索要点

DRET 是调试规范推荐的恢复机制:仅 D-mode 且不从 Program Buffer 执行时有定义,PC 从 dpc 恢复,模式按 dcsr.prv/v 恢复。

DRET 的推荐编码是 0x7b200073;PC 从 dpc 恢复。
正常执行按 dcsr.prv 和 dcsr.v 恢复,适用时 ELP 从 pelp 恢复;它不是 mret/sret 的中断使能恢复序列。
仅 D-mode 且不从 Program Buffer 执行时有定义;不要推断未定义上下文的异常或平台策略。
调试恢复到低于 M 的模式时清 mstatus.MPRV;Zicfilp 的 ELP/pelp 和双陷阱状态按其适用条件更新。

常见使用场景

调试器返回

仅在 D-mode 且不从 Program Buffer 执行:若已准备 dpc=0x8000、dcsr.prv=M、v=0,dret 按调试恢复规则从 PC=0x8000 在 M-mode 恢复;不是 SRET/MRET 的中断使能恢复序列。

硬件断点恢复

仅在 D-mode 且不从 Program Buffer 执行:若已准备 dpc=0x8000、dcsr.prv=M、v=0,dret 按调试恢复规则从 PC=0x8000 在 M-mode 恢复;不是 SRET/MRET 的中断使能恢复序列。

使用前检查清单

语法检查
  • 无显式汇编操作数;调试规范给出的推荐编码为 0x7b200073。
  • 仅在 D-mode 且不从 Program Buffer 执行时有定义;不能推断其他上下文的固定异常。
语义检查
  • 从 dpc 恢复 PC,按 dcsr.prv/v 恢复模式;适用时 ELP 从 pelp 恢复。
  • 恢复到低于 M 的模式清 MPRV;Zicfilp、Smdbltrp 和 Ssdbltrp 的条件更新见调试恢复规则。

容易混淆 / 常见误区

调试规范给出推荐编码;不要把它当作普通用户态指令。
仅 D-mode 且不从 Program Buffer 执行时有定义;不推断其他上下文的固定异常。
恢复低于 M 的模式会清 MPRV;ELP、MDT、SDT 的适用条件按调试规范。

常见问题

它是用户态普通指令吗?

不是。DRET 只在 D-mode 且不从 Program Buffer 执行时有定义;它不是用户态汇编指令。

DRET 恢复哪些架构状态?

PC 从 dpc 恢复;正常执行按 dcsr.prv 与 dcsr.v 恢复,适用时 ELP 从 pelp 恢复。官方文本没有把它定义为 mret/sret 的中断使能恢复序列。