diff --git a/core/debug_dumps.c b/core/debug_dumps.c index 6075f40..5878ae8 100644 --- a/core/debug_dumps.c +++ b/core/debug_dumps.c @@ -68,6 +68,22 @@ void dump_stack(uint32_t *sp) { } } +/* Dump exception status registers as stored above 'sp' + by the interrupt handler preamble +*/ +void dump_exception_registers(uint32_t *sp) { + uint32_t excsave1; + uint32_t *saved = sp - (0x50 / sizeof(uint32_t)); + printf("Registers:\n"); + RSR(excsave1, excsave1); + printf("a0 %08x ", excsave1); + printf("a1 %08x ", (intptr_t)sp); + for(int a = 2; a < 14; a++) { + printf("a%-2d %08x%c", a, saved[a+3], a == 3 || a == 7 || a == 11 ? '\n':' '); + } + printf("SAR %08x\n", saved[0x13]); +} + void IRAM fatal_exception_handler(uint32_t *sp) { if (!sdk_NMIIrqIsOn) { vPortEnterCritical(); @@ -78,11 +94,12 @@ void IRAM fatal_exception_handler(uint32_t *sp) { Cache_Read_Disable(); Cache_Read_Enable(0, 0, 1); dump_excinfo(); - if (sp) + if (sp) { + dump_exception_registers(sp); dump_stack(sp); + } uart_flush_txfifo(0); uart_flush_txfifo(1); sdk_system_restart_in_nmi(); while(1) {} } -