Просмотр исходного кода

xtensa: Move saving of a0 register to match upstream

Upstream xtensa exception handling will save PS, PC, and a0 registers
together when saving a minimal context. This commit ppdates the xtensa
exception handling to match upstream behavior.
Darian Leung 4 лет назад
Родитель
Сommit
3336b057d6

+ 2 - 6
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

+ 2 - 5
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

+ 2 - 5
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

+ 2 - 5
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

+ 2 - 5
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

+ 2 - 4
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