[klibc] [klibc:time64] time: Use 64-bit time types on all architectures

klibc-bot for Ben Hutchings ben at decadent.org.uk
Thu Jan 26 08:12:13 PST 2023


Commit-ID:  a840001eb14092dc4583889e360021638462c919
Gitweb:     http://git.kernel.org/?p=libs/klibc/klibc.git;a=commit;h=a840001eb14092dc4583889e360021638462c919
Author:     Ben Hutchings <ben at decadent.org.uk>
AuthorDate: Sat, 14 Jan 2023 00:17:45 +0100
Committer:  Ben Hutchings <ben at decadent.org.uk>
CommitDate: Sun, 15 Jan 2023 21:28:18 +0100

[klibc] time: Use 64-bit time types on all architectures

- Define time_t as __kernel_time64_t
- In <sys/time.h>, replace <linux/time.h> with suitable
  definitions:
  - Define struct timespec and itimerspec to match the kernel's 64-bit
    structures.  On 32-bit architectures, add padding around tv_nsec;
    the kernel uses a 64-bit tv_nsec but will mask out this padding.
  - Define struct timeval using __kernel_time64_t (although there
    are no new system calls using struct timeval)
  - Keep the old struct itimerval and struct timeval (as timeval_old)
    definitions.  There aren't simple replacements available for the
    {get,set}itimer() and getrusage() system calls, and for these APIs
    struct timeval holds a relative time where the extra range is not
    needed.
  - Copy struct timezone and various important macro definitions
- Change various system call wrappers to use the _time64 variants
  on 32-bit architectures

Signed-off-by: Ben Hutchings <ben at decadent.org.uk>

---
 usr/include/sys/resource.h |  4 ++--
 usr/include/sys/time.h     | 59 +++++++++++++++++++++++++++++++++++++++++++++-
 usr/include/sys/types.h    |  2 +-
 usr/klibc/SYSCALLS.def     | 18 +++++++++-----
 4 files changed, 73 insertions(+), 10 deletions(-)

