我即将用 CLINT 编写我自己的 RV32I 内核。然而,有一些事情对我来说并不完全清楚。至少我在文档中找不到它。以下是特权 isa 规范对 ecall/ebreak 的说明:
ECALL 和 EBREAK 导致接收特权模式的 epc 寄存器被设置为 ECALL 或 EBREAK 指令本身的地址,而不是后续指令的地址。
所以这意味着,为 mret 设置正确的 mepc 是 SW 处理程序的责任。我认为这种行为也适用于所有其他例外。
异步中断呢?硬件是否自动将 mepc 设置为 PC+4?从我在不同软件处理程序中看到的情况来看,似乎是这样,但实际上我在文档中找不到它。
希望有人能指出我正确的文档。