1 #ifndef _LINUX_TIME32_H
2 #define _LINUX_TIME32_H
4 * These are all interfaces based on the old time_t definition
5 * that overflows in 2038 on 32-bit architectures. New code
6 * should use the replacements based on time64_t and timespec64.
8 * Any interfaces in here that become unused as we migrate
9 * code to time64_t should get removed.
12 #include <linux/time64.h>
14 #define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
16 typedef s32 old_time32_t
;
18 struct old_timespec32
{
23 struct old_timeval32
{
28 struct old_itimerspec32
{
29 struct old_timespec32 it_interval
;
30 struct old_timespec32 it_value
;
33 struct old_utimbuf32
{
38 extern int get_old_timespec32(struct timespec64
*, const void __user
*);
39 extern int put_old_timespec32(const struct timespec64
*, void __user
*);
40 extern int get_old_itimerspec32(struct itimerspec64
*its
,
41 const struct old_itimerspec32 __user
*uits
);
42 extern int put_old_itimerspec32(const struct itimerspec64
*its
,
43 struct old_itimerspec32 __user
*uits
);
46 #if __BITS_PER_LONG == 64
48 /* timespec64 is defined as timespec here */
49 static inline struct timespec
timespec64_to_timespec(const struct timespec64 ts64
)
51 return *(const struct timespec
*)&ts64
;
54 static inline struct timespec64
timespec_to_timespec64(const struct timespec ts
)
56 return *(const struct timespec64
*)&ts
;
60 static inline struct timespec
timespec64_to_timespec(const struct timespec64 ts64
)
64 ret
.tv_sec
= (time_t)ts64
.tv_sec
;
65 ret
.tv_nsec
= ts64
.tv_nsec
;
69 static inline struct timespec64
timespec_to_timespec64(const struct timespec ts
)
71 struct timespec64 ret
;
73 ret
.tv_sec
= ts
.tv_sec
;
74 ret
.tv_nsec
= ts
.tv_nsec
;
79 static inline int timespec_equal(const struct timespec
*a
,
80 const struct timespec
*b
)
82 return (a
->tv_sec
== b
->tv_sec
) && (a
->tv_nsec
== b
->tv_nsec
);
86 * lhs < rhs: return <0
87 * lhs == rhs: return 0
88 * lhs > rhs: return >0
90 static inline int timespec_compare(const struct timespec
*lhs
, const struct timespec
*rhs
)
92 if (lhs
->tv_sec
< rhs
->tv_sec
)
94 if (lhs
->tv_sec
> rhs
->tv_sec
)
96 return lhs
->tv_nsec
- rhs
->tv_nsec
;
99 extern void set_normalized_timespec(struct timespec
*ts
, time_t sec
, s64 nsec
);
101 static inline struct timespec
timespec_add(struct timespec lhs
,
104 struct timespec ts_delta
;
106 set_normalized_timespec(&ts_delta
, lhs
.tv_sec
+ rhs
.tv_sec
,
107 lhs
.tv_nsec
+ rhs
.tv_nsec
);
112 * sub = lhs - rhs, in normalized form
114 static inline struct timespec
timespec_sub(struct timespec lhs
,
117 struct timespec ts_delta
;
119 set_normalized_timespec(&ts_delta
, lhs
.tv_sec
- rhs
.tv_sec
,
120 lhs
.tv_nsec
- rhs
.tv_nsec
);
125 * Returns true if the timespec is norm, false if denorm:
127 static inline bool timespec_valid(const struct timespec
*ts
)
129 /* Dates before 1970 are bogus */
132 /* Can't have more nanoseconds then a second */
133 if ((unsigned long)ts
->tv_nsec
>= NSEC_PER_SEC
)
139 * timespec_to_ns - Convert timespec to nanoseconds
140 * @ts: pointer to the timespec variable to be converted
142 * Returns the scalar nanosecond representation of the timespec
145 static inline s64
timespec_to_ns(const struct timespec
*ts
)
147 return ((s64
) ts
->tv_sec
* NSEC_PER_SEC
) + ts
->tv_nsec
;
151 * ns_to_timespec - Convert nanoseconds to timespec
152 * @nsec: the nanoseconds value to be converted
154 * Returns the timespec representation of the nsec parameter.
156 extern struct timespec
ns_to_timespec(const s64 nsec
);
159 * timespec_add_ns - Adds nanoseconds to a timespec
160 * @a: pointer to timespec to be incremented
161 * @ns: unsigned nanoseconds value to be added
163 * This must always be inlined because its used from the x86-64 vdso,
164 * which cannot call other kernel functions.
166 static __always_inline
void timespec_add_ns(struct timespec
*a
, u64 ns
)
168 a
->tv_sec
+= __iter_div_u64_rem(a
->tv_nsec
+ ns
, NSEC_PER_SEC
, &ns
);
172 static inline unsigned long mktime(const unsigned int year
,
173 const unsigned int mon
, const unsigned int day
,
174 const unsigned int hour
, const unsigned int min
,
175 const unsigned int sec
)
177 return mktime64(year
, mon
, day
, hour
, min
, sec
);
180 static inline bool timeval_valid(const struct timeval
*tv
)
182 /* Dates before 1970 are bogus */
186 /* Can't have more microseconds then a second */
187 if (tv
->tv_usec
< 0 || tv
->tv_usec
>= USEC_PER_SEC
)
194 * timeval_to_ns - Convert timeval to nanoseconds
195 * @ts: pointer to the timeval variable to be converted
197 * Returns the scalar nanosecond representation of the timeval
200 static inline s64
timeval_to_ns(const struct timeval
*tv
)
202 return ((s64
) tv
->tv_sec
* NSEC_PER_SEC
) +
203 tv
->tv_usec
* NSEC_PER_USEC
;
207 * ns_to_timeval - Convert nanoseconds to timeval
208 * @nsec: the nanoseconds value to be converted
210 * Returns the timeval representation of the nsec parameter.
212 extern struct timeval
ns_to_timeval(const s64 nsec
);
213 extern struct __kernel_old_timeval
ns_to_kernel_old_timeval(s64 nsec
);
216 * Old names for the 32-bit time_t interfaces, these will be removed
217 * when everything uses the new names.
219 #define compat_time_t old_time32_t
220 #define compat_timeval old_timeval32
221 #define compat_timespec old_timespec32
222 #define compat_itimerspec old_itimerspec32
223 #define ns_to_compat_timeval ns_to_old_timeval32
224 #define get_compat_itimerspec64 get_old_itimerspec32
225 #define put_compat_itimerspec64 put_old_itimerspec32
226 #define compat_get_timespec64 get_old_timespec32
227 #define compat_put_timespec64 put_old_timespec32