diff --git a/components/esp32/panic.c b/components/esp32/panic.c index 8edb70b233..bc795e3ccc 100644 --- a/components/esp32/panic.c +++ b/components/esp32/panic.c @@ -167,6 +167,7 @@ static const char *edesc[] = { static void commonErrorHandler(XtExcFrame *frame); static inline void disableAllWdts(); +static void illegal_instruction_helper(XtExcFrame *frame); //The fact that we've panic'ed probably means the other CPU is now running wild, possibly //messing up the serial output, so we stall it here. @@ -332,10 +333,36 @@ void xt_unhandled_exception(XtExcFrame *frame) return; } panicPutStr(". Exception was unhandled.\r\n"); + if (exccause == 0 /* IllegalInstruction */) { + illegal_instruction_helper(frame); + } } commonErrorHandler(frame); } +static void illegal_instruction_helper(XtExcFrame *frame) +{ + /* Print out memory around the instruction word */ + uint32_t epc = frame->pc; + epc = (epc & ~0x3) - 4; + + /* check that the address was sane */ + if (epc < SOC_IROM_MASK_LOW || epc >= SOC_IROM_HIGH) { + return; + } + volatile uint32_t* pepc = (uint32_t*)epc; + + panicPutStr("Memory dump at 0x"); + panicPutHex(epc); + panicPutStr(": "); + + panicPutHex(*pepc); + panicPutStr(" "); + panicPutHex(*(pepc + 1)); + panicPutStr(" "); + panicPutHex(*(pepc + 2)); + panicPutStr("\r\n"); +} /* If watchdogs are enabled, the panic handler runs the risk of getting aborted pre-emptively because diff --git a/components/soc/esp32/include/soc/soc.h b/components/soc/esp32/include/soc/soc.h index bc822e2364..86a94c9747 100644 --- a/components/soc/esp32/include/soc/soc.h +++ b/components/soc/esp32/include/soc/soc.h @@ -283,6 +283,8 @@ #define SOC_DROM_HIGH 0x3F800000 #define SOC_IROM_LOW 0x400D0000 #define SOC_IROM_HIGH 0x40400000 +#define SOC_IROM_MASK_LOW 0x40000000 +#define SOC_IROM_MASK_HIGH 0x40070000 #define SOC_IRAM_LOW 0x40080000 #define SOC_IRAM_HIGH 0x400A0000 #define SOC_RTC_IRAM_LOW 0x400C0000