Skip to content

Commit acf8870

Browse files
deepa-hubarndb
authored andcommitted
time: Add new y2038 safe __kernel_timespec
The new struct __kernel_timespec is similar to current internal kernel struct timespec64 on 64 bit architecture. The compat structure however is similar to below on little endian systems (padding and tv_nsec are switched for big endian systems): typedef s32 compat_long_t; typedef s64 compat_kernel_time64_t; struct compat_kernel_timespec { compat_kernel_time64_t tv_sec; compat_long_t tv_nsec; compat_long_t padding; }; This allows for both the native and compat representations to be the same and syscalls using this type as part of their ABI can have a single entry point to both. Note that the compat define is not included anywhere in the kernel explicitly to avoid confusion. These types will be used by the new syscalls that will be introduced in the consequent patches. Most of the new syscalls are just an update to the existing native ones with this new type. Hence, put this new type under an ifdef so that the architectures can define CONFIG_64BIT_TIME when they are ready to handle this switch. Cc: linux-arch@vger.kernel.org Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
1 parent b5793b0 commit acf8870

File tree

3 files changed

+17
-1
lines changed

3 files changed

+17
-1
lines changed

include/linux/time64.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,20 @@
22
#ifndef _LINUX_TIME64_H
33
#define _LINUX_TIME64_H
44

5-
#include <uapi/linux/time.h>
65
#include <linux/math64.h>
76

87
typedef __s64 time64_t;
98
typedef __u64 timeu64_t;
109

10+
/* CONFIG_64BIT_TIME enables new 64 bit time_t syscalls in the compat path
11+
* and 32-bit emulation.
12+
*/
13+
#ifndef CONFIG_64BIT_TIME
14+
#define __kernel_timespec timespec
15+
#endif
16+
17+
#include <uapi/linux/time.h>
18+
1119
#if __BITS_PER_LONG == 64
1220
/* this trick allows us to optimize out timespec64_to_timespec */
1321
# define timespec64 timespec

include/uapi/asm-generic/posix_types.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ typedef struct {
8787
typedef __kernel_long_t __kernel_off_t;
8888
typedef long long __kernel_loff_t;
8989
typedef __kernel_long_t __kernel_time_t;
90+
typedef long long __kernel_time64_t;
9091
typedef __kernel_long_t __kernel_clock_t;
9192
typedef int __kernel_timer_t;
9293
typedef int __kernel_clockid_t;

include/uapi/linux/time.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,13 @@ struct itimerval {
4242
struct timeval it_value; /* current value */
4343
};
4444

45+
#ifndef __kernel_timespec
46+
struct __kernel_timespec {
47+
__kernel_time64_t tv_sec; /* seconds */
48+
long long tv_nsec; /* nanoseconds */
49+
};
50+
#endif
51+
4552
/*
4653
* legacy timeval structure, only embedded in structures that
4754
* traditionally used 'timeval' to pass time intervals (not absolute

0 commit comments

Comments
 (0)