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.
return;
}
panicPutStr(". Exception was unhandled.\r\n");
+ if (exccause == 0 /* IllegalInstruction */) {
+ illegal_instruction_helper(frame);
+ }
esp_reset_reason_set_hint(ESP_RST_PANIC);
}
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
#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_CACHE_PRO_LOW 0x40070000
#define SOC_CACHE_PRO_HIGH 0x40078000
#define SOC_CACHE_APP_LOW 0x40078000