From 11ec258dccbf5c93b7f1fefc4df7aae87ce2790e Mon Sep 17 00:00:00 2001 From: Erhan Kurubas Date: Wed, 7 Jan 2026 00:01:13 +0300 Subject: [PATCH] feat(coredump): add coredump_noinit attribute --- components/esp_common/include/esp_attr.h | 7 +++++++ .../include_core_dump/esp_core_dump_common.h | 1 + components/espcoredump/linker.lf | 12 ++++++++++++ components/espcoredump/src/core_dump_common.c | 13 ++++++++++++- tools/test_apps/system/panic/main/test_panic.c | 4 ++++ tools/test_apps/system/panic/pytest_panic.py | 3 +++ 6 files changed, 39 insertions(+), 1 deletion(-) diff --git a/components/esp_common/include/esp_attr.h b/components/esp_common/include/esp_attr.h index 16cfa0bda04..6d34b432eee 100644 --- a/components/esp_common/include/esp_attr.h +++ b/components/esp_common/include/esp_attr.h @@ -119,7 +119,14 @@ extern "C" { // Allows to place data into RTC_FAST memory and map it to coredump #define COREDUMP_RTC_FAST_ATTR _SECTION_ATTR_IMPL(".rtc.fast.coredump", __COUNTER__) + +// Allows to place data into RTC_NOINIT memory and map it to coredump +#define COREDUMP_NOINIT_ATTR _SECTION_ATTR_IMPL(".rtc_noinit.coredump", __COUNTER__) #else + +// Allows to place data into NOINIT memory and map it to coredump +#define COREDUMP_NOINIT_ATTR _SECTION_ATTR_IMPL(".noinit.coredump", __COUNTER__) + #define RTC_DATA_ATTR #define RTC_NOINIT_ATTR #define RTC_RODATA_ATTR diff --git a/components/espcoredump/include_core_dump/esp_core_dump_common.h b/components/espcoredump/include_core_dump/esp_core_dump_common.h index 1292e972460..a5245aff5c8 100644 --- a/components/espcoredump/include_core_dump/esp_core_dump_common.h +++ b/components/espcoredump/include_core_dump/esp_core_dump_common.h @@ -37,6 +37,7 @@ typedef enum { COREDUMP_MEMORY_RTC, COREDUMP_MEMORY_RTC_FAST, #endif + COREDUMP_MEMORY_NOINIT, COREDUMP_MEMORY_MAX, COREDUMP_MEMORY_START = COREDUMP_MEMORY_IRAM } coredump_region_t; diff --git a/components/espcoredump/linker.lf b/components/espcoredump/linker.lf index 0a5ef1f8bf0..d7e039ad740 100644 --- a/components/espcoredump/linker.lf +++ b/components/espcoredump/linker.lf @@ -6,6 +6,10 @@ entries: entries: .rtc.coredump+ +[sections:rtc_noinit_coredump] +entries: + .rtc_noinit.coredump+ + [sections:dram_coredump] entries: .dram2.coredump+ @@ -17,11 +21,17 @@ entries: entries: .iram2.coredump+ +[sections:noinit_coredump] +entries: + .noinit.coredump+ + [scheme:coredump_default] entries: dram_coredump -> dram0_data rtc_coredump -> rtc_data rtc_fast_coredump -> rtc_force_fast + rtc_noinit_coredump -> rtc_noinit + noinit_coredump -> noinit iram_coredump -> iram0_data [mapping:coredump_default] @@ -30,6 +40,8 @@ entries: * (coredump_default); rtc_fast_coredump -> rtc_force_fast SURROUND(coredump_rtc_fast), rtc_coredump -> rtc_data SURROUND(coredump_rtc), + rtc_noinit_coredump -> rtc_noinit SURROUND(coredump_rtc_noinit), + noinit_coredump -> noinit SURROUND(coredump_noinit), dram_coredump -> dram0_data SURROUND(coredump_dram), iram_coredump -> iram0_data SURROUND(coredump_iram) diff --git a/components/espcoredump/src/core_dump_common.c b/components/espcoredump/src/core_dump_common.c index 48fc1de15c6..7c288abf2f0 100644 --- a/components/espcoredump/src/core_dump_common.c +++ b/components/espcoredump/src/core_dump_common.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -54,6 +54,11 @@ extern int _coredump_rtc_start; extern int _coredump_rtc_end; extern int _coredump_rtc_fast_start; extern int _coredump_rtc_fast_end; +extern int _coredump_rtc_noinit_start; +extern int _coredump_rtc_noinit_end; +#else +extern int _coredump_noinit_start; +extern int _coredump_noinit_end; #endif static void* s_exc_frame = NULL; @@ -253,6 +258,9 @@ uint32_t esp_core_dump_get_user_ram_segments(void) #if SOC_RTC_MEM_SUPPORTED total_sz += COREDUMP_GET_MEMORY_SIZE(&_coredump_rtc_end, &_coredump_rtc_start) > 0 ? 1 : 0; total_sz += COREDUMP_GET_MEMORY_SIZE(&_coredump_rtc_fast_end, &_coredump_rtc_fast_start) > 0 ? 1 : 0; + total_sz += COREDUMP_GET_MEMORY_SIZE(&_coredump_rtc_noinit_end, &_coredump_rtc_noinit_start) > 0 ? 1 : 0; +#else + total_sz += COREDUMP_GET_MEMORY_SIZE(&_coredump_noinit_end, &_coredump_noinit_start) > 0 ? 1 : 0; #endif total_sz += COREDUMP_GET_MEMORY_SIZE(&_coredump_iram_end, &_coredump_iram_start) > 0 ? 1 : 0; @@ -280,6 +288,9 @@ static const struct { #if SOC_RTC_MEM_SUPPORTED [COREDUMP_MEMORY_RTC] = { &_coredump_rtc_start, &_coredump_rtc_end }, [COREDUMP_MEMORY_RTC_FAST] = { &_coredump_rtc_fast_start, &_coredump_rtc_fast_end }, + [COREDUMP_MEMORY_NOINIT] = { &_coredump_rtc_noinit_start, &_coredump_rtc_noinit_end }, +#else + [COREDUMP_MEMORY_NOINIT] = { &_coredump_noinit_start, &_coredump_noinit_end }, #endif }; diff --git a/tools/test_apps/system/panic/main/test_panic.c b/tools/test_apps/system/panic/main/test_panic.c index 2d3710d6955..a96b032037d 100644 --- a/tools/test_apps/system/panic/main/test_panic.c +++ b/tools/test_apps/system/panic/main/test_panic.c @@ -403,6 +403,8 @@ int g_bss_var; char *g_heap_ptr; COREDUMP_IRAM_DATA_ATTR uint32_t g_cd_iram = 0x4242; COREDUMP_DRAM_ATTR uint32_t g_cd_dram = 0x4343; +COREDUMP_NOINIT_ATTR uint32_t g_noinit_var; +COREDUMP_NOINIT_ATTR char g_noinit_buffer[28]; #if SOC_RTC_MEM_SUPPORTED COREDUMP_RTC_FAST_ATTR uint32_t g_rtc_fast_var; COREDUMP_RTC_DATA_ATTR uint32_t g_rtc_data_var = 0x55A9; @@ -420,6 +422,8 @@ void test_capture_dram(void) g_rtc_fast_var = 0xAABBCCDD; g_rtc_data_var++; #endif + g_noinit_var = 0xCAFEBABE; + strcpy(g_noinit_buffer, "NOINIT_TEST_STRING"); assert(0); } #endif diff --git a/tools/test_apps/system/panic/pytest_panic.py b/tools/test_apps/system/panic/pytest_panic.py index c6c110bdb29..ef499265f63 100644 --- a/tools/test_apps/system/panic/pytest_panic.py +++ b/tools/test_apps/system/panic/pytest_panic.py @@ -1304,6 +1304,9 @@ def test_capture_dram(dut: PanicTestDut, config: str, test_func_name: str) -> No assert re.search(r'0x[0-9a-fA-F]+ "Coredump Test"', dut.gdb_data_eval_expr('g_heap_ptr')) assert int(dut.gdb_data_eval_expr('g_cd_iram')) == 0x4243 assert int(dut.gdb_data_eval_expr('g_cd_dram')) == 0x4344 + assert int(dut.gdb_data_eval_expr('g_noinit_var')) == 0xCAFEBABE + buffer_value = str(dut.gdb_data_eval_expr('g_noinit_buffer')) + assert 'NOINIT_TEST_STRING' in buffer_value if dut.target not in ['esp32c61', 'esp32c2']: assert int(dut.gdb_data_eval_expr('g_rtc_data_var')) == 0x55AA