EPC和ErrorEPC
EPC : (CP0 14, 0), 异常返回地址寄存器,用于存储异常返回地址。
: (CP0 30, 0),发生复位异常时的异常地址寄存器。
EPC和的相同点: 两个寄存器都是可读可写的,存储32bit地址,通常情况下发生异常时由硬件更新。软件也可以去写这两个寄存器。用于记录发生异常时的指令的虚拟地址。
如果发生异常的指令在分支延迟槽里(cause[BD]=1),EPC和指向前一条分支或跳转指令。EPC和是eret指令的返回地址。
EPC和的不同点: EPC发生异常或中断时会被更新,记录的是当前这次发生异常的虚拟地址。
发生reset异常时会被更新,记录的是上一次异常的虚拟地址。当SR(EXL)=1时,cpu不去写EPC。只有SR(EXL)=0时,EPC会被更新。
__asm__ __volatile__ ("mfc0 %0, $30, 0 \n\t""nop \n\t":"=r"(errorpc):);
printk("CPU%d RESET ERROR PC:X\n", cpu,errorpc);