You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by pk...@apache.org on 2022/06/15 15:07:58 UTC

[incubator-nuttx] 02/08: arch/xtensa: Refactor the code that's used to get the pre-exception backtrace.

This is an automated email from the ASF dual-hosted git repository.

pkarashchenko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git

commit fc22eddc382336f1c1099a68e60bc8996a50619e
Author: Abdelatif Guettouche <ab...@espressif.com>
AuthorDate: Fri Jun 10 13:57:09 2022 +0200

    arch/xtensa: Refactor the code that's used to get the pre-exception
    backtrace.
    
    Signed-off-by: Abdelatif Guettouche <ab...@espressif.com>
---
 arch/xtensa/src/common/xtensa_int_handlers.S | 17 +---------------
 arch/xtensa/src/common/xtensa_macros.S       | 29 ++++++++++++++++++++++++++++
 arch/xtensa/src/common/xtensa_user_handler.S | 12 +-----------
 3 files changed, 31 insertions(+), 27 deletions(-)

diff --git a/arch/xtensa/src/common/xtensa_int_handlers.S b/arch/xtensa/src/common/xtensa_int_handlers.S
index c1d2d94850..d8bfc9de25 100644
--- a/arch/xtensa/src/common/xtensa_int_handlers.S
+++ b/arch/xtensa/src/common/xtensa_int_handlers.S
@@ -192,22 +192,7 @@ g_intstacktop:
 	 * before getting here.
 	 */
 
-#ifdef CONFIG_XTENSA_INTBACKTRACE
-	l32i a3, a12, (4 * REG_A0)        /* Copy pre-exception a0 (return address) */
-	s32e a3, sp, -16
-	l32i a3, a12, (4 * REG_A1)        /* Copy pre-exception a1 (stack pointer) */
-	s32e a3, sp, -12
-
-	/* Backtracing only needs a0 and a1, no need to create full base save area.
-	 * Also need to change current frame's return address to point to pre-exception's
-	 * last run instruction.
-	 */
-
-	rsr a0, EPC_1 + \level - 1  /* return address */
-	movi a4, 0xc0000000         /* constant with top 2 bits set (call size) */
-	or a0, a0, a4               /* set top 2 bits */
-	addx2 a0, a4, a0            /* clear top bit -- simulating call4 size   */
-#endif
+	exception_backtrace a12 \level
 
 	/* Call xtensa_int_decode passing the address of the register save area
 	 * as a parameter (A7).
diff --git a/arch/xtensa/src/common/xtensa_macros.S b/arch/xtensa/src/common/xtensa_macros.S
index cb57846d1c..5adb3633aa 100644
--- a/arch/xtensa/src/common/xtensa_macros.S
+++ b/arch/xtensa/src/common/xtensa_macros.S
@@ -92,3 +92,32 @@
 
 	.endm
 
+/****************************************************************************
+ * Name: exceptin_backtrace
+ *
+ * Description:
+ *   Populate the base save area with the pre-exception A0 and SP to be able
+ *   to backtrace from it.
+ *
+ ****************************************************************************/
+
+	.macro	exception_backtrace	sa level
+
+#if !defined(__XTENSA_CALL0_ABI__) && defined(CONFIG_XTENSA_INTBACKTRACE)
+	l32i    a3, \sa, (4 * REG_A0)    /* Copy pre-exception a0 (return address) */
+	s32e    a3, sp, -16
+	l32i    a3, \sa, (4 * REG_A1)    /* Copy pre-exception a1 (stack pointer) */
+	s32e    a3, sp, -12
+
+	/* Backtracing only needs a0 and a1, no need to create full base save area.
+	 * Also need to change current frame's return address to point to pre-exception's
+	 * last run instruction.
+	 */
+
+	rsr     a0, EPC_1 + \level - 1   /* Return address for debug backtrace */
+	movi    a4, 0xc0000000           /* Constant with top 2 bits set (call size) */
+	or      a0, a0, a4               /* Set top 2 bits */
+	addx2   a0, a4, a0               /* Clear top bit to simulate a call4 size */
+#endif
+
+	.endm
diff --git a/arch/xtensa/src/common/xtensa_user_handler.S b/arch/xtensa/src/common/xtensa_user_handler.S
index c2bf3458a3..47adb53634 100644
--- a/arch/xtensa/src/common/xtensa_user_handler.S
+++ b/arch/xtensa/src/common/xtensa_user_handler.S
@@ -189,17 +189,7 @@ _xtensa_user_handler:
 	 * an interrupt stack).
 	 */
 
-#ifdef CONFIG_XTENSA_INTBACKTRACE
-	l32i    a3, a12, (4 * REG_A0)     /* Copy pre-exception a0 (return address) */
-	s32e    a3, sp, -16
-	l32i    a3, a12, (4 * REG_A1)     /* Copy pre-exception a1 (stack pointer) */
-	s32e    a3, sp, -12
-
-	rsr     a0, EPC_1                /* return address for debug backtrace */
-	movi    a4, 0xc0000000           /* constant with top 2 bits set (call size) */
-	or      a0, a0, a4               /* set top 2 bits */
-	addx2   a0, a4, a0               /* clear top bit -- thus simulating call4 size */
-#endif
+	exception_backtrace a12 1
 
 	/* Call xtensa_user, passing both the EXCCAUSE and a pointer to the
 	 * beginning of the register save area.