#include #include #include #include #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" .global xt_highint4 .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<