RZN2L使用backtrace时,栈地址不对

问题

在使用RZN2L进行backtrace实验时,发现在进入Abort中断后栈顶指针也发生了很大的变化,猜测是因为RZN2L默认运行在SVC模式,而进入Abort后切换到了IRQ模式,导致栈顶地址错误。

RZN2L在system_init函数设置成SVC模式

1
2
3
4
5
6
7
__asm volatile (
"cpsr_save: \n"
" MRS r0, cpsr \n" /* Read original CPSR value to r0 */
" BIC r0, r0, %[bsp_mode_mask] \n" /* Clear the mode bits */
" ORR r0, r0, %[bsp_svc_mode] \n" /* Set value of SVC mode bits */
" MSR SPSR_hyp, r0 \n" /* Write r0 to SPSR_hyp */
::[bsp_mode_mask] "i" (BSP_MODE_MASK), [bsp_svc_mode] "i" (BSP_SVC_MODE) : "memory");

解决方法

在Abort中断函数切换回SVC模式,再进行lr,sp寄存器的获取

1
2
3
4
5
6
7
8
9
10
11
__asm volatile (
"mrs r0, cpsr \n"
"bic r0, r0, %[bsp_mode_mask] \n"
"orr r0, r0, %[bsp_svc_mode] \n"
"msr cpsr, r0 \n"
"push {lr} \n"
"mov r0, lr \n"
"mov r1, sp \n"
"bl backtrace_fault \n"
::[bsp_mode_mask] "i" (BSP_MODE_MASK), [bsp_svc_mode] "i" (BSP_SVC_MODE) : "memory"
);

backtrace介绍

backtrace介绍