From 93a45ff1ca6d459618bb0cf93580c4b2809a4b61 Mon Sep 17 00:00:00 2001 From: Andreas Krebbel Date: Tue, 7 Jan 2014 09:36:31 +0100 Subject: S/390: Make jmp_buf extendible. --- sysdeps/s390/s390-64/__longjmp-common.c | 74 ++++++++++++++++++++++++++++++ sysdeps/s390/s390-64/__longjmp.c | 74 ------------------------------ sysdeps/s390/s390-64/setjmp-common.S | 79 +++++++++++++++++++++++++++++++++ sysdeps/s390/s390-64/setjmp.S | 75 ------------------------------- 4 files changed, 153 insertions(+), 149 deletions(-) create mode 100644 sysdeps/s390/s390-64/__longjmp-common.c delete mode 100644 sysdeps/s390/s390-64/__longjmp.c create mode 100644 sysdeps/s390/s390-64/setjmp-common.S delete mode 100644 sysdeps/s390/s390-64/setjmp.S (limited to 'sysdeps/s390/s390-64') diff --git a/sysdeps/s390/s390-64/__longjmp-common.c b/sysdeps/s390/s390-64/__longjmp-common.c new file mode 100644 index 0000000..46cabb6 --- /dev/null +++ b/sysdeps/s390/s390-64/__longjmp-common.c @@ -0,0 +1,74 @@ +/* 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). + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + 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, see + . */ + +#include +#include +#include +#include +#include +#include + +/* Jump to the position specified by ENV, causing the + setjmp call there to return VAL, or 1 if VAL is 0. */ +attribute_hidden void +__longjmp (__jmp_buf env, int val) +{ +#ifdef PTR_DEMANGLE + uintptr_t guard = THREAD_GET_POINTER_GUARD (); +# ifdef CHECK_SP + CHECK_SP (env, guard); +# endif +#elif defined CHECK_SP + CHECK_SP (env, 0); +#endif + register long int r2 __asm ("%r2") = val == 0 ? 1 : val; +#ifdef PTR_DEMANGLE + 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" +#endif + : : "r" (r2), +#ifdef PTR_DEMANGLE + "r" (r1), "r" (r3) +#else + "a" (env) +#endif + ); + + /* Avoid `volatile function does return' warnings. */ + for (;;); +} diff --git a/sysdeps/s390/s390-64/__longjmp.c b/sysdeps/s390/s390-64/__longjmp.c deleted file mode 100644 index 168ebf5..0000000 --- a/sysdeps/s390/s390-64/__longjmp.c +++ /dev/null @@ -1,74 +0,0 @@ -/* 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). - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - 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, see - . */ - -#include -#include -#include -#include -#include -#include - -/* Jump to the position specified by ENV, causing the - setjmp call there to return VAL, or 1 if VAL is 0. */ -void -__longjmp (__jmp_buf env, int val) -{ -#ifdef PTR_DEMANGLE - uintptr_t guard = THREAD_GET_POINTER_GUARD (); -# ifdef CHECK_SP - CHECK_SP (env, guard); -# endif -#elif defined CHECK_SP - CHECK_SP (env, 0); -#endif - register long int r2 __asm ("%r2") = val == 0 ? 1 : val; -#ifdef PTR_DEMANGLE - 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" -#endif - : : "r" (r2), -#ifdef PTR_DEMANGLE - "r" (r1), "r" (r3) -#else - "a" (env) -#endif - ); - - /* Avoid `volatile function does return' warnings. */ - for (;;); -} diff --git a/sysdeps/s390/s390-64/setjmp-common.S b/sysdeps/s390/s390-64/setjmp-common.S new file mode 100644 index 0000000..9cdcae4 --- /dev/null +++ b/sysdeps/s390/s390-64/setjmp-common.S @@ -0,0 +1,79 @@ +/* setjmp for 64 bit S/390, ELF version. + Copyright (C) 2001-2014 Free Software Foundation, Inc. + Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + 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, see + . */ + +#include +#define _ASM +#define _SETJMP_H +#include + + /* We include the BSD entry points here as well but we make + them weak. */ +ENTRY (setjmp) + .weak C_SYMBOL_NAME (setjmp) + lghi %r3,1 /* Second argument of one. */ + j 0f /* Branch relativ to __sigsetjmp. */ +END (setjmp) + + /* Binary compatibility entry point. */ +ENTRY(_setjmp) + .weak C_SYMBOL_NAME (_setjmp) + slgr %r3,%r3 /* Second argument of zero. */ + j 0f /* Branch relativ to __sigsetjmp. */ +END (_setjmp) +libc_hidden_def (_setjmp) + +ENTRY(__setjmp) + slgr %r3,%r3 /* Second argument of zero. */ + j 0f /* Branch relativ to __sigsetjmp. */ +END (__setjmp) + +ENTRY(__sigsetjmp) +0: +#ifdef PTR_MANGLE + stmg %r6,%r13,0(%r2) /* Store registers in jmp_buf. */ + lgr %r4,%r14 + lgr %r5,%r15 + PTR_MANGLE (%r4, %r1) + PTR_MANGLE2 (%r5, %r1) + stmg %r4,%r5,64(%r2) +#else + stmg %r6,%r15,0(%r2) /* Store registers in jmp_buf. */ +#endif +#ifndef __V1_JMPBUF + lghi %r4,0 + stg %r4,144(%r2) /* Set __flags to 0. */ +#endif + std %f8,80(%r2) + std %f9,88(%r2) + std %f10,96(%r2) + std %f11,104(%r2) + std %f12,112(%r2) + std %f13,120(%r2) + std %f14,128(%r2) + std %f15,136(%r2) +#if defined NOT_IN_libc && defined IS_IN_rtld + /* In ld.so we never save the signal mask. */ + lghi %r2,0 + br %r14 +#elif defined PIC + jg __sigjmp_save@PLT /* Branch to PLT of __sigsetjmp. */ +#else + jg __sigjmp_save +#endif +END (__sigsetjmp) diff --git a/sysdeps/s390/s390-64/setjmp.S b/sysdeps/s390/s390-64/setjmp.S deleted file mode 100644 index 5462dab..0000000 --- a/sysdeps/s390/s390-64/setjmp.S +++ /dev/null @@ -1,75 +0,0 @@ -/* setjmp for 64 bit S/390, ELF version. - Copyright (C) 2001-2014 Free Software Foundation, Inc. - Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - 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, see - . */ - -#include -#define _ASM -#define _SETJMP_H -#include - - /* We include the BSD entry points here as well but we make - them weak. */ -ENTRY (setjmp) - .weak C_SYMBOL_NAME (setjmp) - lghi %r3,1 /* Second argument of one. */ - j .Linternal_sigsetjmp /* Branch relativ to __sigsetjmp. */ -END (setjmp) - - /* Binary compatibility entry point. */ -ENTRY(_setjmp) - .weak C_SYMBOL_NAME (_setjmp) - slgr %r3,%r3 /* Second argument of zero. */ - j .Linternal_sigsetjmp /* Branch relativ to __sigsetjmp. */ -END (setjmp) -libc_hidden_def (_setjmp) - -ENTRY(__setjmp) - slgr %r3,%r3 /* Second argument of zero. */ - j .Linternal_sigsetjmp /* Branch relativ to __sigsetjmp. */ -END (setjmp) - -ENTRY(__sigsetjmp) -.Linternal_sigsetjmp: -#ifdef PTR_MANGLE - stmg %r6,%r13,0(%r2) /* Store registers in jmp_buf. */ - lgr %r4,%r14 - lgr %r5,%r15 - PTR_MANGLE (%r4, %r1) - PTR_MANGLE2 (%r5, %r1) - stmg %r4,%r5,64(%r2) -#else - stmg %r6,%r15,0(%r2) /* Store registers in jmp_buf. */ -#endif - std %f8,80(%r2) - std %f9,88(%r2) - std %f10,96(%r2) - std %f11,104(%r2) - std %f12,112(%r2) - std %f13,120(%r2) - std %f14,128(%r2) - std %f15,136(%r2) -#if defined NOT_IN_libc && defined IS_IN_rtld - /* In ld.so we never save the signal mask. */ - lghi %r2,0 - br %r14 -#elif defined PIC - jg __sigjmp_save@PLT /* Branch to PLT of __sigsetjmp. */ -#else - jg __sigjmp_save -#endif -END (__sigsetjmp) -- cgit v1.1