This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 76e5204a80 risc-v/backtrace: correct stack pointer if enable
ARCH_KERNEL_STACK
76e5204a80 is described below
commit 76e5204a806c6db7847e7c0d0f21c35007548b21
Author: chao an <[email protected]>
AuthorDate: Tue Jun 6 09:33:25 2023 +0800
risc-v/backtrace: correct stack pointer if enable ARCH_KERNEL_STACK
Signed-off-by: chao an <[email protected]>
---
arch/risc-v/src/common/riscv_backtrace.c | 40 +++++++++++++++++++++++++-------
1 file changed, 32 insertions(+), 8 deletions(-)
diff --git a/arch/risc-v/src/common/riscv_backtrace.c
b/arch/risc-v/src/common/riscv_backtrace.c
index 6903ddfed3..01f2e05c11 100644
--- a/arch/risc-v/src/common/riscv_backtrace.c
+++ b/arch/risc-v/src/common/riscv_backtrace.c
@@ -162,20 +162,44 @@ int up_backtrace(struct tcb_s *tcb, void **buffer, int
size, int skip)
}
else
{
- ret = backtrace(rtcb->stack_base_ptr,
- rtcb->stack_base_ptr + rtcb->adj_stack_size,
- (void *)getfp(), NULL, buffer, size, &skip);
+#ifdef CONFIG_ARCH_KERNEL_STACK
+ if (rtcb->xcp.ustkptr != NULL)
+ {
+ ret = backtrace(rtcb->stack_base_ptr,
+ rtcb->stack_base_ptr + rtcb->adj_stack_size,
+ (void *)*(rtcb->xcp.ustkptr + 1), NULL,
+ buffer, size, &skip);
+ }
+ else
+#endif
+ {
+ ret = backtrace(rtcb->stack_base_ptr,
+ rtcb->stack_base_ptr + rtcb->adj_stack_size,
+ (void *)getfp(), NULL, buffer, size, &skip);
+ }
}
}
else
{
flags = enter_critical_section();
- ret = backtrace(tcb->stack_base_ptr,
- tcb->stack_base_ptr + tcb->adj_stack_size,
- (void *)tcb->xcp.regs[REG_FP],
- (void *)tcb->xcp.regs[REG_EPC],
- buffer, size, &skip);
+#ifdef CONFIG_ARCH_KERNEL_STACK
+ if (tcb->xcp.ustkptr != NULL)
+ {
+ ret = backtrace(tcb->stack_base_ptr,
+ tcb->stack_base_ptr + tcb->adj_stack_size,
+ (void *)*(tcb->xcp.ustkptr + 1), NULL,
+ buffer, size, &skip);
+ }
+ else
+#endif
+ {
+ ret = backtrace(tcb->stack_base_ptr,
+ tcb->stack_base_ptr + tcb->adj_stack_size,
+ (void *)tcb->xcp.regs[REG_FP],
+ (void *)tcb->xcp.regs[REG_EPC],
+ buffer, size, &skip);
+ }
leave_critical_section(flags);
}