]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - sysdeps/s390/s390-64/__longjmp.c
Update copyright notices with scripts/update-copyrights
[thirdparty/glibc.git] / sysdeps / s390 / s390-64 / __longjmp.c
index 6650bf702fda5c7331ee186c5fd8e6b569bd3f88..168ebf562b662dca6f82a6a97fea554a58262ac7 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001, 2005 Free Software Foundation, Inc.
+/* Copyright (C) 2001-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
 
@@ -13,9 +13,8 @@
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
 
 #include <errno.h>
 #include <sysdep.h>
@@ -30,25 +29,45 @@ void
 __longjmp (__jmp_buf env, int val)
 {
 #ifdef PTR_DEMANGLE
-  register uintptr_t r5 __asm ("%r5") = THREAD_GET_POINTER_GUARD ();
+  uintptr_t guard = THREAD_GET_POINTER_GUARD ();
+# ifdef CHECK_SP
+  CHECK_SP (env, guard);
+# endif
+#elif defined CHECK_SP
+  CHECK_SP (env, 0);
 #endif
-  /* Restore registers and jump back.  */
-  asm volatile ("lgr  %%r2,%0\n\t"        /* Put val in grp 2.  */
-               "ld   %%f7,104(%1)\n\t"
-               "ld   %%f5,96(%1)\n\t"
-               "ld   %%f3,88(%1)\n\t"
-               "ld   %%f1,80(%1)\n\t"
-               "lmg  %%r6,%%r15,0(%1)\n\t"
+  register long int r2 __asm ("%r2") = val == 0 ? 1 : val;
 #ifdef PTR_DEMANGLE
-               "xgr  %%r14,%2\n\t"
+  register uintptr_t r3 __asm ("%r3") = guard;
+  register void *r1 __asm ("%r1") = (void *) env;
 #endif
+  /* Restore registers and jump back.  */
+  asm volatile ("ld    %%f8,80(%1)\n\t"
+               "ld    %%f9,88(%1)\n\t"
+               "ld    %%f10,96(%1)\n\t"
+               "ld    %%f11,104(%1)\n\t"
+               "ld    %%f12,112(%1)\n\t"
+               "ld    %%f13,120(%1)\n\t"
+               "ld    %%f14,128(%1)\n\t"
+               "ld    %%f15,136(%1)\n\t"
+#ifdef PTR_DEMANGLE
+               "lmg  %%r6,%%r13,0(%1)\n\t"
+               "lmg  %%r4,%%r5,64(%1)\n\t"
+               "xgr  %%r4,%2\n\t"
+               "xgr  %%r5,%2\n\t"
+               "lgr  %%r15,%%r5\n\t"
+               "br   %%r4"
+#else
+               "lmg  %%r6,%%r15,0(%1)\n\t"
                "br   %%r14"
-               : : "r" (val == 0 ? 1 : val),
-                   "a" (env)
+#endif
+               : : "r" (r2),
 #ifdef PTR_DEMANGLE
-                   , "r" (r5)
+                   "r" (r1), "r" (r3)
+#else
+                   "a" (env)
 #endif
-               : "2" );
+               );
 
   /* Avoid `volatile function does return' warnings.  */
   for (;;);