EPC :Exception Program Counter (CP0 Register 14, Select 0), 异常返回地址寄存器,用于存储异常返回地址。
ErrorEPC :ErrorEPC Register (CP0 Register 30, Select 0),发生复位异常时的异常地址寄存器。
EPC和ErrorEPC的相同点:
- 两个寄存器都是可读可写的,存储32bit地址,通常情况下发生异常时由硬件更新。软件也可以去写这两个寄存器。
- 用于记录发生异常时的指令的虚拟地址。
如果发生异常的指令在分支延迟槽里(cause[BD]=1),EPC和ErrorEPC指向前一条分支或跳转指令。 - EPC和ErrorEPC是eret指令的返回地址。
EPC和ErrorEPC的不同点:
- EPC发生异常或中断时会被更新,记录的是当前这次发生异常的虚拟地址。
ErrorEPC发生reset异常时会被更新,记录的是上一次异常的虚拟地址。 - 当SR(EXL)=1时,cpu不去写EPC。只有SR(EXL)=0时,EPC会被更新。
-
下图是mips官方文档对这两个寄存器的描述:
-
ErrorEPC寄存器可以在重启之后对系统上一次reset前的异常进行debug,使用方法如下:
__asm__ __volatile__ (
"mfc0 %0, $30, 0 \n\t"
"nop \n\t"
:"=r"(errorpc)
:);
printk("CPU%d RESET ERROR PC:%08X\n", cpu,errorpc);
作者声明:本文是作者学习总结,能力有限,难免出现问题,如发现问题会及时修改。如有侵权,联系本人删除。
来源:CSDN
作者:shliushliu
链接:https://blog.csdn.net/shliushliu/article/details/104738872