diff options
34 files changed, 223 insertions, 157 deletions
@@ -1,3 +1,63 @@ +2019-09-17 Adhemerval Zanella <adhemerval.zanella@linaro.org> + + * sysdeps/unix/make-syscalls.sh: Make vDSO call use get_vdso_symbol. + * sysdeps/unix/sysv/linux/aarch64/gettimeofday.c (__gettimeofday): + Use get_vdso_symbol instead of _dl_vdso_vsym. + * sysdeps/unix/sysv/linux/powerpc/time.c (time): Likewise. + * sysdeps/unix/sysv/linux/riscv/flush-icache.c + (__lookup_riscv_flush_icache): Likewise. + * sysdeps/unix/sysv/linux/x86/gettimeofday.c (__gettimeofday): + Likewise. + * sysdeps/unix/sysv/linux/x86/time.c (time): Likewise. + * sysdeps/unix/sysv/linux/powerpc/gettimeofday.c: Likewise. + * sysdeps/unix/sysv/linux/aarch64/init-first.c: Likewise. + * sysdeps/unix/sysv/linux/arm/init-first.c: Likewise. + * sysdeps/unix/sysv/linux/i386/init-first.c: Likewise. + * sysdeps/unix/sysv/linux/mips/init-first.c: Likewise. + * sysdeps/unix/sysv/linux/powerpc/init-first.c: Likewise. + * sysdeps/unix/sysv/linux/riscv/init-first.c: Likewise. + * sysdeps/unix/sysv/linux/sparc/init-first.c: Likewise. + * sysdeps/unix/sysv/linux/s390/init-first.c: Likewise. + * sysdeps/unix/sysv/linux/x86_64/init-first.c: Likewise. + * sysdeps/unix/sysv/linux/aarch64/sysdep.h (VDSO_NAME, VDSO_HASH): + Define. + * sysdeps/unix/sysv/linux/arm/sysdep.h (VDSO_NAME, VDSO_HASH): + Likewise. + * sysdeps/unix/sysv/linux/i386/sysdep.h (VDSO_NAME, VDSO_HASH): + Likewise. + * sysdeps/unix/sysv/linux/riscv/sysdep.h (VDSO_NAME, VDSO_HASH): + Likewise. + * sysdeps/unix/sysv/linux/sparc/sysdep.h (VDSO_NAME, VDSO_HASH): + Likewise. + * sysdeps/unix/sysv/linux/x86_64/sysdep.h (VDSO_NAME, VDSO_HASH): + Likewise. + * sysdeps/unix/sysv/linux/mips/mips32/sysdep.h + (HAVE_CLOCK_GETTIME_VSYSCALL, HAVE_GETTIMEOFDAY_VSYSCALL): Remove + definition. + * sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h + (HAVE_CLOCK_GETTIME_VSYSCALL, HAVE_GETTIMEOFDAY_VSYSCALL): Likewise. + * sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h + (HAVE_CLOCK_GETTIME_VSYSCALL, HAVE_GETTIMEOFDAY_VSYSCALL): Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h + (HAVE_CLOCK_GETTIME_VSYSCALL, HAVE_GETTIMEOFDAY_VSYSCALL): Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h + (HAVE_CLOCK_GETTIME_VSYSCALL, HAVE_GETTIMEOFDAY_VSYSCALL): Likewise. + * sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h + (HAVE_CLOCK_GETRES_VSYSCALL, HAVE_CLOCK_GETTIME_VSYSCALL, + HAVE_GETTIMEOFDAY_VSYSCALL, HAVE_GETCPU_VSYSCALL): Likewise. + * sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h + (HAVE_CLOCK_GETRES_VSYSCALL, HAVE_CLOCK_GETTIME_VSYSCALL, + HAVE_GETTIMEOFDAY_VSYSCALL, HAVE_GETCPU_VSYSCALL): Likewise. + * sysdeps/unix/sysv/linux/mips/sysdep.h: New file. + * sysdeps/unix/sysv/linux/powerpc/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/s390/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/dl-vdso.h (PREPARE_VERSION, + PREPARE_VERSION_KNOWN, VDSO_NAME_LINUX_2_6, VDSO_HASH_LINUX_2_6, + VDSO_NAME_LINUX_2_6_15, VDSO_HASH_LINUX_2_6_15, + VDSO_NAME_LINUX_2_6_29, VDSO_HASH_LINUX_2_6_29, + VDSO_NAME_LINUX_4_15, VDSO_HASH_LINUX_4_15): Remove defines. + (get_vdso_symbol): New function. + 2019-09-17 Chung-Lin Tang <cltang@codesourcery.com> * sysdeps/generic/hp-timing-common.h (HP_TIMING_PRINT): Correct diff --git a/sysdeps/unix/make-syscalls.sh b/sysdeps/unix/make-syscalls.sh index 6a5c10d54e..b49e6b6305 100644 --- a/sysdeps/unix/make-syscalls.sh +++ b/sysdeps/unix/make-syscalls.sh @@ -283,10 +283,9 @@ while read file srcfile caller syscall args strong weak; do (echo '#define ${strong} __redirect_${strong}'; \\ echo '#include <dl-vdso.h>'; \\ echo '#undef ${strong}'; \\ - echo '#define vdso_ifunc_init() \\'; \\ - echo ' PREPARE_VERSION_KNOWN (symver, ${vdso_symver})'; \\ + echo '#define vdso_ifunc_init()'; \\ echo '__ifunc (__redirect_${strong}, ${strong},'; \\ - echo ' _dl_vdso_vsym ("${vdso_symbol}", &symver), void,'; \\ + echo ' get_vdso_symbol ("${vdso_symbol}"), void,'; \\ echo ' vdso_ifunc_init)'; \\ EOF # This is doing "hidden_def (${strong})", but the compiler diff --git a/sysdeps/unix/sysv/linux/aarch64/gettimeofday.c b/sysdeps/unix/sysv/linux/aarch64/gettimeofday.c index ccec52e363..1ec98bf161 100644 --- a/sysdeps/unix/sysv/linux/aarch64/gettimeofday.c +++ b/sysdeps/unix/sysv/linux/aarch64/gettimeofday.c @@ -20,12 +20,10 @@ putting it into *tv and *tz. If tz is null, *tz is not filled. Returns 0 on success, -1 on errors. */ +#include <sys/time.h> + #ifdef SHARED -# define __gettimeofday __redirect___gettimeofday -# include <sys/time.h> -# undef __gettimeofday -# define HAVE_VSYSCALL # include <dl-vdso.h> # include <sysdep-vdso.h> @@ -38,25 +36,14 @@ __gettimeofday_vsyscall (struct timeval *tv, struct timezone *tz) return INLINE_VSYSCALL (gettimeofday, 2, tv, tz); } -/* PREPARE_VERSION_KNOWN will need an __LP64__ ifdef when ILP32 support - goes in. See _libc_vdso_platform_setup in - sysdeps/unix/sysv/linux/aarch64/init-first.c. */ - -# undef INIT_ARCH -# define INIT_ARCH() \ - PREPARE_VERSION_KNOWN (linux_version, LINUX_2_6_39); \ - void *vdso_gettimeofday = \ - _dl_vdso_vsym ("__kernel_gettimeofday", &linux_version); - -libc_ifunc_hidden (__redirect___gettimeofday, __gettimeofday, - vdso_gettimeofday ?: (void *) __gettimeofday_vsyscall) - -__hidden_ver1 (__gettimeofday_vsyscall, __GI___gettimeofday, - __gettimeofday_vsyscall); +# define INIT_ARCH() +libc_ifunc_hidden (__gettimeofday, __gettimeofday, + (get_vdso_symbol ("__kernel_gettimeofday") + ?: __gettimeofday_vsyscall)) +libc_hidden_def (__gettimeofday) #else -# include <sys/time.h> # include <sysdep.h> int __gettimeofday (struct timeval *tv, struct timezone *tz) diff --git a/sysdeps/unix/sysv/linux/aarch64/init-first.c b/sysdeps/unix/sysv/linux/aarch64/init-first.c index 6ae2be38c5..16b28be835 100644 --- a/sysdeps/unix/sysv/linux/aarch64/init-first.c +++ b/sysdeps/unix/sysv/linux/aarch64/init-first.c @@ -26,21 +26,15 @@ int (*VDSO_SYMBOL(clock_getres)) (clockid_t, struct timespec *); static inline void _libc_vdso_platform_setup (void) { -#ifdef __LP64__ - PREPARE_VERSION_KNOWN (linux_version, LINUX_2_6_39); -#else - PREPARE_VERSION_KNOWN (linux_version, LINUX_4_9); -#endif - - void *p = _dl_vdso_vsym ("__kernel_gettimeofday", &linux_version); + void *p = get_vdso_symbol ("__kernel_gettimeofday"); PTR_MANGLE (p); VDSO_SYMBOL(gettimeofday) = p; - p = _dl_vdso_vsym ("__kernel_clock_gettime", &linux_version); + p = get_vdso_symbol ("__kernel_clock_gettime"); PTR_MANGLE (p); VDSO_SYMBOL(clock_gettime) = p; - p = _dl_vdso_vsym ("__kernel_clock_getres", &linux_version); + p = get_vdso_symbol ("__kernel_clock_getres"); PTR_MANGLE (p); VDSO_SYMBOL(clock_getres) = p; } diff --git a/sysdeps/unix/sysv/linux/aarch64/sysdep.h b/sysdeps/unix/sysv/linux/aarch64/sysdep.h index 95cb7eb4ab..37d70ca4af 100644 --- a/sysdeps/unix/sysv/linux/aarch64/sysdep.h +++ b/sysdeps/unix/sysv/linux/aarch64/sysdep.h @@ -151,6 +151,13 @@ #else /* not __ASSEMBLER__ */ +# ifdef __LP64__ +# define VDSO_NAME "LINUX_2.6.39" +# define VDSO_HASH 123718537 +# else +# define VDSO_NAME "LINUX_4.9" +# define VDSO_HASH 61765625 +# endif /* List of system calls which are supported as vsyscalls. */ # define HAVE_CLOCK_GETRES_VSYSCALL 1 diff --git a/sysdeps/unix/sysv/linux/arm/init-first.c b/sysdeps/unix/sysv/linux/arm/init-first.c index d2453dde7a..56ae7393c4 100644 --- a/sysdeps/unix/sysv/linux/arm/init-first.c +++ b/sysdeps/unix/sysv/linux/arm/init-first.c @@ -27,13 +27,11 @@ int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); static inline void _libc_vdso_platform_setup (void) { - PREPARE_VERSION_KNOWN (linux26, LINUX_2_6); - - void *p = _dl_vdso_vsym ("__vdso_gettimeofday", &linux26); + void *p = get_vdso_symbol ("__vdso_gettimeofday"); PTR_MANGLE (p); VDSO_SYMBOL (gettimeofday) = p; - p = _dl_vdso_vsym ("__vdso_clock_gettime", &linux26); + p = get_vdso_symbol ("__vdso_clock_gettime"); PTR_MANGLE (p); VDSO_SYMBOL (clock_gettime) = p; } diff --git a/sysdeps/unix/sysv/linux/arm/sysdep.h b/sysdeps/unix/sysv/linux/arm/sysdep.h index ce42f352fa..9eea48de14 100644 --- a/sysdeps/unix/sysv/linux/arm/sysdep.h +++ b/sysdeps/unix/sysv/linux/arm/sysdep.h @@ -388,6 +388,9 @@ __local_syscall_error: \ #undef INTERNAL_SYSCALL_ERRNO #define INTERNAL_SYSCALL_ERRNO(val, err) (-(val)) +#define VDSO_NAME "LINUX_2.6" +#define VDSO_HASH 61765110 + /* List of system calls which are supported as vsyscalls. */ #define HAVE_CLOCK_GETTIME_VSYSCALL 1 #define HAVE_GETTIMEOFDAY_VSYSCALL 1 diff --git a/sysdeps/unix/sysv/linux/dl-vdso.h b/sysdeps/unix/sysv/linux/dl-vdso.h index c37c83d71f..5e40eac3ee 100644 --- a/sysdeps/unix/sysv/linux/dl-vdso.h +++ b/sysdeps/unix/sysv/linux/dl-vdso.h @@ -22,40 +22,18 @@ #include <assert.h> #include <ldsodefs.h> #include <dl-hash.h> - -/* Create version number record for lookup. */ -static inline struct r_found_version -prepare_version_base (const char *name, ElfW(Word) hash) -{ - assert (hash == _dl_elf_hash (name)); - return (struct r_found_version) { name, hash, 1, NULL }; -} -#define prepare_version(vname) \ - prepare_version_base (VDSO_NAME_##vname, VDSO_HASH_##vname) - -/* Use this for the known version sets defined below, where we - record their precomputed hash values only once, in this file. */ -#define PREPARE_VERSION_KNOWN(var, vname) \ - struct r_found_version var = prepare_version (vname); - -#define VDSO_NAME_LINUX_2_6 "LINUX_2.6" -#define VDSO_HASH_LINUX_2_6 61765110 -#define VDSO_NAME_LINUX_2_6_15 "LINUX_2.6.15" -#define VDSO_HASH_LINUX_2_6_15 123718565 -#define VDSO_NAME_LINUX_2_6_29 "LINUX_2.6.29" -#define VDSO_HASH_LINUX_2_6_29 123718585 -#define VDSO_NAME_LINUX_2_6_39 "LINUX_2.6.39" -#define VDSO_HASH_LINUX_2_6_39 123718537 -#define VDSO_NAME_LINUX_4 "LINUX_4" -#define VDSO_HASH_LINUX_4 14921332 -#define VDSO_NAME_LINUX_4_9 "LINUX_4.9" -#define VDSO_HASH_LINUX_4_9 61765625 -#define VDSO_NAME_LINUX_4_15 "LINUX_4.15" -#define VDSO_HASH_LINUX_4_15 182943605 +#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; +static inline void * +get_vdso_symbol (const char *symbol) +{ + struct r_found_version rfv = { VDSO_NAME, VDSO_HASH, 1, NULL }; + return _dl_vdso_vsym (symbol, &rfv); +} + #endif /* dl-vdso.h */ diff --git a/sysdeps/unix/sysv/linux/i386/init-first.c b/sysdeps/unix/sysv/linux/i386/init-first.c index 3453738530..e785664637 100644 --- a/sysdeps/unix/sysv/linux/i386/init-first.c +++ b/sysdeps/unix/sysv/linux/i386/init-first.c @@ -34,9 +34,7 @@ clock_gettime_syscall (clockid_t id, struct timespec *tp) static inline void __vdso_platform_setup (void) { - PREPARE_VERSION_KNOWN (linux26, LINUX_2_6); - - void *p = _dl_vdso_vsym ("__vdso_clock_gettime", &linux26); + void *p = get_vdso_symbol ("__vdso_clock_gettime"); if (p == NULL) p = clock_gettime_syscall; PTR_MANGLE (p); diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.h b/sysdeps/unix/sysv/linux/i386/sysdep.h index 0e76b6b111..cdba552af7 100644 --- a/sysdeps/unix/sysv/linux/i386/sysdep.h +++ b/sysdeps/unix/sysv/linux/i386/sysdep.h @@ -309,6 +309,9 @@ struct libc_do_syscall_args #define INLINE_SYSCALL_ERROR_RETURN_VALUE(resultvar) \ __syscall_error (-(resultvar)) +# define VDSO_NAME "LINUX_2.6" +# define VDSO_HASH 61765110 + /* List of system calls which are supported as vsyscalls. */ # define HAVE_CLOCK_GETTIME_VSYSCALL 1 # define HAVE_GETTIMEOFDAY_VSYSCALL 1 diff --git a/sysdeps/unix/sysv/linux/mips/init-first.c b/sysdeps/unix/sysv/linux/mips/init-first.c index ea5433a9e4..05cf438eb1 100644 --- a/sysdeps/unix/sysv/linux/mips/init-first.c +++ b/sysdeps/unix/sysv/linux/mips/init-first.c @@ -26,13 +26,11 @@ int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); static inline void _libc_vdso_platform_setup (void) { - PREPARE_VERSION_KNOWN (linux26, LINUX_2_6); - - void *p = _dl_vdso_vsym ("__vdso_gettimeofday", &linux26); + void *p = get_vdso_symbol ("__vdso_gettimeofday"); PTR_MANGLE (p); VDSO_SYMBOL (gettimeofday) = p; - p = _dl_vdso_vsym ("__vdso_clock_gettime", &linux26); + p = get_vdso_symbol ("__vdso_clock_gettime"); PTR_MANGLE (p); VDSO_SYMBOL (clock_gettime) = p; } diff --git a/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h b/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h index f5312e8e2a..09d9040efd 100644 --- a/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h +++ b/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h @@ -19,6 +19,7 @@ #define _LINUX_MIPS_MIPS32_SYSDEP_H 1 /* There is some commonality. */ +#include <sysdeps/unix/sysv/linux/mips/sysdep.h> #include <sysdeps/unix/sysv/linux/sysdep.h> #include <sysdeps/unix/mips/mips32/sysdep.h> @@ -360,10 +361,6 @@ libc_hidden_proto (__mips_syscall7, nomips16) _ret; \ }) -/* List of system calls which are supported as vsyscalls. */ -#define HAVE_CLOCK_GETTIME_VSYSCALL 1 -#define HAVE_GETTIMEOFDAY_VSYSCALL 1 - #endif /* __ASSEMBLER__ */ /* Pointer mangling is not yet supported for MIPS. */ diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h b/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h index 0c32cc3851..c276b0086a 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h @@ -19,6 +19,7 @@ #define _LINUX_MIPS_SYSDEP_H 1 /* There is some commonality. */ +#include <sysdeps/unix/sysv/linux/mips/sysdep.h> #include <sysdeps/unix/sysv/linux/sysdep.h> #include <sysdeps/unix/mips/mips64/n32/sysdep.h> @@ -308,10 +309,6 @@ _ret; \ }) -/* List of system calls which are supported as vsyscalls. */ -#define HAVE_CLOCK_GETTIME_VSYSCALL 1 -#define HAVE_GETTIMEOFDAY_VSYSCALL 1 - #endif /* __ASSEMBLER__ */ /* Pointer mangling is not yet supported for MIPS. */ diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h b/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h index c2fe86d1cd..9d574c720a 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h @@ -19,6 +19,7 @@ #define _LINUX_MIPS_SYSDEP_H 1 /* There is some commonality. */ +#include <sysdeps/unix/sysv/linux/mips/sysdep.h> #include <sysdeps/unix/sysv/linux/sysdep.h> #include <sysdeps/unix/mips/mips64/n64/sysdep.h> @@ -304,10 +305,6 @@ _ret; \ }) -/* List of system calls which are supported as vsyscalls. */ -#define HAVE_CLOCK_GETTIME_VSYSCALL 1 -#define HAVE_GETTIMEOFDAY_VSYSCALL 1 - #endif /* __ASSEMBLER__ */ /* Pointer mangling is not yet supported for MIPS. */ diff --git a/sysdeps/unix/sysv/linux/mips/sysdep.h b/sysdeps/unix/sysv/linux/mips/sysdep.h new file mode 100644 index 0000000000..0f3399f82d --- /dev/null +++ b/sysdeps/unix/sysv/linux/mips/sysdep.h @@ -0,0 +1,24 @@ +/* Syscall definitions, Linux MIPS generic version. + |
