This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH v2 09/11] Use clock_gettime to implement gettimeofday.


Hi Adhemerval,

> Use clock_gettime to implement gettimeofday
> 
> Changes from previous version:
> 
>   - Do not remove Linux arch-specific implementations.
> 
> --
> 
> Consolidate generic gettimeofday implementation to use clock_gettime.
> Linux ports that still provide gettimeofday through vDSO are not
> changed.
> 
> Remove sysdeps/unix/clock_gettime.c, which implemented clock_gettime
> using gettimeofday; new OS ports must provide a real implementation of
> clock_gettime.
> 
> Rename sysdeps/mach/gettimeofday.c to sysdeps/mach/clock_gettime.c and
> convert into an implementation of clock_gettime.  It only supports
> CLOCK_REALTIME; Mach does not appear to have any support for monotonic
> clocks.  It uses __host_get_time, which provides at best microsecond
> resolution.  Hurd is currently using sysdeps/posix/clock_getres.c for
> clock_getres; its output for CLOCK_REALTIME is based on
> sysconf (_SC_CLK_TCK), and I do not know whether that gives the
> correct result.
> 
> Unlike settimeofday, there are no known uses of gettimeofday's
> vestigial "get time zone" feature that are not bugs.  (The per-process
> timezone support in localtime and friends is unrelated, and the
> programs that set the kernel's offset between the hardware clock and
> UTC do not need to read it back.)  Therefore, this feature is dummied
> out.  Henceforth, if gettimeofday's "struct timezone" argument is not
> NULL, it will write zeroes to both fields.  Any program that is
> actually looking at this data will thus think it is running in UTC,
> which is probably more correct than whatever it was doing before.
> 
> [__]gettimeofday no longer has any internal callers, so we can now
> remove its internal prototype and PLT bypass aliases.  The
> __gettimeofday@GLIBC_2.0 export remains, in case it is used by any
> third-party code.
> 
> It also allows to simplify the arch-specific implementation on x86 and
> powerpc to remove the hack to disable the internal route to non iFUNC
> variant for internal symbol.
> 
> This patch also fixes a missing optimization on aarch64, powerpc, and
> x86 where the code used on static build do not use the vDSO.
> 
> Checked on x86_64-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu,
> powerpc64-linux-gnu, powerpc-linux-gnu, and aarch64-linux-gnu.
> 
> Co-authored-by: Zack Weinberg <zackw@panix.com>
> ---
>  NEWS                                          | 15 ++++
>  include/sys/time.h                            |  2 -
>  sysdeps/{unix => mach}/clock_gettime.c        | 37 +++++-----
>  sysdeps/mach/gettimeofday.c                   | 43 ------------
>  sysdeps/posix/gettimeofday.c                  | 67 ------------------
>  sysdeps/unix/syscalls.list                    |  1 -
>  .../unix/sysv/linux/aarch64/gettimeofday.c    | 34 ++++-----
>  .../sysv/linux/{i386 => alpha}/gettimeofday.c | 25 ++-----
>  .../unix/sysv/linux/alpha/osf_gettimeofday.c  | 11 ++-
>  sysdeps/unix/sysv/linux/gettimeofday.c        | 49 -------------
>  .../unix/sysv/linux/powerpc/gettimeofday.c    | 69
> +++++-------------- sysdeps/unix/sysv/linux/x86/gettimeofday.c    |
> 43 +++++------- .../unix/sysv/linux/x86_64/x32/gettimeofday.c |  1 +
>  .../unix/sysv/linux/x86_64/x32/syscalls.list  |  1 -
>  time/gettimeofday.c                           | 32 ++++++---
>  15 files changed, 121 insertions(+), 309 deletions(-)
>  rename sysdeps/{unix => mach}/clock_gettime.c (65%)
>  delete mode 100644 sysdeps/mach/gettimeofday.c
>  delete mode 100644 sysdeps/posix/gettimeofday.c
>  rename sysdeps/unix/sysv/linux/{i386 => alpha}/gettimeofday.c (58%)
>  delete mode 100644 sysdeps/unix/sysv/linux/gettimeofday.c
>  create mode 100644 sysdeps/unix/sysv/linux/x86_64/x32/gettimeofday.c
> 
> diff --git a/NEWS b/NEWS
> index 6d109f84f0..12d6af2fc0 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -21,6 +21,21 @@ Major new features:
>    18661-1:2014 and TS 18661-3:2015 as amended by the resolution of
>    Clarification Request 13 to TS 18661-3.
>  
> +* The gettimeofday function will no longer report information about a
> +  system-wide time zone, expect for aarch64, powerpc, and x86 on
> Linux
> +  which still uses the vDSO symbol (when available).
> +
> +  This 4.2-BSD-era feature has been deprecated for many years, as it
> cannot
> +  handle the full complexity of the world’s timezones, but hitherto
> we have
> +  supported it on a best-effort basis.  Changes required to support
> 64-bit
> +  time_t on 32-bit architectures have made this no longer practical.
> +
> +  As of this release, callers of gettimeofday with a non-null ‘tzp’
> argument
> +  will always receive a ‘struct timezone’ whose tz_minuteswest and
> +  tz_dsttime fields are zero.  We have also arranged for call sites
> that
> +  pass a non-null ‘tzp’ argument to gettimeofday to receive
> compile-time
> +  warnings, if the compiler makes this possible.
> +
>  Deprecated and removed features, and other changes affecting
> compatibility: 
>  * The totalorder and totalordermag functions, and the corresponding
> diff --git a/include/sys/time.h b/include/sys/time.h
> index c0e30e70fb..2bf4297e76 100644
> --- a/include/sys/time.h
> +++ b/include/sys/time.h
> @@ -22,8 +22,6 @@
>  # ifndef _ISOMAC
>  extern int __gettimeofday (struct timeval *__tv,
>  			   struct timezone *__tz);
> -libc_hidden_proto (__gettimeofday)
> -libc_hidden_proto (gettimeofday)
>  extern int __settimezone (const struct timezone *__tz)
>  	attribute_hidden;
>  extern int __adjtime (const struct timeval *__delta,
> diff --git a/sysdeps/unix/clock_gettime.c
> b/sysdeps/mach/clock_gettime.c similarity index 65%
> rename from sysdeps/unix/clock_gettime.c
> rename to sysdeps/mach/clock_gettime.c
> index aa74e11703..0f872e5a45 100644
> --- a/sysdeps/unix/clock_gettime.c
> +++ b/sysdeps/mach/clock_gettime.c
> @@ -1,5 +1,4 @@
> -/* clock_gettime -- Get the current time from a POSIX clockid_t.
> Unix version.
> -   Copyright (C) 1999-2019 Free Software Foundation, Inc.
> +/* Copyright (C) 1991-2019 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
> @@ -18,32 +17,28 @@
>  
>  #include <errno.h>
>  #include <time.h>
> -#include <sys/time.h>
> +#include <mach.h>
>  #include <shlib-compat.h>
>  
> -/* Get current value of CLOCK and store it in TP.  */
> +/* Get the current time of day, putting it into *TS.
> +   Returns 0 on success, -1 on errors.  */
>  int
> -__clock_gettime (clockid_t clock_id, struct timespec *tp)
> +__clock_gettime (clockid_t clock_id, struct timespec *ts)
>  {
> -  int retval = -1;
> -
> -  switch (clock_id)
> +  if (clock_id != CLOCK_REALTIME)
>      {
> -    case CLOCK_REALTIME:
> -      {
> -	struct timeval tv;
> -	retval = __gettimeofday (&tv, NULL);
> -	if (retval == 0)
> -	  TIMEVAL_TO_TIMESPEC (&tv, tp);
> -      }
> -      break;
> -
> -    default:
> -      __set_errno (EINVAL);
> -      break;
> +      errno = EINVAL;
> +      return -1;
>      }
>  
> -  return retval;
> +  /* __host_get_time can only fail if passed an invalid host_t.
> +     __mach_host_self could theoretically fail (producing an
> +     invalid host_t) due to resource exhaustion, but we assume
> +     this will never happen.  */
> +  time_value_t tv;
> +  __host_get_time (__mach_host_self (), &tv);
> +  TIME_VALUE_TO_TIMESPEC (&tv, ts);
> +  return 0;
>  }
>  libc_hidden_def (__clock_gettime)
>  
> diff --git a/sysdeps/mach/gettimeofday.c b/sysdeps/mach/gettimeofday.c
> deleted file mode 100644
> index f6df00306b..0000000000
> --- a/sysdeps/mach/gettimeofday.c
> +++ /dev/null
> @@ -1,43 +0,0 @@
> -/* Copyright (C) 1991-2019 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
> -   <https://www.gnu.org/licenses/>.  */
> -
> -#include <errno.h>
> -#include <stddef.h>
> -#include <sys/time.h>
> -#include <mach.h>
> -
> -/* Get the current time of day and timezone information,
> -   putting it into *TV and *TZ.  If TZ is NULL, *TZ is not filled.
> -   Returns 0 on success, -1 on errors.  */
> -int
> -__gettimeofday (struct timeval *tv, struct timezone *tz)
> -{
> -  kern_return_t err;
> -
> -  if (tz != NULL)
> -    *tz = (struct timezone){0, 0}; /* XXX */
> -
> -  if (err = __host_get_time (__mach_host_self (), (time_value_t *)
> tv))
> -    {
> -      errno = err;
> -      return -1;
> -    }
> -  return 0;
> -}
> -libc_hidden_def (__gettimeofday)
> -weak_alias (__gettimeofday, gettimeofday)
> -libc_hidden_weak (gettimeofday)
> diff --git a/sysdeps/posix/gettimeofday.c
> b/sysdeps/posix/gettimeofday.c deleted file mode 100644
> index 6bb98cd018..0000000000
> --- a/sysdeps/posix/gettimeofday.c
> +++ /dev/null
> @@ -1,67 +0,0 @@
> -/* Copyright (C) 1991-2019 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
> -   <https://www.gnu.org/licenses/>.  */
> -
> -#include <errno.h>
> -#include <time.h>
> -#include <sys/time.h>
> -
> -/* Get the current time of day and timezone information,
> -   putting it into *TV and *TZ.  If TZ is NULL, *TZ is not filled.
> -   Returns 0 on success, -1 on errors.  */
> -int
> -__gettimeofday (struct timeval *tv, struct timezone *tz)
> -{
> -  if (tv == NULL)
> -    {
> -      __set_errno (EINVAL);
> -      return -1;
> -    }
> -
> -  tv->tv_sec = (long int) time ((time_t *) NULL);
> -  tv->tv_usec = 0L;
> -
> -  if (tz != NULL)
> -    {
> -      const time_t timer = tv->tv_sec;
> -      struct tm tm;
> -      const struct tm *tmp;
> -
> -      const long int save_timezone = __timezone;
> -      const long int save_daylight = __daylight;
> -      char *save_tzname[2];
> -      save_tzname[0] = __tzname[0];
> -      save_tzname[1] = __tzname[1];
> -
> -      tmp = localtime_r (&timer, &tm);
> -
> -      tz->tz_minuteswest = __timezone / 60;
> -      tz->tz_dsttime = __daylight;
> -
> -      __timezone = save_timezone;
> -      __daylight = save_daylight;
> -      __tzname[0] = save_tzname[0];
> -      __tzname[1] = save_tzname[1];
> -
> -      if (tmp == NULL)
> -	return -1;
> -    }
> -
> -  return 0;
> -}
> -libc_hidden_def (__gettimeofday)
> -weak_alias (__gettimeofday, gettimeofday)
> -libc_hidden_weak (gettimeofday)
> diff --git a/sysdeps/unix/syscalls.list b/sysdeps/unix/syscalls.list
> index 5fedd5733d..e28e801c7a 100644
> --- a/sysdeps/unix/syscalls.list
> +++ b/sysdeps/unix/syscalls.list
> @@ -33,7 +33,6 @@ getrlimit	-	getrlimit
> i:ip	__getrlimit	getrlimit getrusage	-
> getrusage	i:ip	__getrusage	getrusage
> getsockname	-	getsockname	i:ibN
> __getsockname	getsockname getsockopt	-
> getsockopt	i:iiiBN	getsockopt -gettimeofday
> -	gettimeofday	i:pP	__gettimeofday
> gettimeofday getuid		-	getuid
> Ei:	__getuid	getuid ioctl		-
> ioctl		i:iiI	__ioctl		ioctl
> kill		-	kill		i:ii
> __kill		kill diff --git
> a/sysdeps/unix/sysv/linux/aarch64/gettimeofday.c
> b/sysdeps/unix/sysv/linux/aarch64/gettimeofday.c index
> 4ff74fa285..075af3d0d3 100644 ---
> a/sysdeps/unix/sysv/linux/aarch64/gettimeofday.c +++
> b/sysdeps/unix/sysv/linux/aarch64/gettimeofday.c @@ -20,39 +20,39 @@
> putting it into *tv and *tz.  If tz is null, *tz is not filled.
> Returns 0 on success, -1 on errors.  */ -#include <sys/time.h>
> +#include <time.h> +#include <sysdep.h> 
> -#ifdef SHARED
> -
> -# include <dl-vdso.h>
> -# include <sysdep-vdso.h>
> +#ifdef HAVE_GETTIMEOFDAY_VSYSCALL
> +# define HAVE_VSYSCALL
> +#endif
> +#include <sysdep-vdso.h>
>  
>  /* Used as a fallback in the ifunc resolver if VDSO is not available
>     and for libc.so internal __gettimeofday calls.  */
> -
>  static int
>  __gettimeofday_vsyscall (struct timeval *tv, struct timezone *tz)
>  {
> +  if (__glibc_unlikely (tz != 0))
> +    memset (tz, 0, sizeof *tz);
> +
>    return INLINE_VSYSCALL (gettimeofday, 2, tv, tz);
>  }
>  
> +#ifdef SHARED
> +# include <dl-vdso.h>
> +# include <sysdep-vdso.h>
> +
>  # define INIT_ARCH()
> -libc_ifunc_hidden (__gettimeofday, __gettimeofday,
> -		   (get_vdso_symbol (HAVE_GETTIMEOFDAY_VSYSCALL)
> -		    ?: __gettimeofday_vsyscall))
> -libc_hidden_def (__gettimeofday)
> +libc_ifunc (__gettimeofday,
> +	    (get_vdso_symbol (HAVE_GETTIMEOFDAY_VSYSCALL)
> +	    ?: __gettimeofday_vsyscall))
>  
>  #else
> -
> -# include <sysdep.h>
>  int
>  __gettimeofday (struct timeval *tv, struct timezone *tz)
>  {
> -  return INLINE_SYSCALL (gettimeofday, 2, tv, tz);
> +  return __gettimeofday_vsyscall (tv, tz);
>  }
> -libc_hidden_def (__gettimeofday)
> -
>  #endif
> -
>  weak_alias (__gettimeofday, gettimeofday)
> -libc_hidden_weak (gettimeofday)
> diff --git a/sysdeps/unix/sysv/linux/i386/gettimeofday.c
> b/sysdeps/unix/sysv/linux/alpha/gettimeofday.c similarity index 58%
> rename from sysdeps/unix/sysv/linux/i386/gettimeofday.c
> rename to sysdeps/unix/sysv/linux/alpha/gettimeofday.c
> index f6faecb21e..262a3c2352 100644
> --- a/sysdeps/unix/sysv/linux/i386/gettimeofday.c
> +++ b/sysdeps/unix/sysv/linux/alpha/gettimeofday.c
> @@ -1,5 +1,5 @@
> -/* gettimeofday - get the time.  Linux/i386 version.
> -   Copyright (C) 2015-2019 Free Software Foundation, Inc.
> +/* gettimeofday -- Get the current time of day.  Linux/Alpha/tv64
> version.
> +   Copyright (C) 2019 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
> @@ -16,20 +16,7 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>  
> -#ifdef SHARED
> -# define __gettimeofday __redirect___gettimeofday
> -#endif
> -
> -#include <sys/time.h>
> -
> -#ifdef SHARED
> -# undef __gettimeofday
> -# define __gettimeofday_type __redirect___gettimeofday
> -
> -# undef libc_hidden_def
> -# define libc_hidden_def(name) \
> -  __hidden_ver1 (__gettimeofday_syscall, __GI___gettimeofday, \
> -	       __gettimeofday_syscall);
> -#endif
> -
> -#include <sysdeps/unix/sysv/linux/x86/gettimeofday.c>
> +/* We can use the generic implementation, but we have to override its
> +   default symbol version.  */
> +#define VERSION_gettimeofday GLIBC_2.1
> +#include <time/gettimeofday.c>
> diff --git a/sysdeps/unix/sysv/linux/alpha/osf_gettimeofday.c
> b/sysdeps/unix/sysv/linux/alpha/osf_gettimeofday.c index
> e6cc522dd1..f602d8dcf9 100644 ---
> a/sysdeps/unix/sysv/linux/alpha/osf_gettimeofday.c +++
> b/sysdeps/unix/sysv/linux/alpha/osf_gettimeofday.c @@ -20,6 +20,8 @@
>  
>  #if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
>  
> +#include <string.h>
> +#include <time.h>
>  #include <sys/time.h>
>  #include <tv32-compat.h>
>  
> @@ -30,10 +32,13 @@ int
>  attribute_compat_text_section
>  __gettimeofday_tv32 (struct timeval32 *restrict tv32, void *restrict
> tz) {
> -  struct timeval tv;
> -  __gettimeofday (&tv, tz);
> +  if (__glibc_unlikely (tz != 0))
> +    memset (tz, 0, sizeof (struct timezone));
>  
> -  tv64_to_tv32 (tv32, &tv);
> +  struct timespec ts;
> +  __clock_gettime (CLOCK_REALTIME, &ts);
> +
> +  ts64_to_tv32 (tv32, &ts);

IMHO, this shall be replaced with valid_* functions from include/time.h

>    return 0;
>  }
>  
> diff --git a/sysdeps/unix/sysv/linux/gettimeofday.c
> b/sysdeps/unix/sysv/linux/gettimeofday.c deleted file mode 100644
> index c9597d6405..0000000000
> --- a/sysdeps/unix/sysv/linux/gettimeofday.c
> +++ /dev/null
> @@ -1,49 +0,0 @@
> -/* Copyright (C) 2015-2019 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
> -   <https://www.gnu.org/licenses/>.  */
> -
> -#include <errno.h>
> -#include <sys/time.h>
> -
> -#undef __gettimeofday
> -
> -#ifdef HAVE_GETTIMEOFDAY_VSYSCALL
> -# define HAVE_VSYSCALL
> -#endif
> -#include <sysdep-vdso.h>
> -
> -/* Get the current time of day and timezone information,
> -   putting it into *tv and *tz.  If tz is null, *tz is not filled.
> -   Returns 0 on success, -1 on errors.  */
> -int
> -___gettimeofday (struct timeval *tv, struct timezone *tz)
> -{
> -  return INLINE_VSYSCALL (gettimeofday, 2, tv, tz);
> -}
> -
> -#ifdef VERSION_gettimeofday
> -weak_alias (___gettimeofday, __wgettimeofday);
> -default_symbol_version (___gettimeofday, __gettimeofday,
> VERSION_gettimeofday); -default_symbol_version (__wgettimeofday,
> gettimeofday, VERSION_gettimeofday); -libc_hidden_ver
> (___gettimeofday, __gettimeofday); -libc_hidden_ver (___gettimeofday,
> gettimeofday); -#else
> -strong_alias (___gettimeofday, __gettimeofday)
> -weak_alias (___gettimeofday, gettimeofday)
> -libc_hidden_def (__gettimeofday)
> -libc_hidden_weak (gettimeofday)
> -#endif
> diff --git a/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c
> b/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c index
> 13a1fd292a..02486dee3a 100644 ---
> a/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c +++
> b/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c @@ -15,71 +15,40 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>  
> -#if defined SHARED && !defined __powerpc64__
> -# define __gettimeofday __redirect___gettimeofday
> -#else
> -# define __redirect___gettimeofday __gettimeofday
> -#endif
> -
> -#include <sys/time.h>
> -
> -#ifdef SHARED
> -
> -# include <dl-vdso.h>
> -# include <libc-vdso.h>
> -# include <dl-machine.h>
> -# include <sysdep.h>
> -
> -# ifndef __powerpc64__
> -#  undef __gettimeofday
> -
> -int
> -__gettimeofday_vsyscall (struct timeval *tv, struct timezone *tz)
> -{
> -  return INLINE_VSYSCALL (gettimeofday, 2, tv, tz);
> -}
> -
> -/* __GI___gettimeofday is defined as hidden and for ppc32 it enables
> the
> -   compiler make a local call (symbol@local) for internal GLIBC
> usage. It
> -   means the PLT won't be used and the ifunc resolver will be called
> directly.
> -   For ppc64 a call to a function in another translation unit might
> use a
> -   different toc pointer thus disallowing direct branchess and
> making internal
> -   ifuncs calls safe.  */
> -#  undef libc_hidden_def
> -#  define libc_hidden_def(name)
> 	\
> -  __hidden_ver1 (__gettimeofday_vsyscall,
> __GI___gettimeofday,	\
> -	       __gettimeofday_vsyscall);
> +#include <time.h>
> +#include <sysdep.h>
>  
> -# endif /* !__powerpc64__  */
> +#ifdef HAVE_GETTIMEOFDAY_VSYSCALL
> +# define HAVE_VSYSCALL
> +#endif
> +#include <sysdep-vdso.h>
>  
>  static int
>  __gettimeofday_syscall (struct timeval *tv, struct timezone *tz)
>  {
> -  return INLINE_SYSCALL (gettimeofday, 2, tv, tz);
> +  if (__glibc_unlikely (tz != 0))
> +    memset (tz, 0, sizeof *tz);
> +
> +  return INLINE_VSYSCALL (gettimeofday, 2, tv, tz);
>  }
>  
> +#ifdef SHARED
> +# include <dl-vdso.h>
> +# include <libc-vdso.h>
> +
>  # define INIT_ARCH() \
>    void *vdso_gettimeofday = get_vdso_symbol
> (HAVE_GETTIMEOFDAY_VSYSCALL) 
>  /* If the vDSO is not available we fall back syscall.  */
> -libc_ifunc_hidden (__redirect___gettimeofday, __gettimeofday,
> -		   vdso_gettimeofday
> -		   ? VDSO_IFUNC_RET (vdso_gettimeofday)
> -		   : (void *) __gettimeofday_syscall);
> -libc_hidden_def (__gettimeofday)
> -
> +libc_ifunc (__gettimeofday,
> +	    vdso_gettimeofday
> +	    ? VDSO_IFUNC_RET (vdso_gettimeofday)
> +	    : (void *) __gettimeofday_syscall);
>  #else
> -
> -# include <sysdep.h>
> -# include <errno.h>
> -
>  int
>  __gettimeofday (struct timeval *tv, struct timezone *tz)
>  {
> -  return INLINE_SYSCALL (gettimeofday, 2, tv, tz);
> +  return __gettimeofday_syscall (tv, tz);
>  }
> -libc_hidden_def (__gettimeofday)
> -
>  #endif
>  weak_alias (__gettimeofday, gettimeofday)
> -libc_hidden_weak (gettimeofday)
> diff --git a/sysdeps/unix/sysv/linux/x86/gettimeofday.c
> b/sysdeps/unix/sysv/linux/x86/gettimeofday.c index
> 2d9248ee26..cb20e358d8 100644 ---
> a/sysdeps/unix/sysv/linux/x86/gettimeofday.c +++
> b/sysdeps/unix/sysv/linux/x86/gettimeofday.c @@ -16,47 +16,38 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>  
> -#include <sys/time.h>
> +#include <time.h>
> +#include <sysdep.h>
>  
> -#ifdef SHARED
> -
> -# include <dl-vdso.h>
> -# include <errno.h>
> -# include <sysdep-vdso.h>
> -# include <sysdep-vdso.h>
> +#ifdef HAVE_GETTIMEOFDAY_VSYSCALL
> +# define HAVE_VSYSCALL
> +#endif
> +#include <sysdep-vdso.h>
>  
>  static int
>  __gettimeofday_syscall (struct timeval *tv, struct timezone *tz)
>  {
> -  return INLINE_SYSCALL (gettimeofday, 2, tv, tz);
> +  if (__glibc_unlikely (tz != 0))
> +    memset (tz, 0, sizeof *tz);
> +
> +  return INLINE_VSYSCALL (gettimeofday, 2, tv, tz);
>  }
>  
> -# ifndef __gettimeofday_type
> -/* The i386 gettimeofday.c includes this file with a defined
> -   __gettimeofday_type macro.  For x86_64 we have to define it to
> __gettimeofday
> -   as the internal symbol is the ifunc'ed one.  */
> -#  define __gettimeofday_type __gettimeofday
> -# endif
> +#ifdef SHARED
> +# include <dl-vdso.h>
> +# include <libc-vdso.h>
>  
>  # define INIT_ARCH()
>  /* If the vDSO is not available we fall back to syscall.  */
> -libc_ifunc_hidden (__gettimeofday_type, __gettimeofday,
> -		   (get_vdso_symbol ("__vdso_gettimeofday")
> -		    ?: __gettimeofday_syscall));
> -libc_hidden_def (__gettimeofday)
> +libc_ifunc (__gettimeofday,
> +	    (get_vdso_symbol (HAVE_GETTIMEOFDAY_VSYSCALL)
> +	    ?: __gettimeofday_syscall));
>  
>  #else
> -
> -# include <sysdep.h>
> -# include <errno.h>
> -
>  int
>  __gettimeofday (struct timeval *tv, struct timezone *tz)
>  {
> -  return INLINE_SYSCALL (gettimeofday, 2, tv, tz);
> +  return __gettimeofday_syscall (tv, tz);
>  }
> -libc_hidden_def (__gettimeofday)
> -
>  #endif
>  weak_alias (__gettimeofday, gettimeofday)
> -libc_hidden_weak (gettimeofday)
> diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/gettimeofday.c
> b/sysdeps/unix/sysv/linux/x86_64/x32/gettimeofday.c new file mode
> 100644 index 0000000000..cd342f33ad
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/x86_64/x32/gettimeofday.c
> @@ -0,0 +1 @@
> +#include <sysdeps/unix/sysv/linux/x86/gettimeofday.c>
> diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list
> b/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list index
> b44f6f99e9..786c884232 100644 ---
> a/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list +++
> b/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list @@ -1,6 +1,5 @@
>  # File name	Caller	Syscall name	# args
> Strong name	Weak names 
> -gettimeofday	-
> gettimeofday:__vdso_gettimeofday@LINUX_2.6	i:pP
> __gettimeofday	gettimeofday personality	EXTRA
> personality	Ei:i	__personality	personality
> posix_fadvise64	-	fadvise64	Vi:iiii
> posix_fadvise	posix_fadvise64 time		-
> time:__vdso_time@LINUX_2.6			Ei:P	time
> diff --git a/time/gettimeofday.c b/time/gettimeofday.c index
> 1fd2669abd..e8055b397d 100644 --- a/time/gettimeofday.c +++
> b/time/gettimeofday.c @@ -15,20 +15,32 @@ License along with the GNU
> C Library; if not, see <https://www.gnu.org/licenses/>.  */
>  
> -#include <errno.h>
> +#include <string.h>
> +#include <time.h>
>  #include <sys/time.h>
>  
> -/* Get the current time of day and timezone information,
> -   putting it into *TV and *TZ.  If TZ is NULL, *TZ is not filled.
> +/* Get the current time of day, putting it into *TV.
> +   If *TZ is not NULL, clear it.
>     Returns 0 on success, -1 on errors.  */
>  int
> -__gettimeofday (struct timeval *tv, struct timezone *tz)
> +___gettimeofday (struct timeval *tv, struct timezone *tz)
>  {
> -  __set_errno (ENOSYS);
> -  return -1;
> +  if (__glibc_unlikely (tz != 0))
> +    memset (tz, 0, sizeof *tz);
> +
> +  struct timespec ts;
> +  if (__clock_gettime (CLOCK_REALTIME, &ts))
> +    return -1;
> +
> +  TIMESPEC_TO_TIMEVAL (tv, &ts);
> +  return 0;
>  }
> -libc_hidden_def (__gettimeofday)
> -weak_alias (__gettimeofday, gettimeofday)
> -libc_hidden_weak (gettimeofday)
>  
> -stub_warning (gettimeofday)
> +#ifdef VERSION_gettimeofday
> +weak_alias (___gettimeofday, __wgettimeofday);
> +default_symbol_version (___gettimeofday, __gettimeofday,
> VERSION_gettimeofday); +default_symbol_version (__wgettimeofday,
> gettimeofday, VERSION_gettimeofday); +#else
> +strong_alias (___gettimeofday, __gettimeofday)
> +weak_alias (___gettimeofday, gettimeofday)
> +#endif

Reviewed-by: Lukasz Majewski <lukma@denx.de>


Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de

Attachment: pgpVaPEc7E1xR.pgp
Description: OpenPGP digital signature


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]