From 2f438e20ab591641760e97458d5d1569942eced5 Mon Sep 17 00:00:00 2001 From: Stefan Liebler Date: Thu, 31 Jul 2014 20:04:54 +0200 Subject: S/390: Revert the jmp_buf/ucontext_t ABI change. --- sysdeps/s390/s390-32/__longjmp-common.c | 68 ------------------- sysdeps/s390/s390-32/__longjmp.c | 68 +++++++++++++++++++ sysdeps/s390/s390-32/setjmp-common.S | 84 ------------------------ sysdeps/s390/s390-32/setjmp.S | 111 ++++++++++++++++++++++++++++++++ 4 files changed, 179 insertions(+), 152 deletions(-) delete mode 100644 sysdeps/s390/s390-32/__longjmp-common.c create mode 100644 sysdeps/s390/s390-32/__longjmp.c delete mode 100644 sysdeps/s390/s390-32/setjmp-common.S create mode 100644 sysdeps/s390/s390-32/setjmp.S (limited to 'sysdeps/s390/s390-32') diff --git a/sysdeps/s390/s390-32/__longjmp-common.c b/sysdeps/s390/s390-32/__longjmp-common.c deleted file mode 100644 index f78ef656e5..0000000000 --- a/sysdeps/s390/s390-32/__longjmp-common.c +++ /dev/null @@ -1,68 +0,0 @@ -/* Copyright (C) 2000-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 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 %%f6,48(%1)\n\t" - "ld %%f4,40(%1)\n\t" -#ifdef PTR_DEMANGLE - "lm %%r6,%%r13,0(%1)\n\t" - "lm %%r4,%%r5,32(%1)\n\t" - "xr %%r4,%2\n\t" - "xr %%r5,%2\n\t" - "lr %%r15,%%r5\n\t" - "br %%r4" -#else - "lm %%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-32/__longjmp.c b/sysdeps/s390/s390-32/__longjmp.c new file mode 100644 index 0000000000..5d46e21923 --- /dev/null +++ b/sysdeps/s390/s390-32/__longjmp.c @@ -0,0 +1,68 @@ +/* Copyright (C) 2000-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 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 %%f6,48(%1)\n\t" + "ld %%f4,40(%1)\n\t" +#ifdef PTR_DEMANGLE + "lm %%r6,%%r13,0(%1)\n\t" + "lm %%r4,%%r5,32(%1)\n\t" + "xr %%r4,%2\n\t" + "xr %%r5,%2\n\t" + "lr %%r15,%%r5\n\t" + "br %%r4" +#else + "lm %%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-32/setjmp-common.S b/sysdeps/s390/s390-32/setjmp-common.S deleted file mode 100644 index d7bb720454..0000000000 --- a/sysdeps/s390/s390-32/setjmp-common.S +++ /dev/null @@ -1,84 +0,0 @@ -/* setjmp for s390, ELF version. - Copyright (C) 2000-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) - lhi %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) - lhi %r3,0 /* second argument of zero */ - j 0f /* branch relativ to __sigsetjmp */ -END (_setjmp) -libc_hidden_def (_setjmp) - -ENTRY(__setjmp) - lhi %r3,0 /* second argument of zero */ - j 0f /* branch relativ to __sigsetjmp */ -END (__setjmp) - -ENTRY(__sigsetjmp) -0: -#ifdef PTR_MANGLE - stm %r6,%r13,0(%r2) /* store registers in jmp_buf */ - lr %r4,%r14 - lr %r5,%r15 - PTR_MANGLE (%r4, %r1) - PTR_MANGLE2 (%r5, %r1) - stm %r4,%r5,32(%r2) -#else - stm %r6,%r15,0(%r2) /* store registers in jmp_buf */ -#endif -#ifndef __V1_JMPBUF - lhi %r4,0 - st %r4,56(%r2) /* Set __flags to 0. */ -#endif - std %f4,40(%r2) - std %f6,48(%r2) -#if defined NOT_IN_libc && defined IS_IN_rtld - /* In ld.so we never save the signal mask. */ - lhi %r2,0 - br %r14 -#elif defined PIC - /* We cannot use the PLT, because it requires that %r12 be set, but - we can't save and restore our caller's value. Instead, we do an - indirect jump through the GOT. */ - basr %r1,0 -0: al %r1,1f-0b(0,%r1) /* get address of global offset table */ - /* get address of __sigjmp_save from got */ - l %r1,__sigjmp_save@GOT12(0,%r1) - br %r1 -1: .long _GLOBAL_OFFSET_TABLE_ - 0b -#else - basr %r1,0 -0: l %r1,1f-0b(0,%r1) /* load address of __sigjmp_save */ - br %r1 /* tail-call __sigjmp_save */ -1: .long __sigjmp_save -#endif -END (__sigsetjmp) diff --git a/sysdeps/s390/s390-32/setjmp.S b/sysdeps/s390/s390-32/setjmp.S new file mode 100644 index 0000000000..e940d71a9e --- /dev/null +++ b/sysdeps/s390/s390-32/setjmp.S @@ -0,0 +1,111 @@ +/* setjmp for s390, ELF version. + Copyright (C) 2000-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 +#include + +#if !defined IS_IN_rtld +# if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_19, GLIBC_2_20) + /* we need a unique name in case of symbol versioning. */ +# define __sigsetjmp __v1__sigsetjmp +# endif /* if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_19, GLIBC_2_20) */ +#endif /* !defined IS_IN_rtld */ + + /* We include the BSD entry points here as well but we make + them weak. */ +ENTRY (setjmp) + .weak C_SYMBOL_NAME (setjmp) + lhi %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) + lhi %r3,0 /* second argument of zero */ + j .Linternal_sigsetjmp /* branch relativ to __sigsetjmp */ +END (_setjmp) +libc_hidden_def (_setjmp) + +ENTRY(__setjmp) + lhi %r3,0 /* second argument of zero */ + j .Linternal_sigsetjmp /* branch relativ to __sigsetjmp */ +END (__setjmp) + +ENTRY(__sigsetjmp) +.Linternal_sigsetjmp: +#ifdef PTR_MANGLE + stm %r6,%r13,0(%r2) /* store registers in jmp_buf */ + lr %r4,%r14 + lr %r5,%r15 + PTR_MANGLE (%r4, %r1) + PTR_MANGLE2 (%r5, %r1) + stm %r4,%r5,32(%r2) +#else + stm %r6,%r15,0(%r2) /* store registers in jmp_buf */ +#endif + std %f4,40(%r2) + std %f6,48(%r2) +#if defined NOT_IN_libc && defined IS_IN_rtld + /* In ld.so we never save the signal mask. */ + lhi %r2,0 + br %r14 +#elif defined PIC + /* We cannot use the PLT, because it requires that %r12 be set, but + we can't save and restore our caller's value. Instead, we do an + indirect jump through the GOT. */ + basr %r1,0 +.L0: al %r1,.L1 - .L0(0,%r1) /* get address of global offset table */ + /* get address of __sigjmp_save from got */ + l %r1,__sigjmp_save@GOT12(0,%r1) + br %r1 +.L1: .long _GLOBAL_OFFSET_TABLE_ - .L0 +#else + basr %r1,0 +.L0: l %r1,.L1-.L0(0,%r1) /* load address of __sigjmp_save */ + br %r1 /* tail-call __sigjmp_save */ +.L1: .long __sigjmp_save +#endif +END (__sigsetjmp) + +#if !defined IS_IN_rtld +# if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_19, GLIBC_2_20) +/* In glibc release 2.19 new versions of setjmp-functions were introduced, + but were reverted before 2.20. Thus both versions are the same function. */ + +# undef __sigsetjmp + +weak_alias (setjmp, __v1setjmp); +weak_alias (setjmp, __v2setjmp); +versioned_symbol (libc, __v1setjmp, setjmp, GLIBC_2_0); +compat_symbol (libc, __v2setjmp, setjmp, GLIBC_2_19); + +weak_alias (_setjmp, __v1_setjmp); +weak_alias (_setjmp, __v2_setjmp); +versioned_symbol (libc, __v1_setjmp, _setjmp, GLIBC_2_0); +compat_symbol (libc, __v2_setjmp, _setjmp, GLIBC_2_19); + +strong_alias (__v1__sigsetjmp, __v2__sigsetjmp); +versioned_symbol (libc, __v1__sigsetjmp, __sigsetjmp, GLIBC_2_0); +compat_symbol (libc, __v2__sigsetjmp, __sigsetjmp, GLIBC_2_19); +# endif /* if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_19, GLIBC_2_20) */ +#endif /* if !defined IS_IN_rtld */ -- cgit v1.2.1