// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #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. We use interrupt level 4 for this. */ .section .iram1,"ax" .global xt_highint4 .type xt_highint4,@function .align 4 xt_highint4: /* 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<