public inbox for glibc-cvs@sourceware.org help / color / mirror / Atom feed
From: Zack Weinberg <zack@sourceware.org> To: glibc-cvs@sourceware.org Subject: [glibc/zack/y2038-preliminaries] Use clock_gettime to implement gettimeofday. Date: Sat, 17 Aug 2019 01:18:00 -0000 [thread overview] Message-ID: <20190817011800.122131.qmail@sourceware.org> (raw) [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1: Type: text/plain; charset="us-ascii", Size: 36056 bytes --] https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=4a5519b49ec776861d3814cfbbe75be6bb4ba005 commit 4a5519b49ec776861d3814cfbbe75be6bb4ba005 Author: Zack Weinberg <zackw@panix.com> Date: Fri Aug 16 19:28:17 2019 -0400 Use clock_gettime to implement gettimeofday. Abstractly, this is the same change as using clock_gettime to implement time, but the vestigial âget time zoneâ feature of gettimeofday complicates matters a little. Unlike settimeofday, there are *no* known uses of this feature that are not bugs, so it is simply dummied out. (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.) 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. Hurd having already been converted, this patch only affects Linux and hypothetical future ports. Most Linux ports supplied a vDSO symbol for gettimeofday, and some wrapped that with an ifunc, so this patch deletes a lot of code. For ease of future edits to the many copies of _libc_vdso_platform_setup, the variable âpâ in each is now declared separately from any use of it. As with settimeofday, the alpha-linux-gnu configuration has two versions, GLIBC_2.0 and GLIBC_2.1, with the older symbol using 32-bit time_t (yes, really) and the same solution is implemented here. * time/gettimeofday.c: No longer a stub implementation. Call __clock_gettime. If âtzâ argument is not NULL, clear the object it points to. Remove libc_hidden_def for __gettimeofday and libc_hidden_weak for gettimeofday. Optionally override the default symbol version for gettimeofday. * include/sys/time.h: Remove internal prototype and libc_hidden_proto for __gettimeofday, and libc_hidden_proto for gettimeofday. * sysdeps/unix/sysv/linux/aarch64/init-first.c * sysdeps/unix/sysv/linux/arm/init-first.c * sysdeps/unix/sysv/linux/mips/init-first.c * sysdeps/unix/sysv/linux/powerpc/init-first.c * sysdeps/unix/sysv/linux/riscv/init-first.c * sysdeps/unix/sysv/linux/s390/init-first.c * sysdeps/unix/sysv/linux/sparc/init-first.c: Do not define nor initialize VDSO_SYMBOL(gettimeofday). * sysdeps/unix/sysv/linux/aarch64/libc-vdso.h * sysdeps/unix/sysv/linux/arm/libc-vdso.h * sysdeps/unix/sysv/linux/mips/libc-vdso.h * sysdeps/unix/sysv/linux/powerpc/libc-vdso.h * sysdeps/unix/sysv/linux/riscv/libc-vdso.h * sysdeps/unix/sysv/linux/s390/libc-vdso.h * sysdeps/unix/sysv/linux/sparc/libc-vdso.h: Do not declare VDSO_SYMBOL(gettimeofday). * sysdeps/unix/syscalls.list: Remove entry for gettimeofday. * sysdeps/unix/sysv/linux/alpha/syscalls.list: Remove entries for gettimeofday and osf_gettimeofday. * sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list: Remove entry for gettimeofday. * sysdeps/posix/gettimeofday.c * sysdeps/unix/sysv/linux/aarch64/gettimeofday.c * sysdeps/unix/sysv/linux/gettimeofday.c * sysdeps/unix/sysv/linux/i386/gettimeofday.c * sysdeps/unix/sysv/linux/powerpc/gettimeofday.c * sysdeps/unix/sysv/linux/x86/gettimeofday.c: Delete file. * sysdeps/unix/sysv/linux/alpha/osf_gettimeofday.c: New file, defines gettimeofday@GLIBC_2.0. * sysdeps/unix/sysv/linux/alpha/gettimeofday.c New file, defines gettimeofday@@GLIBC_2.1. * sysdeps/unix/make-syscalls.sh: Change an example in a comment from referring to gettimeofday, to referring to sigaction. Diff: --- include/sys/time.h | 4 - sysdeps/posix/gettimeofday.c | 67 ----------------- sysdeps/unix/make-syscalls.sh | 2 +- sysdeps/unix/syscalls.list | 1 - sysdeps/unix/sysv/linux/aarch64/gettimeofday.c | 71 ------------------ sysdeps/unix/sysv/linux/aarch64/init-first.c | 5 -- sysdeps/unix/sysv/linux/aarch64/libc-vdso.h | 2 - .../unix/sysv/linux/{i386 => alpha}/gettimeofday.c | 25 ++----- sysdeps/unix/sysv/linux/alpha/osf_gettimeofday.c | 66 +++++++++++++++++ sysdeps/unix/sysv/linux/alpha/syscalls.list | 2 - sysdeps/unix/sysv/linux/arm/init-first.c | 7 +- sysdeps/unix/sysv/linux/arm/libc-vdso.h | 2 - sysdeps/unix/sysv/linux/gettimeofday.c | 39 ---------- sysdeps/unix/sysv/linux/mips/init-first.c | 7 +- sysdeps/unix/sysv/linux/mips/libc-vdso.h | 2 - sysdeps/unix/sysv/linux/powerpc/gettimeofday.c | 85 ---------------------- sysdeps/unix/sysv/linux/powerpc/init-first.c | 8 +- sysdeps/unix/sysv/linux/powerpc/libc-vdso.h | 2 - sysdeps/unix/sysv/linux/riscv/init-first.c | 10 +-- sysdeps/unix/sysv/linux/riscv/libc-vdso.h | 2 - sysdeps/unix/sysv/linux/s390/init-first.c | 9 +-- sysdeps/unix/sysv/linux/s390/libc-vdso.h | 3 - sysdeps/unix/sysv/linux/sparc/init-first.c | 8 +- sysdeps/unix/sysv/linux/sparc/libc-vdso.h | 2 - sysdeps/unix/sysv/linux/x86/gettimeofday.c | 61 ---------------- sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list | 1 - time/gettimeofday.c | 28 ++++--- 27 files changed, 105 insertions(+), 416 deletions(-) diff --git a/include/sys/time.h b/include/sys/time.h index a57752e..4a91622 100644 --- a/include/sys/time.h +++ b/include/sys/time.h @@ -20,10 +20,6 @@ # include <time/sys/time.h> # 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/posix/gettimeofday.c b/sysdeps/posix/gettimeofday.c deleted file mode 100644 index 6ba625e..0000000 --- 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 - <http://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/make-syscalls.sh b/sysdeps/unix/make-syscalls.sh index 6a5c10d..2b8c9ea 100644 --- a/sysdeps/unix/make-syscalls.sh +++ b/sysdeps/unix/make-syscalls.sh @@ -27,7 +27,7 @@ # n: scalar buffer length (e.g., 3rd arg to read) # N: pointer to value/return scalar buffer length (e.g., 6th arg to recvfrom) # p: non-NULL pointer to typed object (e.g., any non-void* arg) -# P: optionally-NULL pointer to typed object (e.g., 2nd argument to gettimeofday) +# P: optionally-NULL pointer to typed object (e.g., 3rd argument to sigaction) # s: non-NULL string (e.g., 1st arg to open) # S: optionally-NULL string (e.g., 1st arg to acct) # v: vararg scalar (e.g., optional 3rd arg to open) diff --git a/sysdeps/unix/syscalls.list b/sysdeps/unix/syscalls.list index 5fedd57..e28e801 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 deleted file mode 100644 index 9180b50..0000000 --- a/sysdeps/unix/sysv/linux/aarch64/gettimeofday.c +++ /dev/null @@ -1,71 +0,0 @@ -/* Copyright (C) 2018-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 - <http://www.gnu.org/licenses/>. */ - -/* 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. */ - -#ifdef SHARED - -# define __gettimeofday __redirect___gettimeofday -# include <sys/time.h> -# undef __gettimeofday -# define HAVE_VSYSCALL -# include <dl-vdso.h> -# 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) -{ - return INLINE_VSYSCALL (gettimeofday, 2, tv, tz); -} - -/* PREPARE_VERSION_KNOWN will need an __LP64__ ifdef when ILP32 support - goes in. See _libc_vdso_platform_setup in - sysdeps/unix/sysv/linux/aarch64/init-first.c. */ - -# undef INIT_ARCH -# define INIT_ARCH() \ - PREPARE_VERSION_KNOWN (linux_version, LINUX_2_6_39); \ - void *vdso_gettimeofday = \ - _dl_vdso_vsym ("__kernel_gettimeofday", &linux_version); - -libc_ifunc_hidden (__redirect___gettimeofday, __gettimeofday, - vdso_gettimeofday ?: (void *) __gettimeofday_vsyscall) - -__hidden_ver1 (__gettimeofday_vsyscall, __GI___gettimeofday, - __gettimeofday_vsyscall); - -#else - -# include <sys/time.h> -# include <sysdep.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/aarch64/init-first.c b/sysdeps/unix/sysv/linux/aarch64/init-first.c index 80f7ed9..25b6156 100644 --- a/sysdeps/unix/sysv/linux/aarch64/init-first.c +++ b/sysdeps/unix/sysv/linux/aarch64/init-first.c @@ -19,7 +19,6 @@ #include <dl-vdso.h> #include <libc-vdso.h> -int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) attribute_hidden; int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); int (*VDSO_SYMBOL(clock_getres)) (clockid_t, struct timespec *); @@ -32,10 +31,6 @@ _libc_vdso_platform_setup (void) PREPARE_VERSION_KNOWN (linux_version, LINUX_4_9); #endif - void *p = _dl_vdso_vsym ("__kernel_gettimeofday", &linux_version); - PTR_MANGLE (p); - VDSO_SYMBOL(gettimeofday) = p; - p = _dl_vdso_vsym ("__kernel_clock_gettime", &linux_version); PTR_MANGLE (p); VDSO_SYMBOL(clock_gettime) = p; diff --git a/sysdeps/unix/sysv/linux/aarch64/libc-vdso.h b/sysdeps/unix/sysv/linux/aarch64/libc-vdso.h index 3fcbaa9..285ca62 100644 --- a/sysdeps/unix/sysv/linux/aarch64/libc-vdso.h +++ b/sysdeps/unix/sysv/linux/aarch64/libc-vdso.h @@ -22,8 +22,6 @@ #include <sysdep.h> #include <sysdep-vdso.h> -extern int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) - attribute_hidden; extern int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); extern int (*VDSO_SYMBOL(clock_getres)) (clockid_t, struct timespec *); 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 185450e..46dc778 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 <http://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 new file mode 100644 index 0000000..cfecc55 --- /dev/null +++ b/sysdeps/unix/sysv/linux/alpha/osf_gettimeofday.c @@ -0,0 +1,66 @@ +/* gettimeofday -- Get the current time of day. Linux/Alpha/tv32 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 + 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 <errno.h> +#include <limits.h> +#include <string.h> +#include <time.h> +#include <sys/time.h> +#include <shlib-compat.h> + +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1) + +struct timeval32 +{ + int tv_sec, tv_usec; +}; + +/* 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 +attribute_compat_text_section +__gettimeofday_tv32 (struct timeval32 *tv32, + struct timezone *tz) +{ + if (__glibc_unlikely (tz)) + memset (tz, 0, sizeof *tz); + + struct timespec ts; + if (__clock_gettime (CLOCK_REALTIME, &ts)) + return -1; + + if (__glibc_unlikely (ts.tv_sec > (time_t)INT_MAX)) + { + /* The clock has advanced past the time representable in a 32-bit + time_t. Fail, but write a saturated value to the output first, + because callers don't typically expect gettimeofday to fail. */ + __set_errno (EOVERFLOW); + tv32.tv_sec = INT_MAX; + tv32.tv_usec = 0; + return -1; + } + + tv32.tv_sec = ts.tv_sec; + tv32.tv_usec = tv32.tv_nsec / 1000; + return 0; +} + +compat_symbol (libc, __settimeofday_tv32, settimeofday, GLIBC_2_0); +#endif diff --git a/sysdeps/unix/sysv/linux/alpha/syscalls.list b/sysdeps/unix/sysv/linux/alpha/syscalls.list index f5a534e..9ceed78 100644 --- a/sysdeps/unix/sysv/linux/alpha/syscalls.list +++ b/sysdeps/unix/sysv/linux/alpha/syscalls.list @@ -23,7 +23,6 @@ pciconfig_write EXTRA pciconfig_write 5 pciconfig_write pciconfig_iobase EXTRA pciconfig_iobase 3 __pciconfig_iobase pciconfig_iobase # support old timeval32 entry points -osf_gettimeofday - osf_gettimeofday 2 __gettimeofday_tv32 __gettimeofday@GLIBC_2.0 gettimeofday@GLIBC_2.0 osf_getitimer - osf_getitimer 2 __getitimer_tv32 getitimer@GLIBC_2.0 osf_setitimer - osf_setitimer 3 __setitimer_tv32 setitimer@GLIBC_2.0 osf_utimes - osf_utimes 2 __utimes_tv32 utimes@GLIBC_2.0 @@ -31,7 +30,6 @@ osf_getrusage - osf_getrusage 2 __getrusage_tv32 getrusage@GLIBC_2.0 osf_wait4 - osf_wait4 4 __wait4_tv32 wait4@GLIBC_2.0 # support new timeval64 entry points -gettimeofday - gettimeofday 2 __GI___gettimeofday gettimeofday@@GLIBC_2.1 __gettimeofday@@GLIBC_2.1 getitimer - getitimer 2 __getitimer getitimer@@GLIBC_2.1 setitimer - setitimer 3 __setitimer setitimer@@GLIBC_2.1 utimes - utimes 2 __utimes utimes@@GLIBC_2.1 diff --git a/sysdeps/unix/sysv/linux/arm/init-first.c b/sysdeps/unix/sysv/linux/arm/init-first.c index e1846df..c73970d0 100644 --- a/sysdeps/unix/sysv/linux/arm/init-first.c +++ b/sysdeps/unix/sysv/linux/arm/init-first.c @@ -21,17 +21,14 @@ #include <libc-vdso.h> #include <sysdep-vdso.h> -int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) attribute_hidden; int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); static inline void _libc_vdso_platform_setup (void) { - PREPARE_VERSION_KNOWN (linux26, LINUX_2_6); + void *p; - void *p = _dl_vdso_vsym ("__vdso_gettimeofday", &linux26); - PTR_MANGLE (p); - VDSO_SYMBOL (gettimeofday) = p; + PREPARE_VERSION_KNOWN (linux26, LINUX_2_6); p = _dl_vdso_vsym ("__vdso_clock_gettime", &linux26); PTR_MANGLE (p); diff --git a/sysdeps/unix/sysv/linux/arm/libc-vdso.h b/sysdeps/unix/sysv/linux/arm/libc-vdso.h index 8702165..b7ae61d 100644 --- a/sysdeps/unix/sysv/linux/arm/libc-vdso.h +++ b/sysdeps/unix/sysv/linux/arm/libc-vdso.h @@ -22,8 +22,6 @@ #include <sysdep-vdso.h> -extern int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) - attribute_hidden; extern int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); #endif /* _LIBC_VDSO_H */ diff --git a/sysdeps/unix/sysv/linux/gettimeofday.c b/sysdeps/unix/sysv/linux/gettimeofday.c deleted file mode 100644 index a74f038..0000000 --- a/sysdeps/unix/sysv/linux/gettimeofday.c +++ /dev/null @@ -1,39 +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 - <http://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); -} -libc_hidden_def (__gettimeofday) -weak_alias (__gettimeofday, gettimeofday) -libc_hidden_weak (gettimeofday) diff --git a/sysdeps/unix/sysv/linux/mips/init-first.c b/sysdeps/unix/sysv/linux/mips/init-first.c index 25884ff..a7c3643 100644 --- a/sysdeps/unix/sysv/linux/mips/init-first.c +++ b/sysdeps/unix/sysv/linux/mips/init-first.c @@ -20,17 +20,14 @@ #include <dl-vdso.h> #include <libc-vdso.h> -int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) attribute_hidden; int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); static inline void _libc_vdso_platform_setup (void) { - PREPARE_VERSION_KNOWN (linux26, LINUX_2_6); + void *p; - void *p = _dl_vdso_vsym ("__vdso_gettimeofday", &linux26); - PTR_MANGLE (p); - VDSO_SYMBOL (gettimeofday) = p; + PREPARE_VERSION_KNOWN (linux26, LINUX_2_6); p = _dl_vdso_vsym ("__vdso_clock_gettime", &linux26); PTR_MANGLE (p); diff --git a/sysdeps/unix/sysv/linux/mips/libc-vdso.h b/sysdeps/unix/sysv/linux/mips/libc-vdso.h index 344ea2d..e0a8fe4 100644 --- a/sysdeps/unix/sysv/linux/mips/libc-vdso.h +++ b/sysdeps/unix/sysv/linux/mips/libc-vdso.h @@ -22,8 +22,6 @@ #include <sysdep-vdso.h> -extern int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) - attribute_hidden; extern int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); #endif /* _LIBC_VDSO_H */ diff --git a/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c b/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c deleted file mode 100644 index 463b678..0000000 --- a/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c +++ /dev/null @@ -1,85 +0,0 @@ -/* Copyright (C) 2005-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 - <http://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> - -# 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); - -# endif /* !__powerpc64__ */ - -static int -__gettimeofday_syscall (struct timeval *tv, struct timezone *tz) -{ - return INLINE_SYSCALL (gettimeofday, 2, tv, tz); -} - -# define INIT_ARCH() \ - PREPARE_VERSION_KNOWN (linux2615, LINUX_2_6_15); \ - void *vdso_gettimeofday = _dl_vdso_vsym ("__kernel_gettimeofday", &linux2615); - -/* 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) - -#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/powerpc/init-first.c b/sysdeps/unix/sysv/linux/powerpc/init-first.c index 4f12b59..166bf3f 100644 --- a/sysdeps/unix/sysv/linux/powerpc/init-first.c +++ b/sysdeps/unix/sysv/linux/powerpc/init-first.c @@ -19,8 +19,6 @@ #include <dl-vdso.h> #include <libc-vdso.h> -int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) - attribute_hidden; int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); int (*VDSO_SYMBOL(clock_getres)) (clockid_t, struct timespec *); unsigned long long (*VDSO_SYMBOL(get_tbfreq)) (void); @@ -36,11 +34,9 @@ void *VDSO_SYMBOL(sigtramp_rt32); static inline void _libc_vdso_platform_setup (void) { - PREPARE_VERSION_KNOWN (linux2615, LINUX_2_6_15); + void *p; - void *p = _dl_vdso_vsym ("__kernel_gettimeofday", &linux2615); - PTR_MANGLE (p); - VDSO_SYMBOL (gettimeofday) = p; + PREPARE_VERSION_KNOWN (linux2615, LINUX_2_6_15); p = _dl_vdso_vsym ("__kernel_clock_gettime", &linux2615); PTR_MANGLE (p); diff --git a/sysdeps/unix/sysv/linux/powerpc/libc-vdso.h b/sysdeps/unix/sysv/linux/powerpc/libc-vdso.h index f818406..e233ea1 100644 --- a/sysdeps/unix/sysv/linux/powerpc/libc-vdso.h +++ b/sysdeps/unix/sysv/linux/powerpc/libc-vdso.h @@ -23,8 +23,6 @@ #include <sysdep.h> #include <sysdep-vdso.h> -extern int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) - attribute_hidden; extern int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); extern int (*VDSO_SYMBOL(clock_getres)) (clockid_t, struct timespec *); extern unsigned long long (*VDSO_SYMBOL(get_tbfreq)) (void); diff --git a/sysdeps/unix/sysv/linux/riscv/init-first.c b/sysdeps/unix/sysv/linux/riscv/init-first.c index 98a8ce3..014d770 100644 --- a/sysdeps/unix/sysv/linux/riscv/init-first.c +++ b/sysdeps/unix/sysv/linux/riscv/init-first.c @@ -22,8 +22,6 @@ long int (*VDSO_SYMBOL (getcpu)) (unsigned int *, unsigned int *, void *) attribute_hidden; -long int (*VDSO_SYMBOL (gettimeofday)) (struct timeval *, void *) - attribute_hidden; long int (*VDSO_SYMBOL (clock_gettime)) (clockid_t, struct timespec *) attribute_hidden; long int (*VDSO_SYMBOL (clock_getres)) (clockid_t, struct timespec *) @@ -32,16 +30,14 @@ long int (*VDSO_SYMBOL (clock_getres)) (clockid_t, struct timespec *) static inline void _libc_vdso_platform_setup (void) { + void *p; + PREPARE_VERSION_KNOWN (linux_version, LINUX_4_15); - void *p = _dl_vdso_vsym ("__vdso_getcpu", &linux_version); + p = _dl_vdso_vsym ("__vdso_getcpu", &linux_version); PTR_MANGLE (p); VDSO_SYMBOL (getcpu) = p; - p = _dl_vdso_vsym ("__vdso_gettimeofday", &linux_version); - PTR_MANGLE (p); - VDSO_SYMBOL (gettimeofday) = p; - p = _dl_vdso_vsym ("__vdso_clock_gettime", &linux_version); PTR_MANGLE (p); VDSO_SYMBOL (clock_gettime) = p; diff --git a/sysdeps/unix/sysv/linux/riscv/libc-vdso.h b/sysdeps/unix/sysv/linux/riscv/libc-vdso.h index 2373292..e9a5b23 100644 --- a/sysdeps/unix/sysv/linux/riscv/libc-vdso.h +++ b/sysdeps/unix/sysv/linux/riscv/libc-vdso.h @@ -24,8 +24,6 @@ extern long int (*VDSO_SYMBOL (getcpu)) (unsigned int *, unsigned int *, void *) attribute_hidden; -extern long int (*VDSO_SYMBOL (gettimeofday)) (struct timeval *, void *) - attribute_hidden; extern long int (*VDSO_SYMBOL (clock_gettime)) (clockid_t, struct timespec *) attribute_hidden; extern long int (*VDSO_SYMBOL (clock_getres)) (clockid_t, struct timespec *) diff --git a/sysdeps/unix/sysv/linux/s390/init-first.c b/sysdeps/unix/sysv/linux/s390/init-first.c index a1ad945..3a55935 100644 --- a/sysdeps/unix/sysv/linux/s390/init-first.c +++ b/sysdeps/unix/sysv/linux/s390/init-first.c @@ -19,9 +19,6 @@ #include <dl-vdso.h> #include <libc-vdso.h> -long int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) - attribute_hidden; - long int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *) __attribute__ ((nocommon)); @@ -34,11 +31,9 @@ long int (*VDSO_SYMBOL(getcpu)) (unsigned *, unsigned *, void *) static inline void _libc_vdso_platform_setup (void) { - PREPARE_VERSION_KNOWN (linux2629, LINUX_2_6_29); + void *p; - void *p = _dl_vdso_vsym ("__kernel_gettimeofday", &linux2629); - PTR_MANGLE (p); - VDSO_SYMBOL (gettimeofday) = p; + PREPARE_VERSION_KNOWN (linux2629, LINUX_2_6_29); p = _dl_vdso_vsym ("__kernel_clock_gettime", &linux2629); PTR_MANGLE (p); diff --git a/sysdeps/unix/sysv/linux/s390/libc-vdso.h b/sysdeps/unix/sysv/linux/s390/libc-vdso.h index cc97601..2cdf445 100644 --- a/sysdeps/unix/sysv/linux/s390/libc-vdso.h +++ b/sysdeps/unix/sysv/linux/s390/libc-vdso.h @@ -22,9 +22,6 @@ #include <sysdep-vdso.h> -extern long int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) - attribute_hidden; - extern long int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); extern long int (*VDSO_SYMBOL(clock_getres)) (clockid_t, struct timespec *); diff --git a/sysdeps/unix/sysv/linux/sparc/init-first.c b/sysdeps/unix/sysv/linux/sparc/init-first.c index 643d6c7..520fc25 100644 --- a/sysdeps/unix/sysv/linux/sparc/init-first.c +++ b/sysdeps/unix/sysv/linux/sparc/init-first.c @@ -20,19 +20,15 @@ #include <dl-vdso.h> #include <libc-vdso.h> -long int (*VDSO_SYMBOL (gettimeofday)) (struct timeval *, void *) - attribute_hidden; long int (*VDSO_SYMBOL (clock_gettime)) (clockid_t, struct timespec *) attribute_hidden; static inline void _libc_vdso_platform_setup (void) { - PREPARE_VERSION_KNOWN (linux_version, LINUX_2_6); + void *p; - void *p = _dl_vdso_vsym ("__vdso_gettimeofday", &linux_version); - PTR_MANGLE (p); - VDSO_SYMBOL (gettimeofday) = p; + PREPARE_VERSION_KNOWN (linux_version, LINUX_2_6); p = _dl_vdso_vsym ("__vdso_clock_gettime", &linux_version); PTR_MANGLE (p); diff --git a/sysdeps/unix/sysv/linux/sparc/libc-vdso.h b/sysdeps/unix/sysv/linux/sparc/libc-vdso.h index d20afcd..28d1229 100644 --- a/sysdeps/unix/sysv/linux/sparc/libc-vdso.h +++ b/sysdeps/unix/sysv/linux/sparc/libc-vdso.h @@ -22,8 +22,6 @@ #include <sysdep-vdso.h> -extern long int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) - attribute_hidden; extern long int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *); #endif /* _LIBC_VDSO_H */ diff --git a/sysdeps/unix/sysv/linux/x86/gettimeofday.c b/sysdeps/unix/sysv/linux/x86/gettimeofday.c deleted file mode 100644 index 8886ccd..0000000 --- a/sysdeps/unix/sysv/linux/x86/gettimeofday.c +++ /dev/null @@ -1,61 +0,0 @@ -/* gettimeofday - get the time. Linux/x86 version. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <sys/time.h> - -#ifdef SHARED - -# include <dl-vdso.h> -# include <errno.h> - -static int -__gettimeofday_syscall (struct timeval *tv, struct timezone *tz) -{ - return INLINE_SYSCALL (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 - -# undef INIT_ARCH -# define INIT_ARCH() PREPARE_VERSION_KNOWN (linux26, LINUX_2_6) -/* If the vDSO is not available we fall back to syscall. */ -libc_ifunc_hidden (__gettimeofday_type, __gettimeofday, - (_dl_vdso_vsym ("__vdso_gettimeofday", &linux26) - ?: &__gettimeofday_syscall)) -libc_hidden_def (__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_64/x32/syscalls.list b/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list index c0cfa7b..58ea31d 100644 --- a/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list +++ b/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list @@ -1,5 +1,4 @@ # 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 diff --git a/time/gettimeofday.c b/time/gettimeofday.c index 1004ec8..22a996a 100644 --- a/time/gettimeofday.c +++ b/time/gettimeofday.c @@ -15,20 +15,30 @@ License along with the GNU C Library; if not, see <http://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) { - __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, __gettimeofday_w); +default_symbol_version (__gettimeofday_w, gettimeofday, VERSION_gettimeofday); +#else +weak_alias (__gettimeofday, gettimeofday) +#endif
next reply other threads:[~2019-08-17 1:18 UTC|newest] Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-08-17 1:18 Zack Weinberg [this message] 2019-08-19 18:31 Zack Weinberg 2019-08-20 12:08 Zack Weinberg 2019-08-20 13:25 Zack Weinberg 2019-08-21 12:28 Zack Weinberg 2019-08-22 23:04 Zack Weinberg 2019-08-28 13:05 Zack Weinberg
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20190817011800.122131.qmail@sourceware.org \ --to=zack@sourceware.org \ --cc=glibc-cvs@sourceware.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).