|
@@ -0,0 +1,76 @@
|
|
|
+From 05154174b369505238b759cf80d595d8cfc8c731 Mon Sep 17 00:00:00 2001
|
|
|
+From: Max Filippov <jcmvbkbc@gmail.com>
|
|
|
+Date: Mon, 10 Aug 2015 21:35:20 +0300
|
|
|
+Subject: [PATCH 1/3] xtensa: reimplement register spilling
|
|
|
+
|
|
|
+Spilling windowed registers in userspace is much easier, more portable,
|
|
|
+less error-prone and equally effective as in kernel. Now that register
|
|
|
+spilling syscall is considered obsolete in the xtensa linux kernel
|
|
|
+replace it with CALL12 followed by series of ENTRY in libgcc.
|
|
|
+
|
|
|
+2015-08-18 Max Filippov <jcmvbkbc@gmail.com>
|
|
|
+libgcc/
|
|
|
+ * config/xtensa/lib2funcs.S (__xtensa_libgcc_window_spill): Use
|
|
|
+ CALL12 followed by series of ENTRY to spill windowed registers.
|
|
|
+ (__xtensa_nonlocal_goto): Call __xtensa_libgcc_window_spill
|
|
|
+ instead of making linux spill syscall.
|
|
|
+
|
|
|
+Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
|
|
|
+---
|
|
|
+Backported from: r226962
|
|
|
+
|
|
|
+ libgcc/config/xtensa/lib2funcs.S | 30 +++++++++++++++++++++++-------
|
|
|
+ 1 file changed, 23 insertions(+), 7 deletions(-)
|
|
|
+
|
|
|
+diff --git a/libgcc/config/xtensa/lib2funcs.S b/libgcc/config/xtensa/lib2funcs.S
|
|
|
+index 3ac8c1d..2e678af 100644
|
|
|
+--- a/libgcc/config/xtensa/lib2funcs.S
|
|
|
++++ b/libgcc/config/xtensa/lib2funcs.S
|
|
|
+@@ -33,10 +33,29 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
|
|
+ .global __xtensa_libgcc_window_spill
|
|
|
+ .type __xtensa_libgcc_window_spill,@function
|
|
|
+ __xtensa_libgcc_window_spill:
|
|
|
+- entry sp, 32
|
|
|
+- movi a2, 0
|
|
|
+- syscall
|
|
|
++ entry sp, 48
|
|
|
++#if XCHAL_NUM_AREGS > 16
|
|
|
++ call12 1f
|
|
|
++ retw
|
|
|
++ .align 4
|
|
|
++1:
|
|
|
++ .rept (XCHAL_NUM_AREGS - 24) / 12
|
|
|
++ _entry sp, 48
|
|
|
++ mov a12, a0
|
|
|
++ .endr
|
|
|
++ _entry sp, 16
|
|
|
++#if XCHAL_NUM_AREGS % 12 == 0
|
|
|
++ mov a4, a4
|
|
|
++#elif XCHAL_NUM_AREGS % 12 == 4
|
|
|
++ mov a8, a8
|
|
|
++#elif XCHAL_NUM_AREGS % 12 == 8
|
|
|
++ mov a12, a12
|
|
|
++#endif
|
|
|
++ retw
|
|
|
++#else
|
|
|
++ mov a8, a8
|
|
|
+ retw
|
|
|
++#endif
|
|
|
+ .size __xtensa_libgcc_window_spill, .-__xtensa_libgcc_window_spill
|
|
|
+
|
|
|
+
|
|
|
+@@ -58,10 +77,7 @@ __xtensa_nonlocal_goto:
|
|
|
+ entry sp, 32
|
|
|
+
|
|
|
+ /* Flush registers. */
|
|
|
+- mov a5, a2
|
|
|
+- movi a2, 0
|
|
|
+- syscall
|
|
|
+- mov a2, a5
|
|
|
++ call8 __xtensa_libgcc_window_spill
|
|
|
+
|
|
|
+ /* Because the save area for a0-a3 is stored one frame below
|
|
|
+ the one identified by a2, the only way to restore those
|
|
|
+--
|
|
|
+1.8.1.4
|
|
|
+
|