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 2021/07/21 02:30:18 UTC

[incubator-nuttx] 01/02: Fix xtensa_btdump() to look at the exception frame

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/incubator-nuttx.git

commit d2eeeee262ef2d66cf4d7708ce64d0687b08e4e4
Author: Alan C. Assis <ac...@gmail.com>
AuthorDate: Tue Jul 20 09:34:14 2021 -0300

    Fix xtensa_btdump() to look at the exception frame
    
    Remove xtensa_backtrace_start() since it is not used anymore
---
 arch/xtensa/src/common/xtensa.h           |   4 --
 arch/xtensa/src/common/xtensa_backtrace.S | 104 ------------------------------
 arch/xtensa/src/common/xtensa_dumpstate.c |   6 +-
 arch/xtensa/src/esp32/Make.defs           |   4 --
 4 files changed, 5 insertions(+), 113 deletions(-)

diff --git a/arch/xtensa/src/common/xtensa.h b/arch/xtensa/src/common/xtensa.h
index 63eb4f1..4e2bc49 100644
--- a/arch/xtensa/src/common/xtensa.h
+++ b/arch/xtensa/src/common/xtensa.h
@@ -348,9 +348,5 @@ void xtensa_pminitialize(void);
 void up_stack_color(FAR void *stackbase, size_t nbytes);
 #endif
 
-#ifdef CONFIG_XTENSA_DUMPBT_ON_ASSERT
-void xtensa_backtrace_start(uint32_t *pc, uint32_t *sp, uint32_t *next_pc);
-#endif
-
 #endif /* __ASSEMBLY__ */
 #endif /* __ARCH_XTENSA_SRC_COMMON_XTENSA_H */
diff --git a/arch/xtensa/src/common/xtensa_backtrace.S b/arch/xtensa/src/common/xtensa_backtrace.S
deleted file mode 100644
index 8970ff8..0000000
--- a/arch/xtensa/src/common/xtensa_backtrace.S
+++ /dev/null
@@ -1,104 +0,0 @@
-/****************************************************************************
- * arch/xtensa/src/common/xtensa_backtrace.S
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.  The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-
-#include <arch/xtensa/core.h>
-#include <arch/xtensa/xtensa_specregs.h>
-
-#include "xtensa_abi.h"
-
-/*
- * This is how the call stack looks like when calling the function below
- * from xtensa_dumpstate():
- *
- *         High Addr
- *     ..................
- *     |    i-3 BSA     |
- *     |   i-1 locals   | xtensa_assert()
- *     .................. i-1 SP
- *     |    i-2 BSA     |
- *     |    i locals    | xtensa_dumpstate()
- *     ------------------ i SP
- *     |    i-1 BSA     |
- *     |   i+1 locals   | xtensa_btdump()
- *     ------------------ i+1 SP
- *     |     i BSA      |
- *     |   i+2 locals   | xtensa_backtrace_start()
- *     ------------------ i+2 SP
- *     |    i+1 BSA     |
- *     |   i+3 locals   | xtensa_window_spill()
- *     ------------------ i+3 SP
- *     .................. Low Addr
- */
-
-/****************************************************************************
- * Name: xtensa_backtrace_start
- *
- * Description:
- *   Get the first frame of the current stack's backtrace.
- *
- *   Given the following function call flow (B -> A -> X -> xtensa_backtrace_start),
- *   this function will do the following:
- *     - Flush CPU registers and window frames onto the current stack
- *     - Return PC and SP of function A (i.e. start of the stack's backtrace)
- *     - Return PC of function B (i.e. next_pc)
- *
- * Input Parameters:
- *   pc      - PC of the first frame in the backtrace
- *   sp      - SP of the first frame in the backtrace
- *   next_pc - PC of the first frame's caller
- *
- *   C callable as:
- *     void xtensa_backtrace_start(uint32_t *pc, uint32_t *sp, uint32_t *next_pc)
- *
- ****************************************************************************/
-
-    .section    .iram1, "ax"
-    .global     xtensa_backtrace_start
-    .type       xtensa_backtrace_start, @function
-    .align      4
-
-xtensa_backtrace_start:
-
-  ENTRY(32)
-
-  call8   xtensa_window_spill  /* Spill registers onto stack (excluding this
-                                * function) */
-
-  /* a2, a3, a4 should be out arguments for i SP, i PC, i-1 PC respectively.
-   * Use a5 and a6 as scratch.
-   */
-
-  l32e    a5, sp, -16     /* Get i PC, which is ret address of i+1 */
-  s32i    a5, a2, 0       /* Store i PC to arg *pc */
-  l32e    a6, sp, -12     /* Get i+1 SP. Used to access i BS */
-  l32e    a5, a6, -12     /* Get i SP */
-  s32i    a5, a3, 0       /* Store i SP to arg *sp */
-  l32e    a5, a6, -16     /* Get i-1 PC, which is ret address of i */
-  s32i    a5, a4, 0       /* Store i-1 PC to arg *next_pc */
-  RET0
-
-	.size	xtensa_backtrace_start, . - xtensa_backtrace_start
-
diff --git a/arch/xtensa/src/common/xtensa_dumpstate.c b/arch/xtensa/src/common/xtensa_dumpstate.c
index f94fc33..9ca34a7 100644
--- a/arch/xtensa/src/common/xtensa_dumpstate.c
+++ b/arch/xtensa/src/common/xtensa_dumpstate.c
@@ -232,7 +232,11 @@ static inline void xtensa_btdump(void)
   int i;
   bool corrupted = false;
 
-  xtensa_backtrace_start(&pc, &sp, &npc);
+  uint32_t *regs = (uint32_t *)CURRENT_REGS;
+
+  pc  = regs[REG_PC];
+  npc = regs[REG_A0]; /* return register */
+  sp  = regs[REG_A1]; /* stack pointer */
 
   _alert("Backtrace0: %x:%x\n", stackpc(pc), sp);
 
diff --git a/arch/xtensa/src/esp32/Make.defs b/arch/xtensa/src/esp32/Make.defs
index 89ac4fa..268deae 100644
--- a/arch/xtensa/src/esp32/Make.defs
+++ b/arch/xtensa/src/esp32/Make.defs
@@ -50,10 +50,6 @@ ifeq ($(CONFIG_DEBUG_ALERT),y)
   CMN_CSRCS += xtensa_dumpstate.c
 endif
 
-ifeq ($(CONFIG_XTENSA_DUMPBT_ON_ASSERT),y)
-  CMN_ASRCS += xtensa_backtrace.S
-endif
-
 ifeq ($(CONFIG_SPINLOCK),y)
   CMN_CSRCS += xtensa_testset.c
 endif