[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