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

commit e4ae2b48b8d8d2d54a74f949cc1adbbc8758fe7e
Author: zhangyuan21 <zhangyua...@xiaomi.com>
AuthorDate: Fri Mar 31 09:50:58 2023 +0800

    arch/arm64: Obtaining the correct fp pointer
    
    Signed-off-by: zhangyuan21 <zhangyua...@xiaomi.com>
---
 arch/arm64/src/common/Make.defs         | 6 +++++-
 arch/arm64/src/common/arm64_backtrace.c | 7 +++----
 2 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/arch/arm64/src/common/Make.defs b/arch/arm64/src/common/Make.defs
index ac6e7205a3..44ab574f5a 100644
--- a/arch/arm64/src/common/Make.defs
+++ b/arch/arm64/src/common/Make.defs
@@ -47,7 +47,7 @@ CMN_CSRCS += arm64_nputs.c arm64_idle.c arm64_copystate.c 
arm64_createstack.c
 CMN_CSRCS += arm64_releasestack.c arm64_stackframe.c arm64_usestack.c
 CMN_CSRCS += arm64_task_sched.c arm64_exit.c arm64_vfork.c 
arm64_switchcontext.c
 CMN_CSRCS += arm64_schedulesigaction.c arm64_sigdeliver.c
-CMN_CSRCS += arm64_backtrace.c arm64_getintstack.c arm64_registerdump.c
+CMN_CSRCS += arm64_getintstack.c arm64_registerdump.c
 CMN_CSRCS += arm64_perf.c
 
 # Common C source files ( hardware BSP )
@@ -115,3 +115,7 @@ endif
 ifeq ($(CONFIG_STACK_COLORATION),y)
 CMN_CSRCS += arm64_checkstack.c
 endif
+
+ifeq ($(CONFIG_SCHED_BACKTRACE),y)
+CMN_CSRCS += arm64_backtrace.c
+endif
diff --git a/arch/arm64/src/common/arm64_backtrace.c 
b/arch/arm64/src/common/arm64_backtrace.c
index 24d1ac956d..60406f7f4d 100644
--- a/arch/arm64/src/common/arm64_backtrace.c
+++ b/arch/arm64/src/common/arm64_backtrace.c
@@ -53,14 +53,13 @@ static int backtrace(uintptr_t *base, uintptr_t *limit,
 
   if (pc)
     {
-      i++;
       if (*skip-- <= 0)
         {
-          *buffer++ = pc;
+          buffer[i++] = pc;
         }
     }
 
-  for (; i < size; fp = (uintptr_t *)*(fp - 1), i++)
+  for (; i < size; fp = (uintptr_t *)*fp)
     {
       if (fp > limit || fp < base || *fp == 0)
         {
@@ -69,7 +68,7 @@ static int backtrace(uintptr_t *base, uintptr_t *limit,
 
       if (*skip-- <= 0)
         {
-          *buffer++ = (void *)*fp;
+          buffer[i++] = (void *)*(fp + 1);
         }
     }
 

Reply via email to