我将用CLINT编写我自己的RV32I内核。但是,有些事情我不太清楚。至少我在文档中找不到它。 这是特权isa规范对ecall / ebreak的说明:
ECALL和EBREAK导致将接收特权模式的epc寄存器设置为ECALL或EBREAK指令本身的地址,而不是以下指令的地址。
因此,这意味着为mret设置正确的mepc是SW处理程序的责任。我认为这种行为也适用于所有其他异常。
异步中断呢?硬件会自动将mepc设置为PC + 4吗?从我在不同的SW处理程序中看到的情况来看,似乎是这样,但实际上我在文档中找不到它。
希望有人可以指出正确的文档。
答案 0 :(得分:3)
无特权的RISC-V规范的1.6节定义了异常是由指令引发的,而中断是由外部事件引发的。
引发(同步)异常时,触发指令无法正确完成。因此,返回地址有两种可能性:指令本身或后续指令。两种解决方案都有意义。如果它指向指令本身,则更容易确定问题并做出相应反应。如果它指向下一条指令,则从异常处理程序返回时无需增加地址
(异步)中断不同,它们中断了独立线程的已执行指令流。因此,对于返回地址,只有一个合理的解决方案:第一条尚未完成的指令。因此,从中断处理程序返回时,执行将在被中断的地方继续进行。
在此背景下,特权RISC-V规范第3.1.15节中的简要定义
当陷阱进入M模式时,将使用中断或遇到异常的指令的虚拟地址写入mepc。
很清楚:mepc指向引发中断的第一条未完成指令或引发异常的指令。