diff --git a/components/esp_gdbstub/xtensa/gdbstub-entry.S b/components/esp_gdbstub/xtensa/gdbstub-entry.S index 2fd7bcae6a..6fd2168028 100644 --- a/components/esp_gdbstub/xtensa/gdbstub-entry.S +++ b/components/esp_gdbstub/xtensa/gdbstub-entry.S @@ -20,6 +20,8 @@ _xt_gdbstub_int: s32i a0, sp, XT_STK_PS rsr a0, EPC_1 /* save interruptee's PC */ s32i a0, sp, XT_STK_PC + rsr a0, EXCSAVE_1 /* save interruptee's a0 */ + s32i a0, sp, XT_STK_A0 #if XCHAL_HAVE_WINDOWED s32e a0, sp, -16 /* for debug backtrace */ #endif @@ -32,12 +34,6 @@ _xt_gdbstub_int: rsr a0, EXCVADDR s32i a0, sp, XT_STK_EXCVADDR - - /* _xt_context_save seems to save the current a0, but we need the interuptees a0. Fix this. */ - rsr a0, EXCSAVE_1 /* save interruptee's a0 */ - - s32i a0, sp, XT_STK_A0 - mov a6,sp movi a3, gdbstub_handle_uart_int callx0 a3 diff --git a/components/esp_system/port/arch/xtensa/panic_handler_asm.S b/components/esp_system/port/arch/xtensa/panic_handler_asm.S index 3328f55537..a452c5f6a1 100644 --- a/components/esp_system/port/arch/xtensa/panic_handler_asm.S +++ b/components/esp_system/port/arch/xtensa/panic_handler_asm.S @@ -35,6 +35,8 @@ _xt_panic: s32i a0, sp, XT_STK_PS rsr a0, EPC_1 /* save interruptee's PC */ s32i a0, sp, XT_STK_PC + rsr a0, EXCSAVE_1 /* save interruptee's a0 */ + s32i a0, sp, XT_STK_A0 #if XCHAL_HAVE_WINDOWED s32e a0, sp, -16 /* for debug backtrace */ #endif @@ -48,11 +50,6 @@ _xt_panic: rsr a0, EXCVADDR s32i a0, sp, XT_STK_EXCVADDR - /* _xt_context_save seems to save the current a0, but we need the interuptees a0. Fix this. */ - rsr a0, EXCSAVE_1 /* save interruptee's a0 */ - - s32i a0, sp, XT_STK_A0 - /* Set up PS for C, disable all interrupts except NMI and debug, and clear EXCM. */ movi a0, PS_INTLEVEL(XCHAL_DEBUGLEVEL - 2) | PS_UM | PS_WOE wsr a0, PS diff --git a/components/esp_system/port/soc/esp32/highint_hdl.S b/components/esp_system/port/soc/esp32/highint_hdl.S index 51b963cce6..8c77711188 100644 --- a/components/esp_system/port/soc/esp32/highint_hdl.S +++ b/components/esp_system/port/soc/esp32/highint_hdl.S @@ -228,6 +228,8 @@ xt_highintx: s32i a0, sp, XT_STK_PS rsr a0, EPC_X /* save interruptee's PC */ s32i a0, sp, XT_STK_PC + rsr a0, EXCSAVE_X /* save interruptee's a0 */ + s32i a0, sp, XT_STK_A0 #if XCHAL_HAVE_WINDOWED s32e a0, sp, -16 /* for debug backtrace */ #endif @@ -279,11 +281,6 @@ xt_highintx: /* Found the reason, now save it. */ s32i a0, sp, XT_STK_EXCCAUSE - /* _xt_context_save seems to save the current a0, but we need the interuptees a0. Fix this. */ - rsr a0, EXCSAVE_X /* save interruptee's a0 */ - - s32i a0, sp, XT_STK_A0 - /* Set up PS for C, disable all interrupts except NMI and debug, and clear EXCM. */ movi a0, PS_INTLEVEL(5) | PS_UM | PS_WOE wsr a0, PS diff --git a/components/esp_system/port/soc/esp32s2/highint_hdl.S b/components/esp_system/port/soc/esp32s2/highint_hdl.S index 845a50a440..c3d7dc0d8f 100644 --- a/components/esp_system/port/soc/esp32s2/highint_hdl.S +++ b/components/esp_system/port/soc/esp32s2/highint_hdl.S @@ -47,6 +47,8 @@ xt_highint4: s32i a0, sp, XT_STK_PS rsr a0, EPC_4 /* save interruptee's PC */ s32i a0, sp, XT_STK_PC + rsr a0, EXCSAVE_4 /* save interruptee's a0 */ + s32i a0, sp, XT_STK_A0 #if XCHAL_HAVE_WINDOWED s32e a0, sp, -16 /* for debug backtrace */ #endif @@ -77,11 +79,6 @@ xt_highint4: /* Found the reason, now save it. */ s32i a0, sp, XT_STK_EXCCAUSE - /* _xt_context_save seems to save the current a0, but we need the interuptees a0. Fix this. */ - rsr a0, EXCSAVE_4 /* save interruptee's a0 */ - - s32i a0, sp, XT_STK_A0 - /* Set up PS for C, disable all interrupts except NMI and debug, and clear EXCM. */ movi a0, PS_INTLEVEL(5) | PS_UM | PS_WOE wsr a0, PS diff --git a/components/esp_system/port/soc/esp32s3/highint_hdl.S b/components/esp_system/port/soc/esp32s3/highint_hdl.S index af0b2b31e7..12c01adf76 100644 --- a/components/esp_system/port/soc/esp32s3/highint_hdl.S +++ b/components/esp_system/port/soc/esp32s3/highint_hdl.S @@ -63,6 +63,8 @@ xt_highint4: s32i a0, sp, XT_STK_PS rsr a0, EPC_4 /* save interruptee's PC */ s32i a0, sp, XT_STK_PC + rsr a0, EXCSAVE_4 /* save interruptee's a0 */ + s32i a0, sp, XT_STK_A0 #if XCHAL_HAVE_WINDOWED s32e a0, sp, -16 /* for debug backtrace */ #endif @@ -105,11 +107,6 @@ xt_highint4: /* Found the reason, now save it. */ s32i a0, sp, XT_STK_EXCCAUSE - /* _xt_context_save seems to save the current a0, but we need the interuptees a0. Fix this. */ - rsr a0, EXCSAVE_4 /* save interruptee's a0 */ - - s32i a0, sp, XT_STK_A0 - /* Set up PS for C, disable all interrupts except NMI and debug, and clear EXCM. */ movi a0, PS_INTLEVEL(5) | PS_UM | PS_WOE wsr a0, PS diff --git a/components/freertos/FreeRTOS-Kernel/portable/xtensa/xtensa_vectors.S b/components/freertos/FreeRTOS-Kernel/portable/xtensa/xtensa_vectors.S index 1560ff27d6..cb20759a2c 100644 --- a/components/freertos/FreeRTOS-Kernel/portable/xtensa/xtensa_vectors.S +++ b/components/freertos/FreeRTOS-Kernel/portable/xtensa/xtensa_vectors.S @@ -622,6 +622,8 @@ _xt_user_exc: s32i a0, sp, XT_STK_PS rsr a0, EPC_1 /* save interruptee's PC */ s32i a0, sp, XT_STK_PC + rsr a0, EXCSAVE_1 /* save interruptee's a0 */ + s32i a0, sp, XT_STK_A0 #if XCHAL_HAVE_WINDOWED s32e a0, sp, -16 /* for debug backtrace */ #endif @@ -635,10 +637,6 @@ _xt_user_exc: rsr a0, EXCVADDR s32i a0, sp, XT_STK_EXCVADDR - /* _xt_context_save seems to save the current a0, but we need the interuptees a0. Fix this. */ - rsr a0, EXCSAVE_1 /* save interruptee's a0 */ - s32i a0, sp, XT_STK_A0 - /* Set up PS for C, reenable debug and NMI interrupts, and clear EXCM. */ #ifdef __XTENSA_CALL0_ABI__ movi a0, PS_INTLEVEL(XCHAL_DEBUGLEVEL - 2) | PS_UM