Message ID | 53BEA422.6030001@linux.vnet.ibm.com |
---|---|
State | New |
Headers | show |
Allan, Do you think is it good to add for 2.20? On 10-07-2014 11:33, Adhemerval Zanella wrote: > Hi Roland, > > Thanks again for reviewing it. > > > On 09-07-2014 17:02, Roland McGrath wrote: >>> * sysdeps/unix/sysv/linux/x86_64/Makefile [sysdep_routing]: Move >>> dl-vdso rule to ... >>> * sysdeps/unix/sysv/linux/x86/Makefile [sysdep_routines]: ... here. >> Typo: s/routing/routines/. Also, [] is for identifying conditional >> sections (if* in makefiles, #if* in C). Use () for identifying the entity >> being changed. Also, there is no rule here. It's just appending it to the >> list (or not). I would have written: >> >> * sysdeps/unix/sysv/linux/x86/Makefile [$(subdir) = elf] >> (sysdep_routines): Add dl-vdso here, ... >> * sysdeps/unix/sysv/linux/x86_64/Makefile [$(subdir) = elf] >> (sysdep_routines): ... not here. > Thanks, I used your wording. > >>> * sysdeps/unix/sysv/linux/x86/gettimeofday.c: ... here. Also added >> Two spaces between sentences. >> >>> * sysdeps/unix/sysv/linux/x86/time.c: ... here. Also refactored to >> And here. >> >>> --- /dev/null >>> +++ b/sysdeps/unix/sysv/linux/i386/gettimeofday.c >>> @@ -0,0 +1,34 @@ >>> +/* Copyright (C) 2014 Free Software Foundation, Inc. >> Still needs a top-line descriptive comment. >> >>> +# define GETTIMEOFAY_FALLBACK (void*) &__gettimeofday_syscall >> Put parens around the rhs so it's a single syntactic unit. >> >>> +++ b/sysdeps/unix/sysv/linux/i386/time.c >>> @@ -0,0 +1,34 @@ >>> +/* time implementation call for Linux/i386. >> /* time -- Get number of seconds since Epoch. Linux/i386 version. >> >>> --- /dev/null >>> +++ b/sysdeps/unix/sysv/linux/x86/clock_gettime.c >>> @@ -0,0 +1,38 @@ >>> +/* clock_gettime implementation call for Linux/x86. >> /* Get the current value of a clock. Linux/x86 version. >> >> (Here I copied the description from the stub file rt/clock_gettime.c.) >> >>> --- /dev/null >>> +++ b/sysdeps/unix/sysv/linux/x86/gettimeofday.c >>> @@ -0,0 +1,57 @@ >>> +/* Copyright (C) 2014 Free Software Foundation, Inc. >> Still needs a top-line descriptive comment. >> >>> --- /dev/null >>> +++ b/sysdeps/unix/sysv/linux/x86/time.c >>> @@ -0,0 +1,52 @@ >>> +/* Copyright (C) 2014 Free Software Foundation, Inc. >> Still needs a top-line descriptive comment. >> >>> --- /dev/null >>> +++ b/sysdeps/unix/sysv/linux/x86/timespec_get.c >>> @@ -0,0 +1,28 @@ >>> +/* timespec_get implementation call for Linux/x86. >> This is not a sensical English sentence fragment. >> I think you meant "timespec_get call implementation". >> But that's not actually descriptive. > I have addressed all the aforementioned issues. > >>> +#ifdef SHARED >>> +# define INTERNAL_GETTIME(id, tp) \ >>> + ({ long int (*f) (clockid_t, struct timespec *) = __vdso_clock_gettime; \ >>> + PTR_DEMANGLE (f); \ >>> + f (id, tp); }) >> Why isn't this just an inline function? If it had to be a macro, it should >> have line breaks around ({ and }) to be more readable. Either way, it >> should use (*f) (...) to call via the function pointer. > My first approach was to just existent code, that's why I haven't changed it to > an inline function. And if you double check there is already line breaks around it. > I have changed the function call to use (*f). > >> >> You didn't mention what testing you did. For this sort of change, it is >> important to test (and report about it) for more than one kernel version, >> including at least one and one without the vDSO support that this code >> should use but not rely on. > I have indicated on my first message (x86 and x86_64 with a 3.16-rc2 kernel) and I also > checked x86 and x86_64 on a 3.5.0 kernel. > >> I tend to think this is getting a bit close to freeze time for a >> substantial semantic change like this one. But I'll defer that paranoia to >> others, and if the folks here who are distro package maintainers are not >> worried about it then I won't object. > Indeed, although this is more like a cleanup. Anyway, I will defer this work for > another release if other raise concerns about it. > > What about now, is everything ok? > > -- > > 2014-07-10 Adhemerval Zanella <azanella@linux.vnet.ibm.com> > Stefani Seibold <stefani@seibold.net> > > * sysdeps/unix/sysv/linux/x86_64/Makefile [$(subdir) = elf] > (sysdep_routines): Add dl-vdso here, ... > * sysdeps/unix/sysv/linux/x86/Makefile [$(subdir) = elf] > (sysdep_routines): ... not here. > * sysdeps/unix/sysv/linux/i386/gettimeofday.c: New file: set syscall > fallback when vDSO is not presented. > * sysdeps/unix/sysv/linux/x86_64/init-first.c (__vdso_clock_gettime): > Define with libc_hidden_proto/libc_hidden_data_def definitions. > (_libc_vdso_platform_setup): Rename to __vdso_platform_setup. > * sysdeps/unix/sysv/linux/i386/init-first.c: New file: likewise. > * sysdeps/unix/sysv/linux/i386/time.c: New file: likewise. > * sysdeps/unix/sysv/linux/x86_64/bits/libc-vdso.h: Moved to ... > * sysdeps/unix/sysv/linux/x86/libc-vdso.h: ... here. > * sysdeps/unix/sysv/linux/x86_64/clock_gettime.c: Move to ... > * sysdeps/unix/sysv/linux/x86/clock_gettime.c: ... here. > * sysdeps/unix/sysv/linux/x86_64/gettimeofday.c: Move to ... > * sysdeps/unix/sysv/linux/x86/gettimeofday.c: ... here. Also added > fallback configurable symbol when vDSO is not available. > * sysdeps/unix/sysv/linux/x86_64/time.c: Move to ... > * sysdeps/unix/sysv/linux/x86/time.c: ... here. Also refactored to > be able to redefine fallback symbol when vDSO is not available. > * sysdeps/unix/sysv/linux/x86_64/timespec_get.c: Move to ... > * sysdeps/unix/sysv/linux/x86/timespec_get.c: ... here. > > --- > > diff --git a/sysdeps/unix/sysv/linux/i386/gettimeofday.c b/sysdeps/unix/sysv/linux/i386/gettimeofday.c > new file mode 100644 > index 0000000..d02fdd3 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/i386/gettimeofday.c > @@ -0,0 +1,35 @@ > +/* gettimeofday - get the time. Linux/i386 version. > + Copyright (C) 2014 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 > + > +# 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) > +#endif > + > +#include <sysdeps/unix/sysv/linux/x86/gettimeofday.c> > diff --git a/sysdeps/unix/sysv/linux/i386/init-first.c b/sysdeps/unix/sysv/linux/i386/init-first.c > new file mode 100644 > index 0000000..dc3b1ba > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/i386/init-first.c > @@ -0,0 +1,52 @@ > +/* Initialization code run first thing by the ELF startup code. Linux/i386. > + Copyright (C) 2014 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 <time.h> > +# include <sysdep.h> > +# include <dl-vdso.h> > +# include <libc-vdso.h> > + > +long int (*__vdso_clock_gettime) (clockid_t, struct timespec *) > + __attribute__ ((nocommon)); > +libc_hidden_proto (__vdso_clock_gettime) > +libc_hidden_data_def (__vdso_clock_gettime) > + > +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) > +{ > + PREPARE_VERSION (linux26, "LINUX_2.6", 61765110); > + > + void *p = _dl_vdso_vsym ("__vdso_clock_gettime", &linux26); > + if (p == NULL) > + p = clock_gettime_syscall; > + PTR_MANGLE (p); > + __vdso_clock_gettime = p; > +} > + > +# define VDSO_SETUP __vdso_platform_setup > +#endif > + > +#include <csu/init-first.c> > diff --git a/sysdeps/unix/sysv/linux/i386/time.c b/sysdeps/unix/sysv/linux/i386/time.c > new file mode 100644 > index 0000000..ba4401f > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/i386/time.c > @@ -0,0 +1,34 @@ > +/* time -- Get number of seconds since Epoch. Linux/i386 version. > + Copyright (C) 2014 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 <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 > +#endif > + > +#include <sysdeps/unix/sysv/linux/x86/time.c> > diff --git a/sysdeps/unix/sysv/linux/x86/Makefile b/sysdeps/unix/sysv/linux/x86/Makefile > index 012125f..c827784 100644 > --- a/sysdeps/unix/sysv/linux/x86/Makefile > +++ b/sysdeps/unix/sysv/linux/x86/Makefile > @@ -22,3 +22,7 @@ libpthread-sysdep_routines += init-arch > libpthread-sysdep_routines += elision-lock elision-unlock elision-timed \ > elision-trylock > endif > + > +ifeq ($(subdir),elf) > +sysdep_routines += dl-vdso > +endif > diff --git a/sysdeps/unix/sysv/linux/x86/clock_gettime.c b/sysdeps/unix/sysv/linux/x86/clock_gettime.c > new file mode 100644 > index 0000000..2547a8c > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/x86/clock_gettime.c > @@ -0,0 +1,38 @@ > +/* Get the current value of a clock. Linux/x86 version. > + Copyright (C) 2014 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 <libc-vdso.h> > + > +#ifdef SHARED > +# define SYSCALL_GETTIME(id, tp) \ > + ({ long int (*f) (clockid_t, struct timespec *) = __vdso_clock_gettime; \ > + long int v_ret; \ > + PTR_DEMANGLE (f); \ > + v_ret = (*f) (id, tp); \ > + if (INTERNAL_SYSCALL_ERROR_P (v_ret, )) { \ > + __set_errno (INTERNAL_SYSCALL_ERRNO (v_ret, )); \ > + v_ret = -1; \ > + } \ > + v_ret; }) > +# define INTERNAL_GETTIME(id, tp) \ > + ({ long int (*f) (clockid_t, struct timespec *) = __vdso_clock_gettime; \ > + PTR_DEMANGLE (f); \ > + (*f) (id, tp); }) > +#endif > + > +#include <sysdeps/unix/sysv/linux/clock_gettime.c> > diff --git a/sysdeps/unix/sysv/linux/x86/gettimeofday.c b/sysdeps/unix/sysv/linux/x86/gettimeofday.c > new file mode 100644 > index 0000000..c8286e3 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/x86/gettimeofday.c > @@ -0,0 +1,57 @@ > +/* gettimeofday - get the time. Linux/x86 version. > + 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 > + > +# include <dl-vdso.h> > + > +void *gettimeofday_ifunc (void) __asm__ ("__gettimeofday"); > + > +void * > +gettimeofday_ifunc (void) > +{ > + PREPARE_VERSION (linux26, "LINUX_2.6", 61765110); > + > + /* If the vDSO is not available we fall back on the old vsyscall. */ > + return (_dl_vdso_vsym ("__vdso_gettimeofday", &linux26) > + ?: GETTIMEOFAY_FALLBACK); > +} > +asm (".type __gettimeofday, %gnu_indirect_function"); > + > +/* This is doing "libc_hidden_def (__gettimeofday)" but the compiler won't > + let us do it in C because it doesn't know we're defining __gettimeofday > + here in this file. */ > +asm (".globl __GI___gettimeofday\n" > + "__GI___gettimeofday = __gettimeofday"); > + > +#else > + > +# include <sysdep.h> > +# include <errno.h> > + > +int > +__gettimeofday (struct timeval *tv, struct timezone *tz) > +{ > + return INLINE_SYSCALL (gettimeofday, 2, tv, tz); > +} > +libc_hidden_def (__gettimeofday) > + > +#endif > +weak_alias (__gettimeofday, gettimeofday) > +libc_hidden_weak (gettimeofday) > diff --git a/sysdeps/unix/sysv/linux/x86/libc-vdso.h b/sysdeps/unix/sysv/linux/x86/libc-vdso.h > new file mode 100644 > index 0000000..f291924 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/x86/libc-vdso.h > @@ -0,0 +1,31 @@ > +/* Resolve function pointers to VDSO functions. > + Copyright (C) 2005-2014 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 > + > +#include <time.h> > +#include <sys/time.h> > + > +#ifdef SHARED > + > +extern long int (*__vdso_clock_gettime) (clockid_t, struct timespec *); > + > +#endif > + > +#endif /* _LIBC_VDSO_H */ > diff --git a/sysdeps/unix/sysv/linux/x86/time.c b/sysdeps/unix/sysv/linux/x86/time.c > new file mode 100644 > index 0000000..efd1edf > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/x86/time.c > @@ -0,0 +1,53 @@ > +/* time -- Get number of seconds since Epoch. Linux/x86 version. > + Copyright (C) 2014 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 <time.h> > + > +#ifdef SHARED > + > +#include <dl-vdso.h> > + > +void *time_ifunc (void) __asm__ ("time"); > + > +void * > +time_ifunc (void) > +{ > + PREPARE_VERSION (linux26, "LINUX_2.6", 61765110); > + > + return _dl_vdso_vsym ("__vdso_time", &linux26) ?: TIME_FALLBACK; > +} > +asm (".type time, %gnu_indirect_function"); > + > +/* This is doing "libc_hidden_def (time)" but the compiler won't let us do > + it in C because it doesn't know we're defining __gettimeofday here in > + this file. */ > +asm (".globl __GI_time\n" > + "__GI_time = time"); > + > +#else > + > +# include <sysdep.h> > + > +time_t > +time (time_t *t) > +{ > + INTERNAL_SYSCALL_DECL (err); > + return INTERNAL_SYSCALL (time, err, 1, t); > +} > + > +#endif > diff --git a/sysdeps/unix/sysv/linux/x86/timespec_get.c b/sysdeps/unix/sysv/linux/x86/timespec_get.c > new file mode 100644 > index 0000000..4b6d721 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/x86/timespec_get.c > @@ -0,0 +1,29 @@ > +/* timespec_get -- returns the calendar time based on a given time base. > + Linux/x86 version. > + Copyright (C) 2014 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 <libc-vdso.h> > + > +#ifdef SHARED > +# define INTERNAL_GETTIME(id, tp) \ > + ({ long int (*f) (clockid_t, struct timespec *) = __vdso_clock_gettime; \ > + PTR_DEMANGLE (f); \ > + (*f) (id, tp); }) > +#endif > + > +#include <sysdeps/unix/sysv/linux/timespec_get.c> > diff --git a/sysdeps/unix/sysv/linux/x86_64/Makefile b/sysdeps/unix/sysv/linux/x86_64/Makefile > index d6a9d36..9b82155 100644 > --- a/sysdeps/unix/sysv/linux/x86_64/Makefile > +++ b/sysdeps/unix/sysv/linux/x86_64/Makefile > @@ -13,7 +13,3 @@ endif > ifeq ($(subdir),misc) > gen-as-const-headers += sigaltstack-offsets.sym > endif > - > -ifeq ($(subdir),elf) > -sysdep_routines += dl-vdso > -endif > diff --git a/sysdeps/unix/sysv/linux/x86_64/bits/libc-vdso.h b/sysdeps/unix/sysv/linux/x86_64/bits/libc-vdso.h > deleted file mode 100644 > index f291924..0000000 > --- a/sysdeps/unix/sysv/linux/x86_64/bits/libc-vdso.h > +++ /dev/null > @@ -1,31 +0,0 @@ > -/* Resolve function pointers to VDSO functions. > - Copyright (C) 2005-2014 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 > - > -#include <time.h> > -#include <sys/time.h> > - > -#ifdef SHARED > - > -extern long int (*__vdso_clock_gettime) (clockid_t, struct timespec *); > - > -#endif > - > -#endif /* _LIBC_VDSO_H */ > diff --git a/sysdeps/unix/sysv/linux/x86_64/clock_gettime.c b/sysdeps/unix/sysv/linux/x86_64/clock_gettime.c > deleted file mode 100644 > index f712110..0000000 > --- a/sysdeps/unix/sysv/linux/x86_64/clock_gettime.c > +++ /dev/null > @@ -1,20 +0,0 @@ > -#include "bits/libc-vdso.h" > - > -#ifdef SHARED > -# define SYSCALL_GETTIME(id, tp) \ > - ({ long int (*f) (clockid_t, struct timespec *) = __vdso_clock_gettime; \ > - long int v_ret; \ > - PTR_DEMANGLE (f); \ > - v_ret = f (id, tp); \ > - if (INTERNAL_SYSCALL_ERROR_P (v_ret, )) { \ > - __set_errno (INTERNAL_SYSCALL_ERRNO (v_ret, )); \ > - v_ret = -1; \ > - } \ > - v_ret; }) > -# define INTERNAL_GETTIME(id, tp) \ > - ({ long int (*f) (clockid_t, struct timespec *) = __vdso_clock_gettime; \ > - PTR_DEMANGLE (f); \ > - f (id, tp); }) > -#endif > - > -#include "../clock_gettime.c" > diff --git a/sysdeps/unix/sysv/linux/x86_64/gettimeofday.c b/sysdeps/unix/sysv/linux/x86_64/gettimeofday.c > index 440ca7f..defefbc 100644 > --- a/sysdeps/unix/sysv/linux/x86_64/gettimeofday.c > +++ b/sysdeps/unix/sysv/linux/x86_64/gettimeofday.c > @@ -18,42 +18,9 @@ > #include <sys/time.h> > > #ifdef SHARED > - > -# include <dl-vdso.h> > - > +/* If the vDSO is not available we fall back on the old vsyscall. */ > # define VSYSCALL_ADDR_vgettimeofday 0xffffffffff600000ul > - > -void *gettimeofday_ifunc (void) __asm__ ("__gettimeofday"); > - > -void * > -gettimeofday_ifunc (void) > -{ > - PREPARE_VERSION (linux26, "LINUX_2.6", 61765110); > - > - /* If the vDSO is not available we fall back on the old vsyscall. */ > - return (_dl_vdso_vsym ("__vdso_gettimeofday", &linux26) > - ?: (void *) VSYSCALL_ADDR_vgettimeofday); > -} > -asm (".type __gettimeofday, %gnu_indirect_function"); > - > -/* This is doing "libc_hidden_def (__gettimeofday)" but the compiler won't > - let us do it in C because it doesn't know we're defining __gettimeofday > - here in this file. */ > -asm (".globl __GI___gettimeofday\n" > - "__GI___gettimeofday = __gettimeofday"); > - > -#else > - > -# include <sysdep.h> > -# include <errno.h> > - > -int > -__gettimeofday (struct timeval *tv, struct timezone *tz) > -{ > - return INLINE_SYSCALL (gettimeofday, 2, tv, tz); > -} > -libc_hidden_def (__gettimeofday) > - > +# define GETTIMEOFAY_FALLBACK (void*)VSYSCALL_ADDR_vgettimeofday > #endif > -weak_alias (__gettimeofday, gettimeofday) > -libc_hidden_weak (gettimeofday) > + > +#include <sysdeps/unix/sysv/linux/x86/gettimeofday.c> > diff --git a/sysdeps/unix/sysv/linux/x86_64/init-first.c b/sysdeps/unix/sysv/linux/x86_64/init-first.c > index fb090df..827751a 100644 > --- a/sysdeps/unix/sysv/linux/x86_64/init-first.c > +++ b/sysdeps/unix/sysv/linux/x86_64/init-first.c > @@ -20,20 +20,20 @@ > # include <time.h> > # include <sysdep.h> > # include <dl-vdso.h> > -# include <bits/libc-vdso.h> > +# include <libc-vdso.h> > > long int (*__vdso_clock_gettime) (clockid_t, struct timespec *) > __attribute__ ((nocommon)); > -strong_alias (__vdso_clock_gettime, __GI___vdso_clock_gettime attribute_hidden) > +libc_hidden_proto (__vdso_clock_gettime) > +libc_hidden_data_def (__vdso_clock_gettime) > > long int (*__vdso_getcpu) (unsigned *, unsigned *, void *) attribute_hidden; > > - > extern long int __syscall_clock_gettime (clockid_t, struct timespec *); > > > static inline void > -_libc_vdso_platform_setup (void) > +__vdso_platform_setup (void) > { > PREPARE_VERSION (linux26, "LINUX_2.6", 61765110); > > @@ -41,7 +41,7 @@ _libc_vdso_platform_setup (void) > if (p == NULL) > p = __syscall_clock_gettime; > PTR_MANGLE (p); > - __GI___vdso_clock_gettime = p; > + __vdso_clock_gettime = p; > > p = _dl_vdso_vsym ("__vdso_getcpu", &linux26); > /* If the vDSO is not available we fall back on the old vsyscall. */ > @@ -52,7 +52,7 @@ _libc_vdso_platform_setup (void) > __vdso_getcpu = p; > } > > -# define VDSO_SETUP _libc_vdso_platform_setup > +# define VDSO_SETUP __vdso_platform_setup > #endif > > #include <csu/init-first.c> > diff --git a/sysdeps/unix/sysv/linux/x86_64/time.c b/sysdeps/unix/sysv/linux/x86_64/time.c > index 79f1fab..ec1393b 100644 > --- a/sysdeps/unix/sysv/linux/x86_64/time.c > +++ b/sysdeps/unix/sysv/linux/x86_64/time.c > @@ -16,45 +16,9 @@ > <http://www.gnu.org/licenses/>. */ > > #ifdef SHARED > -/* Redefine time so that the compiler won't complain about the type > - mismatch with the IFUNC selector in strong_alias, below. */ > -#undef time > -#define time __redirect_time > -#include <time.h> > - > -#include <dl-vdso.h> > - > +/* If the vDSO is not available we fall back on the old vsyscall. */ > #define VSYSCALL_ADDR_vtime 0xffffffffff600400 > - > -/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle > - ifunc symbol properly. */ > -extern __typeof (__redirect_time) __libc_time; > -void *time_ifunc (void) __asm__ ("__libc_time"); > - > -void * > -time_ifunc (void) > -{ > - PREPARE_VERSION (linux26, "LINUX_2.6", 61765110); > - > - /* If the vDSO is not available we fall back on the old vsyscall. */ > - return _dl_vdso_vsym ("__vdso_time", &linux26) ?: (void *) VSYSCALL_ADDR_vtime; > -} > -__asm (".type __libc_time, %gnu_indirect_function"); > - > -#undef time > -strong_alias (__libc_time, time) > -libc_hidden_ver (__libc_time, time) > - > -#else > - > -# include <time.h> > -# include <sysdep.h> > - > -time_t > -time (time_t *t) > -{ > - INTERNAL_SYSCALL_DECL (err); > - return INTERNAL_SYSCALL (time, err, 1, t); > -} > - > +#define TIME_FALLBACK (void*)VSYSCALL_ADDR_vtime > #endif > + > +#include <sysdeps/unix/sysv/linux/x86/time.c> > diff --git a/sysdeps/unix/sysv/linux/x86_64/timespec_get.c b/sysdeps/unix/sysv/linux/x86_64/timespec_get.c > deleted file mode 100644 > index cb26068..0000000 > --- a/sysdeps/unix/sysv/linux/x86_64/timespec_get.c > +++ /dev/null > @@ -1,10 +0,0 @@ > -#include "bits/libc-vdso.h" > - > -#ifdef SHARED > -# define INTERNAL_GETTIME(id, tp) \ > - ({ long int (*f) (clockid_t, struct timespec *) = __vdso_clock_gettime; \ > - PTR_DEMANGLE (f); \ > - f (id, tp); }) > -#endif > - > -#include "../timespec_get.c" >
On 23/07/14 03:31, Adhemerval Zanella wrote: > Allan, > > Do you think is it good to add for 2.20? > I'm going to say too late for this one. I looked at the patch a thought it was a big intrusive for this stage and then noted Roland comment suggesting it was too close to 2.20 to be included. So I am taking the cautious approach here. Allan
On 22-07-2014 21:40, Allan McRae wrote: > On 23/07/14 03:31, Adhemerval Zanella wrote: >> Allan, >> >> Do you think is it good to add for 2.20? >> > I'm going to say too late for this one. I looked at the patch a thought > it was a big intrusive for this stage and then noted Roland comment > suggesting it was too close to 2.20 to be included. So I am taking the > cautious approach here. > > Allan > Fair enough, I will push it when 2.21 opens.
fyi: if you use the -C/-M flags, the diff output will indicate moved files and make it easier to see what you changed vs just moved -mike
On 23-07-2014 10:56, Adhemerval Zanella wrote: > On 22-07-2014 21:40, Allan McRae wrote: >> On 23/07/14 03:31, Adhemerval Zanella wrote: >>> Allan, >>> >>> Do you think is it good to add for 2.20? >>> >> I'm going to say too late for this one. I looked at the patch a thought >> it was a big intrusive for this stage and then noted Roland comment >> suggesting it was too close to 2.20 to be included. So I am taking the >> cautious approach here. >> >> Allan >> > Fair enough, I will push it when 2.21 opens. > Ping.
On 10-09-2014 11:19, Adhemerval Zanella wrote: > On 23-07-2014 10:56, Adhemerval Zanella wrote: >> On 22-07-2014 21:40, Allan McRae wrote: >>> On 23/07/14 03:31, Adhemerval Zanella wrote: >>>> Allan, >>>> >>>> Do you think is it good to add for 2.20? >>>> >>> I'm going to say too late for this one. I looked at the patch a thought >>> it was a big intrusive for this stage and then noted Roland comment >>> suggesting it was too close to 2.20 to be included. So I am taking the >>> cautious approach here. >>> >>> Allan >>> >> Fair enough, I will push it when 2.21 opens. >> > Ping. > Ping.
Hi, i still wait that this patch will be applied to improve the performance of i386 applications. Anything wrong with this patch? Stefani Am Mittwoch, den 23.07.2014, 10:40 +1000 schrieb Allan McRae: > On 23/07/14 03:31, Adhemerval Zanella wrote: > > Allan, > > > > Do you think is it good to add for 2.20? > > > > I'm going to say too late for this one. I looked at the patch a thought > it was a big intrusive for this stage and then noted Roland comment > suggesting it was too close to 2.20 to be included. So I am taking the > cautious approach here. > > Allan
When it has been this long, you should always make a fresh patch against the trunk and re-do the testing and post it afresh. Using the same email thread links it to the previous versions.
On 08-10-2014 18:55, Roland McGrath wrote: > When it has been this long, you should always make a fresh patch against > the trunk and re-do the testing and post it afresh. Using the same email > thread links it to the previous versions. > I did it: each time I pinged I rebased against master and tested all over again.
> I did it: each time I pinged I rebased against master and tested all over > again. But what you posted was a giant mess of "> > > >" lines. If you post the patch afresh, you get actual review.
On 08-10-2014 19:15, Roland McGrath wrote: >> I did it: each time I pinged I rebased against master and tested all over >> again. > But what you posted was a giant mess of "> > > >" lines. > If you post the patch afresh, you get actual review. > Ok, I'll repost.
diff --git a/sysdeps/unix/sysv/linux/i386/gettimeofday.c b/sysdeps/unix/sysv/linux/i386/gettimeofday.c new file mode 100644 index 0000000..d02fdd3 --- /dev/null +++ b/sysdeps/unix/sysv/linux/i386/gettimeofday.c @@ -0,0 +1,35 @@ +/* gettimeofday - get the time. Linux/i386 version. + Copyright (C) 2014 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 + +# 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) +#endif + +#include <sysdeps/unix/sysv/linux/x86/gettimeofday.c> diff --git a/sysdeps/unix/sysv/linux/i386/init-first.c b/sysdeps/unix/sysv/linux/i386/init-first.c new file mode 100644 index 0000000..dc3b1ba --- /dev/null +++ b/sysdeps/unix/sysv/linux/i386/init-first.c @@ -0,0 +1,52 @@ +/* Initialization code run first thing by the ELF startup code. Linux/i386. + Copyright (C) 2014 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 <time.h> +# include <sysdep.h> +# include <dl-vdso.h> +# include <libc-vdso.h> + +long int (*__vdso_clock_gettime) (clockid_t, struct timespec *) + __attribute__ ((nocommon)); +libc_hidden_proto (__vdso_clock_gettime) +libc_hidden_data_def (__vdso_clock_gettime) + +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) +{ + PREPARE_VERSION (linux26, "LINUX_2.6", 61765110); + + void *p = _dl_vdso_vsym ("__vdso_clock_gettime", &linux26); + if (p == NULL) + p = clock_gettime_syscall; + PTR_MANGLE (p); + __vdso_clock_gettime = p; +} + +# define VDSO_SETUP __vdso_platform_setup +#endif + +#include <csu/init-first.c> diff --git a/sysdeps/unix/sysv/linux/i386/time.c b/sysdeps/unix/sysv/linux/i386/time.c new file mode 100644 index 0000000..ba4401f --- /dev/null +++ b/sysdeps/unix/sysv/linux/i386/time.c @@ -0,0 +1,34 @@ +/* time -- Get number of seconds since Epoch. Linux/i386 version. + Copyright (C) 2014 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 <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 +#endif + +#include <sysdeps/unix/sysv/linux/x86/time.c> diff --git a/sysdeps/unix/sysv/linux/x86/Makefile b/sysdeps/unix/sysv/linux/x86/Makefile index 012125f..c827784 100644 --- a/sysdeps/unix/sysv/linux/x86/Makefile +++ b/sysdeps/unix/sysv/linux/x86/Makefile @@ -22,3 +22,7 @@ libpthread-sysdep_routines += init-arch libpthread-sysdep_routines += elision-lock elision-unlock elision-timed \ elision-trylock endif + +ifeq ($(subdir),elf) +sysdep_routines += dl-vdso +endif diff --git a/sysdeps/unix/sysv/linux/x86/clock_gettime.c b/sysdeps/unix/sysv/linux/x86/clock_gettime.c new file mode 100644 index 0000000..2547a8c --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86/clock_gettime.c @@ -0,0 +1,38 @@ +/* Get the current value of a clock. Linux/x86 version. + Copyright (C) 2014 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 <libc-vdso.h> + +#ifdef SHARED +# define SYSCALL_GETTIME(id, tp) \ + ({ long int (*f) (clockid_t, struct timespec *) = __vdso_clock_gettime; \ + long int v_ret; \ + PTR_DEMANGLE (f); \ + v_ret = (*f) (id, tp); \ + if (INTERNAL_SYSCALL_ERROR_P (v_ret, )) { \ + __set_errno (INTERNAL_SYSCALL_ERRNO (v_ret, )); \ + v_ret = -1; \ + } \ + v_ret; }) +# define INTERNAL_GETTIME(id, tp) \ + ({ long int (*f) (clockid_t, struct timespec *) = __vdso_clock_gettime; \ + PTR_DEMANGLE (f); \ + (*f) (id, tp); }) +#endif + +#include <sysdeps/unix/sysv/linux/clock_gettime.c> diff --git a/sysdeps/unix/sysv/linux/x86/gettimeofday.c b/sysdeps/unix/sysv/linux/x86/gettimeofday.c new file mode 100644 index 0000000..c8286e3 --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86/gettimeofday.c @@ -0,0 +1,57 @@ +/* gettimeofday - get the time. Linux/x86 version. + 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 + +# include <dl-vdso.h> + +void *gettimeofday_ifunc (void) __asm__ ("__gettimeofday"); + +void * +gettimeofday_ifunc (void) +{ + PREPARE_VERSION (linux26, "LINUX_2.6", 61765110); + + /* If the vDSO is not available we fall back on the old vsyscall. */ + return (_dl_vdso_vsym ("__vdso_gettimeofday", &linux26) + ?: GETTIMEOFAY_FALLBACK); +} +asm (".type __gettimeofday, %gnu_indirect_function"); + +/* This is doing "libc_hidden_def (__gettimeofday)" but the compiler won't + let us do it in C because it doesn't know we're defining __gettimeofday + here in this file. */ +asm (".globl __GI___gettimeofday\n" + "__GI___gettimeofday = __gettimeofday"); + +#else + +# include <sysdep.h> +# include <errno.h> + +int +__gettimeofday (struct timeval *tv, struct timezone *tz) +{ + return INLINE_SYSCALL (gettimeofday, 2, tv, tz); +} +libc_hidden_def (__gettimeofday) + +#endif +weak_alias (__gettimeofday, gettimeofday) +libc_hidden_weak (gettimeofday) diff --git a/sysdeps/unix/sysv/linux/x86/libc-vdso.h b/sysdeps/unix/sysv/linux/x86/libc-vdso.h new file mode 100644 index 0000000..f291924 --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86/libc-vdso.h @@ -0,0 +1,31 @@ +/* Resolve function pointers to VDSO functions. + Copyright (C) 2005-2014 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 + +#include <time.h> +#include <sys/time.h> + +#ifdef SHARED + +extern long int (*__vdso_clock_gettime) (clockid_t, struct timespec *); + +#endif + +#endif /* _LIBC_VDSO_H */ diff --git a/sysdeps/unix/sysv/linux/x86/time.c b/sysdeps/unix/sysv/linux/x86/time.c new file mode 100644 index 0000000..efd1edf --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86/time.c @@ -0,0 +1,53 @@ +/* time -- Get number of seconds since Epoch. Linux/x86 version. + Copyright (C) 2014 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 <time.h> + +#ifdef SHARED + +#include <dl-vdso.h> + +void *time_ifunc (void) __asm__ ("time"); + +void * +time_ifunc (void) +{ + PREPARE_VERSION (linux26, "LINUX_2.6", 61765110); + + return _dl_vdso_vsym ("__vdso_time", &linux26) ?: TIME_FALLBACK; +} +asm (".type time, %gnu_indirect_function"); + +/* This is doing "libc_hidden_def (time)" but the compiler won't let us do + it in C because it doesn't know we're defining __gettimeofday here in + this file. */ +asm (".globl __GI_time\n" + "__GI_time = time"); + +#else + +# include <sysdep.h> + +time_t +time (time_t *t) +{ + INTERNAL_SYSCALL_DECL (err); + return INTERNAL_SYSCALL (time, err, 1, t); +} + +#endif diff --git a/sysdeps/unix/sysv/linux/x86/timespec_get.c b/sysdeps/unix/sysv/linux/x86/timespec_get.c new file mode 100644 index 0000000..4b6d721 --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86/timespec_get.c @@ -0,0 +1,29 @@ +/* timespec_get -- returns the calendar time based on a given time base. + Linux/x86 version. + Copyright (C) 2014 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 <libc-vdso.h> + +#ifdef SHARED +# define INTERNAL_GETTIME(id, tp) \ + ({ long int (*f) (clockid_t, struct timespec *) = __vdso_clock_gettime; \ + PTR_DEMANGLE (f); \ + (*f) (id, tp); }) +#endif + +#include <sysdeps/unix/sysv/linux/timespec_get.c> diff --git a/sysdeps/unix/sysv/linux/x86_64/Makefile b/sysdeps/unix/sysv/linux/x86_64/Makefile index d6a9d36..9b82155 100644 --- a/sysdeps/unix/sysv/linux/x86_64/Makefile +++ b/sysdeps/unix/sysv/linux/x86_64/Makefile @@ -13,7 +13,3 @@ endif ifeq ($(subdir),misc) gen-as-const-headers += sigaltstack-offsets.sym endif - -ifeq ($(subdir),elf) -sysdep_routines += dl-vdso -endif diff --git a/sysdeps/unix/sysv/linux/x86_64/bits/libc-vdso.h b/sysdeps/unix/sysv/linux/x86_64/bits/libc-vdso.h deleted file mode 100644 index f291924..0000000 --- a/sysdeps/unix/sysv/linux/x86_64/bits/libc-vdso.h +++ /dev/null @@ -1,31 +0,0 @@ -/* Resolve function pointers to VDSO functions. - Copyright (C) 2005-2014 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 - -#include <time.h> -#include <sys/time.h> - -#ifdef SHARED - -extern long int (*__vdso_clock_gettime) (clockid_t, struct timespec *); - -#endif - -#endif /* _LIBC_VDSO_H */ diff --git a/sysdeps/unix/sysv/linux/x86_64/clock_gettime.c b/sysdeps/unix/sysv/linux/x86_64/clock_gettime.c deleted file mode 100644 index f712110..0000000 --- a/sysdeps/unix/sysv/linux/x86_64/clock_gettime.c +++ /dev/null @@ -1,20 +0,0 @@ -#include "bits/libc-vdso.h" - -#ifdef SHARED -# define SYSCALL_GETTIME(id, tp) \ - ({ long int (*f) (clockid_t, struct timespec *) = __vdso_clock_gettime; \ - long int v_ret; \ - PTR_DEMANGLE (f); \ - v_ret = f (id, tp); \ - if (INTERNAL_SYSCALL_ERROR_P (v_ret, )) { \ - __set_errno (INTERNAL_SYSCALL_ERRNO (v_ret, )); \ - v_ret = -1; \ - } \ - v_ret; }) -# define INTERNAL_GETTIME(id, tp) \ - ({ long int (*f) (clockid_t, struct timespec *) = __vdso_clock_gettime; \ - PTR_DEMANGLE (f); \ - f (id, tp); }) -#endif - -#include "../clock_gettime.c" diff --git a/sysdeps/unix/sysv/linux/x86_64/gettimeofday.c b/sysdeps/unix/sysv/linux/x86_64/gettimeofday.c index 440ca7f..defefbc 100644 --- a/sysdeps/unix/sysv/linux/x86_64/gettimeofday.c +++ b/sysdeps/unix/sysv/linux/x86_64/gettimeofday.c @@ -18,42 +18,9 @@ #include <sys/time.h> #ifdef SHARED - -# include <dl-vdso.h> - +/* If the vDSO is not available we fall back on the old vsyscall. */ # define VSYSCALL_ADDR_vgettimeofday 0xffffffffff600000ul - -void *gettimeofday_ifunc (void) __asm__ ("__gettimeofday"); - -void * -gettimeofday_ifunc (void) -{ - PREPARE_VERSION (linux26, "LINUX_2.6", 61765110); - - /* If the vDSO is not available we fall back on the old vsyscall. */ - return (_dl_vdso_vsym ("__vdso_gettimeofday", &linux26) - ?: (void *) VSYSCALL_ADDR_vgettimeofday); -} -asm (".type __gettimeofday, %gnu_indirect_function"); - -/* This is doing "libc_hidden_def (__gettimeofday)" but the compiler won't - let us do it in C because it doesn't know we're defining __gettimeofday - here in this file. */ -asm (".globl __GI___gettimeofday\n" - "__GI___gettimeofday = __gettimeofday"); - -#else - -# include <sysdep.h> -# include <errno.h> - -int -__gettimeofday (struct timeval *tv, struct timezone *tz) -{ - return INLINE_SYSCALL (gettimeofday, 2, tv, tz); -} -libc_hidden_def (__gettimeofday) - +# define GETTIMEOFAY_FALLBACK (void*)VSYSCALL_ADDR_vgettimeofday #endif -weak_alias (__gettimeofday, gettimeofday) -libc_hidden_weak (gettimeofday) + +#include <sysdeps/unix/sysv/linux/x86/gettimeofday.c> diff --git a/sysdeps/unix/sysv/linux/x86_64/init-first.c b/sysdeps/unix/sysv/linux/x86_64/init-first.c index fb090df..827751a 100644 --- a/sysdeps/unix/sysv/linux/x86_64/init-first.c +++ b/sysdeps/unix/sysv/linux/x86_64/init-first.c @@ -20,20 +20,20 @@ # include <time.h> # include <sysdep.h> # include <dl-vdso.h> -# include <bits/libc-vdso.h> +# include <libc-vdso.h> long int (*__vdso_clock_gettime) (clockid_t, struct timespec *) __attribute__ ((nocommon)); -strong_alias (__vdso_clock_gettime, __GI___vdso_clock_gettime attribute_hidden) +libc_hidden_proto (__vdso_clock_gettime) +libc_hidden_data_def (__vdso_clock_gettime) long int (*__vdso_getcpu) (unsigned *, unsigned *, void *) attribute_hidden; - extern long int __syscall_clock_gettime (clockid_t, struct timespec *); static inline void -_libc_vdso_platform_setup (void) +__vdso_platform_setup (void) { PREPARE_VERSION (linux26, "LINUX_2.6", 61765110); @@ -41,7 +41,7 @@ _libc_vdso_platform_setup (void) if (p == NULL) p = __syscall_clock_gettime; PTR_MANGLE (p); - __GI___vdso_clock_gettime = p; + __vdso_clock_gettime = p; p = _dl_vdso_vsym ("__vdso_getcpu", &linux26); /* If the vDSO is not available we fall back on the old vsyscall. */ @@ -52,7 +52,7 @@ _libc_vdso_platform_setup (void) __vdso_getcpu = p; } -# define VDSO_SETUP _libc_vdso_platform_setup +# define VDSO_SETUP __vdso_platform_setup #endif #include <csu/init-first.c> diff --git a/sysdeps/unix/sysv/linux/x86_64/time.c b/sysdeps/unix/sysv/linux/x86_64/time.c index 79f1fab..ec1393b 100644 --- a/sysdeps/unix/sysv/linux/x86_64/time.c +++ b/sysdeps/unix/sysv/linux/x86_64/time.c @@ -16,45 +16,9 @@ <http://www.gnu.org/licenses/>. */ #ifdef SHARED -/* Redefine time so that the compiler won't complain about the type - mismatch with the IFUNC selector in strong_alias, below. */ -#undef time -#define time __redirect_time -#include <time.h> - -#include <dl-vdso.h> - +/* If the vDSO is not available we fall back on the old vsyscall. */ #define VSYSCALL_ADDR_vtime 0xffffffffff600400 - -/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle - ifunc symbol properly. */ -extern __typeof (__redirect_time) __libc_time; -void *time_ifunc (void) __asm__ ("__libc_time"); - -void * -time_ifunc (void) -{ - PREPARE_VERSION (linux26, "LINUX_2.6", 61765110); - - /* If the vDSO is not available we fall back on the old vsyscall. */ - return _dl_vdso_vsym ("__vdso_time", &linux26) ?: (void *) VSYSCALL_ADDR_vtime; -} -__asm (".type __libc_time, %gnu_indirect_function"); - -#undef time -strong_alias (__libc_time, time) -libc_hidden_ver (__libc_time, time) - -#else - -# include <time.h> -# include <sysdep.h> - -time_t -time (time_t *t) -{ - INTERNAL_SYSCALL_DECL (err); - return INTERNAL_SYSCALL (time, err, 1, t); -} - +#define TIME_FALLBACK (void*)VSYSCALL_ADDR_vtime #endif + +#include <sysdeps/unix/sysv/linux/x86/time.c> diff --git a/sysdeps/unix/sysv/linux/x86_64/timespec_get.c b/sysdeps/unix/sysv/linux/x86_64/timespec_get.c deleted file mode 100644 index cb26068..0000000 --- a/sysdeps/unix/sysv/linux/x86_64/timespec_get.c +++ /dev/null @@ -1,10 +0,0 @@ -#include "bits/libc-vdso.h" - -#ifdef SHARED -# define INTERNAL_GETTIME(id, tp) \ - ({ long int (*f) (clockid_t, struct timespec *) = __vdso_clock_gettime; \ - PTR_DEMANGLE (f); \ - f (id, tp); }) -#endif - -#include "../timespec_get.c"