Skip to content

Commit 1848079

Browse files
committed
fix(coredump): properly save task's stack when stack is located in PSRAM
1 parent c753271 commit 1848079

File tree

1 file changed

+55
-44
lines changed

1 file changed

+55
-44
lines changed

components/espcoredump/src/core_dump_elf.c

Lines changed: 55 additions & 44 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,34 @@ 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, 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

Comments
 (0)