diff --git a/arch/arm/src/common/arm_assert.c b/arch/arm/src/common/arm_assert.c index 8380a8a0f2..42e0148738 100644 --- a/arch/arm/src/common/arm_assert.c +++ b/arch/arm/src/common/arm_assert.c @@ -59,6 +59,12 @@ #ifdef CONFIG_ARCH_STACKDUMP +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static uint8_t s_last_regs[XCPTCONTEXT_SIZE]; + /**************************************************************************** * Private Functions ****************************************************************************/ @@ -397,7 +403,8 @@ static void arm_dumpstate(void) } else { - up_saveusercontext(rtcb->xcp.regs); + up_saveusercontext(s_last_regs); + rtcb->xcp.regs = (uint32_t *)s_last_regs; } /* Dump the registers */ diff --git a/arch/arm/src/common/arm_backtrace_fp.c b/arch/arm/src/common/arm_backtrace_fp.c index 80b942d903..7404932b1a 100644 --- a/arch/arm/src/common/arm_backtrace_fp.c +++ b/arch/arm/src/common/arm_backtrace_fp.c @@ -144,8 +144,8 @@ int up_backtrace(struct tcb_s *tcb, { ret += backtrace(rtcb->stack_base_ptr, rtcb->stack_base_ptr + rtcb->adj_stack_size, - (void *)CURRENT_REGS[REG_FP], - (void *)CURRENT_REGS[REG_PC], + (void *)rtcb->xcp.regs[REG_FP], + (void *)rtcb->xcp.regs[REG_PC], &buffer[ret], size - ret, &skip); } } diff --git a/arch/arm/src/common/arm_backtrace_thumb.c b/arch/arm/src/common/arm_backtrace_thumb.c index 4a8d45c13f..89919d1f06 100644 --- a/arch/arm/src/common/arm_backtrace_thumb.c +++ b/arch/arm/src/common/arm_backtrace_thumb.c @@ -504,10 +504,10 @@ int up_backtrace(struct tcb_s *tcb, #endif if (ret < size) { - sp = (void *)CURRENT_REGS[REG_SP]; + sp = (void *)rtcb->xcp.regs[REG_SP]; ret += backtrace_push(rtcb->stack_base_ptr + rtcb->adj_stack_size, &sp, - (void *)CURRENT_REGS[REG_PC], + (void *)rtcb->xcp.regs[REG_PC], &buffer[ret], size - ret, &skip); } } diff --git a/arch/risc-v/src/common/riscv_assert.c b/arch/risc-v/src/common/riscv_assert.c index 5d1e74b305..713d1b131e 100644 --- a/arch/risc-v/src/common/riscv_assert.c +++ b/arch/risc-v/src/common/riscv_assert.c @@ -65,6 +65,12 @@ #ifdef CONFIG_ARCH_STACKDUMP +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static uint8_t s_last_regs[XCPTCONTEXT_SIZE]; + /**************************************************************************** * Private Functions ****************************************************************************/ @@ -374,7 +380,8 @@ static void riscv_dumpstate(void) } else { - up_saveusercontext(rtcb->xcp.regs); + up_saveusercontext(s_last_regs); + rtcb->xcp.regs = (uintptr_t *)s_last_regs; } /* Dump the registers (if available) */ diff --git a/arch/risc-v/src/common/riscv_backtrace.c b/arch/risc-v/src/common/riscv_backtrace.c index 890e3cb9c2..2a388e8491 100644 --- a/arch/risc-v/src/common/riscv_backtrace.c +++ b/arch/risc-v/src/common/riscv_backtrace.c @@ -154,8 +154,8 @@ int up_backtrace(struct tcb_s *tcb, void **buffer, int size, int skip) { ret += backtrace(rtcb->stack_base_ptr, rtcb->stack_base_ptr + rtcb->adj_stack_size, - (void *)CURRENT_REGS[REG_FP], - (void *)CURRENT_REGS[REG_EPC], + (void *)rtcb->xcp.regs[REG_FP], + (void *)rtcb->xcp.regs[REG_EPC], &buffer[ret], size - ret, &skip); } } diff --git a/arch/xtensa/src/common/xtensa_backtrace.c b/arch/xtensa/src/common/xtensa_backtrace.c index 2c775ba9dd..c0597db41a 100644 --- a/arch/xtensa/src/common/xtensa_backtrace.c +++ b/arch/xtensa/src/common/xtensa_backtrace.c @@ -253,8 +253,8 @@ int up_backtrace(struct tcb_s *tcb, void **buffer, int size, int skip) #endif ret += backtrace_stack(rtcb->stack_base_ptr, rtcb->stack_base_ptr + rtcb->adj_stack_size, - (void *)CURRENT_REGS[REG_A1], - (void *)CURRENT_REGS[REG_A0], + (void *)rtcb->xcp.regs[REG_A1], + (void *)rtcb->xcp.regs[REG_A0], &buffer[ret], size - ret, &skip); } else diff --git a/arch/xtensa/src/common/xtensa_dumpstate.c b/arch/xtensa/src/common/xtensa_dumpstate.c index 366f99a37d..5eaf879e28 100644 --- a/arch/xtensa/src/common/xtensa_dumpstate.c +++ b/arch/xtensa/src/common/xtensa_dumpstate.c @@ -44,6 +44,12 @@ #ifdef CONFIG_DEBUG_ALERT +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static uint8_t s_last_regs[XCPTCONTEXT_SIZE]; + /**************************************************************************** * Private Functions ****************************************************************************/ @@ -343,7 +349,8 @@ void xtensa_dumpstate(void) } else { - up_saveusercontext(rtcb->xcp.regs); + up_saveusercontext(s_last_regs); + rtcb->xcp.regs = (uint32_t *)s_last_regs; } /* Dump the registers (if available) */