RISC-V 从带有压缩指令的异常处理程序返回

rat*_*att 6 assembly exception riscv

我看到退出 RISC-V 异常处理程序的标准方法是更新mepcmepc+4before mret

但如果在压缩指令模式下下一条指令只有 2 个字节长,这会不会造成问题?

在压缩指令模式下,混合有 4 字节和 2 字节指令。如果您不更新mepc,那么mret您就会不断收到相同的异常。但总是将 4 添加到 trap 中mepc似乎是混合压缩指令的一个错误。

我错过了什么吗?

Eri*_*idt 8

我看到退出 risc-v 异常处理程序的标准方法是在 mret 之前将 mepc 更新为 mepc+4。

这些不是严肃的异常处理程序;它们只是说明性的——显示异常的捕获,并返回到被中断的代码,而没有完成给定情况所需的实际异常处理。因此,防止无限循环最简单的方法就是跳过有问题的指令。

为了返回导致异常的代码,我们推进 pc 的少数几个地方之一是处理ecall. 据我所知,没有压缩(16 位)ecall指令。

许多可恢复异常需要重新运行导致异常的指令——导致页面错误的加载和存储(32位和16位形式都可用),例如,一旦页表被修复就需要重新执行(从磁盘读取并映射到用户地址空间的页面)。

许多其他异常通常是不可恢复的。

然而,指令的仿真需要知道其大小,就像 的情况一样ecall。例如,如果您选择模拟未对齐的内存访问,您确实必须决定指令的大小,因为模拟它意味着恢复过去的指令。另请注意,RISC V 支持 16 位、32 位、48 位、64 位和更长的指令,因此要模拟指令的异常处理程序将需要能够解码其长度(仅选择为不过,仿真)。

另一件需要补充的事情是,您可能正在查看的示例异常处理程序被设计为无需压缩指令集即可工作,并且由于 RVC 是可选的,因此这是一个合理的设计选择(当然,理想情况下会明确说明)。