panic: dump some instruction memory on IllegalInstruction exception

pull/2814/head
Ivan Grokhotkov 2018-12-03 06:57:26 +08:00
rodzic 646d36c728
commit 04c511c9b5
2 zmienionych plików z 29 dodań i 0 usunięć

Wyświetl plik

@ -188,6 +188,7 @@ static const char *edesc[] = {
static void commonErrorHandler(XtExcFrame *frame); static void commonErrorHandler(XtExcFrame *frame);
static inline void disableAllWdts(); 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 //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. //messing up the serial output, so we stall it here.
@ -357,11 +358,37 @@ void xt_unhandled_exception(XtExcFrame *frame)
return; return;
} }
panicPutStr(". Exception was unhandled.\r\n"); panicPutStr(". Exception was unhandled.\r\n");
if (exccause == 0 /* IllegalInstruction */) {
illegal_instruction_helper(frame);
}
esp_reset_reason_set_hint(ESP_RST_PANIC); esp_reset_reason_set_hint(ESP_RST_PANIC);
} }
commonErrorHandler(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 If watchdogs are enabled, the panic handler runs the risk of getting aborted pre-emptively because

Wyświetl plik

@ -286,6 +286,8 @@
#define SOC_DROM_HIGH 0x3F800000 #define SOC_DROM_HIGH 0x3F800000
#define SOC_IROM_LOW 0x400D0000 #define SOC_IROM_LOW 0x400D0000
#define SOC_IROM_HIGH 0x40400000 #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_LOW 0x40070000
#define SOC_CACHE_PRO_HIGH 0x40078000 #define SOC_CACHE_PRO_HIGH 0x40078000
#define SOC_CACHE_APP_LOW 0x40078000 #define SOC_CACHE_APP_LOW 0x40078000