From patchwork Mon Feb 10 11:01:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lukasz Majewski X-Patchwork-Id: 37847 Received: (qmail 50953 invoked by alias); 10 Feb 2020 11:01:32 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 50224 invoked by uid 89); 10 Feb 2020 11:01:32 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-21.5 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.1 spammy=UD:tv_sec X-HELO: mail-out.m-online.net From: Lukasz Majewski To: Joseph Myers , Paul Eggert , Adhemerval Zanella Cc: Alistair Francis , Alistair Francis , GNU C Library , Siddhesh Poyarekar , Florian Weimer , Florian Weimer , Zack Weinberg , Carlos O'Donell , Andreas Schwab , Lukasz Majewski Subject: [PATCH v4] y2038: linux: Provide ___gettimeofday64 implementation Date: Mon, 10 Feb 2020 12:01:07 +0100 Message-Id: <20200210110107.29518-1-lukma@denx.de> MIME-Version: 1.0 In the glibc the gettimeofday can use vDSO (on power and x86 the USE_IFUNC_GETTIMEOFDAY is defined), gettimeofday syscall or 'default' ___gettimeofday() from ./time/gettime.c (as a fallback). In this patch the last function (___gettimeofday) has been refactored and moved to ./sysdeps/unix/sysv/linux/gettimeofday.c to be Linux specific. The new __gettimeofday64 explicit 64 bit function for getting 64 bit time from the kernel (by internally calling __clock_gettime64) has been introduced. Moreover, a 32 bit version - __gettimeofday has been refactored to internally use __gettimeofday64. The __gettimeofday is now supposed to be used on systems still supporting 32 bit time (__TIMESIZE != 64) - hence the necessary check for time_t potential overflow and conversion of struct __timeval64 to 32 bit struct timespec. The alpha port is a bit problematic for this change - it supports 64 bit time and can safely use gettimeofday implementation from ./time/gettimeofday.c as it has ./sysdeps/unix/sysv/linux/alpha/gettimeofday.c, which includes ./time/gettimeofday.c, so the Linux specific one can be avoided. For that reason the code to set default gettimeofday symbol has not been moved to ./sysdeps/unix/sysv/linux/gettimeofday.c as only alpha defines VERSION_gettimeofday. The USE_IFUNC_GETTIMEOFDAY for powerpc and i686 has been undefined on purpose. Due to that the support for gettimeofday vDSO on them has been traded for Y2038 safeness (as this syscall is going to be obsolete). Build tests: ./src/scripts/build-many-glibcs.py glibcs Run-time tests: - Run specific tests on ARM/x86 32bit systems (qemu): https://github.com/lmajewski/meta-y2038 and run tests: https://github.com/lmajewski/y2038-tests/commits/master Above tests were performed with Y2038 redirection applied as well as without to test proper usage of both ___gettimeofday64 and __gettimeofday. --- Changes for v4: - Rename ___gettimeofday{64} to __gettimeofday{64} as '___' prefix is not needed for our implementation - Correctly handle the case when tv is NULL (also in __gettimeofday). - Do not define USE_IFUNC_GETTIMEOFDAY for 32 bit archs - namely powerpc and i686. Changes for v3: - New patch --- include/time.h | 4 ++ sysdeps/unix/sysv/linux/gettimeofday.c | 44 ++++++++++++++++++- .../unix/sysv/linux/powerpc/gettimeofday.c | 4 +- sysdeps/unix/sysv/linux/x86/gettimeofday.c | 4 +- 4 files changed, 53 insertions(+), 3 deletions(-) diff --git a/include/time.h b/include/time.h index 73f66277ac..61806658e7 100644 --- a/include/time.h +++ b/include/time.h @@ -227,10 +227,14 @@ libc_hidden_proto (__sched_rr_get_interval64); #if __TIMESIZE == 64 # define __settimeofday64 __settimeofday +# define __gettimeofday64 __gettimeofday #else extern int __settimeofday64 (const struct __timeval64 *tv, const struct timezone *tz); libc_hidden_proto (__settimeofday64) +extern int __gettimeofday64 (struct __timeval64 *restrict tv, + void *restrict tz); +libc_hidden_proto (__gettimeofday64) #endif /* Compute the `struct tm' representation of T, diff --git a/sysdeps/unix/sysv/linux/gettimeofday.c b/sysdeps/unix/sysv/linux/gettimeofday.c index d5cdb22495..7e77b4cfad 100644 --- a/sysdeps/unix/sysv/linux/gettimeofday.c +++ b/sysdeps/unix/sysv/linux/gettimeofday.c @@ -54,5 +54,47 @@ __gettimeofday (struct timeval *restrict tv, void *restrict tz) # endif weak_alias (__gettimeofday, gettimeofday) #else /* USE_IFUNC_GETTIMEOFDAY */ -# include