进入中断
1.跳转到CSR寄存器mtvec(machine Trap-Vector Base-Address Register)——可读可写——定义的PC地址开始进行
mode = 0. 跳转到BASE
mode = 1. 跳转到BASE + 4 * CAUSE(异常编号)
2.更新CSR寄存器mcause
3.更新CSR寄存器 mepc(机器模式异常PC寄存器 Machine Exception Program Counter,可读可写)
保存返回PC
自动更新mepc为当前遇到指令的pc值
mepc = pc+4(2),下一条尚未执行指令
4.更新CSR寄存器mtval( Machine Trap Value Register ),以反映引起当前异常的存储器访问地址或者指令编码。
存储器访问异常(断点、取指读写异常):mtval = 存储器访问地址
非法指令:mtval = 非法指令编码
5.更新CSR寄存器mstatus (Machine Status register)
MIE = 1 : machine mode 所有中断都打开,进入异常之后MIE = 0
MIE = 0 : machine mode 所有中断关闭
MPIE = 异常发生前的MIE,作用是异常结束之后可以恢复之前MIE
MPP = 异常发生前的模式,如果只支持机器模式,则===11
执行异常(异常服务程序)
进入异常之后,从mtvec的pc执行,根据cause编号,进入不同 异常服务子程序。
退出异常
相关指令(Trap Return Instruction):MRET,SRET,URET
1.pc = mepc
2.mstatus.MIE = MPIE
3.mstatus.MPIE = 1