Merge branch 'bugfix/abort_in_interrupt_context' into 'master'

Panic handler backtrace fixes

See merge request !835
This commit is contained in:
Angus Gratton
2017-06-14 13:45:36 +08:00

View File

@@ -119,7 +119,9 @@ static __attribute__((noreturn)) inline void invoke_abort()
esp_apptrace_flush_nolock(ESP_APPTRACE_DEST_TRAX, ESP_APPTRACE_TRAX_BLOCK_SIZE*CONFIG_ESP32_APPTRACE_ONPANIC_HOST_FLUSH_TRAX_THRESH/100, CONFIG_ESP32_APPTRACE_ONPANIC_HOST_FLUSH_TMO); esp_apptrace_flush_nolock(ESP_APPTRACE_DEST_TRAX, ESP_APPTRACE_TRAX_BLOCK_SIZE*CONFIG_ESP32_APPTRACE_ONPANIC_HOST_FLUSH_TRAX_THRESH/100, CONFIG_ESP32_APPTRACE_ONPANIC_HOST_FLUSH_TMO);
#endif #endif
while(1) { while(1) {
if (esp_cpu_in_ocd_debug_mode()) {
__asm__ ("break 0,0"); __asm__ ("break 0,0");
}
*((int*) 0) = 0; *((int*) 0) = 0;
} }
} }
@@ -127,7 +129,7 @@ static __attribute__((noreturn)) inline void invoke_abort()
void abort() void abort()
{ {
#if !CONFIG_ESP32_PANIC_SILENT_REBOOT #if !CONFIG_ESP32_PANIC_SILENT_REBOOT
ets_printf("abort() was called at PC 0x%08x on core %d\n", (intptr_t)__builtin_return_address(0) - 3, xPortGetCoreID()); ets_printf("abort() was called at PC 0x%08x on core %d\r\n", (intptr_t)__builtin_return_address(0) - 3, xPortGetCoreID());
#endif #endif
invoke_abort(); invoke_abort();
} }
@@ -146,6 +148,7 @@ static const char *edesc[] = {
"Cp4Dis", "Cp5Dis", "Cp6Dis", "Cp7Dis" "Cp4Dis", "Cp5Dis", "Cp6Dis", "Cp7Dis"
}; };
#define NUM_EDESCS (sizeof(edesc) / sizeof(char *))
static void commonErrorHandler(XtExcFrame *frame); static void commonErrorHandler(XtExcFrame *frame);
@@ -197,7 +200,6 @@ void panicHandler(XtExcFrame *frame)
panicPutStr("Guru Meditation Error: Core "); panicPutStr("Guru Meditation Error: Core ");
panicPutDec(core_id); panicPutDec(core_id);
panicPutStr(" panic'ed ("); panicPutStr(" panic'ed (");
if (!abort_called) {
panicPutStr(reason); panicPutStr(reason);
panicPutStr(")\r\n"); panicPutStr(")\r\n");
if (frame->exccause == PANIC_RSN_DEBUGEXCEPTION) { if (frame->exccause == PANIC_RSN_DEBUGEXCEPTION) {
@@ -228,9 +230,6 @@ void panicHandler(XtExcFrame *frame)
if (debugRsn&XCHAL_DEBUGCAUSE_DEBUGINT_MASK) panicPutStr("DebugIntr "); if (debugRsn&XCHAL_DEBUGCAUSE_DEBUGINT_MASK) panicPutStr("DebugIntr ");
panicPutStr("\r\n"); panicPutStr("\r\n");
} }
} else {
panicPutStr("abort)\r\n");
}
if (esp_cpu_in_ocd_debug_mode()) { if (esp_cpu_in_ocd_debug_mode()) {
#if CONFIG_ESP32_APPTRACE_ENABLE #if CONFIG_ESP32_APPTRACE_ENABLE
@@ -245,9 +244,10 @@ void panicHandler(XtExcFrame *frame)
void xt_unhandled_exception(XtExcFrame *frame) void xt_unhandled_exception(XtExcFrame *frame)
{ {
haltOtherCore(); haltOtherCore();
if (!abort_called) {
panicPutStr("Guru Meditation Error of type "); panicPutStr("Guru Meditation Error of type ");
int exccause = frame->exccause; int exccause = frame->exccause;
if (exccause < 40) { if (exccause < NUM_EDESCS) {
panicPutStr(edesc[exccause]); panicPutStr(edesc[exccause]);
} else { } else {
panicPutStr("Unknown"); panicPutStr("Unknown");
@@ -267,6 +267,7 @@ void xt_unhandled_exception(XtExcFrame *frame)
return; return;
} }
panicPutStr(". Exception was unhandled.\r\n"); panicPutStr(". Exception was unhandled.\r\n");
}
commonErrorHandler(frame); commonErrorHandler(frame);
} }
@@ -374,7 +375,7 @@ static void doBacktrace(XtExcFrame *frame)
break; break;
} }
sp = *((uint32_t *) (sp - 0x10 + 4)); sp = *((uint32_t *) (sp - 0x10 + 4));
putEntry(pc, sp); putEntry(pc - 3, sp); // stack frame addresses are return addresses, so subtract 3 to get the CALL address
pc = *((uint32_t *) (psp - 0x10)); pc = *((uint32_t *) (psp - 0x10));
if (pc < 0x40000000) { if (pc < 0x40000000) {
break; break;
@@ -389,7 +390,7 @@ void esp_restart_noos() __attribute__ ((noreturn));
We arrive here after a panic or unhandled exception, when no OCD is detected. Dump the registers to the We arrive here after a panic or unhandled exception, when no OCD is detected. Dump the registers to the
serial port and either jump to the gdb stub, halt the CPU or reboot. serial port and either jump to the gdb stub, halt the CPU or reboot.
*/ */
static void commonErrorHandler(XtExcFrame *frame) static __attribute__((noreturn)) void commonErrorHandler(XtExcFrame *frame)
{ {
int *regs = (int *)frame; int *regs = (int *)frame;
int x, y; int x, y;