来自带有压缩指令的异常处理程序的 RISC-V return

RISC-V return from exception handler with compressed instructions

我看到退出 RISC-V 异常处理程序的标准方法是在 mret.

之前将 mepc 更新为 mepc+4

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

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

我是不是漏掉了什么?

I see the standard way of exiting risc-v exception handler is update mepc to mepc+4 before mret.

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

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

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

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

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

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