|
|
@@ -24,6 +24,7 @@
|
|
|
const static DRAM_ATTR char TAG[] __attribute__((unused)) = "esp_core_dump_port";
|
|
|
|
|
|
#define min(a,b) ((a) < (b) ? (a) : (b))
|
|
|
+#define max(a,b) ((a) < (b) ? (b) : (a))
|
|
|
|
|
|
#define COREDUMP_EM_XTENSA 0x5E
|
|
|
#define COREDUMP_INVALID_CAUSE_VALUE 0xFFFF
|
|
|
@@ -156,7 +157,12 @@ static void *esp_core_dump_get_fake_stack(uint32_t *stk_len)
|
|
|
|
|
|
static core_dump_reg_pair_t *esp_core_dump_get_epc_regs(core_dump_reg_pair_t* src)
|
|
|
{
|
|
|
+#pragma GCC diagnostic push
|
|
|
+#if __GNUC__ >= 9
|
|
|
+#pragma GCC diagnostic ignored "-Waddress-of-packed-member"
|
|
|
+#endif
|
|
|
uint32_t* reg_ptr = (uint32_t*)src;
|
|
|
+#pragma GCC diagnostic pop
|
|
|
// get InterruptException program counter registers
|
|
|
COREDUMP_GET_EPC(EPC_1, reg_ptr);
|
|
|
COREDUMP_GET_EPC(EPC_2, reg_ptr);
|
|
|
@@ -170,7 +176,12 @@ static core_dump_reg_pair_t *esp_core_dump_get_epc_regs(core_dump_reg_pair_t* sr
|
|
|
|
|
|
static core_dump_reg_pair_t *esp_core_dump_get_eps_regs(core_dump_reg_pair_t* src)
|
|
|
{
|
|
|
+#pragma GCC diagnostic push
|
|
|
+#if __GNUC__ >= 9
|
|
|
+#pragma GCC diagnostic ignored "-Waddress-of-packed-member"
|
|
|
+#endif
|
|
|
uint32_t* reg_ptr = (uint32_t*)src;
|
|
|
+#pragma GCC diagnostic pop
|
|
|
// get InterruptException processor state registers
|
|
|
COREDUMP_GET_EPS(EPS_2, reg_ptr);
|
|
|
COREDUMP_GET_EPS(EPS_3, reg_ptr);
|
|
|
@@ -339,8 +350,9 @@ bool esp_core_dump_mem_seg_is_sane(uint32_t addr, uint32_t sz)
|
|
|
uint32_t esp_core_dump_get_stack(core_dump_task_header_t *task,
|
|
|
uint32_t* stk_vaddr, uint32_t* stk_paddr)
|
|
|
{
|
|
|
- const uint32_t stack_len = abs(task->stack_start - task->stack_end);
|
|
|
const uint32_t stack_addr = min(task->stack_start, task->stack_end);
|
|
|
+ const uint32_t stack_addr2 = max(task->stack_start, task->stack_end);
|
|
|
+ const uint32_t stack_len = stack_addr2 - stack_addr;
|
|
|
|
|
|
ESP_COREDUMP_DEBUG_ASSERT(stk_paddr != NULL && stk_vaddr != NULL);
|
|
|
|