Skip to content

Commit 9d3917d

Browse files
committed
Merge branch 'extend_coredump_tests_v5.3' into 'release/v5.3'
Extend coredump tests v5.3 See merge request espressif/esp-idf!33456
2 parents aabab37 + dfc248d commit 9d3917d

16 files changed

+253
-94
lines changed

components/espcoredump/src/core_dump_elf.c

Lines changed: 58 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#ifdef CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF
1919
#include <sys/param.h> // for the MIN macro
2020
#include "esp_app_desc.h"
21+
#include "esp_memory_utils.h"
2122
#endif
2223

2324
#define ELF_CLASS ELFCLASS32
@@ -300,22 +301,6 @@ static int elf_add_regs(core_dump_elf_t *self, core_dump_task_header_t *task)
300301
len);
301302
}
302303

303-
static int elf_add_stack(core_dump_elf_t *self, core_dump_task_header_t *task)
304-
{
305-
uint32_t stack_vaddr, stack_len = 0, stack_paddr = 0;
306-
307-
ELF_CHECK_ERR((task), ELF_PROC_ERR_OTHER, "Invalid task pointer.");
308-
309-
stack_len = esp_core_dump_get_stack(task, &stack_vaddr, &stack_paddr);
310-
ESP_COREDUMP_LOG_PROCESS("Add stack for task 0x%x: addr 0x%x, sz %u",
311-
task->tcb_addr, stack_vaddr, stack_len);
312-
int ret = elf_add_segment(self, PT_LOAD,
313-
(uint32_t)stack_vaddr,
314-
(void*)stack_paddr,
315-
(uint32_t) stack_len);
316-
return ret;
317-
}
318-
319304
static int elf_add_tcb(core_dump_elf_t *self, core_dump_task_header_t *task)
320305
{
321306
ELF_CHECK_ERR((task), ELF_PROC_ERR_OTHER, "Invalid task pointer.");
@@ -348,17 +333,39 @@ static int elf_process_task_tcb(core_dump_elf_t *self, core_dump_task_header_t *
348333

349334
static int elf_process_task_stack(core_dump_elf_t *self, core_dump_task_header_t *task)
350335
{
351-
int ret = ELF_PROC_ERR_OTHER;
336+
int ret = 0;
337+
uint32_t stack_vaddr;
338+
uint32_t stack_len = 0;
339+
uint32_t stack_paddr = 0;
352340

353341
ELF_CHECK_ERR((task), ELF_PROC_ERR_OTHER, "Invalid input data.");
354342

355-
ret = elf_add_stack(self, task);
356-
if (ret <= 0) {
357-
ESP_COREDUMP_LOGE("Task (TCB:%x), (Stack:%x), stack processing failure = %d.",
358-
task->tcb_addr,
359-
task->stack_start,
360-
ret);
343+
stack_len = esp_core_dump_get_stack(task, &stack_vaddr, &stack_paddr);
344+
ESP_COREDUMP_LOG_PROCESS("Add stack for task 0x%x: addr 0x%x, sz %u",
345+
task->tcb_addr, stack_vaddr, stack_len);
346+
347+
#if CONFIG_ESP_COREDUMP_CAPTURE_DRAM
348+
/*
349+
When saving all data sections (enabled by `CONFIG_ESP_COREDUMP_CAPTURE_DRAM`),
350+
the task stack located in DRAM will be saved in `esp_core_dump_store_section()`.
351+
Therefore, we filter them out here.
352+
PSRAM data do not fall into any ELF section, so we always save such stacks here.
353+
*/
354+
if (esp_ptr_external_ram((void *)stack_vaddr))
355+
#endif
356+
{
357+
ret = elf_add_segment(self, PT_LOAD,
358+
(uint32_t)stack_vaddr,
359+
(void*)stack_paddr,
360+
(uint32_t) stack_len);
361+
if (ret <= 0) {
362+
ESP_COREDUMP_LOGE("Task (TCB:%x), (Stack:%x), stack processing failure = %d.",
363+
task->tcb_addr,
364+
task->stack_start,
365+
ret);
366+
}
361367
}
368+
362369
return ret;
363370
}
364371

@@ -453,21 +460,15 @@ static int elf_save_task(core_dump_elf_t *self, core_dump_task_header_t *task)
453460
return elf_len;
454461
}
455462

456-
static int elf_write_tasks_data(core_dump_elf_t *self)
463+
static int elf_process_task_data(core_dump_elf_t *self)
457464
{
458465
int elf_len = 0;
459466
core_dump_task_header_t task_hdr = { 0 };
460467
core_dump_mem_seg_header_t interrupted_stack = { 0 };
461468
TaskIterator_t task_iter;
462-
int ret = ELF_PROC_ERR_OTHER;
463469
uint16_t tasks_num = 0;
464470
uint16_t bad_tasks_num = 0;
465471

466-
ESP_COREDUMP_LOG_PROCESS("================ Processing task registers ================");
467-
ret = elf_process_tasks_regs(self);
468-
ELF_CHECK_ERR((ret > 0), ret, "Tasks regs addition failed, return (%d).", ret);
469-
elf_len += ret;
470-
471472
ESP_COREDUMP_LOG_PROCESS("================ Processing task data ================");
472473
// processes all task's stack data and writes segment data into partition
473474
// if flash configuration is set
@@ -479,17 +480,16 @@ static int elf_write_tasks_data(core_dump_elf_t *self)
479480
bad_tasks_num++;
480481
continue;
481482
}
482-
483-
#if CONFIG_ESP_COREDUMP_CAPTURE_DRAM
484-
/* Only crashed task data will be saved here. The other task's data will be automatically saved within the sections */
485-
if (esp_core_dump_get_current_task_handle() == task_iter.pxTaskHandle)
486-
#endif
487-
{
488-
ret = elf_save_task(self, &task_hdr);
489-
ELF_CHECK_ERR((ret > 0), ret,
490-
"Task %x, TCB write failed, return (%d).", task_iter.pxTaskHandle, ret);
491-
elf_len += ret;
492-
}
483+
int ret = elf_save_task(self, &task_hdr);
484+
ELF_CHECK_ERR((ret > 0), ret,
485+
"Task %x, TCB write failed, return (%d).", task_iter.pxTaskHandle, ret);
486+
elf_len += ret;
487+
/* interrupt stacks:
488+
- 'port_IntStack' is in the data section for xtensa
489+
- 'xIsrStack' is in the bss section for risc-v
490+
When DRAM capture is enabled, interrupt stack saving can be done during the full section store
491+
*/
492+
#if !CONFIG_ESP_COREDUMP_CAPTURE_DRAM
493493
if (interrupted_stack.size > 0) {
494494
ESP_COREDUMP_LOG_PROCESS("Add interrupted task stack %lu bytes @ %x",
495495
interrupted_stack.size, interrupted_stack.start);
@@ -500,11 +500,28 @@ static int elf_write_tasks_data(core_dump_elf_t *self)
500500
ELF_CHECK_ERR((ret > 0), ret, "Interrupted task stack write failed, return (%d).", ret);
501501
elf_len += ret;
502502
}
503+
#endif
503504
}
504505
ESP_COREDUMP_LOG_PROCESS("Found %d bad task out of %d", bad_tasks_num, tasks_num);
506+
505507
return elf_len;
506508
}
507509

