panic handler: fix cache error handling
This commit is contained in:
parent
0a389b1764
commit
8bdfb265a4
1 changed files with 16 additions and 11 deletions
|
@ -486,7 +486,13 @@ static void panic_handler(XtExcFrame *frame, bool pseudo_excause)
|
||||||
BUSY_WAIT_IF_TRUE(frame->exccause == PANIC_RSN_INTWDT_CPU1 && core_id == 0);
|
BUSY_WAIT_IF_TRUE(frame->exccause == PANIC_RSN_INTWDT_CPU1 && core_id == 0);
|
||||||
|
|
||||||
// For cache error, pause the non-offending core - offending core handles panic
|
// For cache error, pause the non-offending core - offending core handles panic
|
||||||
BUSY_WAIT_IF_TRUE(frame->exccause == PANIC_RSN_CACHEERR && core_id != esp_cache_err_get_cpuid());
|
if (frame->exccause == PANIC_RSN_CACHEERR && core_id != esp_cache_err_get_cpuid()) {
|
||||||
|
// Only print the backtrace for the offending core in case of the cache error
|
||||||
|
xt_exc_frames[core_id] = NULL;
|
||||||
|
while (1) {
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ets_delay_us(1);
|
ets_delay_us(1);
|
||||||
|
@ -557,20 +563,19 @@ static __attribute__((noreturn)) void esp_digital_reset(void)
|
||||||
|
|
||||||
void __attribute__((noreturn)) panic_restart(void)
|
void __attribute__((noreturn)) panic_restart(void)
|
||||||
{
|
{
|
||||||
// If resetting because of a cache error, reset the digital part
|
|
||||||
// Make sure that the reset reason is not a generic panic reason as well on ESP32S2,
|
|
||||||
// as esp_cache_err_get_cpuid always returns PRO_CPU_NUM
|
|
||||||
|
|
||||||
bool digital_reset_needed = false;
|
bool digital_reset_needed = false;
|
||||||
if ( esp_cache_err_get_cpuid() != -1 && esp_reset_reason_get_hint() != ESP_RST_PANIC ) {
|
#ifdef CONFIG_IDF_TARGET_ESP32
|
||||||
digital_reset_needed = true;
|
// On the ESP32, cache error status can only be cleared by system reset
|
||||||
}
|
if (esp_cache_err_get_cpuid() != -1) {
|
||||||
#if CONFIG_IDF_TARGET_ESP32S2
|
|
||||||
if ( esp_memprot_is_intr_ena_any() || esp_memprot_is_locked_any() ) {
|
|
||||||
digital_reset_needed = true;
|
digital_reset_needed = true;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if ( digital_reset_needed ) {
|
#if CONFIG_IDF_TARGET_ESP32S2
|
||||||
|
if (esp_memprot_is_intr_ena_any() || esp_memprot_is_locked_any()) {
|
||||||
|
digital_reset_needed = true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (digital_reset_needed) {
|
||||||
esp_digital_reset();
|
esp_digital_reset();
|
||||||
}
|
}
|
||||||
esp_restart_noos();
|
esp_restart_noos();
|
||||||
|
|
Loading…
Reference in a new issue