S/390: Make jmp_buf extendible.

This commit is contained in:
Andreas Krebbel 2014-01-07 09:36:31 +01:00
parent d5780febe6
commit 93a45ff1ca
30 changed files with 762 additions and 24 deletions

View File

@ -1,3 +1,47 @@
2014-01-07 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
* Versions.def: Add GLIBC_2.19 for libpthread.
* nptl/sysdeps/unix/sysv/linux/s390/Versions: Add longjmp and
siglongjmp for libpthread with GLIBC_2.19 symver.
* nptl/sysdeps/unix/sysv/linux/s390/pt-longjmp.c: New file.
* sysdeps/s390/Makefile: Build v1-longjmp.c and v1-sigjmp.c.
* sysdeps/s390/Versions: New GLIBC_2.19 and GLIBC_PRIVATE symbols.
* sysdeps/s390/__longjmp.c: New file.
* sysdeps/s390/bits/setjmp.h: Add new fields to __s390_jmp_buf.
* sysdeps/s390/longjmp.c: New file.
* sysdeps/s390/setjmp.S: New file.
* sysdeps/s390/sigjmp.S: New file.
* sysdeps/s390/v1-longjmp.c: New file.
* sysdeps/s390/v1-setjmp.h: New file.
* sysdeps/s390/v1-sigjmp.c: New file.
* sysdeps/unix/sysv/linux/s390/Makefile: Build __longjmp_chk.
* sysdeps/unix/sysv/linux/s390/Versions: Add __longjmp_chk with
GLIBC_2.19 version.
* sysdeps/unix/sysv/linux/s390/longjmp_chk.c: New file.
* sysdeps/unix/sysv/linux/s390/s390-32/____longjmp_chk.c: Provide
versioned symbols for ____longjmp_chk.
* sysdeps/unix/sysv/linux/s390/s390-64/____longjmp_chk.c:
Likewise.
* sysdeps/unix/sysv/linux/s390/s390-32/nptl/libc.abilist:
Regenerate.
* sysdeps/unix/sysv/linux/s390/s390-32/nptl/libpthread.abilist:
Regenerate.
* sysdeps/unix/sysv/linux/s390/s390-64/nptl/libc.abilist:
Regenerate.
* sysdeps/unix/sysv/linux/s390/s390-64/nptl/libpthread.abilist:
Regenerate.
* sysdeps/unix/sysv/linux/s390/v1-longjmp_chk.c: New file.
* sysdeps/s390/s390-32/__longjmp.c: Rename to ...
* sysdeps/s390/s390-32/__longjmp-common.c: ... this.
* sysdeps/s390/s390-32/setjmp.S: Rename and adjust to ...
* sysdeps/s390/s390-32/setjmp-common.S: ... this.
* sysdeps/s390/s390-64/__longjmp.c: Rename to ...
* sysdeps/s390/s390-64/__longjmp-common.c: ... this.
* sysdeps/s390/s390-64/setjmp.S: Rename and adjust to ...
* sysdeps/s390/s390-64/setjmp-common.S: ... this.
* sysdeps/s390/rtld-__longjmp.c: New file.
* sysdeps/s390/rtld-setjmp.S: New file.
2014-01-06 Joseph Myers <joseph@codesourcery.com> 2014-01-06 Joseph Myers <joseph@codesourcery.com>
[BZ #16400] [BZ #16400]

View File

@ -106,6 +106,7 @@ libpthread {
GLIBC_2.11 GLIBC_2.11
GLIBC_2.12 GLIBC_2.12
GLIBC_2.18 GLIBC_2.18
GLIBC_2.19
GLIBC_PRIVATE GLIBC_PRIVATE
} }
libresolv { libresolv {

View File

@ -0,0 +1,5 @@
libpthread {
GLIBC_2.19 {
longjmp; siglongjmp;
}
}

View File

@ -0,0 +1,63 @@
/* Copyright (C) 2013 Free Software Foundation, Inc.
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
<http://www.gnu.org/licenses/>.
This is a copy of pthread/pt-longjmp.c made for extending the
jmpbuf structure on System z. */
#include <setjmp.h>
#include <stdlib.h>
#include <bits/wordsize.h>
#include "pthreadP.h"
#include <shlib-compat.h>
#if defined SHARED && SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_19)
/* The __v1 version prototypes are declared in v1-setjmp.h which
cannot be included together with setjmp.h. So we put the
prototypes here manually. */
extern void __v1__libc_siglongjmp (sigjmp_buf env, int val)
__attribute__ ((noreturn));
extern void __v1__libc_longjmp (sigjmp_buf env, int val)
__attribute__ ((noreturn));
void __v1_siglongjmp (sigjmp_buf env, int val)
{
__v1__libc_siglongjmp (env, val);
}
void __v1_longjmp (jmp_buf env, int val)
{
__v1__libc_longjmp (env, val);
}
compat_symbol (libpthread, __v1_longjmp, longjmp, GLIBC_2_0);
compat_symbol (libpthread, __v1_siglongjmp, siglongjmp, GLIBC_2_0);
#endif /* defined SHARED && SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_19)) */
void
__v2_longjmp (jmp_buf env, int val)
{
__libc_longjmp (env, val);
}
void
__v2_siglongjmp (jmp_buf env, int val)
{
__libc_siglongjmp (env, val);
}
versioned_symbol (libpthread, __v2_longjmp, longjmp, GLIBC_2_19);
versioned_symbol (libpthread, __v2_siglongjmp, siglongjmp, GLIBC_2_19);

5
sysdeps/s390/Makefile Normal file
View File

@ -0,0 +1,5 @@
ifeq ($(subdir),setjmp)
ifeq (yes,$(build-shared))
sysdep_routines += v1-longjmp v1-sigjmp
endif
endif

View File

@ -1,3 +1,14 @@
libc {
GLIBC_2.19 {
setjmp; _setjmp; __setjmp; __sigsetjmp;
longjmp; _longjmp; siglongjmp;
}
GLIBC_PRIVATE {
__v1__libc_longjmp; __v1__libc_siglongjmp;
__v2__libc_longjmp; __v2__libc_siglongjmp;
}
}
ld { ld {
GLIBC_2.3 { GLIBC_2.3 {
# runtime interface to TLS # runtime interface to TLS

31
sysdeps/s390/__longjmp.c Normal file
View File

@ -0,0 +1,31 @@
/* Copyright (C) 2013 Free Software Foundation, Inc.
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
<http://www.gnu.org/licenses/>. */
#include <libc-symbols.h>
#include <shlib-compat.h>
#define __longjmp __v2__longjmp
#include "__longjmp-common.c"
#undef __longjmp
strong_alias (__v2__longjmp, __longjmp)
#if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_19)
# undef __longjmp
# define __V1_JMPBUF
# define __longjmp __v1__longjmp
# include "__longjmp-common.c"
#endif /* if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_19) */

View File

@ -40,6 +40,10 @@ typedef struct __s390_jmp_buf
/* We save fpu registers 4 and 6. */ /* We save fpu registers 4 and 6. */
long __fpregs[4]; long __fpregs[4];
# endif # endif
#ifndef __V1_JMPBUF
unsigned long __flags;
char __reserved[128];
#endif
} __jmp_buf[1]; } __jmp_buf[1];
#endif #endif

64
sysdeps/s390/longjmp.c Normal file
View File

@ -0,0 +1,64 @@
/* Copyright (C) 2013 Free Software Foundation, Inc.
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
<http://www.gnu.org/licenses/>.
Versioned copy of sysdeps/generic/longjmp.c modified for extended
jmpbuf. */
#include <shlib-compat.h>
#include <stddef.h>
#include <setjmp.h>
#include <signal.h>
extern void __v2__longjmp (__jmp_buf __env, int __val)
__attribute__ ((__noreturn__));
extern void __v2__libc_longjmp (sigjmp_buf env, int val)
__attribute__ ((__noreturn__));
libc_hidden_proto (__v2__libc_longjmp)
/* Set the signal mask to the one specified in ENV, and jump
to the position specified in ENV, causing the setjmp
call there to return VAL, or 1 if VAL is 0. */
void
__v2__libc_siglongjmp (sigjmp_buf env, int val)
{
/* Perform any cleanups needed by the frames being unwound. */
_longjmp_unwind (env, val);
if (env[0].__mask_was_saved)
/* Restore the saved signal mask. */
(void) __sigprocmask (SIG_SETMASK, &env[0].__saved_mask,
(sigset_t *) NULL);
/* Call the machine-dependent function to restore machine state. */
__v2__longjmp (env[0].__jmpbuf, val ?: 1);
}
#ifndef __v2__longjmp
strong_alias (__v2__libc_siglongjmp, __v2__libc_longjmp)
libc_hidden_def (__v2__libc_longjmp)
weak_alias (__v2__libc_siglongjmp, __v2_longjmp)
weak_alias (__v2__libc_siglongjmp, __v2longjmp)
weak_alias (__v2__libc_siglongjmp, __v2siglongjmp)
/* These will be used by libpthread only. */
versioned_symbol (libc, __v2__libc_longjmp, __libc_longjmp, GLIBC_PRIVATE);
versioned_symbol (libc, __v2__libc_siglongjmp, __libc_siglongjmp, GLIBC_PRIVATE);
versioned_symbol (libc, __v2_longjmp, _longjmp, GLIBC_2_19);
versioned_symbol (libc, __v2longjmp, longjmp, GLIBC_2_19);
versioned_symbol (libc, __v2siglongjmp, siglongjmp, GLIBC_2_19);
#endif /* ifndef __v2__longjmp */

View File

@ -0,0 +1,19 @@
/* Copyright (C) 2013 Free Software Foundation, Inc.
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
<http://www.gnu.org/licenses/>. */
/* Build a non-versioned object for rtld-*. */
# include "__longjmp-common.c"

View File

@ -0,0 +1,20 @@
/* Extendible version of setjmp for System z
Copyright (C) 2013 Free Software Foundation, Inc.
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
<http://www.gnu.org/licenses/>. */
/* Build a non-versioned object for rtld-*. */
# include "setjmp-common.S"

View File

@ -25,7 +25,7 @@
/* Jump to the position specified by ENV, causing the /* Jump to the position specified by ENV, causing the
setjmp call there to return VAL, or 1 if VAL is 0. */ setjmp call there to return VAL, or 1 if VAL is 0. */
void attribute_hidden void
__longjmp (__jmp_buf env, int val) __longjmp (__jmp_buf env, int val)
{ {
#ifdef PTR_DEMANGLE #ifdef PTR_DEMANGLE

View File

@ -27,24 +27,24 @@
ENTRY (setjmp) ENTRY (setjmp)
.weak C_SYMBOL_NAME (setjmp) .weak C_SYMBOL_NAME (setjmp)
lhi %r3,1 /* second argument of one */ lhi %r3,1 /* second argument of one */
j .Linternal_sigsetjmp /* branch relativ to __sigsetjmp */ j 0f /* branch relativ to __sigsetjmp */
END (setjmp) END (setjmp)
/* Binary compatibility entry point. */ /* Binary compatibility entry point. */
ENTRY(_setjmp) ENTRY(_setjmp)
.weak C_SYMBOL_NAME (_setjmp) .weak C_SYMBOL_NAME (_setjmp)
lhi %r3,0 /* second argument of zero */ lhi %r3,0 /* second argument of zero */
j .Linternal_sigsetjmp /* branch relativ to __sigsetjmp */ j 0f /* branch relativ to __sigsetjmp */
END (_setjmp) END (_setjmp)
libc_hidden_def (_setjmp) libc_hidden_def (_setjmp)
ENTRY(__setjmp) ENTRY(__setjmp)
lhi %r3,0 /* second argument of zero */ lhi %r3,0 /* second argument of zero */
j .Linternal_sigsetjmp /* branch relativ to __sigsetjmp */ j 0f /* branch relativ to __sigsetjmp */
END (__setjmp) END (__setjmp)
ENTRY(__sigsetjmp) ENTRY(__sigsetjmp)
.Linternal_sigsetjmp: 0:
#ifdef PTR_MANGLE #ifdef PTR_MANGLE
stm %r6,%r13,0(%r2) /* store registers in jmp_buf */ stm %r6,%r13,0(%r2) /* store registers in jmp_buf */
lr %r4,%r14 lr %r4,%r14
@ -54,6 +54,10 @@ ENTRY(__sigsetjmp)
stm %r4,%r5,32(%r2) stm %r4,%r5,32(%r2)
#else #else
stm %r6,%r15,0(%r2) /* store registers in jmp_buf */ 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 #endif
std %f4,40(%r2) std %f4,40(%r2)
std %f6,48(%r2) std %f6,48(%r2)
@ -66,15 +70,15 @@ ENTRY(__sigsetjmp)
we can't save and restore our caller's value. Instead, we do an we can't save and restore our caller's value. Instead, we do an
indirect jump through the GOT. */ indirect jump through the GOT. */
basr %r1,0 basr %r1,0
.L0: al %r1,.L1 - .L0(0,%r1) /* get address of global offset table */ 0: al %r1,1f-0b(0,%r1) /* get address of global offset table */
/* get address of __sigjmp_save from got */ /* get address of __sigjmp_save from got */
l %r1,__sigjmp_save@GOT12(0,%r1) l %r1,__sigjmp_save@GOT12(0,%r1)
br %r1 br %r1
.L1: .long _GLOBAL_OFFSET_TABLE_ - .L0 1: .long _GLOBAL_OFFSET_TABLE_ - 0b
#else #else
basr %r1,0 basr %r1,0
.L0: l %r1,.L1-.L0(0,%r1) /* load address of __sigjmp_save */ 0: l %r1,1f-0b(0,%r1) /* load address of __sigjmp_save */
br %r1 /* tail-call __sigjmp_save */ br %r1 /* tail-call __sigjmp_save */
.L1: .long __sigjmp_save 1: .long __sigjmp_save
#endif #endif
END (__sigsetjmp) END (__sigsetjmp)

View File

@ -25,7 +25,7 @@
/* Jump to the position specified by ENV, causing the /* Jump to the position specified by ENV, causing the
setjmp call there to return VAL, or 1 if VAL is 0. */ setjmp call there to return VAL, or 1 if VAL is 0. */
void attribute_hidden void
__longjmp (__jmp_buf env, int val) __longjmp (__jmp_buf env, int val)
{ {
#ifdef PTR_DEMANGLE #ifdef PTR_DEMANGLE

View File

@ -27,24 +27,24 @@
ENTRY (setjmp) ENTRY (setjmp)
.weak C_SYMBOL_NAME (setjmp) .weak C_SYMBOL_NAME (setjmp)
lghi %r3,1 /* Second argument of one. */ lghi %r3,1 /* Second argument of one. */
j .Linternal_sigsetjmp /* Branch relativ to __sigsetjmp. */ j 0f /* Branch relativ to __sigsetjmp. */
END (setjmp) END (setjmp)
/* Binary compatibility entry point. */ /* Binary compatibility entry point. */
ENTRY(_setjmp) ENTRY(_setjmp)
.weak C_SYMBOL_NAME (_setjmp) .weak C_SYMBOL_NAME (_setjmp)
slgr %r3,%r3 /* Second argument of zero. */ slgr %r3,%r3 /* Second argument of zero. */
j .Linternal_sigsetjmp /* Branch relativ to __sigsetjmp. */ j 0f /* Branch relativ to __sigsetjmp. */
END (setjmp) END (_setjmp)
libc_hidden_def (_setjmp) libc_hidden_def (_setjmp)
ENTRY(__setjmp) ENTRY(__setjmp)
slgr %r3,%r3 /* Second argument of zero. */ slgr %r3,%r3 /* Second argument of zero. */
j .Linternal_sigsetjmp /* Branch relativ to __sigsetjmp. */ j 0f /* Branch relativ to __sigsetjmp. */
END (setjmp) END (__setjmp)
ENTRY(__sigsetjmp) ENTRY(__sigsetjmp)
.Linternal_sigsetjmp: 0:
#ifdef PTR_MANGLE #ifdef PTR_MANGLE
stmg %r6,%r13,0(%r2) /* Store registers in jmp_buf. */ stmg %r6,%r13,0(%r2) /* Store registers in jmp_buf. */
lgr %r4,%r14 lgr %r4,%r14
@ -54,6 +54,10 @@ ENTRY(__sigsetjmp)
stmg %r4,%r5,64(%r2) stmg %r4,%r5,64(%r2)
#else #else
stmg %r6,%r15,0(%r2) /* Store registers in jmp_buf. */ 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 #endif
std %f8,80(%r2) std %f8,80(%r2)
std %f9,88(%r2) std %f9,88(%r2)

64
sysdeps/s390/setjmp.S Normal file
View File

@ -0,0 +1,64 @@
/* Extendible version of setjmp for System z
Copyright (C) 2013 Free Software Foundation, Inc.
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
<http://www.gnu.org/licenses/>. */
#include <libc-symbols.h>
#include <shlib-compat.h>
versioned_symbol (libc, __v2setjmp, setjmp, GLIBC_2_19)
versioned_symbol (libc, __v2_setjmp, _setjmp, GLIBC_2_19)
versioned_symbol (libc, __v2__setjmp, __setjmp, GLIBC_2_19)
versioned_symbol (libc, __v2__sigsetjmp, __sigsetjmp, GLIBC_2_19)
#define setjmp __v2setjmp
#define _setjmp __v2_setjmp
#define __setjmp __v2__setjmp
#define __sigsetjmp __v2__sigsetjmp
#define __sigjmp_save __v2__sigjmp_save
#include "setjmp-common.S"
#undef setjmp
#undef _setjmp
#undef __setjmp
#undef __sigsetjmp
#undef __sigjmp_save
libc_hidden_ver (__v2setjmp, setjmp)
libc_hidden_ver (__v2_setjmp, _setjmp)
libc_hidden_ver (__v2__setjmp, __setjmp)
libc_hidden_ver (__v2__sigsetjmp, __sigsetjmp)
#if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_19)
compat_symbol (libc, __v1setjmp, setjmp, GLIBC_2_0)
compat_symbol (libc, __v1_setjmp, _setjmp, GLIBC_2_0)
compat_symbol (libc, __v1__setjmp, __setjmp, GLIBC_2_0)
compat_symbol (libc, __v1__sigsetjmp, __sigsetjmp, GLIBC_2_0)
# define setjmp __v1setjmp
# define _setjmp __v1_setjmp
# define __setjmp __v1__setjmp
# define __sigsetjmp __v1__sigsetjmp
# define __sigjmp_save __v1__sigjmp_save
# define __V1_JMPBUF
# include "setjmp-common.S"
# undef setjmp
# undef _setjmp
# undef __setjmp
# undef __sigsetjmp
# undef __sigjmp_save
#endif /* if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_19) */

34
sysdeps/s390/sigjmp.c Normal file
View File

@ -0,0 +1,34 @@
/* Copyright (C) 1992-2013 Free Software Foundation, Inc.
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
<http://www.gnu.org/licenses/>. */
#include <stddef.h>
#include <setjmp.h>
#include <signal.h>
/* This function is called by the `sigsetjmp' macro
before doing a `__setjmp' on ENV[0].__jmpbuf.
Always return zero. */
int
__v2__sigjmp_save (sigjmp_buf env, int savemask)
{
env[0].__mask_was_saved = (savemask &&
__sigprocmask (SIG_BLOCK, (sigset_t *) NULL,
&env[0].__saved_mask) == 0);
return 0;
}

57
sysdeps/s390/v1-longjmp.c Normal file
View File

@ -0,0 +1,57 @@
/* Copyright (C) 2013 Free Software Foundation, Inc.
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
<http://www.gnu.org/licenses/>.
Versioned copy of sysdeps/generic/longjmp.c modified for extended
jmpbuf. */
#include <shlib-compat.h>
#include <stddef.h>
#include <signal.h>
#include "v1-setjmp.h"
#if !defined NOT_INT_libc && defined SHARED
# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_19)
void
__v1__libc_siglongjmp (__v1__sigjmp_buf env, int val)
{
/* Perform any cleanups needed by the frames being unwound. */
_longjmp_unwind (env, val);
if (env[0].__mask_was_saved)
/* Restore the saved signal mask. */
(void) __sigprocmask (SIG_SETMASK, &env[0].__saved_mask,
(sigset_t *) NULL);
/* Call the machine-dependent function to restore machine state. */
__v1__longjmp (env[0].__jmpbuf, val ?: 1);
}
# ifndef __v1__longjmp
strong_alias (__v1__libc_siglongjmp, __v1__libc_longjmp)
libc_hidden_def (__v1__libc_longjmp)
weak_alias (__v1__libc_siglongjmp, __v1_longjmp)
weak_alias (__v1__libc_siglongjmp, __v1longjmp)
weak_alias (__v1__libc_siglongjmp, __v1siglongjmp)
compat_symbol (libc, __v1_longjmp, _longjmp, GLIBC_2_0);
compat_symbol (libc, __v1longjmp, longjmp, GLIBC_2_0);
compat_symbol (libc, __v1siglongjmp, siglongjmp, GLIBC_2_0);
# endif /* ifndef __v1__longjmp */
# endif /* SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_19) */
#endif /* if !defined NOT_INT_libc && defined SHARED */

111
sysdeps/s390/v1-setjmp.h Normal file
View File

@ -0,0 +1,111 @@
/* Copyright (C) 1991-2013 Free Software Foundation, Inc.
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
<http://www.gnu.org/licenses/>. */
/*
* ISO C99 Standard: 7.13 Nonlocal jumps <setjmp.h>
*/
#ifndef _V1_SETJMP_H
#define _V1_SETJMP_H 1
#include <features.h>
__BEGIN_DECLS
#define __V1_JMPBUF
#define _SETJMP_H
#include <bits/setjmp.h> /* Get `__jmp_buf'. */
#ifndef _ASM
#include <bits/sigset.h> /* Get `__sigset_t'. */
/* Calling environment, plus possibly a saved signal mask. */
typedef struct __v1__jmp_buf_tag
{
/* NOTE: The machine-dependent definitions of `__sigsetjmp'
assume that a `jmp_buf' begins with a `__jmp_buf' and that
`__mask_was_saved' follows it. Do not move these members
or add others before it. */
__jmp_buf __jmpbuf; /* Calling environment. */
int __mask_was_saved; /* Saved the signal mask? */
__sigset_t __saved_mask; /* Saved signal mask. */
} __v1__jmp_buf[1];
/* Store the calling environment in ENV, also saving the signal mask.
Return 0. */
extern int __v1setjmp (__v1__jmp_buf __env);
/* Store the calling environment in ENV, also saving the
signal mask if SAVEMASK is nonzero. Return 0.
This is the internal name for `sigsetjmp'. */
extern int __v1__sigsetjmp (struct __v1__jmp_buf_tag __env[1],
int __savemask);
/* Store the calling environment in ENV, not saving the signal mask.
Return 0. */
extern int __v1_setjmp (struct __v1__jmp_buf_tag __env[1]);
/* Jump to the environment saved in ENV, making the
`setjmp' call there return VAL, or 1 if VAL is 0. */
extern void __v1longjmp (struct __v1__jmp_buf_tag __env[1], int __val)
__attribute__ ((__noreturn__));
/* Same. Usually `_longjmp' is used with `_setjmp', which does not save
the signal mask. But it is how ENV was saved that determines whether
`longjmp' restores the mask; `_longjmp' is just an alias. */
extern void __v1_longjmp (struct __v1__jmp_buf_tag __env[1], int __val)
__attribute__ ((__noreturn__));
/* Use the same type for `jmp_buf' and `sigjmp_buf'.
The `__mask_was_saved' flag determines whether
or not `longjmp' will restore the signal mask. */
typedef struct __v1__jmp_buf_tag __v1__sigjmp_buf[1];
/* Jump to the environment saved in ENV, making the
sigsetjmp call there return VAL, or 1 if VAL is 0.
Restore the signal mask if that sigsetjmp call saved it.
This is just an alias `longjmp'. */
extern void __v1siglongjmp (__v1__sigjmp_buf __env, int __val)
__attribute__ ((__noreturn__));
/* Internal machine-dependent function to restore context sans signal mask. */
extern void __v1__longjmp (__jmp_buf __env, int __val)
__attribute__ ((__noreturn__));
/* Internal function to possibly save the current mask of blocked signals
in ENV, and always set the flag saying whether or not it was saved.
This is used by the machine-dependent definition of `__sigsetjmp'.
Always returns zero, for convenience. */
extern int __v1__sigjmp_save (__v1__jmp_buf __env, int __savemask);
extern void _longjmp_unwind (__v1__jmp_buf env, int val);
extern void __v1__libc_siglongjmp (__v1__sigjmp_buf env, int val)
__attribute__ ((noreturn));
extern void __v1__libc_longjmp (__v1__sigjmp_buf env, int val)
__attribute__ ((noreturn));
libc_hidden_proto (__v1__libc_longjmp)
libc_hidden_proto (__v1_setjmp)
libc_hidden_proto (__v1__sigsetjmp)
#endif /* !_ASM */
#endif /* ifndef _V1_SETJMP_H */

44
sysdeps/s390/v1-sigjmp.c Normal file
View File

@ -0,0 +1,44 @@
/* Copyright (C) 1992-2013 Free Software Foundation, Inc.
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
<http://www.gnu.org/licenses/>.
Copied from setjmp/sigjmp.c for extending jmp_buf. */
#include <bits/wordsize.h>
#include <shlib-compat.h>
#if !defined NOT_IN_libc && defined SHARED
# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_19)
# include <stddef.h>
# include <v1-setjmp.h>
# include <signal.h>
/* This function is called by the `sigsetjmp' macro
before doing a `__setjmp' on ENV[0].__jmpbuf.
Always return zero. */
int
__v1__sigjmp_save (__v1__sigjmp_buf env, int savemask)
{
env[0].__mask_was_saved = (savemask &&
__sigprocmask (SIG_BLOCK, (sigset_t *) NULL,
&env[0].__saved_mask) == 0);
return 0;
}
# endif /* SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_19) */
#endif /* !NOT_IN_libc && SHARED */

View File

@ -16,3 +16,9 @@ endif
ifeq ($(subdir),elf) ifeq ($(subdir),elf)
sysdep_routines += dl-vdso sysdep_routines += dl-vdso
endif endif
ifeq ($(subdir),debug)
ifeq (yes,$(build-shared))
sysdep_routines += v1-longjmp_chk
endif
endif

View File

@ -1,4 +1,7 @@
libc { libc {
GLIBC_2.19 {
__longjmp_chk;
}
GLIBC_PRIVATE { GLIBC_PRIVATE {
__vdso_clock_gettime; __vdso_clock_gettime;
__vdso_clock_getres; __vdso_clock_getres;

View File

@ -0,0 +1,44 @@
/* Copyright (C) 2013 Free Software Foundation, Inc.
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
<http://www.gnu.org/licenses/>.
This is a copy of debug/longjmp_chk.c extended for symbol
versioning. */
#include <shlib-compat.h>
#include <setjmp.h>
/* This place is the only user of these functions. */
extern void ____v2__longjmp_chk (__jmp_buf __env, int __val)
__attribute__ ((__noreturn__));
#if defined NOT_IN_libc
# define __v2__longjmp ____longjmp_chk
# define __v2__libc_siglongjmp __longjmp_chk
# include <longjmp.c>
#else
# define __v2__longjmp ____v2__longjmp_chk
# define __v2__libc_siglongjmp __v2__libc_siglongjmp_chk
# include <longjmp.c>
versioned_symbol (libc, __v2__libc_siglongjmp_chk, __longjmp_chk, GLIBC_2_19);
#endif

View File

@ -26,8 +26,8 @@
#include <stdint.h> #include <stdint.h>
#include <signal.h> #include <signal.h>
#include <sys/syscall.h> #include <sys/syscall.h>
#include <libc-symbols.h>
#define __longjmp ____longjmp_chk #include <shlib-compat.h>
#define CHECK_SP(env, guard) \ #define CHECK_SP(env, guard) \
do \ do \
@ -51,4 +51,22 @@
} \ } \
} while (0) } while (0)
#include "__longjmp.c"
#if defined NOT_IN_libc
/* Build a non-versioned object for rtld-*. */
# define __longjmp ____longjmp_chk
# include "__longjmp-common.c"
#else /* !NOT_IN_libc */
# define __longjmp ____v2__longjmp_chk
# include "__longjmp-common.c"
# if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_11, GLIBC_2_19)
# undef __longjmp
# define __V1_JMPBUF
# define __longjmp ____v1__longjmp_chk
# include "__longjmp-common.c"
# undef __longjmp
# endif
#endif /* !NOT_IN_libc */

View File

@ -1774,6 +1774,16 @@ GLIBC_2.17
GLIBC_2.18 GLIBC_2.18
GLIBC_2.18 A GLIBC_2.18 A
__cxa_thread_atexit_impl F __cxa_thread_atexit_impl F
GLIBC_2.19
GLIBC_2.19 A
__longjmp_chk F
__setjmp F
__sigsetjmp F
_longjmp F
_setjmp F
longjmp F
setjmp F
siglongjmp F
GLIBC_2.2 GLIBC_2.2
GLIBC_2.2 A GLIBC_2.2 A
_IO_adjust_wcolumn F _IO_adjust_wcolumn F

View File

@ -178,6 +178,10 @@ GLIBC_2.18
GLIBC_2.18 A GLIBC_2.18 A
pthread_getattr_default_np F pthread_getattr_default_np F
pthread_setattr_default_np F pthread_setattr_default_np F
GLIBC_2.19
GLIBC_2.19 A
longjmp F
siglongjmp F
GLIBC_2.2 GLIBC_2.2
GLIBC_2.2 A GLIBC_2.2 A
__open64 F __open64 F

View File

@ -26,8 +26,8 @@
#include <stdint.h> #include <stdint.h>
#include <signal.h> #include <signal.h>
#include <sys/syscall.h> #include <sys/syscall.h>
#include <libc-symbols.h>
#define __longjmp ____longjmp_chk #include <shlib-compat.h>
#define CHECK_SP(env, guard) \ #define CHECK_SP(env, guard) \
do \ do \
@ -51,4 +51,23 @@
} \ } \
} while (0) } while (0)
#include "__longjmp.c"
#if defined NOT_IN_libc
/* Build a non-versioned object for rtld-*. */
# define __longjmp ____longjmp_chk
# include "__longjmp-common.c"
#else /* !NOT_IN_libc */
# define __longjmp ____v2__longjmp_chk
# include "__longjmp-common.c"
# undef __longjmp
# if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_11, GLIBC_2_19)
# undef __longjmp
# define __V1_JMPBUF
# define __longjmp ____v1__longjmp_chk
# include "__longjmp-common.c"
# undef __longjmp
# endif
#endif /* !NOT_IN_libc */

View File

@ -95,6 +95,16 @@ GLIBC_2.17
GLIBC_2.18 GLIBC_2.18
GLIBC_2.18 A GLIBC_2.18 A
__cxa_thread_atexit_impl F __cxa_thread_atexit_impl F
GLIBC_2.19
GLIBC_2.19 A
__longjmp_chk F
__setjmp F
__sigsetjmp F
_longjmp F
_setjmp F
longjmp F
setjmp F
siglongjmp F
GLIBC_2.2 GLIBC_2.2
GLIBC_2.2 A GLIBC_2.2 A
_Exit F _Exit F

View File

@ -12,6 +12,10 @@ GLIBC_2.18
GLIBC_2.18 A GLIBC_2.18 A
pthread_getattr_default_np F pthread_getattr_default_np F
pthread_setattr_default_np F pthread_setattr_default_np F
GLIBC_2.19
GLIBC_2.19 A
longjmp F
siglongjmp F
GLIBC_2.2 GLIBC_2.2
GLIBC_2.2 A GLIBC_2.2 A
_IO_flockfile F _IO_flockfile F

View File

@ -0,0 +1,35 @@
/* Copyright (C) 2013 Free Software Foundation, Inc.
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
<http://www.gnu.org/licenses/>.
This went into a separate source file since we would otherwise be
needed to include two different versions of setjmp.h into the same
file. */
#include <shlib-compat.h>
#if !defined NOT_IN_libc && defined SHARED
# if SHLIB_COMPAT (libc, GLIBC_2_11, GLIBC_2_19)
# define __v1__longjmp ____v1__longjmp_chk
# define __v1__libc_siglongjmp __v1__libc_siglongjmp_chk
# include <v1-longjmp.c>
compat_symbol (libc, __v1__libc_siglongjmp_chk, __longjmp_chk, GLIBC_2_11);
# endif
#endif