klibc-bot for Ben Hutchings
2023-Jan-26 16:12 UTC
[klibc] [klibc:time64] time: Use 64-bit time types on all architectures
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(); /*