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

Exception 带压缩指令的异常处理程序返回RISC-V,exception,assembly,riscv,Exception,Assembly,Riscv,我看到退出RISC-V异常处理程序的标准方法是在mret之前将mepc更新为mepc+4 但如果下一条指令在压缩指令模式下只有2字节长,这不会导致问题吗 在压缩指令模式中,存在4字节和2字节指令的混合。如果不更新mepc而只更新mret,则会不断得到相同的异常。但总是在mepc中添加4似乎是混合压缩指令的一个缺陷 我错过什么了吗 我看到退出risc-v异常处理程序的标准方法是在mret之前将mepc更新为mepc+4 这些不是严重的异常处理程序;它们只是说明性的—显示捕获异常,并返回到中断的代码

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

但如果下一条指令在压缩指令模式下只有2字节长,这不会导致问题吗

在压缩指令模式中,存在4字节和2字节指令的混合。如果不更新
mepc
而只更新
mret
,则会不断得到相同的异常。但总是在mepc中添加4似乎是混合压缩指令的一个缺陷

我错过什么了吗

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

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

在处理
ecall
过程中,我们可以推进pc以返回导致异常的代码。据我所知,没有压缩(16位)
ecall
指令

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

许多其他例外情况通常不可恢复

但是,模拟指令需要知道其大小,就像
ecall
一样。例如,如果您选择模拟未对齐的内存访问,那么您确实需要决定指令的大小,因为模拟它意味着恢复过去。还要注意的是,RISC V支持16位、32位、48位、64位和更长的指令,因此要模拟指令的异常处理程序需要能够解码指令的长度(不过,只有选择用于模拟的指令)


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

@Dave2e,您以“需要详细信息”结束了这个问题没有暗示遗漏了什么细节。这个问题对我来说是非常清楚的,在它结束之前我就这样回答了。如果给出一个合理的答案,关闭是没有意义的。至少在大多数系统中,大多数页面错误都不是硬的(需要从磁盘进行页面)。更常见的是内核延迟分配和/或CoW导致的软页面错误。当然,硬页错误就是一个例子。感谢Erik清楚地列出了所有异常以及如何处理它们。因此,对于我的自定义陷阱处理程序,解决方案是解码指令大小,并在mret恢复之前相应地调整mepc以获得指令大小,我只查看指令的较低两位。XXAA!=XX11是16位指令。是的,该测试应该告诉您是递增2还是递增4。对于外部中断,不要调整pc,因为我们只想恢复未修改的中断线程;只有在模拟/模拟例外指令(如ecall)或只想跳过例外指令时,才可调整pc。