繁体   English   中英

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

[英]RISC-V return from exception handler with compressed instructions

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

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

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

我错过了什么吗?

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM