diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2019-06-03 10:22:13 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2019-09-17 17:09:24 -0300 |
commit | b8a7c7da4e228d0f8fb39fdbc1a6cfd33a97a188 (patch) | |
tree | 5546878e48aea11ed1b4b5e7195331c8a5e7943b /sysdeps | |
parent | b8386c2859e61c5c80ca98e987665a3179bd7e52 (diff) | |
download | glibc-b8a7c7da4e228d0f8fb39fdbc1a6cfd33a97a188.zip glibc-b8a7c7da4e228d0f8fb39fdbc1a6cfd33a97a188.tar.gz glibc-b8a7c7da4e228d0f8fb39fdbc1a6cfd33a97a188.tar.bz2 |
Refactor vDSO initialization code
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_RT32i,
HAVE_GETTIMEOFDAY_VSYSCALL): 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.
Diffstat (limited to 'sysdeps')
34 files changed, 177 insertions, 650 deletions
diff --git a/sysdeps/powerpc/powerpc32/backtrace.c b/sysdeps/powerpc/powerpc32/backtrace.c index 971401a..2e6a859 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 8f83093..234d9c0 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/gettimeofday.c b/sysdeps/unix/sysv/linux/aarch64/gettimeofday.c index 1ec98bf..4ff74fa 100644 --- a/sysdeps/unix/sysv/linux/aarch64/gettimeofday.c +++ b/sysdeps/unix/sysv/linux/aarch64/gettimeofday.c @@ -38,7 +38,7 @@ __gettimeofday_vsyscall (struct timeval *tv, struct timezone *tz) # define INIT_ARCH() libc_ifunc_hidden (__gettimeofday, __gettimeofday, - (get_vdso_symbol ("__kernel_gettimeofday") + (get_vdso_symbol (HAVE_GETTIMEOFDAY_VSYSCALL) ?: __gettimeofday_vsyscall)) libc_hidden_def (__gettimeofday) 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 16b28be..0000000 --- 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 - <https://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 37d70ca..53b515a 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 56ae739..0000000 --- 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 - <https://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 6b7a825..0000000 --- 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 - <https://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 9eea48d..f9cc933 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 5e40eac..19ffd30 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 e785664..0000000 --- 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 - <https://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 cdba552..7066ddc 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 0000000..d90ca82 --- /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 index 6396e31..2e63aa1 100644 --- a/sysdeps/unix/sysv/linux/aarch64/libc-vdso.h +++ b/sysdeps/unix/sysv/linux/libc-vdso.h @@ -19,12 +19,26 @@ #ifndef _LIBC_VDSO_H #define _LIBC_VDSO_H -#include <sysdep.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 *); -extern int (*VDSO_SYMBOL(clock_getres)) (clockid_t, struct timespec *); +#define VDSO_SYMBOL(__name) __vdso_##__name + +#ifdef HAVE_CLOCK_GETTIME_VSYSCALL +extern int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *) + attribute_hidden; +#endif +#ifdef HAVE_CLOCK_GETRES_VSYSCALL +extern int (*VDSO_SYMBOL(clock_getres)) (clockid_t, struct timespec *) + attribute_hidden; +#endif +#ifdef HAVE_GETTIMEOFDAY_VSYSCALL +extern int (*VDSO_SYMBOL (gettimeofday)) (struct timeval *, void *) + attribute_hidden; +#endif +#ifdef HAVE_GETCPU_VSYSCALL +extern long int (*VDSO_SYMBOL(getcpu)) (unsigned *, unsigned *, void *) + attribute_hidden; +#endif +#ifdef HAVE_TIME_VSYSCALL +extern time_t (*VDSO_SYMBOL(time)) (time_t *) attribute_hidden; +#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 05cf438..0000000 --- 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 - <https://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 086abe2..0000000 --- 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 - <https://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 0f3399f..5d05c90 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/gettimeofday.c b/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c index 40549fe..13a1fd2 100644 --- a/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c +++ b/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c @@ -28,6 +28,7 @@ # include <dl-vdso.h> # include <libc-vdso.h> # include <dl-machine.h> +# include <sysdep.h> # ifndef __powerpc64__ # undef __gettimeofday @@ -58,7 +59,7 @@ __gettimeofday_syscall (struct timeval *tv, struct timezone *tz) } # define INIT_ARCH() \ - void *vdso_gettimeofday = get_vdso_symbol ("__kernel_gettimeofday") + void *vdso_gettimeofday = get_vdso_symbol (HAVE_GETTIMEOFDAY_VSYSCALL) /* If the vDSO is not available we fall back syscall. */ libc_ifunc_hidden (__redirect___gettimeofday, __gettimeofday, diff --git a/sysdeps/unix/sysv/linux/powerpc/init-first.c b/sysdeps/unix/sysv/linux/powerpc/init-first.c index b1618ed..92a4af8 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 13da28a..5c1f8de 100644 --- a/sysdeps/unix/sysv/linux/powerpc/libc-vdso.h +++ b/sysdeps/unix/sysv/linux/powerpc/libc-vdso.h @@ -17,20 +17,14 @@ <https://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 c72c93d..a29f286 100644 --- a/sysdeps/unix/sysv/linux/powerpc/sysdep.h +++ b/sysdeps/unix/sysv/linux/powerpc/sysdep.h @@ -20,6 +20,16 @@ #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_GETTIMEOFDAY_VSYSCALL "__kernel_gettimeofday" +#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/powerpc/time.c b/sysdeps/unix/sysv/linux/powerpc/time.c index 2a0b776..c35b80f 100644 --- a/sysdeps/unix/sysv/linux/powerpc/time.c +++ b/sysdeps/unix/sysv/linux/powerpc/time.c @@ -67,7 +67,7 @@ time_syscall (time_t *t) } # define INIT_ARCH() \ - void *vdso_time = get_vdso_symbol ("__kernel_time"); + void *vdso_time = get_vdso_symbol (HAVE_TIME_VSYSCALL); /* If the vDSO is not available we fall back to the syscall. */ libc_ifunc_hidden (__redirect_time, time, 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 19812c5..0000000 --- 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 - <https://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 6b306f4..0000000 --- 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 - <https://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 b12dd18..bfbcf60 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 ac4c536..0000000 --- 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 - <https://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 a162ad8..0000000 --- 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 - <https://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 3dfb359..97d78e2 100644 --- a/sysdeps/unix/sysv/linux/s390/sysdep.h +++ b/sysdeps/unix/sysv/linux/s390/sysdep.h @@ -20,7 +20,7 @@ #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 ef5bfb7..0000000 --- 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 - <https://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 9676117..0000000 --- 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 - <https://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 5115711..f38144c 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 75aacf6..cf614fb 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 e263932..0000000 --- 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 - <https://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 93c9ebb..0000000 --- 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 - <https://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 1ffb3cd..475b7d9 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 |