Message ID | 20190905205620.4646-2-adhemerval.zanella@linaro.org |
---|---|
State | New |
Headers | show |
Series | [v2,1/8] Remove PREPARE_VERSION and PREPARE_VERSION_KNOW | expand |
I will commit this shortly if no one opposes, after I tested on the affected architectures. On 05/09/2019 17:56, Adhemerval Zanella wrote: > Linux vDSO initialization code the internal function pointers require a lot > of duplicated boilerplate over different architectures. This patch aims to > simplify not only the code but the required definition to enable a vDSO > symbol. > > The changes are: > > 1. Consolidate all init-first.c on only one implementation and enable > the symbol based on HAVE_*_VSYSCALL existence. > > 2. Set the HAVE_*_VSYSCALL to the architecture expected names string. > > 3. Add a new internal implementation, get_vdso_mangle_symbol, which > returns a mangled function pointer. > > Currently the clock_gettime, clock_getres, gettimeofday, getcpu, and time > are handled in an arch-independent way, powerpc still uses some arch-specific > vDSO symbol handled in a specific init-first implementation. > > Checked on aarch64-linux-gnu, arm-linux-gnueabihf, i386-linux-gnu, > mips64-linux-gnu, powerpc64le-linux-gnu, s390x-linux-gnu, sparc64-linux-gnu, > and x86_64-linux-gnu. > > * sysdeps/powerpc/powerpc32/backtrace.c (is_sigtramp_address, > is_sigtramp_address_rt): Use HAVE_SIGTRAMP_{RT}32 instead of SHARED. > * sysdeps/powerpc/powerpc64/backtrace.c (is_sigtramp_address): > Likewise. > * sysdeps/unix/sysv/linux/aarch64/init-first.c: Remove file. > * sysdeps/unix/sysv/linux/aarch64/libc-vdso.h: Likewise. > * sysdeps/unix/sysv/linux/arm/init-first.c: Likewise. > * sysdeps/unix/sysv/linux/arm/libc-vdso.h: Likewise. > * sysdeps/unix/sysv/linux/mips/init-first.c: Likewise. > * sysdeps/unix/sysv/linux/mips/libc-vdso.h: Likewise. > * sysdeps/unix/sysv/linux/i386/init-first.c: Likewise. > * sysdeps/unix/sysv/linux/riscv/init-first.c: Likewise. > * sysdeps/unix/sysv/linux/riscv/libc-vdso.h: Likewise. > * sysdeps/unix/sysv/linux/s390/init-first.c: Likewise. > * sysdeps/unix/sysv/linux/s390/libc-vdso.h: Likewise. > * sysdeps/unix/sysv/linux/sparc/init-first.c: Likewise. > * sysdeps/unix/sysv/linux/sparc/libc-vdso.h: Likewise. > * sysdeps/unix/sysv/linux/x86/libc-vdso.h: Likewise. > * sysdeps/unix/sysv/linux/x86_64/init-first.c: Likewise. > * sysdeps/unix/sysv/linux/aarch64/sysdep.h > (HAVE_CLOCK_GETRES_VSYSCALL, HAVE_CLOCK_GETTIME_VSYSCALL, > HAVE_GETTIMEOFDAY_VSYSCALL): Define value based on kernel exported > name. > * sysdeps/unix/sysv/linux/arm/sysdep.h (HAVE_CLOCK_GETTIME_VSYSCALL, > HAVE_GETTIMEOFDAY_VSYSCALL): Likewise. > * sysdeps/unix/sysv/linux/i386/sysdep.h (HAVE_CLOCK_GETTIME_VSYSCALL, > HAVE_GETTIMEOFDAY_VSYSCALL): Likewise. > * sysdeps/unix/sysv/linux/mips/sysdep.h (HAVE_CLOCK_GETTIME_VSYSCALL, > HAVE_GETTIMEOFDAY_VSYSCALL): Likewise. > * sysdeps/unix/sysv/linux/powerpc/sysdep.h > (HAVE_CLOCK_GETRES_VSYSCALL, HAVE_CLOCK_GETTIME_VSYSCALL, > HAVE_GETCPU_VSYSCALL, HAVE_TIME_VSYSCALL, HAVE_GET_TBFREQ, > HAVE_SIGTRAMP_RT64, HAVE_SIGTRAMP_32, HAVE_SIGTRAMP_RT32): Likewise. > * sysdeps/unix/sysv/linux/riscv/sysdep.h (HAVE_CLOCK_GETRES_VSYSCALL, > HAVE_CLOCK_GETTIME_VSYSCALL, HAVE_GETTIMEOFDAY_VSYSCALL, > HAVE_GETCPU_VSYSCALL): Likewise. > * sysdeps/unix/sysv/linux/s390/sysdep.h (HAVE_CLOCK_GETRES_VSYSCALL, > HAVE_CLOCK_GETTIME_VSYSCALL, HAVE_GETTIMEOFDAY_VSYSCALL, > HAVE_GETCPU_VSYSCALL): Likewise. > * sysdeps/unix/sysv/linux/sparc/sysdep.h (HAVE_CLOCK_GETTIME_VSYSCALL, > HAVE_GETTIMEOFDAY_VSYSCALL): Likewise. > * sysdeps/unix/sysv/linux/x86_64/sysdep.h > (HAVE_CLOCK_GETTIME_VSYSCALL, HAVE_GETTIMEOFDAY_VSYSCALL, > HAVE_GETCPU_VSYSCALL): Likewise. > * sysdeps/unix/sysv/linux/dl-vdso.h (VDSO_NAME, VDSO_HASH): Define to > invalid names if architecture does not define them. > (get_vdso_mangle_symbol): New symbol. > * sysdeps/unix/sysv/linux/init-first.c: New file. > * sysdeps/unix/sysv/linux/libc-vdso.h: Likewise. > * sysdeps/unix/sysv/linux/powerpc/init-first.c (gettimeofday, > clock_gettime, clock_getres, getcpu, time): Remove declaration. > (__libc_vdso_platform_setup_arch): Likewise and use > get_vdso_mangle_symbol to setup vDSO symbols. > (sigtramp_rt64, sigtramp32, sigtramp_rt32, get_tbfreq): Add > attribute_hidden. > * sysdeps/unix/sysv/linux/powerpc/libc-vdso.h: Likewise. > * sysdeps/unix/sysv/linux/sysdep-vdso.h (VDSO_SYMBOL): Remove > definition. > --- > sysdeps/powerpc/powerpc32/backtrace.c | 4 +- > sysdeps/powerpc/powerpc64/backtrace.c | 2 +- > sysdeps/unix/sysv/linux/aarch64/init-first.c | 44 ---------- > sysdeps/unix/sysv/linux/aarch64/sysdep.h | 6 +- > sysdeps/unix/sysv/linux/arm/init-first.c | 41 ---------- > sysdeps/unix/sysv/linux/arm/libc-vdso.h | 29 ------- > sysdeps/unix/sysv/linux/arm/sysdep.h | 4 +- > sysdeps/unix/sysv/linux/dl-vdso.h | 21 ++++- > sysdeps/unix/sysv/linux/i386/init-first.c | 46 ----------- > sysdeps/unix/sysv/linux/i386/sysdep.h | 4 +- > sysdeps/unix/sysv/linux/init-first.c | 80 +++++++++++++++++++ > .../unix/sysv/linux/{aarch64 => }/libc-vdso.h | 18 ++++- > sysdeps/unix/sysv/linux/mips/init-first.c | 40 ---------- > sysdeps/unix/sysv/linux/mips/libc-vdso.h | 29 ------- > sysdeps/unix/sysv/linux/mips/sysdep.h | 4 +- > sysdeps/unix/sysv/linux/powerpc/init-first.c | 51 +++--------- > sysdeps/unix/sysv/linux/powerpc/libc-vdso.h | 12 +-- > sysdeps/unix/sysv/linux/powerpc/sysdep.h | 14 +++- > sysdeps/unix/sysv/linux/riscv/init-first.c | 54 ------------- > sysdeps/unix/sysv/linux/riscv/libc-vdso.h | 34 -------- > sysdeps/unix/sysv/linux/riscv/sysdep.h | 8 +- > sysdeps/unix/sysv/linux/s390/init-first.c | 56 ------------- > sysdeps/unix/sysv/linux/s390/libc-vdso.h | 35 -------- > sysdeps/unix/sysv/linux/s390/sysdep.h | 8 +- > sysdeps/unix/sysv/linux/sparc/init-first.c | 42 ---------- > sysdeps/unix/sysv/linux/sparc/libc-vdso.h | 29 ------- > sysdeps/unix/sysv/linux/sparc/sysdep.h | 4 +- > sysdeps/unix/sysv/linux/sysdep-vdso.h | 2 +- > sysdeps/unix/sysv/linux/x86/libc-vdso.h | 33 -------- > sysdeps/unix/sysv/linux/x86_64/init-first.c | 48 ----------- > sysdeps/unix/sysv/linux/x86_64/sysdep.h | 6 +- > 31 files changed, 164 insertions(+), 644 deletions(-) > delete mode 100644 sysdeps/unix/sysv/linux/aarch64/init-first.c > delete mode 100644 sysdeps/unix/sysv/linux/arm/init-first.c > delete mode 100644 sysdeps/unix/sysv/linux/arm/libc-vdso.h > delete mode 100644 sysdeps/unix/sysv/linux/i386/init-first.c > create mode 100644 sysdeps/unix/sysv/linux/init-first.c > rename sysdeps/unix/sysv/linux/{aarch64 => }/libc-vdso.h (70%) > delete mode 100644 sysdeps/unix/sysv/linux/mips/init-first.c > delete mode 100644 sysdeps/unix/sysv/linux/mips/libc-vdso.h > delete mode 100644 sysdeps/unix/sysv/linux/riscv/init-first.c > delete mode 100644 sysdeps/unix/sysv/linux/riscv/libc-vdso.h > delete mode 100644 sysdeps/unix/sysv/linux/s390/init-first.c > delete mode 100644 sysdeps/unix/sysv/linux/s390/libc-vdso.h > delete mode 100644 sysdeps/unix/sysv/linux/sparc/init-first.c > delete mode 100644 sysdeps/unix/sysv/linux/sparc/libc-vdso.h > delete mode 100644 sysdeps/unix/sysv/linux/x86/libc-vdso.h > delete mode 100644 sysdeps/unix/sysv/linux/x86_64/init-first.c > > diff --git a/sysdeps/powerpc/powerpc32/backtrace.c b/sysdeps/powerpc/powerpc32/backtrace.c > index 857a8aad7b..2978632017 100644 > --- a/sysdeps/powerpc/powerpc32/backtrace.c > +++ b/sysdeps/powerpc/powerpc32/backtrace.c > @@ -54,7 +54,7 @@ struct signal_frame_32 { > static inline int > is_sigtramp_address (void *nip) > { > -#ifdef SHARED > +#ifdef HAVE_SIGTRAMP_RT32 > if (nip == VDSO_SYMBOL (sigtramp32)) > return 1; > #endif > @@ -71,7 +71,7 @@ struct rt_signal_frame_32 { > static inline int > is_sigtramp_address_rt (void * nip) > { > -#ifdef SHARED > +#ifdef HAVE_SIGTRAMP_32 > if (nip == VDSO_SYMBOL (sigtramp_rt32)) > return 1; > #endif > diff --git a/sysdeps/powerpc/powerpc64/backtrace.c b/sysdeps/powerpc/powerpc64/backtrace.c > index 7a167838d9..0fa7e9c403 100644 > --- a/sysdeps/powerpc/powerpc64/backtrace.c > +++ b/sysdeps/powerpc/powerpc64/backtrace.c > @@ -57,7 +57,7 @@ struct signal_frame_64 { > static inline int > is_sigtramp_address (void *nip) > { > -#ifdef SHARED > +#ifdef HAVE_SIGTRAMP_RT64 > if (nip == VDSO_SYMBOL (sigtramp_rt64)) > return 1; > #endif > diff --git a/sysdeps/unix/sysv/linux/aarch64/init-first.c b/sysdeps/unix/sysv/linux/aarch64/init-first.c > deleted file mode 100644 > index c3c27cfd4b..0000000000 > --- a/sysdeps/unix/sysv/linux/aarch64/init-first.c > +++ /dev/null > @@ -1,44 +0,0 @@ > -/* Copyright (C) 2007-2019 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 <dl-vdso.h> > -#include <libc-vdso.h> > - > -int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) attribute_hidden; > -int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); > -int (*VDSO_SYMBOL(clock_getres)) (clockid_t, struct timespec *); > - > -static inline void > -_libc_vdso_platform_setup (void) > -{ > - void *p = get_vdso_symbol ("__kernel_gettimeofday"); > - PTR_MANGLE (p); > - VDSO_SYMBOL(gettimeofday) = p; > - > - p = get_vdso_symbol ("__kernel_clock_gettime"); > - PTR_MANGLE (p); > - VDSO_SYMBOL(clock_gettime) = p; > - > - p = get_vdso_symbol ("__kernel_clock_getres"); > - PTR_MANGLE (p); > - VDSO_SYMBOL(clock_getres) = p; > -} > - > -#define VDSO_SETUP _libc_vdso_platform_setup > - > -#include <csu/init-first.c> > diff --git a/sysdeps/unix/sysv/linux/aarch64/sysdep.h b/sysdeps/unix/sysv/linux/aarch64/sysdep.h > index 662d321235..d57f7232e2 100644 > --- a/sysdeps/unix/sysv/linux/aarch64/sysdep.h > +++ b/sysdeps/unix/sysv/linux/aarch64/sysdep.h > @@ -160,9 +160,9 @@ > # endif > > /* List of system calls which are supported as vsyscalls. */ > -# define HAVE_CLOCK_GETRES_VSYSCALL 1 > -# define HAVE_CLOCK_GETTIME_VSYSCALL 1 > -# define HAVE_GETTIMEOFDAY_VSYSCALL 1 > +# define HAVE_CLOCK_GETRES_VSYSCALL "__kernel_clock_getres" > +# define HAVE_CLOCK_GETTIME_VSYSCALL "__kernel_clock_gettime" > +# define HAVE_GETTIMEOFDAY_VSYSCALL "__kernel_gettimeofday" > > /* Previously AArch64 used the generic version without the libc_hidden_def > which lead in a non existent __send symbol in libc.so. */ > diff --git a/sysdeps/unix/sysv/linux/arm/init-first.c b/sysdeps/unix/sysv/linux/arm/init-first.c > deleted file mode 100644 > index 2852ab135c..0000000000 > --- a/sysdeps/unix/sysv/linux/arm/init-first.c > +++ /dev/null > @@ -1,41 +0,0 @@ > -/* Initialization code run first thing by the ELF startup code. Linux/ARM. > - Copyright (C) 2015-2019 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 <dl-vdso.h> > -#include <libc-vdso.h> > -#include <sysdep-vdso.h> > - > -int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) attribute_hidden; > -int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); > - > -static inline void > -_libc_vdso_platform_setup (void) > -{ > - void *p = get_vdso_symbol ("__vdso_gettimeofday"); > - PTR_MANGLE (p); > - VDSO_SYMBOL (gettimeofday) = p; > - > - p = get_vdso_symbol ("__vdso_clock_gettime"); > - PTR_MANGLE (p); > - VDSO_SYMBOL (clock_gettime) = p; > -} > - > -#define VDSO_SETUP _libc_vdso_platform_setup > - > -#include <csu/init-first.c> > diff --git a/sysdeps/unix/sysv/linux/arm/libc-vdso.h b/sysdeps/unix/sysv/linux/arm/libc-vdso.h > deleted file mode 100644 > index 8702165c6b..0000000000 > --- a/sysdeps/unix/sysv/linux/arm/libc-vdso.h > +++ /dev/null > @@ -1,29 +0,0 @@ > -/* VDSO function pointer declarations. Linux/ARM. > - Copyright (C) 2015-2019 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/>. */ > - > -#ifndef _LIBC_VDSO_H > -#define _LIBC_VDSO_H > - > -#include <sysdep-vdso.h> > - > -extern int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) > - attribute_hidden; > -extern int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); > - > -#endif /* _LIBC_VDSO_H */ > diff --git a/sysdeps/unix/sysv/linux/arm/sysdep.h b/sysdeps/unix/sysv/linux/arm/sysdep.h > index 467ccf2631..634aa2bc6b 100644 > --- a/sysdeps/unix/sysv/linux/arm/sysdep.h > +++ b/sysdeps/unix/sysv/linux/arm/sysdep.h > @@ -392,8 +392,8 @@ __local_syscall_error: \ > #define VDSO_HASH 61765110 > > /* List of system calls which are supported as vsyscalls. */ > -#define HAVE_CLOCK_GETTIME_VSYSCALL 1 > -#define HAVE_GETTIMEOFDAY_VSYSCALL 1 > +#define HAVE_CLOCK_GETTIME_VSYSCALL "__vdso_gettimeofday" > +#define HAVE_GETTIMEOFDAY_VSYSCALL "__vdso_clock_gettime" > > #define LOAD_ARGS_0() > #define ASM_ARGS_0 > diff --git a/sysdeps/unix/sysv/linux/dl-vdso.h b/sysdeps/unix/sysv/linux/dl-vdso.h > index bab3779615..dcf065ef23 100644 > --- a/sysdeps/unix/sysv/linux/dl-vdso.h > +++ b/sysdeps/unix/sysv/linux/dl-vdso.h > @@ -19,16 +19,25 @@ > #ifndef _DL_VDSO_H > #define _DL_VDSO_H 1 > > -#include <assert.h> > #include <ldsodefs.h> > #include <dl-hash.h> > -#include <libc-vdso.h> > > /* Functions for resolving symbols in the VDSO link map. */ > extern void *_dl_vdso_vsym (const char *name, > const struct r_found_version *version) > attribute_hidden; > > +/* If the architecture support vDSO it should define which is the expected > + kernel version and hash value through both VDSO_NAME and VDSO_HASH > + (usually defined at architecture sysdep.h). */ > + > +#ifndef VDSO_NAME > +# define VDSO_NAME "LINUX_0.0" > +#endif > +#ifndef VDSO_HASH > +# define VDSO_HASH 0 > +#endif > + > static inline void * > get_vdso_symbol (const char *symbol) > { > @@ -36,4 +45,12 @@ get_vdso_symbol (const char *symbol) > return _dl_vdso_vsym (symbol, &rfv); > } > > +static inline void * > +get_vdso_mangle_symbol (const char *symbol) > +{ > + void *vdsop = get_vdso_symbol (symbol); > + PTR_MANGLE (vdsop); > + return vdsop; > +} > + > #endif /* dl-vdso.h */ > diff --git a/sysdeps/unix/sysv/linux/i386/init-first.c b/sysdeps/unix/sysv/linux/i386/init-first.c > deleted file mode 100644 > index 9c03f87b67..0000000000 > --- a/sysdeps/unix/sysv/linux/i386/init-first.c > +++ /dev/null > @@ -1,46 +0,0 @@ > -/* Initialization code run first thing by the ELF startup code. Linux/i386. > - Copyright (C) 2015-2019 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 <time.h> > -#include <sysdep.h> > -#include <dl-vdso.h> > -#include <sysdep-vdso.h> > - > -long int (*VDSO_SYMBOL (clock_gettime)) (clockid_t, struct timespec *) > - attribute_hidden; > - > -static long int > -clock_gettime_syscall (clockid_t id, struct timespec *tp) > -{ > - INTERNAL_SYSCALL_DECL (err); > - return INTERNAL_SYSCALL (clock_gettime, err, 2, id, tp); > -} > - > -static inline void > -__vdso_platform_setup (void) > -{ > - void *p = get_vdso_symbol ("__vdso_clock_gettime"); > - if (p == NULL) > - p = clock_gettime_syscall; > - PTR_MANGLE (p); > - VDSO_SYMBOL (clock_gettime) = p; > -} > - > -#define VDSO_SETUP __vdso_platform_setup > - > -#include <csu/init-first.c> > diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.h b/sysdeps/unix/sysv/linux/i386/sysdep.h > index 278028f52e..e793fdc936 100644 > --- a/sysdeps/unix/sysv/linux/i386/sysdep.h > +++ b/sysdeps/unix/sysv/linux/i386/sysdep.h > @@ -313,8 +313,8 @@ struct libc_do_syscall_args > # define VDSO_HASH 61765110 > > /* List of system calls which are supported as vsyscalls. */ > -# define HAVE_CLOCK_GETTIME_VSYSCALL 1 > -# define HAVE_GETTIMEOFDAY_VSYSCALL 1 > +# define HAVE_CLOCK_GETTIME_VSYSCALL "__vdso_clock_gettime" > +# define HAVE_GETTIMEOFDAY_VSYSCALL "__vdso_gettimeofday" > > /* Define a macro which expands inline into the wrapper code for a system > call. This use is for internal calls that do not need to handle errors > diff --git a/sysdeps/unix/sysv/linux/init-first.c b/sysdeps/unix/sysv/linux/init-first.c > new file mode 100644 > index 0000000000..d90ca820be > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/init-first.c > @@ -0,0 +1,80 @@ > +/* vDSO internal symbols. Linux generic version. > + Copyright (C) 2019 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 <dl-vdso.h> > +#include <libc-vdso.h> > + > +/* vDSO symbol used on clock_gettime implementation. */ > +#ifdef HAVE_CLOCK_GETTIME_VSYSCALL > +int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *) > + attribute_hidden; > +#endif > +/* vDSO symbol used on clock_getres implementation. */ > +#ifdef HAVE_CLOCK_GETRES_VSYSCALL > +int (*VDSO_SYMBOL(clock_getres)) (clockid_t, struct timespec *) > + attribute_hidden; > +#endif > +/* vDSO symbol used on gettimeofday implementation. */ > +#ifdef HAVE_GETTIMEOFDAY_VSYSCALL > +int (*VDSO_SYMBOL (gettimeofday)) (struct timeval *, void *) > + attribute_hidden; > +#endif > +/* vDSO symbol used on GNU extension getcpu implementation. */ > +#ifdef HAVE_GETCPU_VSYSCALL > +long int (*VDSO_SYMBOL(getcpu)) (unsigned *, unsigned *, void *) > + attribute_hidden; > +#endif > +/* vDSO symbol used on time implementation. */ > +#ifdef HAVE_TIME_VSYSCALL > +time_t (*VDSO_SYMBOL(time)) (time_t *) attribute_hidden; > +#endif > + > +static inline void > +__libc_vdso_platform_setup (void) > +{ > +#ifdef HAVE_CLOCK_GETTIME_VSYSCALL > + VDSO_SYMBOL(clock_gettime) > + = get_vdso_mangle_symbol (HAVE_CLOCK_GETTIME_VSYSCALL); > +#endif > + > +#ifdef HAVE_CLOCK_GETRES_VSYSCALL > + VDSO_SYMBOL(clock_getres) > + = get_vdso_mangle_symbol (HAVE_CLOCK_GETRES_VSYSCALL); > +#endif > + > +#ifdef HAVE_GETTIMEOFDAY_VSYSCALL > + VDSO_SYMBOL(gettimeofday) > + = get_vdso_mangle_symbol (HAVE_GETTIMEOFDAY_VSYSCALL); > +#endif > + > +#ifdef HAVE_GETCPU_VSYSCALL > + VDSO_SYMBOL(getcpu) = get_vdso_mangle_symbol (HAVE_GETCPU_VSYSCALL); > +#endif > + > +#ifdef HAVE_TIME_VSYSCALL > + VDSO_SYMBOL(time) = get_vdso_mangle_symbol (HAVE_TIME_VSYSCALL); > +#endif > + > +#ifdef VDSO_SETUP_ARCH > + VDSO_SETUP_ARCH (); > +#endif > +} > + > +#define VDSO_SETUP __libc_vdso_platform_setup > + > +#include <csu/init-first.c> > diff --git a/sysdeps/unix/sysv/linux/aarch64/libc-vdso.h b/sysdeps/unix/sysv/linux/libc-vdso.h > similarity index 70% > rename from sysdeps/unix/sysv/linux/aarch64/libc-vdso.h > rename to sysdeps/unix/sysv/linux/libc-vdso.h > index 3fcbaa9fce..f681868137 100644 > --- a/sysdeps/unix/sysv/linux/aarch64/libc-vdso.h > +++ b/sysdeps/unix/sysv/linux/libc-vdso.h > @@ -19,12 +19,22 @@ > #ifndef _LIBC_VDSO_H > #define _LIBC_VDSO_H > > -#include <sysdep.h> > -#include <sysdep-vdso.h> > +#define VDSO_SYMBOL(__name) __vdso_##__name > > -extern int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) > - attribute_hidden; > +#ifdef HAVE_CLOCK_GETTIME_VSYSCALL > extern int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); > +#endif > +#ifdef HAVE_CLOCK_GETRES_VSYSCALL > extern int (*VDSO_SYMBOL(clock_getres)) (clockid_t, struct timespec *); > +#endif > +#ifdef HAVE_GETTIMEOFDAY_VSYSCALL > +extern int (*VDSO_SYMBOL (gettimeofday)) (struct timeval *, void *); > +#endif > +#ifdef HAVE_GETCPU_VSYSCALL > +extern long int (*VDSO_SYMBOL(getcpu)) (unsigned *, unsigned *, void *); > +#endif > +#ifdef HAVE_TIME_VSYSCALL > +extern time_t (*VDSO_SYMBOL(time)) (time_t *); > +#endif > > #endif /* _LIBC_VDSO_H */ > diff --git a/sysdeps/unix/sysv/linux/mips/init-first.c b/sysdeps/unix/sysv/linux/mips/init-first.c > deleted file mode 100644 > index 2a43bdc8b0..0000000000 > --- a/sysdeps/unix/sysv/linux/mips/init-first.c > +++ /dev/null > @@ -1,40 +0,0 @@ > -/* Initialization code run first thing by the ELF startup code. > - Copyright (C) 2016-2019 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 <dl-vdso.h> > -#include <libc-vdso.h> > - > -int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) attribute_hidden; > -int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); > - > -static inline void > -_libc_vdso_platform_setup (void) > -{ > - void *p = get_vdso_symbol ("__vdso_gettimeofday"); > - PTR_MANGLE (p); > - VDSO_SYMBOL (gettimeofday) = p; > - > - p = get_vdso_symbol ("__vdso_clock_gettime"); > - PTR_MANGLE (p); > - VDSO_SYMBOL (clock_gettime) = p; > -} > - > -#define VDSO_SETUP _libc_vdso_platform_setup > - > -#include <csu/init-first.c> > diff --git a/sysdeps/unix/sysv/linux/mips/libc-vdso.h b/sysdeps/unix/sysv/linux/mips/libc-vdso.h > deleted file mode 100644 > index 344ea2d750..0000000000 > --- a/sysdeps/unix/sysv/linux/mips/libc-vdso.h > +++ /dev/null > @@ -1,29 +0,0 @@ > -/* VDSO function pointer declarations. > - Copyright (C) 2016-2019 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/>. */ > - > -#ifndef _LIBC_VDSO_H > -#define _LIBC_VDSO_H > - > -#include <sysdep-vdso.h> > - > -extern int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) > - attribute_hidden; > -extern int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); > - > -#endif /* _LIBC_VDSO_H */ > diff --git a/sysdeps/unix/sysv/linux/mips/sysdep.h b/sysdeps/unix/sysv/linux/mips/sysdep.h > index cabc590961..58a7244581 100644 > --- a/sysdeps/unix/sysv/linux/mips/sysdep.h > +++ b/sysdeps/unix/sysv/linux/mips/sysdep.h > @@ -20,5 +20,5 @@ > #define VDSO_HASH 61765110 > > /* List of system calls which are supported as vsyscalls. */ > -#define HAVE_CLOCK_GETTIME_VSYSCALL 1 > -#define HAVE_GETTIMEOFDAY_VSYSCALL 1 > +#define HAVE_CLOCK_GETTIME_VSYSCALL "__vdso_gettimeofday" > +#define HAVE_GETTIMEOFDAY_VSYSCALL "__vdso_clock_gettime" > diff --git a/sysdeps/unix/sysv/linux/powerpc/init-first.c b/sysdeps/unix/sysv/linux/powerpc/init-first.c > index 0d46563ce3..6e72d9ca84 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/init-first.c > +++ b/sysdeps/unix/sysv/linux/powerpc/init-first.c > @@ -19,47 +19,18 @@ > #include <dl-vdso.h> > #include <libc-vdso.h> > > -int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) > - attribute_hidden; > -int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); > -int (*VDSO_SYMBOL(clock_getres)) (clockid_t, struct timespec *); > -unsigned long long (*VDSO_SYMBOL(get_tbfreq)) (void); > -int (*VDSO_SYMBOL(getcpu)) (unsigned *, unsigned *); > -time_t (*VDSO_SYMBOL(time)) (time_t *); > - > +unsigned long long (*VDSO_SYMBOL(get_tbfreq)) (void) attribute_hidden; > #if defined(__PPC64__) || defined(__powerpc64__) > -void *VDSO_SYMBOL(sigtramp_rt64); > +void *VDSO_SYMBOL(sigtramp_rt64) attribute_hidden; > #else > -void *VDSO_SYMBOL(sigtramp32); > -void *VDSO_SYMBOL(sigtramp_rt32); > +void *VDSO_SYMBOL(sigtramp32) attribute_hidden; > +void *VDSO_SYMBOL(sigtramp_rt32) attribute_hidden; > #endif > > static inline void > -_libc_vdso_platform_setup (void) > +__libc_vdso_platform_setup_arch (void) > { > - void *p = get_vdso_symbol ("__kernel_gettimeofday"); > - PTR_MANGLE (p); > - VDSO_SYMBOL (gettimeofday) = p; > - > - p = get_vdso_symbol ("__kernel_clock_gettime"); > - PTR_MANGLE (p); > - VDSO_SYMBOL (clock_gettime) = p; > - > - p = get_vdso_symbol ("__kernel_clock_getres"); > - PTR_MANGLE (p); > - VDSO_SYMBOL (clock_getres) = p; > - > - p = get_vdso_symbol ("__kernel_get_tbfreq"); > - PTR_MANGLE (p); > - VDSO_SYMBOL (get_tbfreq) = p; > - > - p = get_vdso_symbol ("__kernel_getcpu"); > - PTR_MANGLE (p); > - VDSO_SYMBOL (getcpu) = p; > - > - p = get_vdso_symbol ("__kernel_time"); > - PTR_MANGLE (p); > - VDSO_SYMBOL (time) = p; > + VDSO_SYMBOL (get_tbfreq) = get_vdso_mangle_symbol (HAVE_GET_TBFREQ); > > /* PPC64 uses only one signal trampoline symbol, while PPC32 will use > two depending if SA_SIGINFO is used (__kernel_sigtramp_rt32) or not > @@ -67,13 +38,13 @@ _libc_vdso_platform_setup (void) > There is no need to pointer mangle these symbol because they will > used only for pointer comparison. */ > #if defined(__PPC64__) || defined(__powerpc64__) > - VDSO_SYMBOL(sigtramp_rt64) = get_vdso_symbol ("__kernel_sigtramp_rt64"); > + VDSO_SYMBOL(sigtramp_rt64) = get_vdso_symbol (HAVE_SIGTRAMP_RT64); > #else > - VDSO_SYMBOL(sigtramp32) = get_vdso_symbol ("__kernel_sigtramp32"); > - VDSO_SYMBOL(sigtramp_rt32) = get_vdso_symbol ("__kernel_sigtramp_rt32"); > + VDSO_SYMBOL(sigtramp32) = get_vdso_symbol (HAVE_SIGTRAMP_32); > + VDSO_SYMBOL(sigtramp_rt32) = get_vdso_symbol (HAVE_SIGTRAMP_RT32); > #endif > } > > -#define VDSO_SETUP _libc_vdso_platform_setup > +#define VDSO_SETUP_ARCH __libc_vdso_platform_setup_arch > > -#include <csu/init-first.c> > +#include <sysdeps/unix/sysv/linux/init-first.c> > diff --git a/sysdeps/unix/sysv/linux/powerpc/libc-vdso.h b/sysdeps/unix/sysv/linux/powerpc/libc-vdso.h > index f8184061c0..47e925493b 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/libc-vdso.h > +++ b/sysdeps/unix/sysv/linux/powerpc/libc-vdso.h > @@ -17,20 +17,14 @@ > <http://www.gnu.org/licenses/>. */ > > > -#ifndef _LIBC_VDSO_H > -#define _LIBC_VDSO_H > +#ifndef _LIBC_POWERPC_VDSO_H > +#define _LIBC_POWERPC_VDSO_H > > #include <sysdep.h> > #include <sysdep-vdso.h> > +#include_next <libc-vdso.h> > > -extern int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) > - attribute_hidden; > -extern int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); > -extern int (*VDSO_SYMBOL(clock_getres)) (clockid_t, struct timespec *); > extern unsigned long long (*VDSO_SYMBOL(get_tbfreq)) (void); > -extern int (*VDSO_SYMBOL(getcpu)) (unsigned *, unsigned *); > -extern time_t (*VDSO_SYMBOL(time)) (time_t *); > - > #if defined(__PPC64__) || defined(__powerpc64__) > extern void *VDSO_SYMBOL(sigtramp_rt64); > #else > diff --git a/sysdeps/unix/sysv/linux/powerpc/sysdep.h b/sysdeps/unix/sysv/linux/powerpc/sysdep.h > index 5b411d0e8e..20167615c8 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/sysdep.h > +++ b/sysdeps/unix/sysv/linux/powerpc/sysdep.h > @@ -20,7 +20,15 @@ > #define VDSO_HASH 123718565 > > /* List of system calls which are supported as vsyscalls. */ > -#define HAVE_CLOCK_GETRES_VSYSCALL 1 > -#define HAVE_CLOCK_GETTIME_VSYSCALL 1 > -#define HAVE_GETCPU_VSYSCALL 1 > +#define HAVE_CLOCK_GETRES_VSYSCALL "__kernel_clock_getres" > +#define HAVE_CLOCK_GETTIME_VSYSCALL "__kernel_clock_gettime" > +#define HAVE_GETCPU_VSYSCALL "__kernel_getcpu" > +#define HAVE_TIME_VSYSCALL "__kernel_time" > +#define HAVE_GET_TBFREQ "__kernel_get_tbfreq" > > +#if defined(__PPC64__) || defined(__powerpc64__) > +# define HAVE_SIGTRAMP_RT64 "__kernel_sigtramp_rt64" > +#else > +# define HAVE_SIGTRAMP_32 "__kernel_sigtramp32" > +# define HAVE_SIGTRAMP_RT32 "__kernel_sigtramp_rt32" > +#endif > diff --git a/sysdeps/unix/sysv/linux/riscv/init-first.c b/sysdeps/unix/sysv/linux/riscv/init-first.c > deleted file mode 100644 > index f3d243a192..0000000000 > --- a/sysdeps/unix/sysv/linux/riscv/init-first.c > +++ /dev/null > @@ -1,54 +0,0 @@ > -/* RISC-V VDSO initialization > - Copyright (C) 2017-2019 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 <dl-vdso.h> > -#include <libc-vdso.h> > - > -long int (*VDSO_SYMBOL (getcpu)) (unsigned int *, unsigned int *, void *) > - attribute_hidden; > -long int (*VDSO_SYMBOL (gettimeofday)) (struct timeval *, void *) > - attribute_hidden; > -long int (*VDSO_SYMBOL (clock_gettime)) (clockid_t, struct timespec *) > - attribute_hidden; > -long int (*VDSO_SYMBOL (clock_getres)) (clockid_t, struct timespec *) > - attribute_hidden; > - > -static inline void > -_libc_vdso_platform_setup (void) > -{ > - void *p = get_vdso_symbol ("__vdso_getcpu"); > - PTR_MANGLE (p); > - VDSO_SYMBOL (getcpu) = p; > - > - p = get_vdso_symbol ("__vdso_gettimeofday"); > - PTR_MANGLE (p); > - VDSO_SYMBOL (gettimeofday) = p; > - > - p = get_vdso_symbol ("__vdso_clock_gettime"); > - PTR_MANGLE (p); > - VDSO_SYMBOL (clock_gettime) = p; > - > - p = get_vdso_symbol ("__vdso_clock_getres"); > - PTR_MANGLE (p); > - VDSO_SYMBOL (clock_getres) = p; > -} > - > -#define VDSO_SETUP _libc_vdso_platform_setup > - > -#include <csu/init-first.c> > diff --git a/sysdeps/unix/sysv/linux/riscv/libc-vdso.h b/sysdeps/unix/sysv/linux/riscv/libc-vdso.h > deleted file mode 100644 > index 2373292ab9..0000000000 > --- a/sysdeps/unix/sysv/linux/riscv/libc-vdso.h > +++ /dev/null > @@ -1,34 +0,0 @@ > -/* RISC-V VDSO function declarations > - Copyright (C) 2017-2019 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/>. */ > - > -#ifndef _LIBC_VDSO_H > -#define _LIBC_VDSO_H > - > -#include <sysdep-vdso.h> > - > -extern long int (*VDSO_SYMBOL (getcpu)) (unsigned int *, unsigned int *, void *) > - attribute_hidden; > -extern long int (*VDSO_SYMBOL (gettimeofday)) (struct timeval *, void *) > - attribute_hidden; > -extern long int (*VDSO_SYMBOL (clock_gettime)) (clockid_t, struct timespec *) > - attribute_hidden; > -extern long int (*VDSO_SYMBOL (clock_getres)) (clockid_t, struct timespec *) > - attribute_hidden; > - > -#endif /* _LIBC_VDSO_H */ > diff --git a/sysdeps/unix/sysv/linux/riscv/sysdep.h b/sysdeps/unix/sysv/linux/riscv/sysdep.h > index 5de773744c..22835aa12f 100644 > --- a/sysdeps/unix/sysv/linux/riscv/sysdep.h > +++ b/sysdeps/unix/sysv/linux/riscv/sysdep.h > @@ -125,10 +125,10 @@ > # define VDSO_HASH 182943605 > > /* List of system calls which are supported as vsyscalls. */ > -# define HAVE_CLOCK_GETRES_VSYSCALL 1 > -# define HAVE_CLOCK_GETTIME_VSYSCALL 1 > -# define HAVE_GETTIMEOFDAY_VSYSCALL 1 > -# define HAVE_GETCPU_VSYSCALL 1 > +# define HAVE_CLOCK_GETRES_VSYSCALL "__vdso_clock_getres" > +# define HAVE_CLOCK_GETTIME_VSYSCALL "__vdso_clock_gettime" > +# define HAVE_GETTIMEOFDAY_VSYSCALL "__vdso_gettimeofday" > +# define HAVE_GETCPU_VSYSCALL "__vdso_getcpu" > > /* Define a macro which expands into the inline wrapper code for a system > call. */ > diff --git a/sysdeps/unix/sysv/linux/s390/init-first.c b/sysdeps/unix/sysv/linux/s390/init-first.c > deleted file mode 100644 > index 3e36270eac..0000000000 > --- a/sysdeps/unix/sysv/linux/s390/init-first.c > +++ /dev/null > @@ -1,56 +0,0 @@ > -/* Initialization code run first thing by the ELF startup code. Linux/s390. > - Copyright (C) 2008-2019 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 <dl-vdso.h> > -#include <libc-vdso.h> > - > -long int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) > - attribute_hidden; > - > -long int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *) > - __attribute__ ((nocommon)); > - > -long int (*VDSO_SYMBOL(clock_getres)) (clockid_t, struct timespec *) > - __attribute__ ((nocommon)); > - > -long int (*VDSO_SYMBOL(getcpu)) (unsigned *, unsigned *, void *) > - attribute_hidden; > - > -static inline void > -_libc_vdso_platform_setup (void) > -{ > - void *p = get_vdso_symbol ("__kernel_gettimeofday"); > - PTR_MANGLE (p); > - VDSO_SYMBOL (gettimeofday) = p; > - > - p = get_vdso_symbol ("__kernel_clock_gettime"); > - PTR_MANGLE (p); > - VDSO_SYMBOL (clock_gettime) = p; > - > - p = get_vdso_symbol ("__kernel_clock_getres"); > - PTR_MANGLE (p); > - VDSO_SYMBOL (clock_getres) = p; > - > - p = get_vdso_symbol ("__kernel_getcpu"); > - PTR_MANGLE (p); > - VDSO_SYMBOL (getcpu) = p; > -} > - > -#define VDSO_SETUP _libc_vdso_platform_setup > - > -#include <csu/init-first.c> > diff --git a/sysdeps/unix/sysv/linux/s390/libc-vdso.h b/sysdeps/unix/sysv/linux/s390/libc-vdso.h > deleted file mode 100644 > index cc97601383..0000000000 > --- a/sysdeps/unix/sysv/linux/s390/libc-vdso.h > +++ /dev/null > @@ -1,35 +0,0 @@ > -/* Resolve function pointers to VDSO functions. > - Copyright (C) 2008-2019 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/>. */ > - > - > -#ifndef _LIBC_VDSO_H > -#define _LIBC_VDSO_H > - > -#include <sysdep-vdso.h> > - > -extern long int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) > - attribute_hidden; > - > -extern long int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); > - > -extern long int (*VDSO_SYMBOL(clock_getres)) (clockid_t, struct timespec *); > - > -extern long int (*VDSO_SYMBOL(getcpu)) (unsigned *, unsigned *, void *) > - attribute_hidden; > - > -#endif /* _LIBC_VDSO_H */ > diff --git a/sysdeps/unix/sysv/linux/s390/sysdep.h b/sysdeps/unix/sysv/linux/s390/sysdep.h > index eefbd8f007..386efb1896 100644 > --- a/sysdeps/unix/sysv/linux/s390/sysdep.h > +++ b/sysdeps/unix/sysv/linux/s390/sysdep.h > @@ -20,8 +20,8 @@ > #define VDSO_HASH 123718585 > > /* List of system calls which are supported as vsyscalls. */ > -#define HAVE_CLOCK_GETRES_VSYSCALL 1 > -#define HAVE_CLOCK_GETTIME_VSYSCALL 1 > -#define HAVE_GETTIMEOFDAY_VSYSCALL 1 > -#define HAVE_GETCPU_VSYSCALL 1 > +#define HAVE_CLOCK_GETRES_VSYSCALL "__kernel_clock_getres" > +#define HAVE_CLOCK_GETTIME_VSYSCALL "__kernel_clock_gettime" > +#define HAVE_GETTIMEOFDAY_VSYSCALL "__kernel_gettimeofday" > +#define HAVE_GETCPU_VSYSCALL "__kernel_getcpu" > > diff --git a/sysdeps/unix/sysv/linux/sparc/init-first.c b/sysdeps/unix/sysv/linux/sparc/init-first.c > deleted file mode 100644 > index bdaa78fd32..0000000000 > --- a/sysdeps/unix/sysv/linux/sparc/init-first.c > +++ /dev/null > @@ -1,42 +0,0 @@ > -/* SPARC VDSO initialization > - Copyright (C) 2018-2019 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 <dl-vdso.h> > -#include <libc-vdso.h> > - > -long int (*VDSO_SYMBOL (gettimeofday)) (struct timeval *, void *) > - attribute_hidden; > -long int (*VDSO_SYMBOL (clock_gettime)) (clockid_t, struct timespec *) > - attribute_hidden; > - > -static inline void > -_libc_vdso_platform_setup (void) > -{ > - void *p = get_vdso_symbol ("__vdso_gettimeofday"); > - PTR_MANGLE (p); > - VDSO_SYMBOL (gettimeofday) = p; > - > - p = get_vdso_symbol ("__vdso_clock_gettime"); > - PTR_MANGLE (p); > - VDSO_SYMBOL (clock_gettime) = p; > -} > - > -#define VDSO_SETUP _libc_vdso_platform_setup > - > -#include <csu/init-first.c> > diff --git a/sysdeps/unix/sysv/linux/sparc/libc-vdso.h b/sysdeps/unix/sysv/linux/sparc/libc-vdso.h > deleted file mode 100644 > index d20afcdf04..0000000000 > --- a/sysdeps/unix/sysv/linux/sparc/libc-vdso.h > +++ /dev/null > @@ -1,29 +0,0 @@ > -/* VDSO function pointer declarations. > - Copyright (C) 2018-2019 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/>. */ > - > -#ifndef _LIBC_VDSO_H > -#define _LIBC_VDSO_H > - > -#include <sysdep-vdso.h> > - > -extern long int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) > - attribute_hidden; > -extern long int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); > - > -#endif /* _LIBC_VDSO_H */ > diff --git a/sysdeps/unix/sysv/linux/sparc/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sysdep.h > index 3bfb1fc60e..925b57082d 100644 > --- a/sysdeps/unix/sysv/linux/sparc/sysdep.h > +++ b/sysdeps/unix/sysv/linux/sparc/sysdep.h > @@ -45,8 +45,8 @@ > # define VDSO_HASH 61765110 > > /* List of system calls which are supported as vsyscalls. */ > -# define HAVE_CLOCK_GETTIME_VSYSCALL 1 > -# define HAVE_GETTIMEOFDAY_VSYSCALL 1 > +# define HAVE_CLOCK_GETTIME_VSYSCALL "__vdso_clock_gettime" > +# define HAVE_GETTIMEOFDAY_VSYSCALL "__vdso_gettimeofday" > > #undef INLINE_SYSCALL > #define INLINE_SYSCALL(name, nr, args...) \ > diff --git a/sysdeps/unix/sysv/linux/sysdep-vdso.h b/sysdeps/unix/sysv/linux/sysdep-vdso.h > index 5fec208380..3da5417fff 100644 > --- a/sysdeps/unix/sysv/linux/sysdep-vdso.h > +++ b/sysdeps/unix/sysv/linux/sysdep-vdso.h > @@ -19,7 +19,7 @@ > #ifndef SYSDEP_VDSO_LINUX_H > # define SYSDEP_VDSO_LINUX_H > > -#define VDSO_SYMBOL(__name) __vdso_##__name > +#include <dl-vdso.h> > > #ifndef INTERNAL_VSYSCALL_CALL > # define INTERNAL_VSYSCALL_CALL(funcptr, err, nr, args...) \ > diff --git a/sysdeps/unix/sysv/linux/x86/libc-vdso.h b/sysdeps/unix/sysv/linux/x86/libc-vdso.h > deleted file mode 100644 > index c9aa1c8a72..0000000000 > --- a/sysdeps/unix/sysv/linux/x86/libc-vdso.h > +++ /dev/null > @@ -1,33 +0,0 @@ > -/* Resolve function pointers to VDSO functions. > - Copyright (C) 2005-2019 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/>. */ > - > -#ifndef _LIBC_VDSO_H > -#define _LIBC_VDSO_H > - > -#include <time.h> > -#include <sys/time.h> > - > -#include <sysdep-vdso.h> > - > -extern long int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *) > - attribute_hidden; > - > -extern long int (*VDSO_SYMBOL(getcpu)) (unsigned *, unsigned *, void *) > - attribute_hidden; > - > -#endif /* _LIBC_VDSO_H */ > diff --git a/sysdeps/unix/sysv/linux/x86_64/init-first.c b/sysdeps/unix/sysv/linux/x86_64/init-first.c > deleted file mode 100644 > index aede1c858d..0000000000 > --- a/sysdeps/unix/sysv/linux/x86_64/init-first.c > +++ /dev/null > @@ -1,48 +0,0 @@ > -/* Initialization code run first thing by the ELF startup code. Linux/x86-64. > - Copyright (C) 2007-2019 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 <time.h> > -#include <sysdep.h> > -#include <dl-vdso.h> > -#include <libc-vdso.h> > - > -long int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *) > - attribute_hidden; > -long int (*VDSO_SYMBOL(getcpu)) (unsigned *, unsigned *, void *) > - attribute_hidden; > - > -extern __typeof (clock_gettime) __syscall_clock_gettime attribute_hidden; > - > - > -static inline void > -__vdso_platform_setup (void) > -{ > - void *p = get_vdso_symbol ("__vdso_clock_gettime"); > - if (p == NULL) > - p = __syscall_clock_gettime; > - PTR_MANGLE (p); > - VDSO_SYMBOL(clock_gettime) = p; > - > - p = get_vdso_symbol ("__vdso_getcpu"); > - PTR_MANGLE (p); > - VDSO_SYMBOL(getcpu) = p; > -} > - > -#define VDSO_SETUP __vdso_platform_setup > - > -#include <csu/init-first.c> > diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep.h b/sysdeps/unix/sysv/linux/x86_64/sysdep.h > index 197329f4dc..4541c0d492 100644 > --- a/sysdeps/unix/sysv/linux/x86_64/sysdep.h > +++ b/sysdeps/unix/sysv/linux/x86_64/sysdep.h > @@ -374,9 +374,9 @@ > # define VDSO_HASH 61765110 > > /* List of system calls which are supported as vsyscalls. */ > -# define HAVE_CLOCK_GETTIME_VSYSCALL 1 > -# define HAVE_GETTIMEOFDAY_VSYSCALL 1 > -# define HAVE_GETCPU_VSYSCALL 1 > +# define HAVE_CLOCK_GETTIME_VSYSCALL "__vdso_clock_gettime" > +# define HAVE_GETTIMEOFDAY_VSYSCALL "__vdso_gettimeofday" > +# define HAVE_GETCPU_VSYSCALL "__vdso_getcpu" > > # define SINGLE_THREAD_BY_GLOBAL 1 > >
* Andreas Schwab: > * sysdeps/unix/sysv/linux/arm/sysdep.h > (HAVE_CLOCK_GETTIME_VSYSCALL): Define to "__vdso_clock_gettime", > not "__vdso_gettimeofday". > (HAVE_GETTIMEOFDAY_VSYSCALL): Define to "__vdso_gettimeofday", not > "__vdso_clock_gettime". > * sysdeps/unix/sysv/linux/mips/sysdep.h > (HAVE_CLOCK_GETTIME_VSYSCALL): Define to "__vdso_clock_gettime", > not "__vdso_gettimeofday". > (HAVE_GETTIMEOFDAY_VSYSCALL): Define to "__vdso_gettimeofday", not > "__vdso_clock_gettime". It would be nice if you could note in the commit message the commit that is fixed by this change.
Thanks to check on this and sorry for the trouble. > Il giorno 24 set 2019, alle ore 04:41, Andreas Schwab <schwab@suse.de> ha scritto: > > * sysdeps/unix/sysv/linux/arm/sysdep.h > (HAVE_CLOCK_GETTIME_VSYSCALL): Define to "__vdso_clock_gettime", > not "__vdso_gettimeofday". > (HAVE_GETTIMEOFDAY_VSYSCALL): Define to "__vdso_gettimeofday", not > "__vdso_clock_gettime". > * sysdeps/unix/sysv/linux/mips/sysdep.h > (HAVE_CLOCK_GETTIME_VSYSCALL): Define to "__vdso_clock_gettime", > not "__vdso_gettimeofday". > (HAVE_GETTIMEOFDAY_VSYSCALL): Define to "__vdso_gettimeofday", not > "__vdso_clock_gettime". > > diff --git a/sysdeps/unix/sysv/linux/arm/sysdep.h b/sysdeps/unix/sysv/linux/arm/sysdep.h > index f9cc9335f5..e9e022e037 100644 > --- a/sysdeps/unix/sysv/linux/arm/sysdep.h > +++ b/sysdeps/unix/sysv/linux/arm/sysdep.h > @@ -392,8 +392,8 @@ __local_syscall_error: \ > #define VDSO_HASH 61765110 > > /* List of system calls which are supported as vsyscalls. */ > -#define HAVE_CLOCK_GETTIME_VSYSCALL "__vdso_gettimeofday" > -#define HAVE_GETTIMEOFDAY_VSYSCALL "__vdso_clock_gettime" > +#define HAVE_CLOCK_GETTIME_VSYSCALL "__vdso_clock_gettime" > +#define HAVE_GETTIMEOFDAY_VSYSCALL "__vdso_gettimeofday" > > #define LOAD_ARGS_0() > #define ASM_ARGS_0 > diff --git a/sysdeps/unix/sysv/linux/mips/sysdep.h b/sysdeps/unix/sysv/linux/mips/sysdep.h > index b2045fcc55..82a3cf9f3d 100644 > --- a/sysdeps/unix/sysv/linux/mips/sysdep.h > +++ b/sysdeps/unix/sysv/linux/mips/sysdep.h > @@ -20,8 +20,8 @@ > #define VDSO_HASH 61765110 > > /* List of system calls which are supported as vsyscalls. */ > -#define HAVE_CLOCK_GETTIME_VSYSCALL "__vdso_gettimeofday" > -#define HAVE_GETTIMEOFDAY_VSYSCALL "__vdso_clock_gettime" > +#define HAVE_CLOCK_GETTIME_VSYSCALL "__vdso_clock_gettime" > +#define HAVE_GETTIMEOFDAY_VSYSCALL "__vdso_gettimeofday" > > #ifndef __ASSEMBLER__ > > -- > 2.23.0 > > -- > Andreas Schwab, SUSE Labs, schwab@suse.de > GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7 > "And now for something completely different."
diff --git a/sysdeps/powerpc/powerpc32/backtrace.c b/sysdeps/powerpc/powerpc32/backtrace.c index 857a8aad7b..2978632017 100644 --- a/sysdeps/powerpc/powerpc32/backtrace.c +++ b/sysdeps/powerpc/powerpc32/backtrace.c @@ -54,7 +54,7 @@ struct signal_frame_32 { static inline int is_sigtramp_address (void *nip) { -#ifdef SHARED +#ifdef HAVE_SIGTRAMP_RT32 if (nip == VDSO_SYMBOL (sigtramp32)) return 1; #endif @@ -71,7 +71,7 @@ struct rt_signal_frame_32 { static inline int is_sigtramp_address_rt (void * nip) { -#ifdef SHARED +#ifdef HAVE_SIGTRAMP_32 if (nip == VDSO_SYMBOL (sigtramp_rt32)) return 1; #endif diff --git a/sysdeps/powerpc/powerpc64/backtrace.c b/sysdeps/powerpc/powerpc64/backtrace.c index 7a167838d9..0fa7e9c403 100644 --- a/sysdeps/powerpc/powerpc64/backtrace.c +++ b/sysdeps/powerpc/powerpc64/backtrace.c @@ -57,7 +57,7 @@ struct signal_frame_64 { static inline int is_sigtramp_address (void *nip) { -#ifdef SHARED +#ifdef HAVE_SIGTRAMP_RT64 if (nip == VDSO_SYMBOL (sigtramp_rt64)) return 1; #endif diff --git a/sysdeps/unix/sysv/linux/aarch64/init-first.c b/sysdeps/unix/sysv/linux/aarch64/init-first.c deleted file mode 100644 index c3c27cfd4b..0000000000 --- a/sysdeps/unix/sysv/linux/aarch64/init-first.c +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (C) 2007-2019 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 <dl-vdso.h> -#include <libc-vdso.h> - -int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) attribute_hidden; -int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); -int (*VDSO_SYMBOL(clock_getres)) (clockid_t, struct timespec *); - -static inline void -_libc_vdso_platform_setup (void) -{ - void *p = get_vdso_symbol ("__kernel_gettimeofday"); - PTR_MANGLE (p); - VDSO_SYMBOL(gettimeofday) = p; - - p = get_vdso_symbol ("__kernel_clock_gettime"); - PTR_MANGLE (p); - VDSO_SYMBOL(clock_gettime) = p; - - p = get_vdso_symbol ("__kernel_clock_getres"); - PTR_MANGLE (p); - VDSO_SYMBOL(clock_getres) = p; -} - -#define VDSO_SETUP _libc_vdso_platform_setup - -#include <csu/init-first.c> diff --git a/sysdeps/unix/sysv/linux/aarch64/sysdep.h b/sysdeps/unix/sysv/linux/aarch64/sysdep.h index 662d321235..d57f7232e2 100644 --- a/sysdeps/unix/sysv/linux/aarch64/sysdep.h +++ b/sysdeps/unix/sysv/linux/aarch64/sysdep.h @@ -160,9 +160,9 @@ # endif /* List of system calls which are supported as vsyscalls. */ -# define HAVE_CLOCK_GETRES_VSYSCALL 1 -# define HAVE_CLOCK_GETTIME_VSYSCALL 1 -# define HAVE_GETTIMEOFDAY_VSYSCALL 1 +# define HAVE_CLOCK_GETRES_VSYSCALL "__kernel_clock_getres" +# define HAVE_CLOCK_GETTIME_VSYSCALL "__kernel_clock_gettime" +# define HAVE_GETTIMEOFDAY_VSYSCALL "__kernel_gettimeofday" /* Previously AArch64 used the generic version without the libc_hidden_def which lead in a non existent __send symbol in libc.so. */ diff --git a/sysdeps/unix/sysv/linux/arm/init-first.c b/sysdeps/unix/sysv/linux/arm/init-first.c deleted file mode 100644 index 2852ab135c..0000000000 --- a/sysdeps/unix/sysv/linux/arm/init-first.c +++ /dev/null @@ -1,41 +0,0 @@ -/* Initialization code run first thing by the ELF startup code. Linux/ARM. - Copyright (C) 2015-2019 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 <dl-vdso.h> -#include <libc-vdso.h> -#include <sysdep-vdso.h> - -int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) attribute_hidden; -int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); - -static inline void -_libc_vdso_platform_setup (void) -{ - void *p = get_vdso_symbol ("__vdso_gettimeofday"); - PTR_MANGLE (p); - VDSO_SYMBOL (gettimeofday) = p; - - p = get_vdso_symbol ("__vdso_clock_gettime"); - PTR_MANGLE (p); - VDSO_SYMBOL (clock_gettime) = p; -} - -#define VDSO_SETUP _libc_vdso_platform_setup - -#include <csu/init-first.c> diff --git a/sysdeps/unix/sysv/linux/arm/libc-vdso.h b/sysdeps/unix/sysv/linux/arm/libc-vdso.h deleted file mode 100644 index 8702165c6b..0000000000 --- a/sysdeps/unix/sysv/linux/arm/libc-vdso.h +++ /dev/null @@ -1,29 +0,0 @@ -/* VDSO function pointer declarations. Linux/ARM. - Copyright (C) 2015-2019 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/>. */ - -#ifndef _LIBC_VDSO_H -#define _LIBC_VDSO_H - -#include <sysdep-vdso.h> - -extern int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) - attribute_hidden; -extern int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); - -#endif /* _LIBC_VDSO_H */ diff --git a/sysdeps/unix/sysv/linux/arm/sysdep.h b/sysdeps/unix/sysv/linux/arm/sysdep.h index 467ccf2631..634aa2bc6b 100644 --- a/sysdeps/unix/sysv/linux/arm/sysdep.h +++ b/sysdeps/unix/sysv/linux/arm/sysdep.h @@ -392,8 +392,8 @@ __local_syscall_error: \ #define VDSO_HASH 61765110 /* List of system calls which are supported as vsyscalls. */ -#define HAVE_CLOCK_GETTIME_VSYSCALL 1 -#define HAVE_GETTIMEOFDAY_VSYSCALL 1 +#define HAVE_CLOCK_GETTIME_VSYSCALL "__vdso_gettimeofday" +#define HAVE_GETTIMEOFDAY_VSYSCALL "__vdso_clock_gettime" #define LOAD_ARGS_0() #define ASM_ARGS_0 diff --git a/sysdeps/unix/sysv/linux/dl-vdso.h b/sysdeps/unix/sysv/linux/dl-vdso.h index bab3779615..dcf065ef23 100644 --- a/sysdeps/unix/sysv/linux/dl-vdso.h +++ b/sysdeps/unix/sysv/linux/dl-vdso.h @@ -19,16 +19,25 @@ #ifndef _DL_VDSO_H #define _DL_VDSO_H 1 -#include <assert.h> #include <ldsodefs.h> #include <dl-hash.h> -#include <libc-vdso.h> /* Functions for resolving symbols in the VDSO link map. */ extern void *_dl_vdso_vsym (const char *name, const struct r_found_version *version) attribute_hidden; +/* If the architecture support vDSO it should define which is the expected + kernel version and hash value through both VDSO_NAME and VDSO_HASH + (usually defined at architecture sysdep.h). */ + +#ifndef VDSO_NAME +# define VDSO_NAME "LINUX_0.0" +#endif +#ifndef VDSO_HASH +# define VDSO_HASH 0 +#endif + static inline void * get_vdso_symbol (const char *symbol) { @@ -36,4 +45,12 @@ get_vdso_symbol (const char *symbol) return _dl_vdso_vsym (symbol, &rfv); } +static inline void * +get_vdso_mangle_symbol (const char *symbol) +{ + void *vdsop = get_vdso_symbol (symbol); + PTR_MANGLE (vdsop); + return vdsop; +} + #endif /* dl-vdso.h */ diff --git a/sysdeps/unix/sysv/linux/i386/init-first.c b/sysdeps/unix/sysv/linux/i386/init-first.c deleted file mode 100644 index 9c03f87b67..0000000000 --- a/sysdeps/unix/sysv/linux/i386/init-first.c +++ /dev/null @@ -1,46 +0,0 @@ -/* Initialization code run first thing by the ELF startup code. Linux/i386. - Copyright (C) 2015-2019 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 <time.h> -#include <sysdep.h> -#include <dl-vdso.h> -#include <sysdep-vdso.h> - -long int (*VDSO_SYMBOL (clock_gettime)) (clockid_t, struct timespec *) - attribute_hidden; - -static long int -clock_gettime_syscall (clockid_t id, struct timespec *tp) -{ - INTERNAL_SYSCALL_DECL (err); - return INTERNAL_SYSCALL (clock_gettime, err, 2, id, tp); -} - -static inline void -__vdso_platform_setup (void) -{ - void *p = get_vdso_symbol ("__vdso_clock_gettime"); - if (p == NULL) - p = clock_gettime_syscall; - PTR_MANGLE (p); - VDSO_SYMBOL (clock_gettime) = p; -} - -#define VDSO_SETUP __vdso_platform_setup - -#include <csu/init-first.c> diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.h b/sysdeps/unix/sysv/linux/i386/sysdep.h index 278028f52e..e793fdc936 100644 --- a/sysdeps/unix/sysv/linux/i386/sysdep.h +++ b/sysdeps/unix/sysv/linux/i386/sysdep.h @@ -313,8 +313,8 @@ struct libc_do_syscall_args # define VDSO_HASH 61765110 /* List of system calls which are supported as vsyscalls. */ -# define HAVE_CLOCK_GETTIME_VSYSCALL 1 -# define HAVE_GETTIMEOFDAY_VSYSCALL 1 +# define HAVE_CLOCK_GETTIME_VSYSCALL "__vdso_clock_gettime" +# define HAVE_GETTIMEOFDAY_VSYSCALL "__vdso_gettimeofday" /* Define a macro which expands inline into the wrapper code for a system call. This use is for internal calls that do not need to handle errors diff --git a/sysdeps/unix/sysv/linux/init-first.c b/sysdeps/unix/sysv/linux/init-first.c new file mode 100644 index 0000000000..d90ca820be --- /dev/null +++ b/sysdeps/unix/sysv/linux/init-first.c @@ -0,0 +1,80 @@ +/* vDSO internal symbols. Linux generic version. + Copyright (C) 2019 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 <dl-vdso.h> +#include <libc-vdso.h> + +/* vDSO symbol used on clock_gettime implementation. */ +#ifdef HAVE_CLOCK_GETTIME_VSYSCALL +int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *) + attribute_hidden; +#endif +/* vDSO symbol used on clock_getres implementation. */ +#ifdef HAVE_CLOCK_GETRES_VSYSCALL +int (*VDSO_SYMBOL(clock_getres)) (clockid_t, struct timespec *) + attribute_hidden; +#endif +/* vDSO symbol used on gettimeofday implementation. */ +#ifdef HAVE_GETTIMEOFDAY_VSYSCALL +int (*VDSO_SYMBOL (gettimeofday)) (struct timeval *, void *) + attribute_hidden; +#endif +/* vDSO symbol used on GNU extension getcpu implementation. */ +#ifdef HAVE_GETCPU_VSYSCALL +long int (*VDSO_SYMBOL(getcpu)) (unsigned *, unsigned *, void *) + attribute_hidden; +#endif +/* vDSO symbol used on time implementation. */ +#ifdef HAVE_TIME_VSYSCALL +time_t (*VDSO_SYMBOL(time)) (time_t *) attribute_hidden; +#endif + +static inline void +__libc_vdso_platform_setup (void) +{ +#ifdef HAVE_CLOCK_GETTIME_VSYSCALL + VDSO_SYMBOL(clock_gettime) + = get_vdso_mangle_symbol (HAVE_CLOCK_GETTIME_VSYSCALL); +#endif + +#ifdef HAVE_CLOCK_GETRES_VSYSCALL + VDSO_SYMBOL(clock_getres) + = get_vdso_mangle_symbol (HAVE_CLOCK_GETRES_VSYSCALL); +#endif + +#ifdef HAVE_GETTIMEOFDAY_VSYSCALL + VDSO_SYMBOL(gettimeofday) + = get_vdso_mangle_symbol (HAVE_GETTIMEOFDAY_VSYSCALL); +#endif + +#ifdef HAVE_GETCPU_VSYSCALL + VDSO_SYMBOL(getcpu) = get_vdso_mangle_symbol (HAVE_GETCPU_VSYSCALL); +#endif + +#ifdef HAVE_TIME_VSYSCALL + VDSO_SYMBOL(time) = get_vdso_mangle_symbol (HAVE_TIME_VSYSCALL); +#endif + +#ifdef VDSO_SETUP_ARCH + VDSO_SETUP_ARCH (); +#endif +} + +#define VDSO_SETUP __libc_vdso_platform_setup + +#include <csu/init-first.c> diff --git a/sysdeps/unix/sysv/linux/aarch64/libc-vdso.h b/sysdeps/unix/sysv/linux/libc-vdso.h similarity index 70% rename from sysdeps/unix/sysv/linux/aarch64/libc-vdso.h rename to sysdeps/unix/sysv/linux/libc-vdso.h index 3fcbaa9fce..f681868137 100644 --- a/sysdeps/unix/sysv/linux/aarch64/libc-vdso.h +++ b/sysdeps/unix/sysv/linux/libc-vdso.h @@ -19,12 +19,22 @@ #ifndef _LIBC_VDSO_H #define _LIBC_VDSO_H -#include <sysdep.h> -#include <sysdep-vdso.h> +#define VDSO_SYMBOL(__name) __vdso_##__name -extern int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) - attribute_hidden; +#ifdef HAVE_CLOCK_GETTIME_VSYSCALL extern int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); +#endif +#ifdef HAVE_CLOCK_GETRES_VSYSCALL extern int (*VDSO_SYMBOL(clock_getres)) (clockid_t, struct timespec *); +#endif +#ifdef HAVE_GETTIMEOFDAY_VSYSCALL +extern int (*VDSO_SYMBOL (gettimeofday)) (struct timeval *, void *); +#endif +#ifdef HAVE_GETCPU_VSYSCALL +extern long int (*VDSO_SYMBOL(getcpu)) (unsigned *, unsigned *, void *); +#endif +#ifdef HAVE_TIME_VSYSCALL +extern time_t (*VDSO_SYMBOL(time)) (time_t *); +#endif #endif /* _LIBC_VDSO_H */ diff --git a/sysdeps/unix/sysv/linux/mips/init-first.c b/sysdeps/unix/sysv/linux/mips/init-first.c deleted file mode 100644 index 2a43bdc8b0..0000000000 --- a/sysdeps/unix/sysv/linux/mips/init-first.c +++ /dev/null @@ -1,40 +0,0 @@ -/* Initialization code run first thing by the ELF startup code. - Copyright (C) 2016-2019 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 <dl-vdso.h> -#include <libc-vdso.h> - -int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) attribute_hidden; -int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); - -static inline void -_libc_vdso_platform_setup (void) -{ - void *p = get_vdso_symbol ("__vdso_gettimeofday"); - PTR_MANGLE (p); - VDSO_SYMBOL (gettimeofday) = p; - - p = get_vdso_symbol ("__vdso_clock_gettime"); - PTR_MANGLE (p); - VDSO_SYMBOL (clock_gettime) = p; -} - -#define VDSO_SETUP _libc_vdso_platform_setup - -#include <csu/init-first.c> diff --git a/sysdeps/unix/sysv/linux/mips/libc-vdso.h b/sysdeps/unix/sysv/linux/mips/libc-vdso.h deleted file mode 100644 index 344ea2d750..0000000000 --- a/sysdeps/unix/sysv/linux/mips/libc-vdso.h +++ /dev/null @@ -1,29 +0,0 @@ -/* VDSO function pointer declarations. - Copyright (C) 2016-2019 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/>. */ - -#ifndef _LIBC_VDSO_H -#define _LIBC_VDSO_H - -#include <sysdep-vdso.h> - -extern int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) - attribute_hidden; -extern int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); - -#endif /* _LIBC_VDSO_H */ diff --git a/sysdeps/unix/sysv/linux/mips/sysdep.h b/sysdeps/unix/sysv/linux/mips/sysdep.h index cabc590961..58a7244581 100644 --- a/sysdeps/unix/sysv/linux/mips/sysdep.h +++ b/sysdeps/unix/sysv/linux/mips/sysdep.h @@ -20,5 +20,5 @@ #define VDSO_HASH 61765110 /* List of system calls which are supported as vsyscalls. */ -#define HAVE_CLOCK_GETTIME_VSYSCALL 1 -#define HAVE_GETTIMEOFDAY_VSYSCALL 1 +#define HAVE_CLOCK_GETTIME_VSYSCALL "__vdso_gettimeofday" +#define HAVE_GETTIMEOFDAY_VSYSCALL "__vdso_clock_gettime" diff --git a/sysdeps/unix/sysv/linux/powerpc/init-first.c b/sysdeps/unix/sysv/linux/powerpc/init-first.c index 0d46563ce3..6e72d9ca84 100644 --- a/sysdeps/unix/sysv/linux/powerpc/init-first.c +++ b/sysdeps/unix/sysv/linux/powerpc/init-first.c @@ -19,47 +19,18 @@ #include <dl-vdso.h> #include <libc-vdso.h> -int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) - attribute_hidden; -int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); -int (*VDSO_SYMBOL(clock_getres)) (clockid_t, struct timespec *); -unsigned long long (*VDSO_SYMBOL(get_tbfreq)) (void); -int (*VDSO_SYMBOL(getcpu)) (unsigned *, unsigned *); -time_t (*VDSO_SYMBOL(time)) (time_t *); - +unsigned long long (*VDSO_SYMBOL(get_tbfreq)) (void) attribute_hidden; #if defined(__PPC64__) || defined(__powerpc64__) -void *VDSO_SYMBOL(sigtramp_rt64); +void *VDSO_SYMBOL(sigtramp_rt64) attribute_hidden; #else -void *VDSO_SYMBOL(sigtramp32); -void *VDSO_SYMBOL(sigtramp_rt32); +void *VDSO_SYMBOL(sigtramp32) attribute_hidden; +void *VDSO_SYMBOL(sigtramp_rt32) attribute_hidden; #endif static inline void -_libc_vdso_platform_setup (void) +__libc_vdso_platform_setup_arch (void) { - void *p = get_vdso_symbol ("__kernel_gettimeofday"); - PTR_MANGLE (p); - VDSO_SYMBOL (gettimeofday) = p; - - p = get_vdso_symbol ("__kernel_clock_gettime"); - PTR_MANGLE (p); - VDSO_SYMBOL (clock_gettime) = p; - - p = get_vdso_symbol ("__kernel_clock_getres"); - PTR_MANGLE (p); - VDSO_SYMBOL (clock_getres) = p; - - p = get_vdso_symbol ("__kernel_get_tbfreq"); - PTR_MANGLE (p); - VDSO_SYMBOL (get_tbfreq) = p; - - p = get_vdso_symbol ("__kernel_getcpu"); - PTR_MANGLE (p); - VDSO_SYMBOL (getcpu) = p; - - p = get_vdso_symbol ("__kernel_time"); - PTR_MANGLE (p); - VDSO_SYMBOL (time) = p; + VDSO_SYMBOL (get_tbfreq) = get_vdso_mangle_symbol (HAVE_GET_TBFREQ); /* PPC64 uses only one signal trampoline symbol, while PPC32 will use two depending if SA_SIGINFO is used (__kernel_sigtramp_rt32) or not @@ -67,13 +38,13 @@ _libc_vdso_platform_setup (void) There is no need to pointer mangle these symbol because they will used only for pointer comparison. */ #if defined(__PPC64__) || defined(__powerpc64__) - VDSO_SYMBOL(sigtramp_rt64) = get_vdso_symbol ("__kernel_sigtramp_rt64"); + VDSO_SYMBOL(sigtramp_rt64) = get_vdso_symbol (HAVE_SIGTRAMP_RT64); #else - VDSO_SYMBOL(sigtramp32) = get_vdso_symbol ("__kernel_sigtramp32"); - VDSO_SYMBOL(sigtramp_rt32) = get_vdso_symbol ("__kernel_sigtramp_rt32"); + VDSO_SYMBOL(sigtramp32) = get_vdso_symbol (HAVE_SIGTRAMP_32); + VDSO_SYMBOL(sigtramp_rt32) = get_vdso_symbol (HAVE_SIGTRAMP_RT32); #endif } -#define VDSO_SETUP _libc_vdso_platform_setup +#define VDSO_SETUP_ARCH __libc_vdso_platform_setup_arch -#include <csu/init-first.c> +#include <sysdeps/unix/sysv/linux/init-first.c> diff --git a/sysdeps/unix/sysv/linux/powerpc/libc-vdso.h b/sysdeps/unix/sysv/linux/powerpc/libc-vdso.h index f8184061c0..47e925493b 100644 --- a/sysdeps/unix/sysv/linux/powerpc/libc-vdso.h +++ b/sysdeps/unix/sysv/linux/powerpc/libc-vdso.h @@ -17,20 +17,14 @@ <http://www.gnu.org/licenses/>. */ -#ifndef _LIBC_VDSO_H -#define _LIBC_VDSO_H +#ifndef _LIBC_POWERPC_VDSO_H +#define _LIBC_POWERPC_VDSO_H #include <sysdep.h> #include <sysdep-vdso.h> +#include_next <libc-vdso.h> -extern int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) - attribute_hidden; -extern int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); -extern int (*VDSO_SYMBOL(clock_getres)) (clockid_t, struct timespec *); extern unsigned long long (*VDSO_SYMBOL(get_tbfreq)) (void); -extern int (*VDSO_SYMBOL(getcpu)) (unsigned *, unsigned *); -extern time_t (*VDSO_SYMBOL(time)) (time_t *); - #if defined(__PPC64__) || defined(__powerpc64__) extern void *VDSO_SYMBOL(sigtramp_rt64); #else diff --git a/sysdeps/unix/sysv/linux/powerpc/sysdep.h b/sysdeps/unix/sysv/linux/powerpc/sysdep.h index 5b411d0e8e..20167615c8 100644 --- a/sysdeps/unix/sysv/linux/powerpc/sysdep.h +++ b/sysdeps/unix/sysv/linux/powerpc/sysdep.h @@ -20,7 +20,15 @@ #define VDSO_HASH 123718565 /* List of system calls which are supported as vsyscalls. */ -#define HAVE_CLOCK_GETRES_VSYSCALL 1 -#define HAVE_CLOCK_GETTIME_VSYSCALL 1 -#define HAVE_GETCPU_VSYSCALL 1 +#define HAVE_CLOCK_GETRES_VSYSCALL "__kernel_clock_getres" +#define HAVE_CLOCK_GETTIME_VSYSCALL "__kernel_clock_gettime" +#define HAVE_GETCPU_VSYSCALL "__kernel_getcpu" +#define HAVE_TIME_VSYSCALL "__kernel_time" +#define HAVE_GET_TBFREQ "__kernel_get_tbfreq" +#if defined(__PPC64__) || defined(__powerpc64__) +# define HAVE_SIGTRAMP_RT64 "__kernel_sigtramp_rt64" +#else +# define HAVE_SIGTRAMP_32 "__kernel_sigtramp32" +# define HAVE_SIGTRAMP_RT32 "__kernel_sigtramp_rt32" +#endif diff --git a/sysdeps/unix/sysv/linux/riscv/init-first.c b/sysdeps/unix/sysv/linux/riscv/init-first.c deleted file mode 100644 index f3d243a192..0000000000 --- a/sysdeps/unix/sysv/linux/riscv/init-first.c +++ /dev/null @@ -1,54 +0,0 @@ -/* RISC-V VDSO initialization - Copyright (C) 2017-2019 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 <dl-vdso.h> -#include <libc-vdso.h> - -long int (*VDSO_SYMBOL (getcpu)) (unsigned int *, unsigned int *, void *) - attribute_hidden; -long int (*VDSO_SYMBOL (gettimeofday)) (struct timeval *, void *) - attribute_hidden; -long int (*VDSO_SYMBOL (clock_gettime)) (clockid_t, struct timespec *) - attribute_hidden; -long int (*VDSO_SYMBOL (clock_getres)) (clockid_t, struct timespec *) - attribute_hidden; - -static inline void -_libc_vdso_platform_setup (void) -{ - void *p = get_vdso_symbol ("__vdso_getcpu"); - PTR_MANGLE (p); - VDSO_SYMBOL (getcpu) = p; - - p = get_vdso_symbol ("__vdso_gettimeofday"); - PTR_MANGLE (p); - VDSO_SYMBOL (gettimeofday) = p; - - p = get_vdso_symbol ("__vdso_clock_gettime"); - PTR_MANGLE (p); - VDSO_SYMBOL (clock_gettime) = p; - - p = get_vdso_symbol ("__vdso_clock_getres"); - PTR_MANGLE (p); - VDSO_SYMBOL (clock_getres) = p; -} - -#define VDSO_SETUP _libc_vdso_platform_setup - -#include <csu/init-first.c> diff --git a/sysdeps/unix/sysv/linux/riscv/libc-vdso.h b/sysdeps/unix/sysv/linux/riscv/libc-vdso.h deleted file mode 100644 index 2373292ab9..0000000000 --- a/sysdeps/unix/sysv/linux/riscv/libc-vdso.h +++ /dev/null @@ -1,34 +0,0 @@ -/* RISC-V VDSO function declarations - Copyright (C) 2017-2019 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/>. */ - -#ifndef _LIBC_VDSO_H -#define _LIBC_VDSO_H - -#include <sysdep-vdso.h> - -extern long int (*VDSO_SYMBOL (getcpu)) (unsigned int *, unsigned int *, void *) - attribute_hidden; -extern long int (*VDSO_SYMBOL (gettimeofday)) (struct timeval *, void *) - attribute_hidden; -extern long int (*VDSO_SYMBOL (clock_gettime)) (clockid_t, struct timespec *) - attribute_hidden; -extern long int (*VDSO_SYMBOL (clock_getres)) (clockid_t, struct timespec *) - attribute_hidden; - -#endif /* _LIBC_VDSO_H */ diff --git a/sysdeps/unix/sysv/linux/riscv/sysdep.h b/sysdeps/unix/sysv/linux/riscv/sysdep.h index 5de773744c..22835aa12f 100644 --- a/sysdeps/unix/sysv/linux/riscv/sysdep.h +++ b/sysdeps/unix/sysv/linux/riscv/sysdep.h @@ -125,10 +125,10 @@ # define VDSO_HASH 182943605 /* List of system calls which are supported as vsyscalls. */ -# define HAVE_CLOCK_GETRES_VSYSCALL 1 -# define HAVE_CLOCK_GETTIME_VSYSCALL 1 -# define HAVE_GETTIMEOFDAY_VSYSCALL 1 -# define HAVE_GETCPU_VSYSCALL 1 +# define HAVE_CLOCK_GETRES_VSYSCALL "__vdso_clock_getres" +# define HAVE_CLOCK_GETTIME_VSYSCALL "__vdso_clock_gettime" +# define HAVE_GETTIMEOFDAY_VSYSCALL "__vdso_gettimeofday" +# define HAVE_GETCPU_VSYSCALL "__vdso_getcpu" /* Define a macro which expands into the inline wrapper code for a system call. */ diff --git a/sysdeps/unix/sysv/linux/s390/init-first.c b/sysdeps/unix/sysv/linux/s390/init-first.c deleted file mode 100644 index 3e36270eac..0000000000 --- a/sysdeps/unix/sysv/linux/s390/init-first.c +++ /dev/null @@ -1,56 +0,0 @@ -/* Initialization code run first thing by the ELF startup code. Linux/s390. - Copyright (C) 2008-2019 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 <dl-vdso.h> -#include <libc-vdso.h> - -long int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) - attribute_hidden; - -long int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *) - __attribute__ ((nocommon)); - -long int (*VDSO_SYMBOL(clock_getres)) (clockid_t, struct timespec *) - __attribute__ ((nocommon)); - -long int (*VDSO_SYMBOL(getcpu)) (unsigned *, unsigned *, void *) - attribute_hidden; - -static inline void -_libc_vdso_platform_setup (void) -{ - void *p = get_vdso_symbol ("__kernel_gettimeofday"); - PTR_MANGLE (p); - VDSO_SYMBOL (gettimeofday) = p; - - p = get_vdso_symbol ("__kernel_clock_gettime"); - PTR_MANGLE (p); - VDSO_SYMBOL (clock_gettime) = p; - - p = get_vdso_symbol ("__kernel_clock_getres"); - PTR_MANGLE (p); - VDSO_SYMBOL (clock_getres) = p; - - p = get_vdso_symbol ("__kernel_getcpu"); - PTR_MANGLE (p); - VDSO_SYMBOL (getcpu) = p; -} - -#define VDSO_SETUP _libc_vdso_platform_setup - -#include <csu/init-first.c> diff --git a/sysdeps/unix/sysv/linux/s390/libc-vdso.h b/sysdeps/unix/sysv/linux/s390/libc-vdso.h deleted file mode 100644 index cc97601383..0000000000 --- a/sysdeps/unix/sysv/linux/s390/libc-vdso.h +++ /dev/null @@ -1,35 +0,0 @@ -/* Resolve function pointers to VDSO functions. - Copyright (C) 2008-2019 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/>. */ - - -#ifndef _LIBC_VDSO_H -#define _LIBC_VDSO_H - -#include <sysdep-vdso.h> - -extern long int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) - attribute_hidden; - -extern long int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); - -extern long int (*VDSO_SYMBOL(clock_getres)) (clockid_t, struct timespec *); - -extern long int (*VDSO_SYMBOL(getcpu)) (unsigned *, unsigned *, void *) - attribute_hidden; - -#endif /* _LIBC_VDSO_H */ diff --git a/sysdeps/unix/sysv/linux/s390/sysdep.h b/sysdeps/unix/sysv/linux/s390/sysdep.h index eefbd8f007..386efb1896 100644 --- a/sysdeps/unix/sysv/linux/s390/sysdep.h +++ b/sysdeps/unix/sysv/linux/s390/sysdep.h @@ -20,8 +20,8 @@ #define VDSO_HASH 123718585 /* List of system calls which are supported as vsyscalls. */ -#define HAVE_CLOCK_GETRES_VSYSCALL 1 -#define HAVE_CLOCK_GETTIME_VSYSCALL 1 -#define HAVE_GETTIMEOFDAY_VSYSCALL 1 -#define HAVE_GETCPU_VSYSCALL 1 +#define HAVE_CLOCK_GETRES_VSYSCALL "__kernel_clock_getres" +#define HAVE_CLOCK_GETTIME_VSYSCALL "__kernel_clock_gettime" +#define HAVE_GETTIMEOFDAY_VSYSCALL "__kernel_gettimeofday" +#define HAVE_GETCPU_VSYSCALL "__kernel_getcpu" diff --git a/sysdeps/unix/sysv/linux/sparc/init-first.c b/sysdeps/unix/sysv/linux/sparc/init-first.c deleted file mode 100644 index bdaa78fd32..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/init-first.c +++ /dev/null @@ -1,42 +0,0 @@ -/* SPARC VDSO initialization - Copyright (C) 2018-2019 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 <dl-vdso.h> -#include <libc-vdso.h> - -long int (*VDSO_SYMBOL (gettimeofday)) (struct timeval *, void *) - attribute_hidden; -long int (*VDSO_SYMBOL (clock_gettime)) (clockid_t, struct timespec *) - attribute_hidden; - -static inline void -_libc_vdso_platform_setup (void) -{ - void *p = get_vdso_symbol ("__vdso_gettimeofday"); - PTR_MANGLE (p); - VDSO_SYMBOL (gettimeofday) = p; - - p = get_vdso_symbol ("__vdso_clock_gettime"); - PTR_MANGLE (p); - VDSO_SYMBOL (clock_gettime) = p; -} - -#define VDSO_SETUP _libc_vdso_platform_setup - -#include <csu/init-first.c> diff --git a/sysdeps/unix/sysv/linux/sparc/libc-vdso.h b/sysdeps/unix/sysv/linux/sparc/libc-vdso.h deleted file mode 100644 index d20afcdf04..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/libc-vdso.h +++ /dev/null @@ -1,29 +0,0 @@ -/* VDSO function pointer declarations. - Copyright (C) 2018-2019 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/>. */ - -#ifndef _LIBC_VDSO_H -#define _LIBC_VDSO_H - -#include <sysdep-vdso.h> - -extern long int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) - attribute_hidden; -extern long int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); - -#endif /* _LIBC_VDSO_H */ diff --git a/sysdeps/unix/sysv/linux/sparc/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sysdep.h index 3bfb1fc60e..925b57082d 100644 --- a/sysdeps/unix/sysv/linux/sparc/sysdep.h +++ b/sysdeps/unix/sysv/linux/sparc/sysdep.h @@ -45,8 +45,8 @@ # define VDSO_HASH 61765110 /* List of system calls which are supported as vsyscalls. */ -# define HAVE_CLOCK_GETTIME_VSYSCALL 1 -# define HAVE_GETTIMEOFDAY_VSYSCALL 1 +# define HAVE_CLOCK_GETTIME_VSYSCALL "__vdso_clock_gettime" +# define HAVE_GETTIMEOFDAY_VSYSCALL "__vdso_gettimeofday" #undef INLINE_SYSCALL #define INLINE_SYSCALL(name, nr, args...) \ diff --git a/sysdeps/unix/sysv/linux/sysdep-vdso.h b/sysdeps/unix/sysv/linux/sysdep-vdso.h index 5fec208380..3da5417fff 100644 --- a/sysdeps/unix/sysv/linux/sysdep-vdso.h +++ b/sysdeps/unix/sysv/linux/sysdep-vdso.h @@ -19,7 +19,7 @@ #ifndef SYSDEP_VDSO_LINUX_H # define SYSDEP_VDSO_LINUX_H -#define VDSO_SYMBOL(__name) __vdso_##__name +#include <dl-vdso.h> #ifndef INTERNAL_VSYSCALL_CALL # define INTERNAL_VSYSCALL_CALL(funcptr, err, nr, args...) \ diff --git a/sysdeps/unix/sysv/linux/x86/libc-vdso.h b/sysdeps/unix/sysv/linux/x86/libc-vdso.h deleted file mode 100644 index c9aa1c8a72..0000000000 --- a/sysdeps/unix/sysv/linux/x86/libc-vdso.h +++ /dev/null @@ -1,33 +0,0 @@ -/* Resolve function pointers to VDSO functions. - Copyright (C) 2005-2019 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/>. */ - -#ifndef _LIBC_VDSO_H -#define _LIBC_VDSO_H - -#include <time.h> -#include <sys/time.h> - -#include <sysdep-vdso.h> - -extern long int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *) - attribute_hidden; - -extern long int (*VDSO_SYMBOL(getcpu)) (unsigned *, unsigned *, void *) - attribute_hidden; - -#endif /* _LIBC_VDSO_H */ diff --git a/sysdeps/unix/sysv/linux/x86_64/init-first.c b/sysdeps/unix/sysv/linux/x86_64/init-first.c deleted file mode 100644 index aede1c858d..0000000000 --- a/sysdeps/unix/sysv/linux/x86_64/init-first.c +++ /dev/null @@ -1,48 +0,0 @@ -/* Initialization code run first thing by the ELF startup code. Linux/x86-64. - Copyright (C) 2007-2019 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 <time.h> -#include <sysdep.h> -#include <dl-vdso.h> -#include <libc-vdso.h> - -long int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *) - attribute_hidden; -long int (*VDSO_SYMBOL(getcpu)) (unsigned *, unsigned *, void *) - attribute_hidden; - -extern __typeof (clock_gettime) __syscall_clock_gettime attribute_hidden; - - -static inline void -__vdso_platform_setup (void) -{ - void *p = get_vdso_symbol ("__vdso_clock_gettime"); - if (p == NULL) - p = __syscall_clock_gettime; - PTR_MANGLE (p); - VDSO_SYMBOL(clock_gettime) = p; - - p = get_vdso_symbol ("__vdso_getcpu"); - PTR_MANGLE (p); - VDSO_SYMBOL(getcpu) = p; -} - -#define VDSO_SETUP __vdso_platform_setup - -#include <csu/init-first.c> diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep.h b/sysdeps/unix/sysv/linux/x86_64/sysdep.h index 197329f4dc..4541c0d492 100644 --- a/sysdeps/unix/sysv/linux/x86_64/sysdep.h +++ b/sysdeps/unix/sysv/linux/x86_64/sysdep.h @@ -374,9 +374,9 @@ # define VDSO_HASH 61765110 /* List of system calls which are supported as vsyscalls. */ -# define HAVE_CLOCK_GETTIME_VSYSCALL 1 -# define HAVE_GETTIMEOFDAY_VSYSCALL 1 -# define HAVE_GETCPU_VSYSCALL 1 +# define HAVE_CLOCK_GETTIME_VSYSCALL "__vdso_clock_gettime" +# define HAVE_GETTIMEOFDAY_VSYSCALL "__vdso_gettimeofday" +# define HAVE_GETCPU_VSYSCALL "__vdso_getcpu" # define SINGLE_THREAD_BY_GLOBAL 1