mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-02 11:10:54 +03:00
feat(coredump): add coredump_noinit attribute
This commit is contained in:
@@ -120,7 +120,14 @@ extern "C" {
|
|||||||
|
|
||||||
// Allows to place data into RTC_FAST memory and map it to coredump
|
// 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__)
|
#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
|
#else
|
||||||
|
|
||||||
|
// Allows to place data into NOINIT memory and map it to coredump
|
||||||
|
#define COREDUMP_NOINIT_ATTR _SECTION_ATTR_IMPL(".noinit.coredump", __COUNTER__)
|
||||||
|
|
||||||
// RTC memory is not supported on these chips
|
// RTC memory is not supported on these chips
|
||||||
#define RTC_DATA_ATTR ESP_STATIC_ASSERT(0, "RTC_DATA_ATTR is not supported on this chip. Use DRAM_ATTR instead.")
|
#define RTC_DATA_ATTR ESP_STATIC_ASSERT(0, "RTC_DATA_ATTR is not supported on this chip. Use DRAM_ATTR instead.")
|
||||||
#define RTC_NOINIT_ATTR ESP_STATIC_ASSERT(0, "RTC_NOINIT_ATTR is not supported on this chip. Use DRAM_ATTR instead.")
|
#define RTC_NOINIT_ATTR ESP_STATIC_ASSERT(0, "RTC_NOINIT_ATTR is not supported on this chip. Use DRAM_ATTR instead.")
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ typedef enum {
|
|||||||
COREDUMP_MEMORY_RTC,
|
COREDUMP_MEMORY_RTC,
|
||||||
COREDUMP_MEMORY_RTC_FAST,
|
COREDUMP_MEMORY_RTC_FAST,
|
||||||
#endif
|
#endif
|
||||||
|
COREDUMP_MEMORY_NOINIT,
|
||||||
COREDUMP_MEMORY_MAX,
|
COREDUMP_MEMORY_MAX,
|
||||||
COREDUMP_MEMORY_START = COREDUMP_MEMORY_IRAM
|
COREDUMP_MEMORY_START = COREDUMP_MEMORY_IRAM
|
||||||
} coredump_region_t;
|
} coredump_region_t;
|
||||||
|
|||||||
@@ -6,6 +6,10 @@ entries:
|
|||||||
entries:
|
entries:
|
||||||
.rtc.coredump+
|
.rtc.coredump+
|
||||||
|
|
||||||
|
[sections:rtc_noinit_coredump]
|
||||||
|
entries:
|
||||||
|
.rtc_noinit.coredump+
|
||||||
|
|
||||||
[sections:dram_coredump]
|
[sections:dram_coredump]
|
||||||
entries:
|
entries:
|
||||||
.dram2.coredump+
|
.dram2.coredump+
|
||||||
@@ -17,11 +21,17 @@ entries:
|
|||||||
entries:
|
entries:
|
||||||
.iram2.coredump+
|
.iram2.coredump+
|
||||||
|
|
||||||
|
[sections:noinit_coredump]
|
||||||
|
entries:
|
||||||
|
.noinit.coredump+
|
||||||
|
|
||||||
[scheme:coredump_default]
|
[scheme:coredump_default]
|
||||||
entries:
|
entries:
|
||||||
dram_coredump -> dram0_data
|
dram_coredump -> dram0_data
|
||||||
rtc_coredump -> rtc_data
|
rtc_coredump -> rtc_data
|
||||||
rtc_fast_coredump -> rtc_force_fast
|
rtc_fast_coredump -> rtc_force_fast
|
||||||
|
rtc_noinit_coredump -> rtc_noinit
|
||||||
|
noinit_coredump -> noinit
|
||||||
iram_coredump -> iram0_data
|
iram_coredump -> iram0_data
|
||||||
|
|
||||||
[mapping:coredump_default]
|
[mapping:coredump_default]
|
||||||
@@ -30,6 +40,8 @@ entries:
|
|||||||
* (coredump_default);
|
* (coredump_default);
|
||||||
rtc_fast_coredump -> rtc_force_fast SURROUND(coredump_rtc_fast),
|
rtc_fast_coredump -> rtc_force_fast SURROUND(coredump_rtc_fast),
|
||||||
rtc_coredump -> rtc_data SURROUND(coredump_rtc),
|
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),
|
dram_coredump -> dram0_data SURROUND(coredump_dram),
|
||||||
iram_coredump -> iram0_data SURROUND(coredump_iram)
|
iram_coredump -> iram0_data SURROUND(coredump_iram)
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
@@ -51,6 +51,11 @@ extern int _coredump_rtc_start;
|
|||||||
extern int _coredump_rtc_end;
|
extern int _coredump_rtc_end;
|
||||||
extern int _coredump_rtc_fast_start;
|
extern int _coredump_rtc_fast_start;
|
||||||
extern int _coredump_rtc_fast_end;
|
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
|
#endif
|
||||||
|
|
||||||
static void* s_exc_frame = NULL;
|
static void* s_exc_frame = NULL;
|
||||||
@@ -241,21 +246,6 @@ bool esp_core_dump_get_task_snapshot(void *handle, core_dump_task_header_t *task
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t esp_core_dump_get_user_ram_segments(void)
|
|
||||||
{
|
|
||||||
uint32_t total_sz = 0;
|
|
||||||
|
|
||||||
// count number of memory segments to insert into ELF structure
|
|
||||||
total_sz += COREDUMP_GET_MEMORY_SIZE(&_coredump_dram_end, &_coredump_dram_start) > 0 ? 1 : 0;
|
|
||||||
#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;
|
|
||||||
#endif
|
|
||||||
total_sz += COREDUMP_GET_MEMORY_SIZE(&_coredump_iram_end, &_coredump_iram_start) > 0 ? 1 : 0;
|
|
||||||
|
|
||||||
return total_sz;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct {
|
static const struct {
|
||||||
int *start;
|
int *start;
|
||||||
int *end;
|
int *end;
|
||||||
@@ -277,6 +267,9 @@ static const struct {
|
|||||||
#if SOC_RTC_MEM_SUPPORTED
|
#if SOC_RTC_MEM_SUPPORTED
|
||||||
[COREDUMP_MEMORY_RTC] = { &_coredump_rtc_start, &_coredump_rtc_end },
|
[COREDUMP_MEMORY_RTC] = { &_coredump_rtc_start, &_coredump_rtc_end },
|
||||||
[COREDUMP_MEMORY_RTC_FAST] = { &_coredump_rtc_fast_start, &_coredump_rtc_fast_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
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||||
*/
|
*/
|
||||||
@@ -405,6 +405,8 @@ int g_bss_var;
|
|||||||
char *g_heap_ptr;
|
char *g_heap_ptr;
|
||||||
COREDUMP_IRAM_DATA_ATTR uint32_t g_cd_iram = 0x4242;
|
COREDUMP_IRAM_DATA_ATTR uint32_t g_cd_iram = 0x4242;
|
||||||
COREDUMP_DRAM_ATTR uint32_t g_cd_dram = 0x4343;
|
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
|
#if SOC_RTC_MEM_SUPPORTED
|
||||||
COREDUMP_RTC_FAST_ATTR uint32_t g_rtc_fast_var;
|
COREDUMP_RTC_FAST_ATTR uint32_t g_rtc_fast_var;
|
||||||
COREDUMP_RTC_DATA_ATTR uint32_t g_rtc_data_var = 0x55A9;
|
COREDUMP_RTC_DATA_ATTR uint32_t g_rtc_data_var = 0x55A9;
|
||||||
@@ -422,6 +424,8 @@ void test_capture_dram(void)
|
|||||||
g_rtc_fast_var = 0xAABBCCDD;
|
g_rtc_fast_var = 0xAABBCCDD;
|
||||||
g_rtc_data_var++;
|
g_rtc_data_var++;
|
||||||
#endif
|
#endif
|
||||||
|
g_noinit_var = 0xCAFEBABE;
|
||||||
|
strcpy(g_noinit_buffer, "NOINIT_TEST_STRING");
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1305,6 +1305,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 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_iram')) == 0x4243
|
||||||
assert int(dut.gdb_data_eval_expr('g_cd_dram')) == 0x4344
|
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']:
|
if dut.target not in ['esp32c61', 'esp32c2']:
|
||||||
assert int(dut.gdb_data_eval_expr('g_rtc_data_var')) == 0x55AA
|
assert int(dut.gdb_data_eval_expr('g_rtc_data_var')) == 0x55AA
|
||||||
|
|||||||
Reference in New Issue
Block a user