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-
319304static 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
349334static 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.
0 commit comments