1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00

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.
This commit is contained in:
Adhemerval Zanella
2019-06-03 10:22:13 -03:00
parent b8386c2859
commit b8a7c7da4e
35 changed files with 236 additions and 649 deletions

View File

@ -1,5 +1,65 @@
2019-09-17 Adhemerval Zanella <adhemerval.zanella@linaro.org> 2019-09-17 Adhemerval Zanella <adhemerval.zanella@linaro.org>
* 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.
* sysdeps/unix/make-syscalls.sh: Make vDSO call use get_vdso_symbol. * sysdeps/unix/make-syscalls.sh: Make vDSO call use get_vdso_symbol.
* sysdeps/unix/sysv/linux/aarch64/gettimeofday.c (__gettimeofday): * sysdeps/unix/sysv/linux/aarch64/gettimeofday.c (__gettimeofday):
Use get_vdso_symbol instead of _dl_vdso_vsym. Use get_vdso_symbol instead of _dl_vdso_vsym.

View File

@ -54,7 +54,7 @@ struct signal_frame_32 {
static inline int static inline int
is_sigtramp_address (void *nip) is_sigtramp_address (void *nip)
{ {
#ifdef SHARED #ifdef HAVE_SIGTRAMP_RT32
if (nip == VDSO_SYMBOL (sigtramp32)) if (nip == VDSO_SYMBOL (sigtramp32))
return 1; return 1;
#endif #endif
@ -71,7 +71,7 @@ struct rt_signal_frame_32 {
static inline int static inline int
is_sigtramp_address_rt (void * nip) is_sigtramp_address_rt (void * nip)
{ {
#ifdef SHARED #ifdef HAVE_SIGTRAMP_32
if (nip == VDSO_SYMBOL (sigtramp_rt32)) if (nip == VDSO_SYMBOL (sigtramp_rt32))
return 1; return 1;
#endif #endif

View File

@ -57,7 +57,7 @@ struct signal_frame_64 {
static inline int static inline int
is_sigtramp_address (void *nip) is_sigtramp_address (void *nip)
{ {
#ifdef SHARED #ifdef HAVE_SIGTRAMP_RT64
if (nip == VDSO_SYMBOL (sigtramp_rt64)) if (nip == VDSO_SYMBOL (sigtramp_rt64))
return 1; return 1;
#endif #endif

View File

@ -38,7 +38,7 @@ __gettimeofday_vsyscall (struct timeval *tv, struct timezone *tz)
# define INIT_ARCH() # define INIT_ARCH()
libc_ifunc_hidden (__gettimeofday, __gettimeofday, libc_ifunc_hidden (__gettimeofday, __gettimeofday,
(get_vdso_symbol ("__kernel_gettimeofday") (get_vdso_symbol (HAVE_GETTIMEOFDAY_VSYSCALL)
?: __gettimeofday_vsyscall)) ?: __gettimeofday_vsyscall))
libc_hidden_def (__gettimeofday) libc_hidden_def (__gettimeofday)

View File

@ -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>

View File

@ -160,9 +160,9 @@
# endif # endif
/* List of system calls which are supported as vsyscalls. */ /* List of system calls which are supported as vsyscalls. */
# define HAVE_CLOCK_GETRES_VSYSCALL 1 # define HAVE_CLOCK_GETRES_VSYSCALL "__kernel_clock_getres"
# define HAVE_CLOCK_GETTIME_VSYSCALL 1 # define HAVE_CLOCK_GETTIME_VSYSCALL "__kernel_clock_gettime"
# define HAVE_GETTIMEOFDAY_VSYSCALL 1 # define HAVE_GETTIMEOFDAY_VSYSCALL "__kernel_gettimeofday"
/* Previously AArch64 used the generic version without the libc_hidden_def /* Previously AArch64 used the generic version without the libc_hidden_def
which lead in a non existent __send symbol in libc.so. */ which lead in a non existent __send symbol in libc.so. */

View File

@ -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>

View File

@ -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 */

View File

@ -392,8 +392,8 @@ __local_syscall_error: \
#define VDSO_HASH 61765110 #define VDSO_HASH 61765110
/* List of system calls which are supported as vsyscalls. */ /* List of system calls which are supported as vsyscalls. */
#define HAVE_CLOCK_GETTIME_VSYSCALL 1 #define HAVE_CLOCK_GETTIME_VSYSCALL "__vdso_gettimeofday"
#define HAVE_GETTIMEOFDAY_VSYSCALL 1 #define HAVE_GETTIMEOFDAY_VSYSCALL "__vdso_clock_gettime"
#define LOAD_ARGS_0() #define LOAD_ARGS_0()
#define ASM_ARGS_0 #define ASM_ARGS_0

View File

@ -19,16 +19,25 @@
#ifndef _DL_VDSO_H #ifndef _DL_VDSO_H
#define _DL_VDSO_H 1 #define _DL_VDSO_H 1
#include <assert.h>
#include <ldsodefs.h> #include <ldsodefs.h>
#include <dl-hash.h> #include <dl-hash.h>
#include <libc-vdso.h>
/* Functions for resolving symbols in the VDSO link map. */ /* Functions for resolving symbols in the VDSO link map. */
extern void *_dl_vdso_vsym (const char *name, extern void *_dl_vdso_vsym (const char *name,
const struct r_found_version *version) const struct r_found_version *version)
attribute_hidden; 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 * static inline void *
get_vdso_symbol (const char *symbol) get_vdso_symbol (const char *symbol)
{ {
@ -36,4 +45,12 @@ get_vdso_symbol (const char *symbol)
return _dl_vdso_vsym (symbol, &rfv); 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 */ #endif /* dl-vdso.h */

View File

@ -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>

View File

@ -313,8 +313,8 @@ struct libc_do_syscall_args
# define VDSO_HASH 61765110 # define VDSO_HASH 61765110
/* List of system calls which are supported as vsyscalls. */ /* List of system calls which are supported as vsyscalls. */
# define HAVE_CLOCK_GETTIME_VSYSCALL 1 # define HAVE_CLOCK_GETTIME_VSYSCALL "__vdso_clock_gettime"
# define HAVE_GETTIMEOFDAY_VSYSCALL 1 # define HAVE_GETTIMEOFDAY_VSYSCALL "__vdso_gettimeofday"
/* Define a macro which expands inline into the wrapper code for a system /* 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 call. This use is for internal calls that do not need to handle errors

View File

@ -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>

View File

@ -19,12 +19,26 @@
#ifndef _LIBC_VDSO_H #ifndef _LIBC_VDSO_H
#define _LIBC_VDSO_H #define _LIBC_VDSO_H
#include <sysdep.h> #define VDSO_SYMBOL(__name) __vdso_##__name
#include <sysdep-vdso.h>
extern int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) #ifdef HAVE_CLOCK_GETTIME_VSYSCALL
attribute_hidden; extern int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *)
extern int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); attribute_hidden;
extern int (*VDSO_SYMBOL(clock_getres)) (clockid_t, struct timespec *); #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 */ #endif /* _LIBC_VDSO_H */

View File

@ -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>

View File

@ -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 */

View File

@ -20,5 +20,5 @@
#define VDSO_HASH 61765110 #define VDSO_HASH 61765110
/* List of system calls which are supported as vsyscalls. */ /* List of system calls which are supported as vsyscalls. */
#define HAVE_CLOCK_GETTIME_VSYSCALL 1 #define HAVE_CLOCK_GETTIME_VSYSCALL "__vdso_gettimeofday"
#define HAVE_GETTIMEOFDAY_VSYSCALL 1 #define HAVE_GETTIMEOFDAY_VSYSCALL "__vdso_clock_gettime"

View File

@ -28,6 +28,7 @@
# include <dl-vdso.h> # include <dl-vdso.h>
# include <libc-vdso.h> # include <libc-vdso.h>
# include <dl-machine.h> # include <dl-machine.h>
# include <sysdep.h>
# ifndef __powerpc64__ # ifndef __powerpc64__
# undef __gettimeofday # undef __gettimeofday
@ -58,7 +59,7 @@ __gettimeofday_syscall (struct timeval *tv, struct timezone *tz)
} }
# define INIT_ARCH() \ # 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. */ /* If the vDSO is not available we fall back syscall. */
libc_ifunc_hidden (__redirect___gettimeofday, __gettimeofday, libc_ifunc_hidden (__redirect___gettimeofday, __gettimeofday,

View File

@ -19,47 +19,18 @@
#include <dl-vdso.h> #include <dl-vdso.h>
#include <libc-vdso.h> #include <libc-vdso.h>
int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) unsigned long long (*VDSO_SYMBOL(get_tbfreq)) (void) attribute_hidden;
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 *);
#if defined(__PPC64__) || defined(__powerpc64__) #if defined(__PPC64__) || defined(__powerpc64__)
void *VDSO_SYMBOL(sigtramp_rt64); void *VDSO_SYMBOL(sigtramp_rt64) attribute_hidden;
#else #else
void *VDSO_SYMBOL(sigtramp32); void *VDSO_SYMBOL(sigtramp32) attribute_hidden;
void *VDSO_SYMBOL(sigtramp_rt32); void *VDSO_SYMBOL(sigtramp_rt32) attribute_hidden;
#endif #endif
static inline void static inline void
_libc_vdso_platform_setup (void) __libc_vdso_platform_setup_arch (void)
{ {
void *p = get_vdso_symbol ("__kernel_gettimeofday"); VDSO_SYMBOL (get_tbfreq) = get_vdso_mangle_symbol (HAVE_GET_TBFREQ);
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;
/* PPC64 uses only one signal trampoline symbol, while PPC32 will use /* PPC64 uses only one signal trampoline symbol, while PPC32 will use
two depending if SA_SIGINFO is used (__kernel_sigtramp_rt32) or not 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 There is no need to pointer mangle these symbol because they will
used only for pointer comparison. */ used only for pointer comparison. */
#if defined(__PPC64__) || defined(__powerpc64__) #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 #else
VDSO_SYMBOL(sigtramp32) = get_vdso_symbol ("__kernel_sigtramp32"); VDSO_SYMBOL(sigtramp32) = get_vdso_symbol (HAVE_SIGTRAMP_32);
VDSO_SYMBOL(sigtramp_rt32) = get_vdso_symbol ("__kernel_sigtramp_rt32"); VDSO_SYMBOL(sigtramp_rt32) = get_vdso_symbol (HAVE_SIGTRAMP_RT32);
#endif #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>

View File

@ -17,20 +17,14 @@
<https://www.gnu.org/licenses/>. */ <https://www.gnu.org/licenses/>. */
#ifndef _LIBC_VDSO_H #ifndef _LIBC_POWERPC_VDSO_H
#define _LIBC_VDSO_H #define _LIBC_POWERPC_VDSO_H
#include <sysdep.h> #include <sysdep.h>
#include <sysdep-vdso.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 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__) #if defined(__PPC64__) || defined(__powerpc64__)
extern void *VDSO_SYMBOL(sigtramp_rt64); extern void *VDSO_SYMBOL(sigtramp_rt64);
#else #else

View File

@ -20,6 +20,16 @@
#define VDSO_HASH 123718565 #define VDSO_HASH 123718565
/* List of system calls which are supported as vsyscalls. */ /* List of system calls which are supported as vsyscalls. */
#define HAVE_CLOCK_GETRES_VSYSCALL 1 #define HAVE_CLOCK_GETRES_VSYSCALL "__kernel_clock_getres"
#define HAVE_CLOCK_GETTIME_VSYSCALL 1 #define HAVE_CLOCK_GETTIME_VSYSCALL "__kernel_clock_gettime"
#define HAVE_GETCPU_VSYSCALL 1 #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

View File

@ -67,7 +67,7 @@ time_syscall (time_t *t)
} }
# define INIT_ARCH() \ # 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. */ /* If the vDSO is not available we fall back to the syscall. */
libc_ifunc_hidden (__redirect_time, time, libc_ifunc_hidden (__redirect_time, time,

View File

@ -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>

View File

@ -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 */

View File

@ -125,10 +125,10 @@
# define VDSO_HASH 182943605 # define VDSO_HASH 182943605
/* List of system calls which are supported as vsyscalls. */ /* List of system calls which are supported as vsyscalls. */
# define HAVE_CLOCK_GETRES_VSYSCALL 1 # define HAVE_CLOCK_GETRES_VSYSCALL "__vdso_clock_getres"
# define HAVE_CLOCK_GETTIME_VSYSCALL 1 # define HAVE_CLOCK_GETTIME_VSYSCALL "__vdso_clock_gettime"
# define HAVE_GETTIMEOFDAY_VSYSCALL 1 # define HAVE_GETTIMEOFDAY_VSYSCALL "__vdso_gettimeofday"
# define HAVE_GETCPU_VSYSCALL 1 # define HAVE_GETCPU_VSYSCALL "__vdso_getcpu"
/* Define a macro which expands into the inline wrapper code for a system /* Define a macro which expands into the inline wrapper code for a system
call. */ call. */

View File

@ -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>

View File

@ -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 */

View File

@ -20,7 +20,7 @@
#define VDSO_HASH 123718585 #define VDSO_HASH 123718585
/* List of system calls which are supported as vsyscalls. */ /* List of system calls which are supported as vsyscalls. */
#define HAVE_CLOCK_GETRES_VSYSCALL 1 #define HAVE_CLOCK_GETRES_VSYSCALL "__kernel_clock_getres"
#define HAVE_CLOCK_GETTIME_VSYSCALL 1 #define HAVE_CLOCK_GETTIME_VSYSCALL "__kernel_clock_gettime"
#define HAVE_GETTIMEOFDAY_VSYSCALL 1 #define HAVE_GETTIMEOFDAY_VSYSCALL "__kernel_gettimeofday"
#define HAVE_GETCPU_VSYSCALL 1 #define HAVE_GETCPU_VSYSCALL "__kernel_getcpu"

View File

@ -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>

View File

@ -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 */

View File

@ -45,8 +45,8 @@
# define VDSO_HASH 61765110 # define VDSO_HASH 61765110
/* List of system calls which are supported as vsyscalls. */ /* List of system calls which are supported as vsyscalls. */
# define HAVE_CLOCK_GETTIME_VSYSCALL 1 # define HAVE_CLOCK_GETTIME_VSYSCALL "__vdso_clock_gettime"
# define HAVE_GETTIMEOFDAY_VSYSCALL 1 # define HAVE_GETTIMEOFDAY_VSYSCALL "__vdso_gettimeofday"
#undef INLINE_SYSCALL #undef INLINE_SYSCALL
#define INLINE_SYSCALL(name, nr, args...) \ #define INLINE_SYSCALL(name, nr, args...) \

View File

@ -19,7 +19,7 @@
#ifndef SYSDEP_VDSO_LINUX_H #ifndef SYSDEP_VDSO_LINUX_H
# define SYSDEP_VDSO_LINUX_H # define SYSDEP_VDSO_LINUX_H
#define VDSO_SYMBOL(__name) __vdso_##__name #include <dl-vdso.h>
#ifndef INTERNAL_VSYSCALL_CALL #ifndef INTERNAL_VSYSCALL_CALL
# define INTERNAL_VSYSCALL_CALL(funcptr, err, nr, args...) \ # define INTERNAL_VSYSCALL_CALL(funcptr, err, nr, args...) \

View File

@ -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 */

View File

@ -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>

View File

@ -374,9 +374,9 @@
# define VDSO_HASH 61765110 # define VDSO_HASH 61765110
/* List of system calls which are supported as vsyscalls. */ /* List of system calls which are supported as vsyscalls. */
# define HAVE_CLOCK_GETTIME_VSYSCALL 1 # define HAVE_CLOCK_GETTIME_VSYSCALL "__vdso_clock_gettime"
# define HAVE_GETTIMEOFDAY_VSYSCALL 1 # define HAVE_GETTIMEOFDAY_VSYSCALL "__vdso_gettimeofday"
# define HAVE_GETCPU_VSYSCALL 1 # define HAVE_GETCPU_VSYSCALL "__vdso_getcpu"
# define SINGLE_THREAD_BY_GLOBAL 1 # define SINGLE_THREAD_BY_GLOBAL 1