RISC-V 异常与中断
RISC-V exceptions vs interrupts
我准备用 CLINT 编写我自己的 RV32I 内核。但是,有些事情我不太清楚。至少我在文档中找不到它。
以下是特权 isa 规范对 ecall/ebreak 的说明:
ECALL and EBREAK cause the receiving privilege mode’s epc register to be set to the address of the ECALL or EBREAK instruction itself, not the address of the following instruction.
所以这意味着,为 mret 设置正确的 mepc 是 SW 处理程序的责任。我假设此行为也适用于所有其他异常。
异步中断呢?硬件是否自动将 mepc 设置为 PC+4?从我在不同的 SW 处理程序中看到的情况来看,似乎是这样的,但实际上我在文档中找不到它。
希望有人能指出正确的文档。
非特权 RISC-V 规范的第 1.6 节定义异常由指令引发,中断由外部事件引发。
当出现(同步)异常时,触发指令无法正确完成。因此,return 地址有两种可能性:指令本身或后续指令。两种解决方案都有意义。如果它指向指令本身,则更容易确定问题并做出相应的反应。如果它指向下一条指令,则当 return 来自异常处理程序
时不需要递增地址
(Asynchronous) interrupts 不同,它们打断独立线程的执行指令流。因此,return地址只有一个合理的解法:第一条还没有完成的指令。因此,当 return 从中断处理程序执行时,执行将在中断处继续执行。
在此背景下,特权RISC-V规范第3.1.15节的简要定义
When a trap is taken into M-mode, mepc is written with the virtual address of the instruction that was interrupted or that encountered the exception.
很清楚:当引发中断时,mepc 指向第一条未完成的指令或指向引发异常的指令。
我准备用 CLINT 编写我自己的 RV32I 内核。但是,有些事情我不太清楚。至少我在文档中找不到它。 以下是特权 isa 规范对 ecall/ebreak 的说明:
ECALL and EBREAK cause the receiving privilege mode’s epc register to be set to the address of the ECALL or EBREAK instruction itself, not the address of the following instruction.
所以这意味着,为 mret 设置正确的 mepc 是 SW 处理程序的责任。我假设此行为也适用于所有其他异常。
异步中断呢?硬件是否自动将 mepc 设置为 PC+4?从我在不同的 SW 处理程序中看到的情况来看,似乎是这样的,但实际上我在文档中找不到它。
希望有人能指出正确的文档。
非特权 RISC-V 规范的第 1.6 节定义异常由指令引发,中断由外部事件引发。
当出现(同步)异常时,触发指令无法正确完成。因此,return 地址有两种可能性:指令本身或后续指令。两种解决方案都有意义。如果它指向指令本身,则更容易确定问题并做出相应的反应。如果它指向下一条指令,则当 return 来自异常处理程序
时不需要递增地址(Asynchronous) interrupts 不同,它们打断独立线程的执行指令流。因此,return地址只有一个合理的解法:第一条还没有完成的指令。因此,当 return 从中断处理程序执行时,执行将在中断处继续执行。
在此背景下,特权RISC-V规范第3.1.15节的简要定义
When a trap is taken into M-mode, mepc is written with the virtual address of the instruction that was interrupted or that encountered the exception.
很清楚:当引发中断时,mepc 指向第一条未完成的指令或指向引发异常的指令。