From 002faf3b0a2662ca3d8a1debac6b46df73059802 Mon Sep 17 00:00:00 2001 From: Erhan Kurubas Date: Fri, 3 May 2024 00:00:03 +0200 Subject: [PATCH] ci(panic): extend extram_stack tests --- components/espcoredump/src/core_dump_elf.c | 18 ++++++---- tools/test_apps/system/panic/CMakeLists.txt | 2 +- .../system/panic/main/CMakeLists.txt | 4 +-- .../system/panic/main/include/test_panic.h | 5 ++- .../system/panic/main/test_app_main.c | 5 ++- .../test_apps/system/panic/main/test_panic.c | 11 +++++- tools/test_apps/system/panic/pytest_panic.py | 34 +++++++++++++++---- ...g.ci.coredump_flash_extram_stack_bss_esp32 | 13 +++++++ ...ci.coredump_flash_extram_stack_bss_esp32s2 | 13 +++++++ ...ci.coredump_flash_extram_stack_bss_esp32s3 | 13 +++++++ ...ci.coredump_flash_extram_stack_heap_esp32} | 2 -- ...i.coredump_flash_extram_stack_heap_esp32s2 | 9 +++++ ...i.coredump_flash_extram_stack_heap_esp32s3 | 9 +++++ 13 files changed, 117 insertions(+), 21 deletions(-) create mode 100644 tools/test_apps/system/panic/sdkconfig.ci.coredump_flash_extram_stack_bss_esp32 create mode 100644 tools/test_apps/system/panic/sdkconfig.ci.coredump_flash_extram_stack_bss_esp32s2 create mode 100644 tools/test_apps/system/panic/sdkconfig.ci.coredump_flash_extram_stack_bss_esp32s3 rename tools/test_apps/system/panic/{sdkconfig.ci.coredump_extram_stack => sdkconfig.ci.coredump_flash_extram_stack_heap_esp32} (79%) create mode 100644 tools/test_apps/system/panic/sdkconfig.ci.coredump_flash_extram_stack_heap_esp32s2 create mode 100644 tools/test_apps/system/panic/sdkconfig.ci.coredump_flash_extram_stack_heap_esp32s3 diff --git a/components/espcoredump/src/core_dump_elf.c b/components/espcoredump/src/core_dump_elf.c index 719cda1f702..76081e4ab2a 100644 --- a/components/espcoredump/src/core_dump_elf.c +++ b/components/espcoredump/src/core_dump_elf.c @@ -334,7 +334,9 @@ static int elf_process_task_tcb(core_dump_elf_t *self, core_dump_task_header_t * static int elf_process_task_stack(core_dump_elf_t *self, core_dump_task_header_t *task) { int ret = 0; - uint32_t stack_vaddr, stack_len = 0, stack_paddr = 0; + uint32_t stack_vaddr; + uint32_t stack_len = 0; + uint32_t stack_paddr = 0; ELF_CHECK_ERR((task), ELF_PROC_ERR_OTHER, "Invalid input data."); @@ -343,8 +345,11 @@ static int elf_process_task_stack(core_dump_elf_t *self, core_dump_task_header_t task->tcb_addr, stack_vaddr, stack_len); #if CONFIG_ESP_COREDUMP_CAPTURE_DRAM - /* If the task data located in the PSRAM, we will save it here. - Otherwise it will be saved in esp_core_dump_store_section() + /* + When saving all data sections (enabled by `CONFIG_ESP_COREDUMP_CAPTURE_DRAM`), + the task stack located in DRAM will be saved in `esp_core_dump_store_section()`. + Therefore, we filter them out here. + PSRAM data do not fall into any ELF section, so we always save such stacks here. */ if (esp_ptr_external_ram((void *)stack_vaddr)) #endif @@ -457,11 +462,12 @@ static int elf_save_task(core_dump_elf_t *self, core_dump_task_header_t *task) static int elf_process_task_data(core_dump_elf_t *self) { - int elf_len = 0, ret; + int elf_len = 0; core_dump_task_header_t task_hdr = { 0 }; core_dump_mem_seg_header_t interrupted_stack = { 0 }; TaskIterator_t task_iter; - uint16_t tasks_num = 0, bad_tasks_num = 0; + uint16_t tasks_num = 0; + uint16_t bad_tasks_num = 0; ESP_COREDUMP_LOG_PROCESS("================ Processing task data ================"); // processes all task's stack data and writes segment data into partition @@ -474,7 +480,7 @@ static int elf_process_task_data(core_dump_elf_t *self) bad_tasks_num++; continue; } - ret = elf_save_task(self, &task_hdr); + int ret = elf_save_task(self, &task_hdr); ELF_CHECK_ERR((ret > 0), ret, "Task %x, TCB write failed, return (%d).", task_iter.pxTaskHandle, ret); elf_len += ret; diff --git a/tools/test_apps/system/panic/CMakeLists.txt b/tools/test_apps/system/panic/CMakeLists.txt index e9db4327f57..3305b7b4f6f 100644 --- a/tools/test_apps/system/panic/CMakeLists.txt +++ b/tools/test_apps/system/panic/CMakeLists.txt @@ -17,7 +17,7 @@ if(CONFIG_TEST_MEMPROT) endif() endif() -if(NOT CONFIG_TEST_MEMPROT AND NOT CONFIG_ESP_COREDUMP_CAPTURE_DRAM) +if(NOT CONFIG_TEST_MEMPROT AND NOT CONFIG_ESP_COREDUMP_CAPTURE_DRAM AND NOT CONFIG_SPIRAM) # Enable UBSAN checks # # shift-base sanitizer is disabled due to the following pattern found in register header files: diff --git a/tools/test_apps/system/panic/main/CMakeLists.txt b/tools/test_apps/system/panic/main/CMakeLists.txt index 90e5bcf9730..e3f9f4a0d2b 100644 --- a/tools/test_apps/system/panic/main/CMakeLists.txt +++ b/tools/test_apps/system/panic/main/CMakeLists.txt @@ -13,8 +13,8 @@ endif() idf_component_register(SRCS "${srcs}" INCLUDE_DIRS "include" - REQUIRES spi_flash esp_psram esp_system esp_partition espcoredump - PRIV_REQUIRES esp_gdbstub) + REQUIRES spi_flash esp_psram esp_system esp_partition + PRIV_REQUIRES esp_gdbstub espcoredump) target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-unused-variable" "-Wno-infinite-recursion" diff --git a/tools/test_apps/system/panic/main/include/test_panic.h b/tools/test_apps/system/panic/main/include/test_panic.h index 1ed17354756..71733add77e 100644 --- a/tools/test_apps/system/panic/main/include/test_panic.h +++ b/tools/test_apps/system/panic/main/include/test_panic.h @@ -32,7 +32,10 @@ void test_hw_stack_guard_cpu1(void); #endif // CONFIG_ESP_SYSTEM_HW_STACK_GUARD #if CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH && CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY -void test_panic_extram_stack(void); +void test_panic_extram_stack_heap(void); +#if CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY +void test_panic_extram_stack_bss(void); +#endif #endif #if !CONFIG_FREERTOS_UNICORE diff --git a/tools/test_apps/system/panic/main/test_app_main.c b/tools/test_apps/system/panic/main/test_app_main.c index 8382b84af47..a038f088bf4 100644 --- a/tools/test_apps/system/panic/main/test_app_main.c +++ b/tools/test_apps/system/panic/main/test_app_main.c @@ -96,7 +96,10 @@ void app_main(void) #endif // CONFIG_FREERTOS_UNICORE #endif // CONFIG_ESP_SYSTEM_HW_STACK_GUARD #if CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH && CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY - HANDLE_TEST(test_name, test_panic_extram_stack); + HANDLE_TEST(test_name, test_panic_extram_stack_heap); +#if CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY + HANDLE_TEST(test_name, test_panic_extram_stack_bss); +#endif #endif #if CONFIG_ESP_COREDUMP_CAPTURE_DRAM HANDLE_TEST(test_name, test_capture_dram); diff --git a/tools/test_apps/system/panic/main/test_panic.c b/tools/test_apps/system/panic/main/test_panic.c index a9d41b0227a..612615ffdf9 100644 --- a/tools/test_apps/system/panic/main/test_panic.c +++ b/tools/test_apps/system/panic/main/test_panic.c @@ -104,7 +104,7 @@ static void stack_in_extram(void* arg) { abort(); } -void test_panic_extram_stack(void) { +void test_panic_extram_stack_heap(void) { /* Start by initializing a Task which has a stack in external RAM */ StaticTask_t handle; const uint32_t stack_size = 8192; @@ -119,8 +119,17 @@ void test_panic_extram_stack(void) { vTaskDelay(1000); } +#if CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY +static EXT_RAM_BSS_ATTR StackType_t stack[8192]; +void test_panic_extram_stack_bss(void) +{ + StaticTask_t handle; + xTaskCreateStatic(stack_in_extram, "Task_stack_extram", sizeof(stack), NULL, 4, stack, &handle); + vTaskDelay(1000); +} +#endif #endif // ESP_COREDUMP_ENABLE_TO_FLASH && SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY diff --git a/tools/test_apps/system/panic/pytest_panic.py b/tools/test_apps/system/panic/pytest_panic.py index ee706cf73e1..0682cfea8da 100644 --- a/tools/test_apps/system/panic/pytest_panic.py +++ b/tools/test_apps/system/panic/pytest_panic.py @@ -69,11 +69,13 @@ # This list is used to check if the target is a dual-core one. TARGETS_DUAL_CORE_NAMES = [x.mark.name for x in TARGETS_DUAL_CORE] -# The tests which panic on external stack require PSRAM capable runners CONFIGS_EXTRAM_STACK = [ - pytest.param('coredump_extram_stack', marks=[pytest.mark.esp32, pytest.mark.psram]), - pytest.param('coredump_extram_stack', marks=[pytest.mark.esp32s2, pytest.mark.generic]), - pytest.param('coredump_extram_stack', marks=[pytest.mark.esp32s3, pytest.mark.quad_psram]), + pytest.param('coredump_flash_extram_stack_heap_esp32', marks=[pytest.mark.esp32, pytest.mark.psram]), + pytest.param('coredump_flash_extram_stack_heap_esp32s2', marks=[pytest.mark.esp32s2, pytest.mark.generic]), + pytest.param('coredump_flash_extram_stack_heap_esp32s3', marks=[pytest.mark.esp32s3, pytest.mark.quad_psram]), + pytest.param('coredump_flash_extram_stack_bss_esp32', marks=[pytest.mark.esp32, pytest.mark.psram]), + pytest.param('coredump_flash_extram_stack_bss_esp32s2', marks=[pytest.mark.esp32s2, pytest.mark.generic]), + pytest.param('coredump_flash_extram_stack_bss_esp32s3', marks=[pytest.mark.esp32s3, pytest.mark.quad_psram]), ] CONFIGS_HW_STACK_GUARD = [ @@ -207,8 +209,11 @@ def test_task_wdt_cpu1(dut: PanicTestDut, config: str, test_func_name: str) -> N @pytest.mark.parametrize('config', CONFIGS_EXTRAM_STACK, indirect=True) -def test_panic_extram_stack(dut: PanicTestDut, config: str, test_func_name: str) -> None: - dut.run_test_func(test_func_name) +def test_panic_extram_stack(dut: PanicTestDut, config: str) -> None: + if 'heap' in config: + dut.run_test_func('test_panic_extram_stack_heap') + else: + dut.run_test_func('test_panic_extram_stack_bss') dut.expect_none('Allocated stack is not in external RAM') dut.expect_none('Guru Meditation') dut.expect_backtrace() @@ -221,7 +226,22 @@ def test_panic_extram_stack(dut: PanicTestDut, config: str, test_func_name: str) # The caller must be accessible after restoring the stack dut.expect_exact('Core dump has been saved to flash.') - common_test(dut, config) + if dut.target == 'esp32': + # ESP32 External data memory range [0x3f800000-0x3fc00000) + coredump_pattern = re.compile('.coredump.tasks.data (0x3[fF][8-9a-bA-B][0-9a-fA-F]{5}) (0x[a-fA-F0-9]+) RW') + elif dut.target == 'esp32s2': + # ESP32-S2 External data memory range [0x3f500000-0x3ff80000) + coredump_pattern = re.compile('.coredump.tasks.data (0x3[fF][5-9a-fA-F][0-7][0-9a-fA-F]{4}) (0x[a-fA-F0-9]+) RW') + else: + # ESP32-S3 External data memory range [0x3c000000-0x3e000000) + coredump_pattern = re.compile('.coredump.tasks.data (0x3[c-dC-D][0-9a-fA-F]{6}) (0x[a-fA-F0-9]+) RW') + + common_test( + dut, + config, + expected_backtrace=None, + expected_coredump=[coredump_pattern] + ) @pytest.mark.parametrize('config', CONFIGS, indirect=True) diff --git a/tools/test_apps/system/panic/sdkconfig.ci.coredump_flash_extram_stack_bss_esp32 b/tools/test_apps/system/panic/sdkconfig.ci.coredump_flash_extram_stack_bss_esp32 new file mode 100644 index 00000000000..26769c3c598 --- /dev/null +++ b/tools/test_apps/system/panic/sdkconfig.ci.coredump_flash_extram_stack_bss_esp32 @@ -0,0 +1,13 @@ +CONFIG_IDF_TARGET="esp32" +CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH=y +CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF=y +CONFIG_ESP_COREDUMP_CHECKSUM_SHA256=y +# We need to have the coredump info log +CONFIG_LOG_DEFAULT_LEVEL_INFO=y +CONFIG_SPIRAM=y +CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY=y +CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y +CONFIG_ESP_COREDUMP_USE_STACK_SIZE=y +CONFIG_ESP_COREDUMP_CAPTURE_DRAM=y +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions_capture_dram.csv" diff --git a/tools/test_apps/system/panic/sdkconfig.ci.coredump_flash_extram_stack_bss_esp32s2 b/tools/test_apps/system/panic/sdkconfig.ci.coredump_flash_extram_stack_bss_esp32s2 new file mode 100644 index 00000000000..ad1a91fa811 --- /dev/null +++ b/tools/test_apps/system/panic/sdkconfig.ci.coredump_flash_extram_stack_bss_esp32s2 @@ -0,0 +1,13 @@ +CONFIG_IDF_TARGET="esp32s2" +CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH=y +CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF=y +CONFIG_ESP_COREDUMP_CHECKSUM_SHA256=y +# We need to have the coredump info log +CONFIG_LOG_DEFAULT_LEVEL_INFO=y +CONFIG_SPIRAM=y +CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY=y +CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y +CONFIG_ESP_COREDUMP_USE_STACK_SIZE=y +CONFIG_ESP_COREDUMP_CAPTURE_DRAM=y +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions_capture_dram.csv" diff --git a/tools/test_apps/system/panic/sdkconfig.ci.coredump_flash_extram_stack_bss_esp32s3 b/tools/test_apps/system/panic/sdkconfig.ci.coredump_flash_extram_stack_bss_esp32s3 new file mode 100644 index 00000000000..46903a02235 --- /dev/null +++ b/tools/test_apps/system/panic/sdkconfig.ci.coredump_flash_extram_stack_bss_esp32s3 @@ -0,0 +1,13 @@ +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH=y +CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF=y +CONFIG_ESP_COREDUMP_CHECKSUM_SHA256=y +# We need to have the coredump info log +CONFIG_LOG_DEFAULT_LEVEL_INFO=y +CONFIG_SPIRAM=y +CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY=y +CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y +CONFIG_ESP_COREDUMP_USE_STACK_SIZE=y +CONFIG_ESP_COREDUMP_CAPTURE_DRAM=y +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions_capture_dram.csv" diff --git a/tools/test_apps/system/panic/sdkconfig.ci.coredump_extram_stack b/tools/test_apps/system/panic/sdkconfig.ci.coredump_flash_extram_stack_heap_esp32 similarity index 79% rename from tools/test_apps/system/panic/sdkconfig.ci.coredump_extram_stack rename to tools/test_apps/system/panic/sdkconfig.ci.coredump_flash_extram_stack_heap_esp32 index 06ac9fcc8ea..18391318a37 100644 --- a/tools/test_apps/system/panic/sdkconfig.ci.coredump_extram_stack +++ b/tools/test_apps/system/panic/sdkconfig.ci.coredump_flash_extram_stack_heap_esp32 @@ -2,8 +2,6 @@ CONFIG_IDF_TARGET="esp32" CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH=y CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF=y CONFIG_ESP_COREDUMP_CHECKSUM_SHA256=y -# CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set -CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT=y # We need to have the coredump info log CONFIG_LOG_DEFAULT_LEVEL_INFO=y CONFIG_SPIRAM=y diff --git a/tools/test_apps/system/panic/sdkconfig.ci.coredump_flash_extram_stack_heap_esp32s2 b/tools/test_apps/system/panic/sdkconfig.ci.coredump_flash_extram_stack_heap_esp32s2 new file mode 100644 index 00000000000..981803c0be2 --- /dev/null +++ b/tools/test_apps/system/panic/sdkconfig.ci.coredump_flash_extram_stack_heap_esp32s2 @@ -0,0 +1,9 @@ +CONFIG_IDF_TARGET="esp32s2" +CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH=y +CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF=y +CONFIG_ESP_COREDUMP_CHECKSUM_SHA256=y +# We need to have the coredump info log +CONFIG_LOG_DEFAULT_LEVEL_INFO=y +CONFIG_SPIRAM=y +CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY=y +CONFIG_ESP_COREDUMP_USE_STACK_SIZE=y diff --git a/tools/test_apps/system/panic/sdkconfig.ci.coredump_flash_extram_stack_heap_esp32s3 b/tools/test_apps/system/panic/sdkconfig.ci.coredump_flash_extram_stack_heap_esp32s3 new file mode 100644 index 00000000000..ff952817bde --- /dev/null +++ b/tools/test_apps/system/panic/sdkconfig.ci.coredump_flash_extram_stack_heap_esp32s3 @@ -0,0 +1,9 @@ +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH=y +CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF=y +CONFIG_ESP_COREDUMP_CHECKSUM_SHA256=y +# We need to have the coredump info log +CONFIG_LOG_DEFAULT_LEVEL_INFO=y +CONFIG_SPIRAM=y +CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY=y +CONFIG_ESP_COREDUMP_USE_STACK_SIZE=y