Message ID | 1432933107-21117-1-git-send-email-nathan_lynch@codesourcery.com |
---|---|
State | New |
Headers | show |
On Fri, 29 May 2015, Nathan Lynch wrote: > diff --git a/sysdeps/unix/sysv/linux/arm/Versions b/sysdeps/unix/sysv/linux/arm/Versions > index a251b0fd7d87..7bc5936372bb 100644 > --- a/sysdeps/unix/sysv/linux/arm/Versions > +++ b/sysdeps/unix/sysv/linux/arm/Versions > @@ -10,5 +10,7 @@ libc { > GLIBC_PRIVATE { > # A copy of sigaction lives in libpthread, and needs these. > __default_sa_restorer; __default_rt_sa_restorer; > + __vdso_clock_gettime; > + __vdso_gettimeofday; That existing comment certainly doesn't explain why the VDSO symbols are exported. Now, __vdso_clock_gettime is presumably exported (on this and other architectures) because of an INTERNAL_VSYSCALL use in nptl/pthread_cond_timedwait.c. But why do you need an export of __vdso_gettimeofday that no other architecture has? > + void *p = _dl_vdso_vsym ("__vdso_gettimeofday", &linux26); > + PTR_MANGLE (p); > + VDSO_SYMBOL(gettimeofday) = p; > + > + p = _dl_vdso_vsym ("__vdso_clock_gettime", &linux26); > + PTR_MANGLE (p); > + VDSO_SYMBOL(clock_gettime) = p; Missing space before '(' in calls to VDSO_SYMBOL.
On 06/01/2015 02:59 PM, Joseph Myers wrote: > On Fri, 29 May 2015, Nathan Lynch wrote: > >> diff --git a/sysdeps/unix/sysv/linux/arm/Versions b/sysdeps/unix/sysv/linux/arm/Versions >> index a251b0fd7d87..7bc5936372bb 100644 >> --- a/sysdeps/unix/sysv/linux/arm/Versions >> +++ b/sysdeps/unix/sysv/linux/arm/Versions >> @@ -10,5 +10,7 @@ libc { >> GLIBC_PRIVATE { >> # A copy of sigaction lives in libpthread, and needs these. >> __default_sa_restorer; __default_rt_sa_restorer; >> + __vdso_clock_gettime; >> + __vdso_gettimeofday; > > That existing comment certainly doesn't explain why the VDSO symbols are > exported. > > Now, __vdso_clock_gettime is presumably exported (on this and other > architectures) because of an INTERNAL_VSYSCALL use in > nptl/pthread_cond_timedwait.c. But why do you need an export of > __vdso_gettimeofday that no other architecture has? I confess I didn't quite understand what this was for. Your comments clarify the situation for me -- the export of __vdso_gettimeofday is unneeded. I will remove it, and add explanation for the export of __vdso_clock_gettime. >> + void *p = _dl_vdso_vsym ("__vdso_gettimeofday", &linux26); >> + PTR_MANGLE (p); >> + VDSO_SYMBOL(gettimeofday) = p; >> + >> + p = _dl_vdso_vsym ("__vdso_clock_gettime", &linux26); >> + PTR_MANGLE (p); >> + VDSO_SYMBOL(clock_gettime) = p; > > Missing space before '(' in calls to VDSO_SYMBOL. I will fix these.
diff --git a/sysdeps/unix/sysv/linux/arm/Makefile b/sysdeps/unix/sysv/linux/arm/Makefile index 50410b67b5fc..270cb73f70e5 100644 --- a/sysdeps/unix/sysv/linux/arm/Makefile +++ b/sysdeps/unix/sysv/linux/arm/Makefile @@ -1,4 +1,5 @@ ifeq ($(subdir),elf) +sysdep_routines += dl-vdso sysdep-rtld-routines += aeabi_read_tp libc-do-syscall endif diff --git a/sysdeps/unix/sysv/linux/arm/Versions b/sysdeps/unix/sysv/linux/arm/Versions index a251b0fd7d87..7bc5936372bb 100644 --- a/sysdeps/unix/sysv/linux/arm/Versions +++ b/sysdeps/unix/sysv/linux/arm/Versions @@ -10,5 +10,7 @@ libc { GLIBC_PRIVATE { # A copy of sigaction lives in libpthread, and needs these. __default_sa_restorer; __default_rt_sa_restorer; + __vdso_clock_gettime; + __vdso_gettimeofday; } } diff --git a/sysdeps/unix/sysv/linux/arm/init-first.c b/sysdeps/unix/sysv/linux/arm/init-first.c new file mode 100644 index 000000000000..f4868b834cf1 --- /dev/null +++ b/sysdeps/unix/sysv/linux/arm/init-first.c @@ -0,0 +1,43 @@ +/* Copyright (C) 2015 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/>. */ + +#ifdef SHARED +# 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) +{ + PREPARE_VERSION_KNOWN (linux26, LINUX_2_6); + + void *p = _dl_vdso_vsym ("__vdso_gettimeofday", &linux26); + PTR_MANGLE (p); + VDSO_SYMBOL(gettimeofday) = p; + + p = _dl_vdso_vsym ("__vdso_clock_gettime", &linux26); + PTR_MANGLE (p); + VDSO_SYMBOL(clock_gettime) = p; +} + +# define VDSO_SETUP _libc_vdso_platform_setup +#endif + +#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 new file mode 100644 index 000000000000..2ebcc62cd284 --- /dev/null +++ b/sysdeps/unix/sysv/linux/arm/libc-vdso.h @@ -0,0 +1,32 @@ +/* Copyright (C) 2015 Free Software Foundation, Inc. + + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <http://www.gnu.org/licenses/>. */ + +#ifndef _LIBC_VDSO_H +#define _LIBC_VDSO_H + +#ifdef SHARED + +# 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 + +#endif /* _LIBC_VDSO_H */ diff --git a/sysdeps/unix/sysv/linux/arm/sysdep.h b/sysdeps/unix/sysv/linux/arm/sysdep.h index 37eac192b1e2..200f77a62ef1 100644 --- a/sysdeps/unix/sysv/linux/arm/sysdep.h +++ b/sysdeps/unix/sysv/linux/arm/sysdep.h @@ -387,6 +387,10 @@ __local_syscall_error: \ #undef INTERNAL_SYSCALL_ERRNO #define INTERNAL_SYSCALL_ERRNO(val, err) (-(val)) +/* List of system calls which are supported as vsyscalls. */ +#define HAVE_CLOCK_GETTIME_VSYSCALL 1 +#define HAVE_GETTIMEOFDAY_VSYSCALL 1 + #define LOAD_ARGS_0() #define ASM_ARGS_0 #define LOAD_ARGS_1(a1) \