本文主要是介绍EPC和ErrorEPC,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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);
作者声明:本文是作者学习总结,能力有限,难免出现问题,如发现问题会及时修改。如有侵权,联系本人删除。
这篇关于EPC和ErrorEPC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!