Message ID | 553963C1.2080600@linaro.org |
---|---|
State | New |
Headers | show |
Ping. On 23-04-2015 18:27, Adhemerval Zanella wrote: > This patch removes the vsyscall usage for x86_64 port. As indicated > by kernel code comments [1], vsyscalls are a legacy ABI and its concept > is problematic: > > - It interferes with ASLR. > - It's awkward to write code that lives in kernel addresses but is > callable by userspace at fixed addresses. > - The whole concept is impossible for 32-bit compat userspace. > - UML cannot easily virtualize a vsyscall. > > The VDSO is a better approach for such functionality. Tested on i686, > x86_64, and x32. > > [1] arch/x86/kernel/vsyscall_64.c > > -- > > * sysdeps/unix/sysv/linux/i386/gettimeofday.c > (__gettimeofday_syscall): Remove. > * sysdeps/unix/sysv/linux/i386/time.c (__time_syscall): Remove. > * sysdeps/unix/sysv/linux/x86/gettimeofday.c (__gettimeofday_syscall): > Add function. > (gettimeofday_ifunc): Use __gettimeofday_syscall as fallback mechanism > if vDSO is not present. > * sysdeps/unix/sysv/linux/x86/time.c (__time_syscall): Add function. > (time_ifunc): Use __time_syscall as fallback mechanism if vDSO is not > present. > * sysdeps/unix/sysv/linux/x86_64/gettimeofday.c: Remove file. > * sysdeps/unix/sysv/linux/x86_64/time.c: Likewise. > > --- > > diff --git a/sysdeps/unix/sysv/linux/i386/gettimeofday.c b/sysdeps/unix/sysv/linux/i386/gettimeofday.c > index 3e00eb4..fdb0fab 100644 > --- a/sysdeps/unix/sysv/linux/i386/gettimeofday.c > +++ b/sysdeps/unix/sysv/linux/i386/gettimeofday.c > @@ -20,16 +20,6 @@ > > #ifdef SHARED > > -# include <dl-vdso.h> > -# include <errno.h> > - > -/* If the vDSO is not available we fall back on the syscall. */ > -static int > -__gettimeofday_syscall (struct timeval *tv, struct timezone *tz) > -{ > - return INLINE_SYSCALL (gettimeofday, 2, tv, tz); > -} > -# define GETTIMEOFAY_FALLBACK (void*) (&__gettimeofday_syscall) > # undef libc_ifunc_hidden_def > # define libc_ifunc_hidden_def(name) \ > libc_ifunc_hidden_def1 (__GI_##name, __gettimeofday_syscall) > diff --git a/sysdeps/unix/sysv/linux/i386/time.c b/sysdeps/unix/sysv/linux/i386/time.c > index e8a4e59..66b9a6c 100644 > --- a/sysdeps/unix/sysv/linux/i386/time.c > +++ b/sysdeps/unix/sysv/linux/i386/time.c > @@ -18,17 +18,6 @@ > > #ifdef SHARED > > -# include <dl-vdso.h> > -# include <errno.h> > - > -/* If the vDSO is not available we fall back on the old vsyscall. */ > -static time_t > -__time_syscall (time_t *t) > -{ > - INTERNAL_SYSCALL_DECL (err); > - return INTERNAL_SYSCALL (time, err, 1, t); > -} > -# define TIME_FALLBACK (void*) &__time_syscall > # undef libc_ifunc_hidden_def > # define libc_ifunc_hidden_def(name) \ > libc_ifunc_hidden_def1 (__GI_##name, __time_syscall) > diff --git a/sysdeps/unix/sysv/linux/x86/gettimeofday.c b/sysdeps/unix/sysv/linux/x86/gettimeofday.c > index c820fd7..c9cb6ea 100644 > --- a/sysdeps/unix/sysv/linux/x86/gettimeofday.c > +++ b/sysdeps/unix/sysv/linux/x86/gettimeofday.c > @@ -21,6 +21,14 @@ > #ifdef SHARED > > # include <dl-vdso.h> > +# include <errno.h> > + > +/* If the vDSO is not available we fall back on the syscall. */ > +static int > +__gettimeofday_syscall (struct timeval *tv, struct timezone *tz) > +{ > + return INLINE_SYSCALL (gettimeofday, 2, tv, tz); > +} > > void *gettimeofday_ifunc (void) __asm__ ("__gettimeofday"); > > @@ -31,7 +39,7 @@ gettimeofday_ifunc (void) > > /* If the vDSO is not available we fall back on the old vsyscall. */ > return (_dl_vdso_vsym ("__vdso_gettimeofday", &linux26) > - ?: GETTIMEOFAY_FALLBACK); > + ?: (void*) (&__gettimeofday_syscall)); > } > asm (".type __gettimeofday, %gnu_indirect_function"); > > diff --git a/sysdeps/unix/sysv/linux/x86/time.c b/sysdeps/unix/sysv/linux/x86/time.c > index 1ab9248..3459e17 100644 > --- a/sysdeps/unix/sysv/linux/x86/time.c > +++ b/sysdeps/unix/sysv/linux/x86/time.c > @@ -21,6 +21,15 @@ > #ifdef SHARED > > #include <dl-vdso.h> > +#include <errno.h> > + > +/* If the vDSO is not available we fall back on the old vsyscall. */ > +static time_t > +__time_syscall (time_t *t) > +{ > + INTERNAL_SYSCALL_DECL (err); > + return INTERNAL_SYSCALL (time, err, 1, t); > +} > > void *time_ifunc (void) __asm__ ("time"); > > @@ -29,7 +38,8 @@ time_ifunc (void) > { > PREPARE_VERSION_KNOWN (linux26, LINUX_2_6); > > - return _dl_vdso_vsym ("__vdso_time", &linux26) ?: TIME_FALLBACK; > + return _dl_vdso_vsym ("__vdso_time", &linux26) > + ?: (void*) &__time_syscall; > } > asm (".type time, %gnu_indirect_function"); > > diff --git a/sysdeps/unix/sysv/linux/x86_64/gettimeofday.c b/sysdeps/unix/sysv/linux/x86_64/gettimeofday.c > deleted file mode 100644 > index daa14de..0000000 > --- a/sysdeps/unix/sysv/linux/x86_64/gettimeofday.c > +++ /dev/null > @@ -1,26 +0,0 @@ > -/* Copyright (C) 2002-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/>. */ > - > -#include <sys/time.h> > - > -#ifdef SHARED > -/* If the vDSO is not available we fall back on the old vsyscall. */ > -# define VSYSCALL_ADDR_vgettimeofday 0xffffffffff600000ul > -# define GETTIMEOFAY_FALLBACK (void*)VSYSCALL_ADDR_vgettimeofday > -#endif > - > -#include <sysdeps/unix/sysv/linux/x86/gettimeofday.c> > diff --git a/sysdeps/unix/sysv/linux/x86_64/time.c b/sysdeps/unix/sysv/linux/x86_64/time.c > deleted file mode 100644 > index 6ceb819..0000000 > --- a/sysdeps/unix/sysv/linux/x86_64/time.c > +++ /dev/null > @@ -1,24 +0,0 @@ > -/* Copyright (C) 2001-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 > -/* If the vDSO is not available we fall back on the old vsyscall. */ > -#define VSYSCALL_ADDR_vtime 0xffffffffff600400 > -#define TIME_FALLBACK (void*)VSYSCALL_ADDR_vtime > -#endif > - > -#include <sysdeps/unix/sysv/linux/x86/time.c> >
Ping. On 11-05-2015 16:12, Adhemerval Zanella wrote: > Ping. > > On 23-04-2015 18:27, Adhemerval Zanella wrote: >> This patch removes the vsyscall usage for x86_64 port. As indicated >> by kernel code comments [1], vsyscalls are a legacy ABI and its concept >> is problematic: >> >> - It interferes with ASLR. >> - It's awkward to write code that lives in kernel addresses but is >> callable by userspace at fixed addresses. >> - The whole concept is impossible for 32-bit compat userspace. >> - UML cannot easily virtualize a vsyscall. >> >> The VDSO is a better approach for such functionality. Tested on i686, >> x86_64, and x32. >> >> [1] arch/x86/kernel/vsyscall_64.c >> >> -- >> >> * sysdeps/unix/sysv/linux/i386/gettimeofday.c >> (__gettimeofday_syscall): Remove. >> * sysdeps/unix/sysv/linux/i386/time.c (__time_syscall): Remove. >> * sysdeps/unix/sysv/linux/x86/gettimeofday.c (__gettimeofday_syscall): >> Add function. >> (gettimeofday_ifunc): Use __gettimeofday_syscall as fallback mechanism >> if vDSO is not present. >> * sysdeps/unix/sysv/linux/x86/time.c (__time_syscall): Add function. >> (time_ifunc): Use __time_syscall as fallback mechanism if vDSO is not >> present. >> * sysdeps/unix/sysv/linux/x86_64/gettimeofday.c: Remove file. >> * sysdeps/unix/sysv/linux/x86_64/time.c: Likewise. >> >> --- >> >> diff --git a/sysdeps/unix/sysv/linux/i386/gettimeofday.c b/sysdeps/unix/sysv/linux/i386/gettimeofday.c >> index 3e00eb4..fdb0fab 100644 >> --- a/sysdeps/unix/sysv/linux/i386/gettimeofday.c >> +++ b/sysdeps/unix/sysv/linux/i386/gettimeofday.c >> @@ -20,16 +20,6 @@ >> >> #ifdef SHARED >> >> -# include <dl-vdso.h> >> -# include <errno.h> >> - >> -/* If the vDSO is not available we fall back on the syscall. */ >> -static int >> -__gettimeofday_syscall (struct timeval *tv, struct timezone *tz) >> -{ >> - return INLINE_SYSCALL (gettimeofday, 2, tv, tz); >> -} >> -# define GETTIMEOFAY_FALLBACK (void*) (&__gettimeofday_syscall) >> # undef libc_ifunc_hidden_def >> # define libc_ifunc_hidden_def(name) \ >> libc_ifunc_hidden_def1 (__GI_##name, __gettimeofday_syscall) >> diff --git a/sysdeps/unix/sysv/linux/i386/time.c b/sysdeps/unix/sysv/linux/i386/time.c >> index e8a4e59..66b9a6c 100644 >> --- a/sysdeps/unix/sysv/linux/i386/time.c >> +++ b/sysdeps/unix/sysv/linux/i386/time.c >> @@ -18,17 +18,6 @@ >> >> #ifdef SHARED >> >> -# include <dl-vdso.h> >> -# include <errno.h> >> - >> -/* If the vDSO is not available we fall back on the old vsyscall. */ >> -static time_t >> -__time_syscall (time_t *t) >> -{ >> - INTERNAL_SYSCALL_DECL (err); >> - return INTERNAL_SYSCALL (time, err, 1, t); >> -} >> -# define TIME_FALLBACK (void*) &__time_syscall >> # undef libc_ifunc_hidden_def >> # define libc_ifunc_hidden_def(name) \ >> libc_ifunc_hidden_def1 (__GI_##name, __time_syscall) >> diff --git a/sysdeps/unix/sysv/linux/x86/gettimeofday.c b/sysdeps/unix/sysv/linux/x86/gettimeofday.c >> index c820fd7..c9cb6ea 100644 >> --- a/sysdeps/unix/sysv/linux/x86/gettimeofday.c >> +++ b/sysdeps/unix/sysv/linux/x86/gettimeofday.c >> @@ -21,6 +21,14 @@ >> #ifdef SHARED >> >> # include <dl-vdso.h> >> +# include <errno.h> >> + >> +/* If the vDSO is not available we fall back on the syscall. */ >> +static int >> +__gettimeofday_syscall (struct timeval *tv, struct timezone *tz) >> +{ >> + return INLINE_SYSCALL (gettimeofday, 2, tv, tz); >> +} >> >> void *gettimeofday_ifunc (void) __asm__ ("__gettimeofday"); >> >> @@ -31,7 +39,7 @@ gettimeofday_ifunc (void) >> >> /* If the vDSO is not available we fall back on the old vsyscall. */ >> return (_dl_vdso_vsym ("__vdso_gettimeofday", &linux26) >> - ?: GETTIMEOFAY_FALLBACK); >> + ?: (void*) (&__gettimeofday_syscall)); >> } >> asm (".type __gettimeofday, %gnu_indirect_function"); >> >> diff --git a/sysdeps/unix/sysv/linux/x86/time.c b/sysdeps/unix/sysv/linux/x86/time.c >> index 1ab9248..3459e17 100644 >> --- a/sysdeps/unix/sysv/linux/x86/time.c >> +++ b/sysdeps/unix/sysv/linux/x86/time.c >> @@ -21,6 +21,15 @@ >> #ifdef SHARED >> >> #include <dl-vdso.h> >> +#include <errno.h> >> + >> +/* If the vDSO is not available we fall back on the old vsyscall. */ >> +static time_t >> +__time_syscall (time_t *t) >> +{ >> + INTERNAL_SYSCALL_DECL (err); >> + return INTERNAL_SYSCALL (time, err, 1, t); >> +} >> >> void *time_ifunc (void) __asm__ ("time"); >> >> @@ -29,7 +38,8 @@ time_ifunc (void) >> { >> PREPARE_VERSION_KNOWN (linux26, LINUX_2_6); >> >> - return _dl_vdso_vsym ("__vdso_time", &linux26) ?: TIME_FALLBACK; >> + return _dl_vdso_vsym ("__vdso_time", &linux26) >> + ?: (void*) &__time_syscall; >> } >> asm (".type time, %gnu_indirect_function"); >> >> diff --git a/sysdeps/unix/sysv/linux/x86_64/gettimeofday.c b/sysdeps/unix/sysv/linux/x86_64/gettimeofday.c >> deleted file mode 100644 >> index daa14de..0000000 >> --- a/sysdeps/unix/sysv/linux/x86_64/gettimeofday.c >> +++ /dev/null >> @@ -1,26 +0,0 @@ >> -/* Copyright (C) 2002-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/>. */ >> - >> -#include <sys/time.h> >> - >> -#ifdef SHARED >> -/* If the vDSO is not available we fall back on the old vsyscall. */ >> -# define VSYSCALL_ADDR_vgettimeofday 0xffffffffff600000ul >> -# define GETTIMEOFAY_FALLBACK (void*)VSYSCALL_ADDR_vgettimeofday >> -#endif >> - >> -#include <sysdeps/unix/sysv/linux/x86/gettimeofday.c> >> diff --git a/sysdeps/unix/sysv/linux/x86_64/time.c b/sysdeps/unix/sysv/linux/x86_64/time.c >> deleted file mode 100644 >> index 6ceb819..0000000 >> --- a/sysdeps/unix/sysv/linux/x86_64/time.c >> +++ /dev/null >> @@ -1,24 +0,0 @@ >> -/* Copyright (C) 2001-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 >> -/* If the vDSO is not available we fall back on the old vsyscall. */ >> -#define VSYSCALL_ADDR_vtime 0xffffffffff600400 >> -#define TIME_FALLBACK (void*)VSYSCALL_ADDR_vtime >> -#endif >> - >> -#include <sysdeps/unix/sysv/linux/x86/time.c> >>
I will commit it soon if noone opposes it. On 05-06-2015 15:59, Adhemerval Zanella wrote: > Ping. > > On 11-05-2015 16:12, Adhemerval Zanella wrote: >> Ping. >> >> On 23-04-2015 18:27, Adhemerval Zanella wrote: >>> This patch removes the vsyscall usage for x86_64 port. As indicated >>> by kernel code comments [1], vsyscalls are a legacy ABI and its concept >>> is problematic: >>> >>> - It interferes with ASLR. >>> - It's awkward to write code that lives in kernel addresses but is >>> callable by userspace at fixed addresses. >>> - The whole concept is impossible for 32-bit compat userspace. >>> - UML cannot easily virtualize a vsyscall. >>> >>> The VDSO is a better approach for such functionality. Tested on i686, >>> x86_64, and x32. >>> >>> [1] arch/x86/kernel/vsyscall_64.c >>> >>> -- >>> >>> * sysdeps/unix/sysv/linux/i386/gettimeofday.c >>> (__gettimeofday_syscall): Remove. >>> * sysdeps/unix/sysv/linux/i386/time.c (__time_syscall): Remove. >>> * sysdeps/unix/sysv/linux/x86/gettimeofday.c (__gettimeofday_syscall): >>> Add function. >>> (gettimeofday_ifunc): Use __gettimeofday_syscall as fallback mechanism >>> if vDSO is not present. >>> * sysdeps/unix/sysv/linux/x86/time.c (__time_syscall): Add function. >>> (time_ifunc): Use __time_syscall as fallback mechanism if vDSO is not >>> present. >>> * sysdeps/unix/sysv/linux/x86_64/gettimeofday.c: Remove file. >>> * sysdeps/unix/sysv/linux/x86_64/time.c: Likewise. >>> >>> --- >>> >>> diff --git a/sysdeps/unix/sysv/linux/i386/gettimeofday.c b/sysdeps/unix/sysv/linux/i386/gettimeofday.c >>> index 3e00eb4..fdb0fab 100644 >>> --- a/sysdeps/unix/sysv/linux/i386/gettimeofday.c >>> +++ b/sysdeps/unix/sysv/linux/i386/gettimeofday.c >>> @@ -20,16 +20,6 @@ >>> >>> #ifdef SHARED >>> >>> -# include <dl-vdso.h> >>> -# include <errno.h> >>> - >>> -/* If the vDSO is not available we fall back on the syscall. */ >>> -static int >>> -__gettimeofday_syscall (struct timeval *tv, struct timezone *tz) >>> -{ >>> - return INLINE_SYSCALL (gettimeofday, 2, tv, tz); >>> -} >>> -# define GETTIMEOFAY_FALLBACK (void*) (&__gettimeofday_syscall) >>> # undef libc_ifunc_hidden_def >>> # define libc_ifunc_hidden_def(name) \ >>> libc_ifunc_hidden_def1 (__GI_##name, __gettimeofday_syscall) >>> diff --git a/sysdeps/unix/sysv/linux/i386/time.c b/sysdeps/unix/sysv/linux/i386/time.c >>> index e8a4e59..66b9a6c 100644 >>> --- a/sysdeps/unix/sysv/linux/i386/time.c >>> +++ b/sysdeps/unix/sysv/linux/i386/time.c >>> @@ -18,17 +18,6 @@ >>> >>> #ifdef SHARED >>> >>> -# include <dl-vdso.h> >>> -# include <errno.h> >>> - >>> -/* If the vDSO is not available we fall back on the old vsyscall. */ >>> -static time_t >>> -__time_syscall (time_t *t) >>> -{ >>> - INTERNAL_SYSCALL_DECL (err); >>> - return INTERNAL_SYSCALL (time, err, 1, t); >>> -} >>> -# define TIME_FALLBACK (void*) &__time_syscall >>> # undef libc_ifunc_hidden_def >>> # define libc_ifunc_hidden_def(name) \ >>> libc_ifunc_hidden_def1 (__GI_##name, __time_syscall) >>> diff --git a/sysdeps/unix/sysv/linux/x86/gettimeofday.c b/sysdeps/unix/sysv/linux/x86/gettimeofday.c >>> index c820fd7..c9cb6ea 100644 >>> --- a/sysdeps/unix/sysv/linux/x86/gettimeofday.c >>> +++ b/sysdeps/unix/sysv/linux/x86/gettimeofday.c >>> @@ -21,6 +21,14 @@ >>> #ifdef SHARED >>> >>> # include <dl-vdso.h> >>> +# include <errno.h> >>> + >>> +/* If the vDSO is not available we fall back on the syscall. */ >>> +static int >>> +__gettimeofday_syscall (struct timeval *tv, struct timezone *tz) >>> +{ >>> + return INLINE_SYSCALL (gettimeofday, 2, tv, tz); >>> +} >>> >>> void *gettimeofday_ifunc (void) __asm__ ("__gettimeofday"); >>> >>> @@ -31,7 +39,7 @@ gettimeofday_ifunc (void) >>> >>> /* If the vDSO is not available we fall back on the old vsyscall. */ >>> return (_dl_vdso_vsym ("__vdso_gettimeofday", &linux26) >>> - ?: GETTIMEOFAY_FALLBACK); >>> + ?: (void*) (&__gettimeofday_syscall)); >>> } >>> asm (".type __gettimeofday, %gnu_indirect_function"); >>> >>> diff --git a/sysdeps/unix/sysv/linux/x86/time.c b/sysdeps/unix/sysv/linux/x86/time.c >>> index 1ab9248..3459e17 100644 >>> --- a/sysdeps/unix/sysv/linux/x86/time.c >>> +++ b/sysdeps/unix/sysv/linux/x86/time.c >>> @@ -21,6 +21,15 @@ >>> #ifdef SHARED >>> >>> #include <dl-vdso.h> >>> +#include <errno.h> >>> + >>> +/* If the vDSO is not available we fall back on the old vsyscall. */ >>> +static time_t >>> +__time_syscall (time_t *t) >>> +{ >>> + INTERNAL_SYSCALL_DECL (err); >>> + return INTERNAL_SYSCALL (time, err, 1, t); >>> +} >>> >>> void *time_ifunc (void) __asm__ ("time"); >>> >>> @@ -29,7 +38,8 @@ time_ifunc (void) >>> { >>> PREPARE_VERSION_KNOWN (linux26, LINUX_2_6); >>> >>> - return _dl_vdso_vsym ("__vdso_time", &linux26) ?: TIME_FALLBACK; >>> + return _dl_vdso_vsym ("__vdso_time", &linux26) >>> + ?: (void*) &__time_syscall; >>> } >>> asm (".type time, %gnu_indirect_function"); >>> >>> diff --git a/sysdeps/unix/sysv/linux/x86_64/gettimeofday.c b/sysdeps/unix/sysv/linux/x86_64/gettimeofday.c >>> deleted file mode 100644 >>> index daa14de..0000000 >>> --- a/sysdeps/unix/sysv/linux/x86_64/gettimeofday.c >>> +++ /dev/null >>> @@ -1,26 +0,0 @@ >>> -/* Copyright (C) 2002-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/>. */ >>> - >>> -#include <sys/time.h> >>> - >>> -#ifdef SHARED >>> -/* If the vDSO is not available we fall back on the old vsyscall. */ >>> -# define VSYSCALL_ADDR_vgettimeofday 0xffffffffff600000ul >>> -# define GETTIMEOFAY_FALLBACK (void*)VSYSCALL_ADDR_vgettimeofday >>> -#endif >>> - >>> -#include <sysdeps/unix/sysv/linux/x86/gettimeofday.c> >>> diff --git a/sysdeps/unix/sysv/linux/x86_64/time.c b/sysdeps/unix/sysv/linux/x86_64/time.c >>> deleted file mode 100644 >>> index 6ceb819..0000000 >>> --- a/sysdeps/unix/sysv/linux/x86_64/time.c >>> +++ /dev/null >>> @@ -1,24 +0,0 @@ >>> -/* Copyright (C) 2001-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 >>> -/* If the vDSO is not available we fall back on the old vsyscall. */ >>> -#define VSYSCALL_ADDR_vtime 0xffffffffff600400 >>> -#define TIME_FALLBACK (void*)VSYSCALL_ADDR_vtime >>> -#endif >>> - >>> -#include <sysdeps/unix/sysv/linux/x86/time.c> >>>
diff --git a/sysdeps/unix/sysv/linux/i386/gettimeofday.c b/sysdeps/unix/sysv/linux/i386/gettimeofday.c index 3e00eb4..fdb0fab 100644 --- a/sysdeps/unix/sysv/linux/i386/gettimeofday.c +++ b/sysdeps/unix/sysv/linux/i386/gettimeofday.c @@ -20,16 +20,6 @@ #ifdef SHARED -# include <dl-vdso.h> -# include <errno.h> - -/* If the vDSO is not available we fall back on the syscall. */ -static int -__gettimeofday_syscall (struct timeval *tv, struct timezone *tz) -{ - return INLINE_SYSCALL (gettimeofday, 2, tv, tz); -} -# define GETTIMEOFAY_FALLBACK (void*) (&__gettimeofday_syscall) # undef libc_ifunc_hidden_def # define libc_ifunc_hidden_def(name) \ libc_ifunc_hidden_def1 (__GI_##name, __gettimeofday_syscall) diff --git a/sysdeps/unix/sysv/linux/i386/time.c b/sysdeps/unix/sysv/linux/i386/time.c index e8a4e59..66b9a6c 100644 --- a/sysdeps/unix/sysv/linux/i386/time.c +++ b/sysdeps/unix/sysv/linux/i386/time.c @@ -18,17 +18,6 @@ #ifdef SHARED -# include <dl-vdso.h> -# include <errno.h> - -/* If the vDSO is not available we fall back on the old vsyscall. */ -static time_t -__time_syscall (time_t *t) -{ - INTERNAL_SYSCALL_DECL (err); - return INTERNAL_SYSCALL (time, err, 1, t); -} -# define TIME_FALLBACK (void*) &__time_syscall # undef libc_ifunc_hidden_def # define libc_ifunc_hidden_def(name) \ libc_ifunc_hidden_def1 (__GI_##name, __time_syscall) diff --git a/sysdeps/unix/sysv/linux/x86/gettimeofday.c b/sysdeps/unix/sysv/linux/x86/gettimeofday.c index c820fd7..c9cb6ea 100644 --- a/sysdeps/unix/sysv/linux/x86/gettimeofday.c +++ b/sysdeps/unix/sysv/linux/x86/gettimeofday.c @@ -21,6 +21,14 @@ #ifdef SHARED # include <dl-vdso.h> +# include <errno.h> + +/* If the vDSO is not available we fall back on the syscall. */ +static int +__gettimeofday_syscall (struct timeval *tv, struct timezone *tz) +{ + return INLINE_SYSCALL (gettimeofday, 2, tv, tz); +} void *gettimeofday_ifunc (void) __asm__ ("__gettimeofday"); @@ -31,7 +39,7 @@ gettimeofday_ifunc (void) /* If the vDSO is not available we fall back on the old vsyscall. */ return (_dl_vdso_vsym ("__vdso_gettimeofday", &linux26) - ?: GETTIMEOFAY_FALLBACK); + ?: (void*) (&__gettimeofday_syscall)); } asm (".type __gettimeofday, %gnu_indirect_function"); diff --git a/sysdeps/unix/sysv/linux/x86/time.c b/sysdeps/unix/sysv/linux/x86/time.c index 1ab9248..3459e17 100644 --- a/sysdeps/unix/sysv/linux/x86/time.c +++ b/sysdeps/unix/sysv/linux/x86/time.c @@ -21,6 +21,15 @@ #ifdef SHARED #include <dl-vdso.h> +#include <errno.h> + +/* If the vDSO is not available we fall back on the old vsyscall. */ +static time_t +__time_syscall (time_t *t) +{ + INTERNAL_SYSCALL_DECL (err); + return INTERNAL_SYSCALL (time, err, 1, t); +} void *time_ifunc (void) __asm__ ("time"); @@ -29,7 +38,8 @@ time_ifunc (void) { PREPARE_VERSION_KNOWN (linux26, LINUX_2_6); - return _dl_vdso_vsym ("__vdso_time", &linux26) ?: TIME_FALLBACK; + return _dl_vdso_vsym ("__vdso_time", &linux26) + ?: (void*) &__time_syscall; } asm (".type time, %gnu_indirect_function"); diff --git a/sysdeps/unix/sysv/linux/x86_64/gettimeofday.c b/sysdeps/unix/sysv/linux/x86_64/gettimeofday.c deleted file mode 100644 index daa14de..0000000 --- a/sysdeps/unix/sysv/linux/x86_64/gettimeofday.c +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (C) 2002-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/>. */ - -#include <sys/time.h> - -#ifdef SHARED -/* If the vDSO is not available we fall back on the old vsyscall. */ -# define VSYSCALL_ADDR_vgettimeofday 0xffffffffff600000ul -# define GETTIMEOFAY_FALLBACK (void*)VSYSCALL_ADDR_vgettimeofday -#endif - -#include <sysdeps/unix/sysv/linux/x86/gettimeofday.c> diff --git a/sysdeps/unix/sysv/linux/x86_64/time.c b/sysdeps/unix/sysv/linux/x86_64/time.c deleted file mode 100644 index 6ceb819..0000000 --- a/sysdeps/unix/sysv/linux/x86_64/time.c +++ /dev/null @@ -1,24 +0,0 @@ -/* Copyright (C) 2001-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 -/* If the vDSO is not available we fall back on the old vsyscall. */ -#define VSYSCALL_ADDR_vtime 0xffffffffff600400 -#define TIME_FALLBACK (void*)VSYSCALL_ADDR_vtime -#endif - -#include <sysdeps/unix/sysv/linux/x86/time.c>