Merge branch 'fix/panic_handler_reboot_before_halt_v5.5' into 'release/v5.5'

fix(panic_handler): Fixed a issue where the system reboots before halt (v5.5)

See merge request espressif/esp-idf!41264
This commit is contained in:
Marius Vikhammer
2025-09-01 17:53:16 +08:00
6 changed files with 40 additions and 2 deletions
+10 -2
View File
@@ -262,6 +262,14 @@ static inline void disable_all_wdts(void)
wdt_hal_write_protect_enable(&rtc_wdt_ctx);
}
/* IRAM-only halt stub: reset modules, then loop */
void IRAM_ATTR esp_panic_handler_reset_modules_on_exit_and_halt(void)
{
// Do not print or call non-IRAM functions beyond this point
esp_system_reset_modules_on_exit();
ESP_INFINITE_LOOP();
}
/********************** Panic handler functions **********************/
/* This function is called from the panic handler entry point to increment the panic entry count */
@@ -455,10 +463,10 @@ void esp_panic_handler(panic_info_t *info)
panic_print_str("Rebooting...\r\n");
panic_restart();
#else /* CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT || CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT */
esp_panic_handler_feed_wdts();
panic_print_str("CPU halted.\r\n");
esp_system_reset_modules_on_exit();
disable_all_wdts();
ESP_INFINITE_LOOP();
esp_panic_handler_reset_modules_on_exit_and_halt();
#endif /* CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT || CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT */
#endif /* CONFIG_ESP_SYSTEM_PANIC_GDBSTUB */
}
@@ -83,6 +83,10 @@ void test_coredump_summary(void);
void test_panic_print_backtrace(void);
#if CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT
void test_panic_halt(void);
#endif /* CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT */
#ifdef __cplusplus
}
#endif
@@ -126,6 +126,9 @@ void app_main(void)
HANDLE_TEST(test_name, test_tcb_corrupted);
HANDLE_TEST(test_name, test_panic_handler_stuck0);
HANDLE_TEST(test_name, test_panic_handler_crash0);
#if CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT
HANDLE_TEST(test_name, test_panic_halt);
#endif /* CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT */
#if CONFIG_ESP_SYSTEM_USE_FRAME_POINTER
HANDLE_TEST(test_name, test_panic_print_backtrace);
#endif
@@ -445,3 +445,12 @@ void test_panic_print_backtrace(void)
}
#endif
#if CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT
void test_panic_halt(void)
{
printf("Triggering panic. Device should print 'CPU halted.' and stop.\n");
fflush(stdout);
assert(0);
}
#endif /* CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT */
@@ -50,6 +50,7 @@ CONFIGS = list(
CONFIG_PANIC = list(itertools.chain(itertools.product(['panic'], ['supported_targets'])))
CONFIG_PANIC_DUAL_CORE = list(itertools.chain(itertools.product(['panic'], TARGETS_DUAL_CORE)))
CONFIG_PANIC_HALT = list(itertools.chain(itertools.product(['panic_halt'], TARGETS_ALL)))
CONFIGS_BACKTRACE = list(
itertools.chain(
@@ -1235,3 +1236,11 @@ def test_panic_print_backtrace(dut: PanicTestDut, config: str, test_func_name: s
coredump_pattern = re.compile(PANIC_ABORT_PREFIX + regex_pattern.decode('utf-8'))
common_test(dut, config, expected_backtrace=None, expected_coredump=[coredump_pattern])
@pytest.mark.generic
@idf_parametrize('config, target', CONFIG_PANIC_HALT, indirect=['config', 'target'])
def test_panic_halt(dut: PanicTestDut) -> None:
dut.run_test_func('test_panic_halt')
dut.expect_exact('CPU halted.', timeout=30)
dut.expect_none(dut.REBOOT, timeout=3)
@@ -0,0 +1,5 @@
# Panic halt CI config
CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT=y
CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=n
CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT=n
CONFIG_ESP_SYSTEM_PANIC_GDBSTUB=n