mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 12:30:06 +00:00
S/390: Revert the jmp_buf/ucontext_t ABI change.
This commit is contained in:
parent
6c9578a24b
commit
2f438e20ab
71
ChangeLog
71
ChangeLog
@ -1,3 +1,74 @@
|
||||
2014-07-31 Stefan Liebler <stli@linux.vnet.ibm.com>
|
||||
|
||||
* sysdeps/s390/Makefile: Delete file.
|
||||
* sysdeps/s390/Versions (GLIBC_2.19): Remove __setjmp.
|
||||
* sysdeps/s390/__longjmp.c: Delete file.
|
||||
* sysdeps/s390/bits/setjmp.h (__s390_jmp_buf):
|
||||
Remove fields __flags and __reserved.
|
||||
* sysdeps/s390/longjmp.c: Include setjmp/longjmp.c
|
||||
and add versioning.
|
||||
* sysdeps/s390/rtld-__longjmp.c: Delete file.
|
||||
* sysdeps/s390/rtld-global-offsets.sym: Likewise.
|
||||
* sysdeps/s390/rtld-setjmp.S: Likewise.
|
||||
* sysdeps/s390/s390-32/__longjmp-common.c: Move to ...
|
||||
* sysdeps/s390/s390-32/__longjmp.c: ... here.
|
||||
* sysdeps/s390/s390-32/setjmp-common.S: Move to ...
|
||||
* sysdeps/s390/s390-32/setjmp.S: ... here.
|
||||
Add versioning.
|
||||
(__sigsetjmp): Remove setting __flags field.
|
||||
* sysdeps/s390/s390-64/__longjmp-common.c:Move to ...
|
||||
* sysdeps/s390/s390-64/__longjmp.c: ... here.
|
||||
* sysdeps/s390/s390-64/setjmp-common.S: Move to ...
|
||||
* sysdeps/s390/s390-64/setjmp.S: ... here.
|
||||
Add versioning.
|
||||
(__sigsetjmp): Remove setting __flags field.
|
||||
* sysdeps/s390/setjmp.S: Delete file.
|
||||
* sysdeps/s390/sigjmp.c: Likewise.
|
||||
* sysdeps/s390/v1-longjmp.c: Likewise.
|
||||
* sysdeps/s390/v1-setjmp.h: Likewise.
|
||||
* sysdeps/s390/v1-sigjmp.c: Likewise.
|
||||
* sysdeps/unix/sysv/linux/s390/Makefile (sysdep_routines):
|
||||
Remove v1-longjmp_chk.
|
||||
* sysdeps/unix/sysv/linux/s390/getcontext.S: Delete file.
|
||||
* sysdeps/unix/sysv/linux/s390/longjmp_chk.c:
|
||||
Include debug/longjmp_chk.c and add versioning.
|
||||
* sysdeps/unix/sysv/linux/s390/pt-longjmp.c:
|
||||
Include nptl/pt-longjmp.c and add versioning.
|
||||
* sysdeps/unix/sysv/linux/s390/rtld-getcontext.S: Delete file.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/____longjmp_chk.c:
|
||||
Include __longjmp.c.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/getcontext-common.S:
|
||||
Move to ...
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/getcontext.S: ... here.
|
||||
(__getcontext): Remove setting __flags field.
|
||||
Add versioning.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S:
|
||||
Don't restore upper high grps.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/swapcontext.S:
|
||||
Likewise.
|
||||
(__swapcontext): Remove setting uc_flags field.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/ucontext_i.sym:
|
||||
Delete file.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-64/____longjmp_chk.c:
|
||||
Include __longjmp.c.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-64/getcontext-common.S:
|
||||
Move to ...
|
||||
* sysdeps/unix/sysv/linux/s390/s390-64/getcontext.S: ... here.
|
||||
(__getcontext): Remove setting __flags field.
|
||||
Add versioning.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-64/swapcontext.S:
|
||||
(__swapcontext): Remove setting uc_flags field.
|
||||
* unix/sysv/linux/s390/s390-64/ucontext_i.sym: Delete file.
|
||||
* sysdeps/unix/sysv/linux/s390/sys/ucontext.h (ucontext):
|
||||
Remove fields uc_high_gprs and __reserved.
|
||||
* sysdeps/unix/sysv/linux/s390/ucontext_i.sym:
|
||||
New file with reverted content.
|
||||
* sysdeps/unix/sysv/linux/s390/v1-longjmp_chk.c: Delete file.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist:
|
||||
Regenerated.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist:
|
||||
Regenerated.
|
||||
|
||||
2014-07-31 Andreas Schwab <schwab@suse.de>
|
||||
|
||||
* config.h.in (HAVE_IFUNC): Define to 0.
|
||||
|
@ -1,9 +0,0 @@
|
||||
ifeq ($(subdir),setjmp)
|
||||
ifeq (yes,$(build-shared))
|
||||
sysdep_routines += v1-longjmp v1-sigjmp
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(subdir),csu)
|
||||
gen-as-const-headers += rtld-global-offsets.sym
|
||||
endif
|
@ -1,12 +1,8 @@
|
||||
libc {
|
||||
GLIBC_2.19 {
|
||||
setjmp; _setjmp; __setjmp; __sigsetjmp;
|
||||
setjmp; _setjmp; __sigsetjmp;
|
||||
longjmp; _longjmp; siglongjmp;
|
||||
}
|
||||
GLIBC_PRIVATE {
|
||||
__v1__libc_longjmp; __v1__libc_siglongjmp;
|
||||
__v2__libc_longjmp; __v2__libc_siglongjmp;
|
||||
}
|
||||
}
|
||||
|
||||
ld {
|
||||
|
@ -1,31 +0,0 @@
|
||||
/* 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) */
|
@ -40,10 +40,6 @@ typedef struct __s390_jmp_buf
|
||||
/* We save fpu registers 4 and 6. */
|
||||
long __fpregs[4];
|
||||
# endif
|
||||
#ifndef __V1_JMPBUF
|
||||
unsigned long __flags;
|
||||
char __reserved[128];
|
||||
#endif
|
||||
} __jmp_buf[1];
|
||||
|
||||
#endif
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 2014 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
|
||||
@ -15,50 +15,28 @@
|
||||
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. */
|
||||
Versioned copy of setjmp/longjmp.c modified for versioning
|
||||
the reverted jmpbuf extension. */
|
||||
|
||||
#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)
|
||||
#include <setjmp/longjmp.c>
|
||||
|
||||
/* 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 defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_19, GLIBC_2_20)
|
||||
/* In glibc release 2.19 new versions of longjmp-functions were introduced,
|
||||
but were reverted before 2.20. Thus both versions are the same function. */
|
||||
weak_alias (__libc_siglongjmp, __v1_longjmp)
|
||||
weak_alias (__libc_siglongjmp, __v2_longjmp)
|
||||
versioned_symbol (libc, __v1_longjmp, _longjmp, GLIBC_2_0);
|
||||
compat_symbol (libc, __v2_longjmp, _longjmp, GLIBC_2_19);
|
||||
|
||||
if (env[0].__mask_was_saved)
|
||||
/* Restore the saved signal mask. */
|
||||
(void) __sigprocmask (SIG_SETMASK, &env[0].__saved_mask,
|
||||
(sigset_t *) NULL);
|
||||
weak_alias (__libc_siglongjmp, __v1longjmp)
|
||||
weak_alias (__libc_siglongjmp, __v2longjmp)
|
||||
versioned_symbol (libc, __v1longjmp, longjmp, GLIBC_2_0);
|
||||
compat_symbol (libc, __v2longjmp, longjmp, GLIBC_2_19);
|
||||
|
||||
/* 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 */
|
||||
weak_alias (__libc_siglongjmp, __v1siglongjmp)
|
||||
weak_alias (__libc_siglongjmp, __v2siglongjmp)
|
||||
versioned_symbol (libc, __v1siglongjmp, siglongjmp, GLIBC_2_0);
|
||||
compat_symbol (libc, __v2siglongjmp, siglongjmp, GLIBC_2_19);
|
||||
#endif /* SHARED && SHLIB_COMPAT (libc, GLIBC_2_19, GLIBC_2_20) */
|
||||
|
@ -1,19 +0,0 @@
|
||||
/* 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"
|
@ -1,7 +0,0 @@
|
||||
#define SHARED 1
|
||||
|
||||
#include <ldsodefs.h>
|
||||
|
||||
#define rtld_global_ro_offsetof(mem) offsetof (struct rtld_global_ro, mem)
|
||||
|
||||
RTLD_GLOBAL_RO_DL_HWCAP_OFFSET rtld_global_ro_offsetof (_dl_hwcap)
|
@ -1,20 +0,0 @@
|
||||
/* 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"
|
@ -25,7 +25,7 @@
|
||||
|
||||
/* Jump to the position specified by ENV, causing the
|
||||
setjmp call there to return VAL, or 1 if VAL is 0. */
|
||||
attribute_hidden void
|
||||
void
|
||||
__longjmp (__jmp_buf env, int val)
|
||||
{
|
||||
#ifdef PTR_DEMANGLE
|
@ -21,30 +21,38 @@
|
||||
#define _ASM
|
||||
#define _SETJMP_H
|
||||
#include <bits/setjmp.h>
|
||||
#include <shlib-compat.h>
|
||||
|
||||
#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 0f /* branch relativ to __sigsetjmp */
|
||||
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 0f /* branch relativ to __sigsetjmp */
|
||||
j .Linternal_sigsetjmp /* 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 */
|
||||
j .Linternal_sigsetjmp /* branch relativ to __sigsetjmp */
|
||||
END (__setjmp)
|
||||
|
||||
ENTRY(__sigsetjmp)
|
||||
0:
|
||||
.Linternal_sigsetjmp:
|
||||
#ifdef PTR_MANGLE
|
||||
stm %r6,%r13,0(%r2) /* store registers in jmp_buf */
|
||||
lr %r4,%r14
|
||||
@ -54,10 +62,6 @@ ENTRY(__sigsetjmp)
|
||||
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)
|
||||
@ -70,15 +74,38 @@ ENTRY(__sigsetjmp)
|
||||
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 */
|
||||
.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
|
||||
1: .long _GLOBAL_OFFSET_TABLE_ - 0b
|
||||
.L1: .long _GLOBAL_OFFSET_TABLE_ - .L0
|
||||
#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
|
||||
.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 */
|
@ -25,7 +25,7 @@
|
||||
|
||||
/* Jump to the position specified by ENV, causing the
|
||||
setjmp call there to return VAL, or 1 if VAL is 0. */
|
||||
attribute_hidden void
|
||||
void
|
||||
__longjmp (__jmp_buf env, int val)
|
||||
{
|
||||
#ifdef PTR_DEMANGLE
|
@ -21,30 +21,38 @@
|
||||
#define _ASM
|
||||
#define _SETJMP_H
|
||||
#include <bits/setjmp.h>
|
||||
#include <shlib-compat.h>
|
||||
|
||||
#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)
|
||||
lghi %r3,1 /* Second argument of one. */
|
||||
j 0f /* Branch relativ to __sigsetjmp. */
|
||||
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 0f /* Branch relativ to __sigsetjmp. */
|
||||
j .Linternal_sigsetjmp /* 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. */
|
||||
j .Linternal_sigsetjmp /* Branch relativ to __sigsetjmp. */
|
||||
END (__setjmp)
|
||||
|
||||
ENTRY(__sigsetjmp)
|
||||
0:
|
||||
.Linternal_sigsetjmp:
|
||||
#ifdef PTR_MANGLE
|
||||
stmg %r6,%r13,0(%r2) /* Store registers in jmp_buf. */
|
||||
lgr %r4,%r14
|
||||
@ -54,10 +62,6 @@ ENTRY(__sigsetjmp)
|
||||
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)
|
||||
@ -77,3 +81,26 @@ ENTRY(__sigsetjmp)
|
||||
jg __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 */
|
@ -1,64 +0,0 @@
|
||||
/* 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) */
|
@ -1,34 +0,0 @@
|
||||
/* 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;
|
||||
}
|
@ -1,57 +0,0 @@
|
||||
/* 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 */
|
@ -1,111 +0,0 @@
|
||||
/* 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 */
|
@ -1,44 +0,0 @@
|
||||
/* 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 */
|
@ -17,12 +17,6 @@ ifeq ($(subdir),elf)
|
||||
sysdep_routines += dl-vdso
|
||||
endif
|
||||
|
||||
ifeq ($(subdir),debug)
|
||||
ifeq (yes,$(build-shared))
|
||||
sysdep_routines += v1-longjmp_chk
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(subdir),nptl)
|
||||
ifeq ($(enable-lock-elision),yes)
|
||||
libpthread-sysdep_routines += elision-lock elision-unlock elision-timed \
|
||||
|
@ -1,38 +0,0 @@
|
||||
/* Extendible version of getcontext 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, __v2getcontext, getcontext, GLIBC_2_19)
|
||||
#define __getcontext __v2getcontext
|
||||
|
||||
#include "getcontext-common.S"
|
||||
|
||||
#undef __getcontext
|
||||
|
||||
libc_hidden_ver (__v2getcontext, getcontext)
|
||||
|
||||
#if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_1, GLIBC_2_19)
|
||||
# define __V1_UCONTEXT
|
||||
compat_symbol (libc, __v1getcontext, getcontext, GLIBC_2_1)
|
||||
# define __getcontext __v1getcontext
|
||||
# include "getcontext-common.S"
|
||||
# undef __getcontext
|
||||
|
||||
#endif
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 2014 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
|
||||
@ -15,30 +15,34 @@
|
||||
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. */
|
||||
Versioned copy of debug/longjmp_chk.c modified for versioning
|
||||
the reverted jmpbuf extension. */
|
||||
|
||||
#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)
|
||||
#if !defined NOT_IN_libc && defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_19, GLIBC_2_20)
|
||||
/* this is a copy from debug/longjmp_chk.c because we need an unique name
|
||||
for __longjmp_chk, but it is already named via a define
|
||||
for __libc_siglongjmp in debug/longjmp_chk.c. */
|
||||
# include <setjmp.h>
|
||||
|
||||
// XXX Should move to include/setjmp.h
|
||||
extern void ____longjmp_chk (__jmp_buf __env, int __val)
|
||||
__attribute__ ((__noreturn__));
|
||||
|
||||
#if defined NOT_IN_libc
|
||||
# define __longjmp ____longjmp_chk
|
||||
# define __libc_siglongjmp __v1__longjmp_chk
|
||||
|
||||
# define __v2__longjmp ____longjmp_chk
|
||||
# define __v2__libc_siglongjmp __longjmp_chk
|
||||
# include <setjmp/longjmp.c>
|
||||
|
||||
# include <longjmp.c>
|
||||
/* In glibc release 2.19 a new versions of __longjmp_chk was introduced,
|
||||
but was reverted before 2.20. Thus both versions are the same function. */
|
||||
strong_alias (__v1__longjmp_chk, __v2__longjmp_chk);
|
||||
versioned_symbol (libc, __v1__longjmp_chk, __longjmp_chk, GLIBC_2_11);
|
||||
compat_symbol (libc, __v2__longjmp_chk, __longjmp_chk, GLIBC_2_19);
|
||||
|
||||
#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);
|
||||
# include <debug/longjmp_chk.c>
|
||||
|
||||
#endif
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 2014 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
|
||||
@ -15,49 +15,30 @@
|
||||
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. */
|
||||
Versioned copy of nptl/pt-longjmp.c modified for versioning
|
||||
the reverted jmpbuf extension. */
|
||||
|
||||
#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));
|
||||
#if defined SHARED && SHLIB_COMPAT (libpthread, GLIBC_2_19, GLIBC_2_20)
|
||||
/* we need a unique name in case of symbol versioning. */
|
||||
# define longjmp __v1longjmp
|
||||
#endif /* defined SHARED && SHLIB_COMPAT (libpthread, GLIBC_2_19, GLIBC_2_20)) */
|
||||
|
||||
void __v1_siglongjmp (sigjmp_buf env, int val)
|
||||
{
|
||||
__v1__libc_siglongjmp (env, val);
|
||||
}
|
||||
#include <nptl/pt-longjmp.c>
|
||||
|
||||
void __v1_longjmp (jmp_buf env, int val)
|
||||
{
|
||||
__v1__libc_longjmp (env, val);
|
||||
}
|
||||
#if defined SHARED && SHLIB_COMPAT (libpthread, GLIBC_2_19, GLIBC_2_20)
|
||||
/* In glibc release 2.19 new versions of longjmp-functions were introduced,
|
||||
but were reverted before 2.20. Thus both versions are the same function. */
|
||||
|
||||
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)) */
|
||||
# undef longjmp
|
||||
|
||||
void
|
||||
__v2_longjmp (jmp_buf env, int val)
|
||||
{
|
||||
__libc_longjmp (env, val);
|
||||
}
|
||||
strong_alias (__v1longjmp, __v2longjmp)
|
||||
versioned_symbol (libpthread, __v1longjmp, longjmp, GLIBC_2_0);
|
||||
compat_symbol (libpthread, __v2longjmp, longjmp, GLIBC_2_19);
|
||||
|
||||
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);
|
||||
weak_alias (siglongjmp, __v1siglongjmp)
|
||||
weak_alias (siglongjmp, __v2siglongjmp)
|
||||
versioned_symbol (libpthread, __v1siglongjmp, siglongjmp, GLIBC_2_0);
|
||||
compat_symbol (libpthread, __v2siglongjmp, siglongjmp, GLIBC_2_19);
|
||||
#endif /* defined SHARED && SHLIB_COMPAT (libpthread, GLIBC_2_19, GLIBC_2_20)) */
|
||||
|
@ -1,19 +0,0 @@
|
||||
/* 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 "getcontext-common.S"
|
@ -26,8 +26,8 @@
|
||||
#include <stdint.h>
|
||||
#include <signal.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <libc-symbols.h>
|
||||
#include <shlib-compat.h>
|
||||
|
||||
#define __longjmp ____longjmp_chk
|
||||
|
||||
#define CHECK_SP(env, guard) \
|
||||
do \
|
||||
@ -51,22 +51,4 @@
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
|
||||
#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 */
|
||||
#include "__longjmp.c"
|
||||
|
@ -19,9 +19,10 @@
|
||||
#include <sysdep.h>
|
||||
#include <features.h>
|
||||
|
||||
#include "rtld-global-offsets.h"
|
||||
#include "ucontext_i.h"
|
||||
|
||||
#include <shlib-compat.h>
|
||||
|
||||
/* __getcontext (const ucontext_t *ucp)
|
||||
|
||||
Saves the machine context in UCP such that when it is activated,
|
||||
@ -37,7 +38,7 @@ ENTRY(__getcontext)
|
||||
/* rt_sigprocmask (SIG_BLOCK, NULL, &sc->sc_mask, sigsetsize). */
|
||||
la %r2,SIG_BLOCK
|
||||
slr %r3,%r3
|
||||
la %r4,SC_MASK(%r1)
|
||||
la %r4,SC_MASK(%r1)
|
||||
lhi %r5,_NSIG8
|
||||
svc SYS_ify(rt_sigprocmask)
|
||||
|
||||
@ -60,42 +61,6 @@ ENTRY(__getcontext)
|
||||
std %f14,SC_FPRS+112(%r1)
|
||||
std %f15,SC_FPRS+120(%r1)
|
||||
|
||||
lhi %r2,0
|
||||
#ifndef __V1_UCONTEXT
|
||||
bras %r3,0f
|
||||
# ifdef IS_IN_rtld
|
||||
/* Within ld.so we can do slightly better by addressing dl_hwap
|
||||
relative to GOT start. */
|
||||
1: .long _GLOBAL_OFFSET_TABLE_ - 1b
|
||||
.long C_SYMBOL_NAME(_rtld_global_ro)@GOTOFF
|
||||
0: l %r4,0(%r3)
|
||||
la %r4,0(%r3,%r4)
|
||||
l %r5,4(%r3)
|
||||
/* _dl_hwcap is 64 bit and we need the lower 32. */
|
||||
l %r3,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET+4(%r4,%r5)
|
||||
# elif PIC
|
||||
1: .long _GLOBAL_OFFSET_TABLE_ - 1b
|
||||
.long C_SYMBOL_NAME(_rtld_global_ro)@GOT
|
||||
0: l %r4,0(%r3)
|
||||
la %r4,0(%r3,%r4) /* GOT pointer -> r4 */
|
||||
l %r5,4(%r3) /* GOT offset -> r5 */
|
||||
l %r5,0(%r4,%r5) /* GOT slot -> r5 */
|
||||
l %r3,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET+4(%r5)
|
||||
# else
|
||||
.long C_SYMBOL_NAME(_dl_hwcap)
|
||||
0: l %r3,0(%r3)
|
||||
l %r3,0(%r3)
|
||||
# endif
|
||||
tml %r3,512 /* HWCAP_S390_HIGH_GPRS */
|
||||
jz 2f
|
||||
/* highgprs implies zarch so stmh/oill is ok here. */
|
||||
.machine "z900"
|
||||
.machinemode "zarch_nohighgprs"
|
||||
stmh %r0,%r15,SC_HIGHGPRS(%r1)
|
||||
oill %r2,1 /* UCONTEXT_UC_FLAGS_HIGH_GPRS */
|
||||
#endif
|
||||
2: st %r2,SC_FLGS(%r1)
|
||||
|
||||
/* Set __getcontext return value to 0. */
|
||||
slr %r2,%r2
|
||||
|
||||
@ -110,3 +75,12 @@ ENTRY(__getcontext)
|
||||
END(__getcontext)
|
||||
|
||||
weak_alias (__getcontext, getcontext)
|
||||
|
||||
#if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_19, GLIBC_2_20)
|
||||
/* In glibc release 2.19 a new version of getcontext was introduced,
|
||||
but was reverted before 2.20. Thus both versions are the same function. */
|
||||
weak_alias (__getcontext, __v1__getcontext)
|
||||
weak_alias (__getcontext, __v2__getcontext)
|
||||
versioned_symbol (libc, __v1__getcontext, getcontext, GLIBC_2_1)
|
||||
compat_symbol (libc, __v2__getcontext, getcontext, GLIBC_2_19)
|
||||
#endif
|
@ -1777,7 +1777,6 @@ GLIBC_2.18
|
||||
GLIBC_2.19
|
||||
GLIBC_2.19 A
|
||||
__longjmp_chk F
|
||||
__setjmp F
|
||||
__sigsetjmp F
|
||||
_longjmp F
|
||||
_setjmp F
|
||||
|
@ -62,16 +62,8 @@ ENTRY(__setcontext)
|
||||
/* Don't touch %a0, used for thread purposes. */
|
||||
lam %a1,%a15,SC_ACRS+4(%r1)
|
||||
|
||||
/* Restore the upper halfs if available. */
|
||||
l %r2,SC_FLGS(%r1)
|
||||
tml %r2,1 /* UCONTEXT_UC_FLAGS_HIGH_GPRS */
|
||||
jz 0f
|
||||
.machine "z900"
|
||||
.machinemode "zarch_nohighgprs"
|
||||
lmh %r0,%r15,SC_HIGHGPRS(%r1)
|
||||
|
||||
/* Load general purpose registers. */
|
||||
0: lm %r0,%r15,SC_GPRS(%r1)
|
||||
lm %r0,%r15,SC_GPRS(%r1)
|
||||
|
||||
/* Return. */
|
||||
br %r14
|
||||
|
@ -65,31 +65,19 @@ ENTRY(__swapcontext)
|
||||
std %f14,SC_FPRS+112(%r1)
|
||||
std %f15,SC_FPRS+120(%r1)
|
||||
|
||||
/* Store access registers. */
|
||||
stam %a0,%a15,SC_ACRS(%r1)
|
||||
|
||||
/* Set __swapcontext return value to 0. */
|
||||
slr %r2,%r2
|
||||
|
||||
/* Store access registers. */
|
||||
stam %a0,%a15,SC_ACRS(%r1)
|
||||
|
||||
/* Store general purpose registers. */
|
||||
stm %r0,%r15,SC_GPRS(%r1)
|
||||
|
||||
/* Copy uc_flags into the new ucontext_t. */
|
||||
/* sigprocmask (SIG_SETMASK, &sc->sc_mask, NULL). */
|
||||
la %r2,SIG_BLOCK
|
||||
lr %r5,%r0
|
||||
l %r2,SC_FLGS(%r5)
|
||||
st %r2,SC_FLGS(%r1)
|
||||
|
||||
/* Save/restore the upper halfs if necessary. */
|
||||
tml %r2,1 /* UCONTEXT_UC_FLAGS_HIGH_GPRS */
|
||||
jz 0f
|
||||
.machine "z900"
|
||||
.machinemode "zarch_nohighgprs"
|
||||
stmh %r0,%r15,SC_HIGHGPRS(%r1)
|
||||
lmh %r0,%r15,SC_HIGHGPRS(%r5)
|
||||
|
||||
/* rt_sigprocmask (SIG_SETMASK, &sc->sc_mask, NULL, sigsetsize). */
|
||||
0: la %r2,SIG_BLOCK
|
||||
la %r3,SC_MASK(%r5)
|
||||
la %r3,SC_MASK(%r5)
|
||||
slr %r4,%r4
|
||||
lhi %r5,_NSIG8
|
||||
svc SYS_ify(rt_sigprocmask)
|
||||
|
@ -1,26 +0,0 @@
|
||||
#include <stddef.h>
|
||||
#include <signal.h>
|
||||
#include <sys/ucontext.h>
|
||||
|
||||
--
|
||||
|
||||
SIG_BLOCK
|
||||
SIG_UNBLOCK
|
||||
SIG_SETMASK
|
||||
|
||||
_NSIG8 (_NSIG / 8)
|
||||
|
||||
#define ucontext(member) offsetof (ucontext_t, member)
|
||||
#define mcontext(member) ucontext (uc_mcontext.member)
|
||||
|
||||
SC_FLGS ucontext (uc_flags)
|
||||
SC_LINK ucontext (uc_link)
|
||||
SC_STCK ucontext (uc_stack.ss_sp)
|
||||
SC_STSZ ucontext (uc_stack.ss_size)
|
||||
SC_PSW mcontext (psw)
|
||||
SC_GPRS mcontext (gregs)
|
||||
SC_ACRS mcontext (aregs)
|
||||
SC_FPC mcontext (fpregs.fpc)
|
||||
SC_FPRS mcontext (fpregs.fprs)
|
||||
SC_MASK ucontext (uc_sigmask)
|
||||
SC_HIGHGPRS ucontext (uc_high_gprs)
|
@ -26,8 +26,8 @@
|
||||
#include <stdint.h>
|
||||
#include <signal.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <libc-symbols.h>
|
||||
#include <shlib-compat.h>
|
||||
|
||||
#define __longjmp ____longjmp_chk
|
||||
|
||||
#define CHECK_SP(env, guard) \
|
||||
do \
|
||||
@ -51,23 +51,4 @@
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
|
||||
#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 */
|
||||
#include "__longjmp.c"
|
||||
|
@ -21,6 +21,8 @@
|
||||
|
||||
#include "ucontext_i.h"
|
||||
|
||||
#include <shlib-compat.h>
|
||||
|
||||
/* __getcontext (const ucontext_t *ucp)
|
||||
|
||||
Saves the machine context in UCP such that when it is activated,
|
||||
@ -62,10 +64,6 @@ ENTRY(__getcontext)
|
||||
/* Set __getcontext return value to 0. */
|
||||
slgr %r2,%r2
|
||||
|
||||
/* Store the version number into the uc_flags field. So far
|
||||
we do not make use of the reserved bytes so we store a zero. */
|
||||
stg %r2,SC_FLGS(%r1)
|
||||
|
||||
/* Store access registers. */
|
||||
stam %a0,%a15,SC_ACRS(%r1)
|
||||
|
||||
@ -77,3 +75,12 @@ ENTRY(__getcontext)
|
||||
END(__getcontext)
|
||||
|
||||
weak_alias (__getcontext, getcontext)
|
||||
|
||||
#if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_19, GLIBC_2_20)
|
||||
/* In glibc release 2.19 a new version of getcontext was introduced,
|
||||
but was reverted before 2.20. Thus both versions are the same function. */
|
||||
weak_alias (__getcontext, __v1__getcontext)
|
||||
weak_alias (__getcontext, __v2__getcontext)
|
||||
versioned_symbol (libc, __v1__getcontext, getcontext, GLIBC_2_1)
|
||||
compat_symbol (libc, __v2__getcontext, getcontext, GLIBC_2_19)
|
||||
#endif
|
@ -98,7 +98,6 @@ GLIBC_2.18
|
||||
GLIBC_2.19
|
||||
GLIBC_2.19 A
|
||||
__longjmp_chk F
|
||||
__setjmp F
|
||||
__sigsetjmp F
|
||||
_longjmp F
|
||||
_setjmp F
|
||||
|
@ -65,25 +65,21 @@ ENTRY(__swapcontext)
|
||||
std %f14,SC_FPRS+112(%r1)
|
||||
std %f15,SC_FPRS+120(%r1)
|
||||
|
||||
/* Set __swapcontext return value to 0. */
|
||||
slgr %r2,%r2
|
||||
|
||||
/* Store access registers. */
|
||||
stam %a0,%a15,SC_ACRS(%r1)
|
||||
|
||||
/* Set __swapcontext return value to 0. */
|
||||
slgr %r2,%r2
|
||||
|
||||
/* Store general purpose registers. */
|
||||
stmg %r0,%r15,SC_GPRS(%r1)
|
||||
|
||||
/* Copy uc_flags into the new ucontext_t. */
|
||||
lgr %r5,%r0
|
||||
lg %r2,SC_FLGS(%r5)
|
||||
stg %r2,SC_FLGS(%r1)
|
||||
|
||||
/* rt_sigprocmask (SIG_SETMASK, &sc->sc_mask, NULL, sigsetsize). */
|
||||
la %r2,SIG_BLOCK
|
||||
lgr %r5,%r0
|
||||
la %r3,SC_MASK(%r5)
|
||||
slgr %r4,%r4
|
||||
lghi %r5,_NSIG8
|
||||
slgr %r4,%r4
|
||||
svc SYS_ify(rt_sigprocmask)
|
||||
|
||||
/* Load fpu context. */
|
||||
|
@ -64,15 +64,6 @@ typedef struct
|
||||
fpreg_t fprs[16];
|
||||
} fpregset_t;
|
||||
|
||||
/* Bit is set if the uc_high_gprs field contains the upper halfs of
|
||||
the 64 bit general purpose registers. Since the uc_high_gprs field
|
||||
is only available in the 32 bit version of ucontext_t it will never
|
||||
be set for 64 bit. */
|
||||
#define UCONTEXT_UC_FLAGS_HIGH_GPRS (1UL << 0)
|
||||
|
||||
/* A new uc_flags constant will be defined when actually making use of
|
||||
the reserved space: UCONTEXT_UCFLAGS_RESERVED (1UL << 1). */
|
||||
|
||||
/* Context to describe whole processor state. */
|
||||
typedef struct
|
||||
{
|
||||
@ -90,10 +81,6 @@ struct ucontext
|
||||
stack_t uc_stack;
|
||||
mcontext_t uc_mcontext;
|
||||
__sigset_t uc_sigmask;
|
||||
#ifndef __s390x__
|
||||
unsigned long uc_high_gprs[16];
|
||||
#endif
|
||||
char __reserved[512];
|
||||
};
|
||||
|
||||
|
||||
|
@ -1,35 +0,0 @@
|
||||
/* 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
|
Loading…
Reference in New Issue
Block a user