mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
64 lines
2.0 KiB
ArmAsm
64 lines
2.0 KiB
ArmAsm
#include "freertos/xtensa_rtos.h"
|
|
#include "esp_private/panic_reason.h"
|
|
#include "soc/soc.h"
|
|
|
|
#include "sdkconfig.h"
|
|
|
|
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
Panic handler.
|
|
Should be reached by call0 (preferable) or jump only. If call0, a0 says where
|
|
from. If on simulator, display panic message and abort, else loop indefinitely.
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
|
|
.section .iram1,"ax"
|
|
.global panicHandler
|
|
|
|
.global _xt_panic
|
|
.type _xt_panic,@function
|
|
.align 4
|
|
.literal_position
|
|
.align 4
|
|
|
|
_xt_panic:
|
|
/* Allocate exception frame and save minimal context. */
|
|
mov a0, sp
|
|
addi sp, sp, -XT_STK_FRMSZ
|
|
s32i a0, sp, XT_STK_A1
|
|
#if XCHAL_HAVE_WINDOWED
|
|
s32e a0, sp, -12 /* for debug backtrace */
|
|
#endif
|
|
rsr a0, PS /* save interruptee's PS */
|
|
s32i a0, sp, XT_STK_PS
|
|
rsr a0, EPC_1 /* save interruptee's PC */
|
|
s32i a0, sp, XT_STK_PC
|
|
#if XCHAL_HAVE_WINDOWED
|
|
s32e a0, sp, -16 /* for debug backtrace */
|
|
#endif
|
|
s32i a12, sp, XT_STK_A12 /* _xt_context_save requires A12- */
|
|
s32i a13, sp, XT_STK_A13 /* A13 to have already been saved */
|
|
call0 _xt_context_save
|
|
|
|
/* Save exc cause and vaddr into exception frame */
|
|
rsr a0, EXCCAUSE
|
|
s32i a0, sp, XT_STK_EXCCAUSE
|
|
rsr a0, EXCVADDR
|
|
s32i a0, sp, XT_STK_EXCVADDR
|
|
|
|
/* _xt_context_save seems to save the current a0, but we need the interuptees a0. Fix this. */
|
|
rsr a0, EXCSAVE_1 /* save interruptee's a0 */
|
|
|
|
s32i a0, sp, XT_STK_A0
|
|
|
|
/* Set up PS for C, disable all interrupts except NMI and debug, and clear EXCM. */
|
|
movi a0, PS_INTLEVEL(5) | PS_UM | PS_WOE
|
|
wsr a0, PS
|
|
|
|
//Call panic handler
|
|
mov a6,sp
|
|
call4 panicHandler
|
|
|
|
ret |