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);
     }