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
