You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2023/06/06 17:44:34 UTC
[nuttx] branch master updated: risc-v/backtrace: correct stack pointer if enable ARCH_KERNEL_STACK
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 <an...@xiaomi.com>
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 <an...@xiaomi.com>
---
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);
}