510+
static int elf_write_tasks_data(core_dump_elf_t *self)
511+
{
512+
ESP_COREDUMP_LOG_PROCESS("================ Processing task registers ================");
513+
int ret = elf_process_tasks_regs(self);
514+
ELF_CHECK_ERR((ret > 0), ret, "Tasks regs addition failed, return (%d).", ret);
515+
int elf_len = ret;
516+
517+
ret = elf_process_task_data(self);
518+
if (ret <= 0) {
519+
return ret;
520+
}
521+
522+
return elf_len + ret;
523+
}
524+
508525
#if CONFIG_ESP_COREDUMP_CAPTURE_DRAM
509526

510527
/* Coredump stack will also be used by the checksum functions while saving sections.

tools/test_apps/system/panic/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ if(CONFIG_TEST_MEMPROT)
1717
endif()
1818
endif()
1919

20-
if(NOT CONFIG_TEST_MEMPROT AND NOT CONFIG_ESP_COREDUMP_CAPTURE_DRAM)
20+
if(NOT CONFIG_TEST_MEMPROT AND NOT CONFIG_ESP_COREDUMP_CAPTURE_DRAM AND NOT CONFIG_SPIRAM)
2121
# Enable UBSAN checks
2222
#
2323
# shift-base sanitizer is disabled due to the following pattern found in register header files:

tools/test_apps/system/panic/main/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ endif()
1313

1414
idf_component_register(SRCS "${srcs}"
1515
INCLUDE_DIRS "include"
16-
REQUIRES spi_flash esp_psram esp_system esp_partition espcoredump
17-
PRIV_REQUIRES esp_gdbstub)
16+
REQUIRES spi_flash esp_psram esp_system esp_partition
17+
PRIV_REQUIRES esp_gdbstub espcoredump)
1818

1919
target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-unused-variable"
2020
"-Wno-infinite-recursion"

tools/test_apps/system/panic/main/include/test_panic.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,10 @@ void test_hw_stack_guard_cpu1(void);
3232
#endif // CONFIG_ESP_SYSTEM_HW_STACK_GUARD
3333

3434
#if CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH && CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY
35-
void test_panic_extram_stack(void);
35+
void test_panic_extram_stack_heap(void);
36+
#if CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY
37+
void test_panic_extram_stack_bss(void);
38+
#endif
3639
#endif
3740

3841
#if !CONFIG_FREERTOS_UNICORE
@@ -67,6 +70,8 @@ void test_illegal_access(void);
6770

6871
void test_capture_dram(void);
6972

73+
void test_tcb_corrupted(void);
74+
7075
#if CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH && CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF
7176
void test_setup_coredump_summary(void);
7277
void test_coredump_summary(void);

tools/test_apps/system/panic/main/test_app_main.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,10 @@ void app_main(void)
9696
#endif // CONFIG_FREERTOS_UNICORE
9797
#endif // CONFIG_ESP_SYSTEM_HW_STACK_GUARD
9898
#if CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH && CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY
99-
HANDLE_TEST(test_name, test_panic_extram_stack);
99+
HANDLE_TEST(test_name, test_panic_extram_stack_heap);
100+
#if CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY
101+
HANDLE_TEST(test_name, test_panic_extram_stack_bss);
102+
#endif
100103
#endif
101104
#if CONFIG_ESP_COREDUMP_CAPTURE_DRAM
102105
HANDLE_TEST(test_name, test_capture_dram);
@@ -116,6 +119,7 @@ void app_main(void)
116119
HANDLE_TEST(test_name, test_assert_cache_disabled);
117120
HANDLE_TEST(test_name, test_assert_cache_write_back_error_can_print_backtrace);
118121
HANDLE_TEST(test_name, test_assert_cache_write_back_error_can_print_backtrace2);
122+
HANDLE_TEST(test_name, test_tcb_corrupted);
119123
#if CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH && CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF
120124
HANDLE_TEST(test_name, test_setup_coredump_summary);
121125
HANDLE_TEST(test_name, test_coredump_summary);

tools/test_apps/system/panic/main/test_panic.c

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ static void stack_in_extram(void* arg) {
104104
abort();
105105
}
106106

107-
void test_panic_extram_stack(void) {
107+
void test_panic_extram_stack_heap(void) {
108108
/* Start by initializing a Task which has a stack in external RAM */
109109
StaticTask_t handle;
110110
const uint32_t stack_size = 8192;
@@ -119,8 +119,17 @@ void test_panic_extram_stack(void) {
119119

120120
vTaskDelay(1000);
121121
}
122+
#if CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY
123+
static EXT_RAM_BSS_ATTR StackType_t stack[8192];
124+
void test_panic_extram_stack_bss(void)
125+
{
126+
StaticTask_t handle;
122127

128+
xTaskCreateStatic(stack_in_extram, "Task_stack_extram", sizeof(stack), NULL, 4, stack, &handle);
123129

130+
vTaskDelay(1000);
131+
}
132+
#endif
124133
#endif // ESP_COREDUMP_ENABLE_TO_FLASH && SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY
125134

126135

@@ -301,6 +310,15 @@ void test_coredump_summary(void)
301310
}
302311
#endif
303312

313+
void test_tcb_corrupted(void)
314+
{
315+
uint32_t *tcb_ptr = (uint32_t *)xTaskGetIdleTaskHandleForCore(0);
316+
for (size_t i = 0; i < sizeof(StaticTask_t) / sizeof(uint32_t); ++i) {
317+
tcb_ptr[i] = 0xDEADBEE0;
318+
}
319+
vTaskDelay(2);
320+
}
321+
304322
/* NOTE: The following test verifies the behaviour for the
305323
* Xtensa-specific MPU instructions (Refer WDTLB, DSYNC, WDTIB, ISYNC)
306324
* used for memory protection.

0 commit comments

Comments
 (0)