This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH v5] y2038: Introduce __ASSUME_TIME64_SYSCALLS define
- From: Lukasz Majewski <lukma at denx dot de>
- To: libc-alpha at sourceware dot org
- Cc: Stepan Golosunov <stepan at golosunov dot pp dot ru>, Arnd Bergmann <arnd at arndb dot de>, Paul Eggert <eggert at cs dot ucla dot edu>, Joseph Myers <joseph at codesourcery dot com>, Lukasz Majewski <lukma at denx dot de>
- Date: Wed, 15 May 2019 16:27:23 +0200
- Subject: [PATCH v5] y2038: Introduce __ASSUME_TIME64_SYSCALLS define
- References: <20190414220841.20243-1-lukma@denx.de>
This define indicates if the Linux kernel (5.1+) provides syscalls supporting
64 bit versions of struct timespec and timeval.
For architectures with __WORDSIZE==64 and __TIMESIZE==64 (e.g. x86_64, aarch64)
this flag is never defined (as those already use 64 bit versions of struct
timespec and timeval).
The __ASSUME_TIME64_SYSCALLS shall be only defined on systems with
__WORDSIZE==32.
For x32 this flag is explicitly undefined as this architecture has
__WORDSIZE==32 with __TIMESIZE==64. Despite having __WORDSIZE==32 the x32
has support for 64 bit time values and hence needs to undefine
__ASSUME_TIME64_SYSCALLS flag.
* sysdeps/unix/sysv/linux/kernel-features.h: (__ASSUME_TIME64_SYSCALLS):
[__LINUX_KERNEL_VERSION >= 0x050100]: Define.
* sysdeps/unix/sysv/linux/x86_64/kernel-features.h (__ASSUME_TIME64_SYSCALLS):
#undef the __ASSUME_TIME64_SYSCALLS for x32 architecture
---
Changes for v5:
- Rewrite the in-code comment (x32 description more precise)
- Change patch description (for x32)
Changes for v4:
- Exclude this patch from the clock_settime64 patch series
- Rewrite the in-code comment
- Change patch description
Changes for v3:
- Provide more detailed and verbose description
- Change name to __ASSUME_TIME64_SYSCALLS
- Undefine __ASSUME_TIME64_SYSCALLS on x32
Changes for v2:
- New patch
---
sysdeps/unix/sysv/linux/kernel-features.h | 38 ++++++++++++++++++++++++
sysdeps/unix/sysv/linux/x86_64/kernel-features.h | 7 +++++
2 files changed, 45 insertions(+)
diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h
index bc5c959f58..30e77dd213 100644
--- a/sysdeps/unix/sysv/linux/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/kernel-features.h
@@ -143,3 +143,41 @@
*/
#define __ASSUME_CLONE_DEFAULT 1
+
+#include <bits/wordsize.h>
+#if __WORDSIZE != 64
+/* Support for Linux kernel syscalls, which are able to handle 64 bit
+ time on 32 bit systems (with 'long' and __WORDSIZE equal to 32 bits).
+
+ Linux kernel, as of version 5.1, provides following set of syscalls,
+ which accept data based on struct timespec and timeval with 64 bit
+ tv_sec:
+
+ clock_gettime64
+ clock_settime64
+ clock_adjtime64
+ clock_getres_time64
+ clock_nanosleep_time64
+ timer_gettime64
+ timer_settime64
+ timerfd_gettime64
+ timerfd_settime64
+ utimensat_time64
+ pselect6_time64
+ ppoll_time64
+ io_pgetevents_time64
+ recvmmsg_time64
+ mq_timedsend_time64
+ mq_timedreceive_time64
+ semtimedop_time64
+ rt_sigtimedwait_time64
+ futex_time64
+ sched_rr_get_interval_time64
+
+ Above syscalls are supposed to replace legacy ones, which handle 32
+ bit version of struct timespec and timeval (i.e. without the '64'
+ suffix). */
+# if __LINUX_KERNEL_VERSION >= 0x050100
+# define __ASSUME_TIME64_SYSCALLS 1
+# endif
+#endif
diff --git a/sysdeps/unix/sysv/linux/x86_64/kernel-features.h b/sysdeps/unix/sysv/linux/x86_64/kernel-features.h
index 26280f57ec..179a9ae932 100644
--- a/sysdeps/unix/sysv/linux/x86_64/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/x86_64/kernel-features.h
@@ -24,3 +24,10 @@
#endif
#include_next <kernel-features.h>
+
+/* For x32, which is a special case in respect to 64 bit time support
+ (it has __WORDSIZE==32 but __TIMESIZE==64), the
+ __ASSUME_TIME64_SYSCALLS flag needs to be explicitly undefined. */
+#ifdef __ILP32__
+# undef __ASSUME_TIME64_SYSCALLS
+#endif
--
2.11.0