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 51d13df31761daf137b608119d0cc93baf764c7a
Author: zhuyanlin <[email protected]>
AuthorDate: Tue Jul 27 15:15:14 2021 +0800

    arch: xtensa: save current SP before overwrting in dispatch_c_isr.
    
    In levelx(2,3,4,5)_handler, first need to save sp in a12,
    then after dispatch_c_isr we can restore sp from a12.
    
    Change-Id: Idb6b64a782da866670a4db80b33435a9b63f02c3
---
 arch/xtensa/src/common/xtensa_int_handlers.S | 35 ++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)

diff --git a/arch/xtensa/src/common/xtensa_int_handlers.S 
b/arch/xtensa/src/common/xtensa_int_handlers.S
index 60bcd61..dbdde24 100644
--- a/arch/xtensa/src/common/xtensa_int_handlers.S
+++ b/arch/xtensa/src/common/xtensa_int_handlers.S
@@ -416,6 +416,13 @@ _xtensa_level2_handler:
        mov             a2, sp                                                  
/* Address of state save on stack */
        call0   _xtensa_context_save                    /* Save full register 
state */
 
+       /* Save current SP before (possibly) overwriting it, it's the register 
save
+        * area. This value will be used later by dispatch_c_isr to retrieve the
+        * register save area.
+        */
+
+       mov  a12, sp
+
        /* Set up PS for C, enable interrupts above this level and clear EXCM. 
*/
 
        ps_setup        2 a0
@@ -481,6 +488,13 @@ _xtensa_level3_handler:
        mov             a2, sp                                                  
/* Address of state save on stack */
        call0   _xtensa_context_save                    /* Save full register 
state */
 
+       /* Save current SP before (possibly) overwriting it, it's the register 
save
+        * area. This value will be used later by dispatch_c_isr to retrieve the
+        * register save area.
+        */
+
+       mov  a12, sp
+
        /* Set up PS for C, enable interrupts above this level and clear EXCM. 
*/
 
        ps_setup        3 a0
@@ -546,6 +560,13 @@ _xtensa_level4_handler:
        mov             a2, sp                                                  
/* Address of state save on stack */
        call0   _xtensa_context_save                    /* Save full register 
state */
 
+       /* Save current SP before (possibly) overwriting it, it's the register 
save
+        * area. This value will be used later by dispatch_c_isr to retrieve the
+        * register save area.
+        */
+
+       mov  a12, sp
+
        /* Set up PS for C, enable interrupts above this level and clear EXCM. 
*/
 
        ps_setup        4 a0
@@ -611,6 +632,13 @@ _xtensa_level5_handler:
        mov             a2, sp                                                  
/* Address of state save on stack */
        call0   _xtensa_context_save                    /* Save full register 
state */
 
+       /* Save current SP before (possibly) overwriting it, it's the register 
save
+        * area. This value will be used later by dispatch_c_isr to retrieve the
+        * register save area.
+        */
+
+       mov  a12, sp
+
        /* Set up PS for C, enable interrupts above this level and clear EXCM. 
*/
 
        ps_setup        5 a0
@@ -676,6 +704,13 @@ _xtensa_level6_handler:
        mov             a2, sp                                                  
/* Address of state save on stack */
        call0   _xtensa_context_save                    /* Save full register 
state */
 
+       /* Save current SP before (possibly) overwriting it, it's the register 
save
+        * area. This value will be used later by dispatch_c_isr to retrieve the
+        * register save area.
+        */
+
+       mov  a12, sp
+
        /* Set up PS for C, enable interrupts above this level and clear EXCM. 
*/
 
        ps_setup        6 a0

Reply via email to