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,34 @@ 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 , stack_len = 0 , stack_paddr = 0 ;
352338
353339 ELF_CHECK_ERR ((task ), ELF_PROC_ERR_OTHER , "Invalid input data." );
354340
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 );
341+ stack_len = esp_core_dump_get_stack (task , & stack_vaddr , & stack_paddr );
342+ ESP_COREDUMP_LOG_PROCESS ("Add stack for task 0x%x: addr 0x%x, sz %u" ,
343+ task -> tcb_addr , stack_vaddr , stack_len );
344+
345+ #if CONFIG_ESP_COREDUMP_CAPTURE_DRAM
346+ /* If the task data located in the PSRAM, we will save it here.
347+ Otherwise it will be saved in esp_core_dump_store_section()
348+ */
349+ if (esp_ptr_external_ram ((void * )stack_vaddr ))
350+ #endif
351+ {
352+ ret = elf_add_segment (self , PT_LOAD ,
353+ (uint32_t )stack_vaddr ,
354+ (void * )stack_paddr ,
355+ (uint32_t ) stack_len );
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 );
361+ }
361362 }
363+
362364 return ret ;
363365}
364366
@@ -453,20 +455,13 @@ static int elf_save_task(core_dump_elf_t *self, core_dump_task_header_t *task)
453455 return elf_len ;
454456}
455457
456- static int elf_write_tasks_data (core_dump_elf_t * self )
458+ static int elf_process_task_data (core_dump_elf_t * self )
457459{
458- int elf_len = 0 ;
460+ int elf_len = 0 , ret ;
459461 core_dump_task_header_t task_hdr = { 0 };
460462 core_dump_mem_seg_header_t interrupted_stack = { 0 };
461463 TaskIterator_t task_iter ;
462- int ret = ELF_PROC_ERR_OTHER ;
463- uint16_t tasks_num = 0 ;
464- uint16_t bad_tasks_num = 0 ;
465-
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 ;
464+ uint16_t tasks_num = 0 , bad_tasks_num = 0 ;
470465
471466 ESP_COREDUMP_LOG_PROCESS ("================ Processing task data ================" );
472467 // processes all task's stack data and writes segment data into partition
@@ -479,17 +474,16 @@ static int elf_write_tasks_data(core_dump_elf_t *self)
479474 bad_tasks_num ++ ;
480475 continue ;
481476 }
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- }
477+ ret = elf_save_task (self , & task_hdr );
478+ ELF_CHECK_ERR ((ret > 0 ), ret ,
479+ "Task %x, TCB write failed, return (%d)." , task_iter .pxTaskHandle , ret );
480+ elf_len += ret ;
481+ /* interrupt stacks:
482+ - 'port_IntStack' is in the data section for xtensa
483+ - 'xIsrStack' is in the bss section for risc-v
484+ When DRAM capture is enabled, interrupt stack saving can be done during the full section store
485+ */
486+ #if !CONFIG_ESP_COREDUMP_CAPTURE_DRAM
493487 if (interrupted_stack .size > 0 ) {
494488 ESP_COREDUMP_LOG_PROCESS ("Add interrupted task stack %lu bytes @ %x" ,
495489 interrupted_stack .size , interrupted_stack .start );
@@ -500,11 +494,28 @@ static int elf_write_tasks_data(core_dump_elf_t *self)
500494 ELF_CHECK_ERR ((ret > 0 ), ret , "Interrupted task stack write failed, return (%d)." , ret );
501495 elf_len += ret ;
502496 }
497+ #endif
503498 }
504499 ESP_COREDUMP_LOG_PROCESS ("Found %d bad task out of %d" , bad_tasks_num , tasks_num );
500+
505501 return elf_len ;
506502}
507503
504+ static int elf_write_tasks_data (core_dump_elf_t * self )
505+ {
506+ ESP_COREDUMP_LOG_PROCESS ("================ Processing task registers ================" );
507+ int ret = elf_process_tasks_regs (self );
508+ ELF_CHECK_ERR ((ret > 0 ), ret , "Tasks regs addition failed, return (%d)." , ret );
509+ int elf_len = ret ;
510+
511+ ret = elf_process_task_data (self );
512+ if (ret <= 0 ) {
513+ return ret ;
514+ }
515+
516+ return elf_len + ret ;
517+ }
518+
508519#if CONFIG_ESP_COREDUMP_CAPTURE_DRAM
509520
510521/* Coredump stack will also be used by the checksum functions while saving sections.
0 commit comments