diff --git a/usr/include/sys/resource.h b/usr/include/sys/resource.h
index 94ed28a5..e43a69dd 100644
--- a/usr/include/sys/resource.h
+++ b/usr/include/sys/resource.h
@@ -15,8 +15,8 @@
 #define RUSAGE_THREAD	1
 
 struct	rusage {
-	struct timeval ru_utime;	/* user time used */
-	struct timeval ru_stime;	/* system time used */
+	struct timeval_old ru_utime;	/* user time used */
+	struct timeval_old ru_stime;	/* system time used */
 	__kernel_long_t	ru_maxrss;	/* maximum resident set size */
 	__kernel_long_t	ru_ixrss;	/* integral shared memory size */
 	__kernel_long_t	ru_idrss;	/* integral unshared data size */
diff --git a/usr/include/sys/time.h b/usr/include/sys/time.h
index e8163303..741724be 100644
--- a/usr/include/sys/time.h
+++ b/usr/include/sys/time.h
@@ -6,9 +6,66 @@
 #define _SYS_TIME_H
 
 #include <klibc/extern.h>
+#include <klibc/endian.h>
 #include <stddef.h>
 #include <sys/types.h>
-#include <linux/time.h>
+
+/* struct timespec as used by current kernel UAPI (time64 on 32-bit) */
+struct timespec {
+	__kernel_time64_t	tv_sec;
+#if __BYTE_ORDER == __BIG_ENDIAN && __BITS_PER_LONG == 32
+	int			:32;
+#endif
+	long			tv_nsec;
+#if __BYTE_ORDER == __LITTLE_ENDIAN && __BITS_PER_LONG == 32
+	int			:32;
+#endif
+};
+
+/* struct timeval with 64-bit time, not used by kernel UAPI */
+struct timeval {
+	__kernel_time64_t	tv_sec;
+	__kernel_suseconds_t	tv_usec;
+};
+
+/* struct timeval as used by old kernel UAPI */
+struct timeval_old {
+	__kernel_time_t		tv_sec;
+	__kernel_suseconds_t	tv_usec;
+};
+
+struct itimerspec {
+	struct timespec	it_interval;
+	struct timespec it_value;
+};
+
+struct itimerval {
+	struct timeval_old	it_interval;
+	struct timeval_old	it_value;
+};
+
+struct timezone {
+	int	tz_minuteswest;
+	int	tz_dsttime;
+};
+
+#define ITIMER_REAL		0
+#define ITIMER_VIRTUAL		1
+#define TIMER_PROF		2
+
+#define CLOCK_REALTIME			0
+#define CLOCK_MONOTONIC			1
+#define CLOCK_PROCESS_CPUTIME_ID	2
+#define CLOCK_THREAD_CPUTIME_ID		3
+#define CLOCK_MONOTONIC_RAW		4
+#define CLOCK_REALTIME_COARSE		5
+#define CLOCK_MONOTONIC_COARSE		6
+#define CLOCK_BOOTTIME			7
+#define CLOCK_REALTIME_ALARM		8
+#define CLOCK_BOOTTIME_ALARM		9
+#define CLOCK_TAI			11
+
+#define TIMER_ABSTIME			0x01
 
 /* The 2.6.20 Linux headers always #define FD_ZERO __FD_ZERO, etc, in
    <linux/time.h> but not all architectures define the
diff --git a/usr/include/sys/types.h b/usr/include/sys/types.h
index e17bc87f..d698ae5b 100644
--- a/usr/include/sys/types.h
+++ b/usr/include/sys/types.h
@@ -46,7 +46,7 @@ typedef __kernel_fsid_t fsid_t;
  */
 #ifndef _TIME_T
 #define _TIME_T
-typedef __kernel_time_t time_t;
+typedef __kernel_time64_t time_t;
 #endif
 
 #ifndef _CLOCK_T
diff --git a/usr/klibc/SYSCALLS.def b/usr/klibc/SYSCALLS.def
index d46bb548..660efc66 100644
--- a/usr/klibc/SYSCALLS.def
+++ b/usr/klibc/SYSCALLS.def
@@ -140,7 +140,8 @@ int fchown32,fchown::fchown(int, uid_t, gid_t);
 <?> int fchownat(int, const char *, uid_t, gid_t, int);
 <?> int lchown32,lchown::lchown(const char *, uid_t, gid_t);
 int getcwd::__getcwd(char *, size_t);
-int utimensat(int, const char *, const struct timespec *, int);
+<32> int utimensat_time64::utimensat(int, const char *, const struct timespec *, int);
+<64> int utimensat(int, const char *, const struct timespec *, int);
 <?> int inotify_init();
 <?> int inotify_add_watch(int, const char *, __u32);
 <?> int inotify_rm_watch(int, __u32);
@@ -165,9 +166,11 @@ int dup3(int, int, int);
 <!i386,ppc64> int fcntl64,fcntl::fcntl(int, int, unsigned long);
 int ioctl(int, int, void *);
 int flock(int, int);
-int pselect6::__pselect6(int, fd_set *, fd_set *, fd_set *, struct timespec *, const struct __pselect6 *);
+<32> int pselect6_time64::__pselect6(int, fd_set *, fd_set *, fd_set *, struct timespec *, const struct __pselect6 *);
+<64> int pselect6::__pselect6(int, fd_set *, fd_set *, fd_set *, struct timespec *, const struct __pselect6 *);
 <?> int poll(struct pollfd *, nfds_t, long);
-<?> int ppoll::__ppoll(struct pollfd *, nfds_t, struct timespec *, const sigset_t *, size_t);
+<32> int ppoll_time64::__ppoll(struct pollfd *, nfds_t, struct timespec *, const sigset_t *, size_t);
+<64> int ppoll::__ppoll(struct pollfd *, nfds_t, struct timespec *, const sigset_t *, size_t);
 int fsync(int);
 int fdatasync,fsync::fdatasync(int);
 int readv(int, const struct iovec *, int);
@@ -204,9 +207,12 @@ int setitimer(int, const struct itimerval *, struct itimerval *);
 clock_t times(struct tms *);
 int gettimeofday::__gettimeofday(void *, struct timezone *);
 int settimeofday::__settimeofday(const void *, const struct timezone *);
-int clock_gettime(clockid_t, struct timespec *);
-int clock_settime(clockid_t, const struct timespec *);
-int clock_nanosleep::__clock_nanosleep(clockid_t, int, const struct timespec *, struct timespec *);
+<32> int clock_gettime64::clock_gettime(clockid_t, struct timespec *);
+<64> int clock_gettime(clockid_t, struct timespec *);
+<32> int clock_settime64::clock_settime(clockid_t, const struct timespec *);
+<64> int clock_settime(clockid_t, const struct timespec *);
+<32> int clock_nanosleep_time64::__clock_nanosleep(clockid_t, int, const struct timespec *, struct timespec *);
+<64> int clock_nanosleep::__clock_nanosleep(clockid_t, int, const struct timespec *, struct timespec *);
 <?> int pause();
 
 /*


More information about the klibc mailing list