用压缩指令从异常处理程序返回RISC-V。

问题描述 投票:0回答:1

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

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

在压缩指令模式下,有4字节和2字节混合的指令。如果你不更新 mepc 而只是 mret 然后你一直得到同样的异常。 但总是在陷阱中加入4 mepc 好像是混合压缩指令的一个bug。

我是不是遗漏了什么?

riscv
1个回答
3
投票

我看到退出 risc-v 异常处理程序的标准方法是 update mepc to mepc+4 before mret。

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

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

许多可恢复的异常需要重新运行引起异常的指令--例如引起页故障的加载&存储(有32位和16位两种形式),需要在页表修复后重新执行(从光盘读入页并映射到用户的地址空间)。

其他许多异常情况一般是不能重新执行的。

但是,对一条指令的仿真需要知道它的大小,比如说对 ecall......如果你选择模拟,例如,错位的内存访问,你将确实必须对指令的大小做出决定,因为模拟它意味着恢复过去。  另外要注意的是,RISC V支持16位、32位、48位、64位和更长的指令,所以要仿真指令的异常处理程序需要能够解码它们的长度(不过只是选择仿真的指令)。

另外需要补充的是,你可能会看到的异常处理程序示例是为了在没有压缩指令集的情况下工作而设计的,由于RVC是可选的,所以这是一个合理的设计选择(当然,理想情况下,会有明确的说明)。

© www.soinside.com 2019 - 2024. All rights reserved.