首页 > 解决方案 > RISC-V 从带有压缩指令的异常处理程序返回

问题描述

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

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

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

我错过了什么吗?

标签: exceptionassemblyriscv

解决方案


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

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

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

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

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

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

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


推荐阅读