120 lines
3.9 KiB
ArmAsm
120 lines
3.9 KiB
ArmAsm
|
#include <xtensa/coreasm.h>
|
||
|
#include <xtensa/corebits.h>
|
||
|
#include <xtensa/config/system.h>
|
||
|
#include <xtensa/simcall.h>
|
||
|
#include "freertos/xtensa_context.h"
|
||
|
#include "esp_panic.h"
|
||
|
#include "sdkconfig.h"
|
||
|
#include "soc/soc.h"
|
||
|
|
||
|
|
||
|
/*
|
||
|
In some situations, the panic handler needs to be invoked even when (low/medium priority) interrupts
|
||
|
are disabled. In that case, we use a high interrupt to panic anyway. This is the high-level interrupt
|
||
|
handler for such a situation.
|
||
|
*/
|
||
|
|
||
|
.section .iram1,"ax"
|
||
|
.type xt_highint4,@function
|
||
|
.align 4
|
||
|
xt_highint4:
|
||
|
|
||
|
#ifdef XT_INTEXC_HOOKS
|
||
|
/* Call interrupt hook if present to (pre)handle interrupts. */
|
||
|
movi a0, _xt_intexc_hooks
|
||
|
l32i a0, a0, 4<<2
|
||
|
beqz a0, 1f
|
||
|
.Ln_xt_highint4_call_hook:
|
||
|
callx0 a0 /* must NOT disturb stack! */
|
||
|
1:
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/* On the ESP32, this level is used for panic events that are detected by hardware and should
|
||
|
also panic when interrupts are disabled. At the moment, these are the interrupt watchdog
|
||
|
as well as the cache invalid access interrupt. (24 and 25) */
|
||
|
|
||
|
/* 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_4 /* 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 vaddr into exception frame */
|
||
|
rsr a0, EXCVADDR
|
||
|
s32i a0, sp, XT_STK_EXCVADDR
|
||
|
|
||
|
/* Figure out reason, save into EXCCAUSE reg */
|
||
|
|
||
|
rsr a0, INTERRUPT
|
||
|
extui a0, a0, ETS_CACHEERR_INUM, 1 /* get cacheerr int bit */
|
||
|
beqz a0, 1f
|
||
|
/* Kill this interrupt; we cannot reset it. */
|
||
|
rsr a0, INTENABLE
|
||
|
movi a4, ~(1<<ETS_CACHEERR_INUM)
|
||
|
and a0, a4, a0
|
||
|
wsr a0, INTENABLE
|
||
|
movi a0, PANIC_RSN_CACHEERR
|
||
|
j 9f
|
||
|
1:
|
||
|
#if CONFIG_INT_WDT_CHECK_CPU1
|
||
|
/* Check if the cause is the app cpu failing to tick.*/
|
||
|
movi a0, int_wdt_app_cpu_ticked
|
||
|
l32i a0, a0, 0
|
||
|
bnez a0, 2f
|
||
|
/* It is. Modify cause. */
|
||
|
movi a0,PANIC_RSN_INTWDT_CPU1
|
||
|
j 9f
|
||
|
2:
|
||
|
#endif
|
||
|
/* Set EXCCAUSE to reflect cause of the wdt int trigger */
|
||
|
movi a0,PANIC_RSN_INTWDT_CPU0
|
||
|
9:
|
||
|
/* Found the reason, now save it. */
|
||
|
s32i a0, sp, XT_STK_EXCCAUSE
|
||
|
|
||
|
/* _xt_context_save seems to save the current a0, but we need the interuptees a0. Fix this. */
|
||
|
rsr a0, EXCSAVE_4 /* 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
|
||
|
|
||
|
call0 _xt_context_restore
|
||
|
l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */
|
||
|
wsr a0, PS
|
||
|
l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */
|
||
|
wsr a0, EPC_1
|
||
|
l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */
|
||
|
l32i sp, sp, XT_STK_A1 /* remove exception frame */
|
||
|
rsync /* ensure PS and EPC written */
|
||
|
|
||
|
rsr a0, EXCSAVE_4 /* restore a0 */
|
||
|
rfi 4
|
||
|
|
||
|
/* The linker has no reason to link in this file; all symbols it exports are already defined
|
||
|
(weakly!) in the default int handler. Define a symbol here so we can use it to have the
|
||
|
linker inspect this anyway. */
|
||
|
|
||
|
.global ld_include_panic_highint_hdl
|
||
|
ld_include_panic_highint_hdl:
|
||
|
|