diff mbox

[v2] Add x86 32 bit vDSO time function support

Message ID 53BEA422.6030001@linux.vnet.ibm.com
State New
Headers show

Commit Message

Adhemerval Zanella July 10, 2014, 2:33 p.m. UTC
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.

---

Comments

Adhemerval Zanella July 22, 2014, 5:31 p.m. UTC | #1
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"
>
Allan McRae July 23, 2014, 12:40 a.m. UTC | #2
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
Adhemerval Zanella July 23, 2014, 1:56 p.m. UTC | #3
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.
Mike Frysinger Aug. 2, 2014, 4:48 p.m. UTC | #4
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
Adhemerval Zanella Sept. 10, 2014, 2:19 p.m. UTC | #5
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.
Adhemerval Zanella Sept. 22, 2014, 3 p.m. UTC | #6
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.
Stefani Seibold Oct. 7, 2014, 6:57 a.m. UTC | #7
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
Roland McGrath Oct. 8, 2014, 9:55 p.m. UTC | #8
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.
Adhemerval Zanella Oct. 8, 2014, 10:02 p.m. UTC | #9
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.
Roland McGrath Oct. 8, 2014, 10:15 p.m. UTC | #10
> 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.
Adhemerval Zanella Oct. 8, 2014, 10:31 p.m. UTC | #11
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 mbox

Patch

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"