1#ifndef _LINUX_TIME_H
2#define _LINUX_TIME_H
3
4# include <linux/cache.h>
5# include <linux/seqlock.h>
6# include <linux/math64.h>
7# include <linux/time64.h>
8
9extern struct timezone sys_tz;
10
11int get_timespec64(struct timespec64 *ts,
12 const struct timespec __user *uts);
13int put_timespec64(const struct timespec64 *ts,
14 struct timespec __user *uts);
15int get_itimerspec64(struct itimerspec64 *it,
16 const struct itimerspec __user *uit);
17int put_itimerspec64(const struct itimerspec64 *it,
18 struct itimerspec __user *uit);
19
20#define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
21
22static inline int timespec_equal(const struct timespec *a,
23 const struct timespec *b)
24{
25 return (a->tv_sec == b->tv_sec) && (a->tv_nsec == b->tv_nsec);
26}
27
28
29
30
31
32
33static inline int timespec_compare(const struct timespec *lhs, const struct timespec *rhs)
34{
35 if (lhs->tv_sec < rhs->tv_sec)
36 return -1;
37 if (lhs->tv_sec > rhs->tv_sec)
38 return 1;
39 return lhs->tv_nsec - rhs->tv_nsec;
40}
41
42static inline int timeval_compare(const struct timeval *lhs, const struct timeval *rhs)
43{
44 if (lhs->tv_sec < rhs->tv_sec)
45 return -1;
46 if (lhs->tv_sec > rhs->tv_sec)
47 return 1;
48 return lhs->tv_usec - rhs->tv_usec;
49}
50
51extern time64_t mktime64(const unsigned int year, const unsigned int mon,
52 const unsigned int day, const unsigned int hour,
53 const unsigned int min, const unsigned int sec);
54
55
56
57
58static inline unsigned long mktime(const unsigned int year,
59 const unsigned int mon, const unsigned int day,
60 const unsigned int hour, const unsigned int min,
61 const unsigned int sec)
62{
63 return mktime64(year, mon, day, hour, min, sec);
64}
65
66extern void set_normalized_timespec(struct timespec *ts, time_t sec, s64 nsec);
67
68
69
70
71
72
73extern struct timespec timespec_add_safe(const struct timespec lhs,
74 const struct timespec rhs);
75
76
77static inline struct timespec timespec_add(struct timespec lhs,
78 struct timespec rhs)
79{
80 struct timespec ts_delta;
81 set_normalized_timespec(&ts_delta, lhs.tv_sec + rhs.tv_sec,
82 lhs.tv_nsec + rhs.tv_nsec);
83 return ts_delta;
84}
85
86
87
88
89static inline struct timespec timespec_sub(struct timespec lhs,
90 struct timespec rhs)
91{
92 struct timespec ts_delta;
93 set_normalized_timespec(&ts_delta, lhs.tv_sec - rhs.tv_sec,
94 lhs.tv_nsec - rhs.tv_nsec);
95 return ts_delta;
96}
97
98
99
100
101static inline bool timespec_valid(const struct timespec *ts)
102{
103
104 if (ts->tv_sec < 0)
105 return false;
106
107 if ((unsigned long)ts->tv_nsec >= NSEC_PER_SEC)
108 return false;
109 return true;
110}
111
112static inline bool timespec_valid_strict(const struct timespec *ts)
113{
114 if (!timespec_valid(ts))
115 return false;
116
117 if ((unsigned long long)ts->tv_sec >= KTIME_SEC_MAX)
118 return false;
119 return true;
120}
121
122static inline bool timeval_valid(const struct timeval *tv)
123{
124
125 if (tv->tv_sec < 0)
126 return false;
127
128
129 if (tv->tv_usec < 0 || tv->tv_usec >= USEC_PER_SEC)
130 return false;
131
132 return true;
133}
134
135extern struct timespec timespec_trunc(struct timespec t, unsigned gran);
136
137
138
139
140
141
142
143static inline bool timeval_inject_offset_valid(const struct timeval *tv)
144{
145
146
147
148 if (tv->tv_usec < 0 || tv->tv_usec >= USEC_PER_SEC)
149 return false;
150 return true;
151}
152
153static inline bool timespec_inject_offset_valid(const struct timespec *ts)
154{
155
156
157
158 if (ts->tv_nsec < 0 || ts->tv_nsec >= NSEC_PER_SEC)
159 return false;
160 return true;
161}
162
163
164
165
166
167
168
169
170
171
172#ifdef CONFIG_ARCH_USES_GETTIMEOFFSET
173extern u32 (*arch_gettimeoffset)(void);
174#endif
175
176struct itimerval;
177extern int do_setitimer(int which, struct itimerval *value,
178 struct itimerval *ovalue);
179extern int do_getitimer(int which, struct itimerval *value);
180
181extern long do_utimes(int dfd, const char __user *filename, struct timespec *times, int flags);
182
183
184
185
186
187struct tm {
188
189
190
191
192 int tm_sec;
193
194 int tm_min;
195
196 int tm_hour;
197
198 int tm_mday;
199
200 int tm_mon;
201
202 long tm_year;
203
204 int tm_wday;
205
206 int tm_yday;
207};
208
209void time64_to_tm(time64_t totalsecs, int offset, struct tm *result);
210
211
212
213
214
215
216
217
218
219static inline void time_to_tm(time_t totalsecs, int offset, struct tm *result)
220{
221 time64_to_tm(totalsecs, offset, result);
222}
223
224
225
226
227
228
229
230
231static inline s64 timespec_to_ns(const struct timespec *ts)
232{
233 return ((s64) ts->tv_sec * NSEC_PER_SEC) + ts->tv_nsec;
234}
235
236
237
238
239
240
241
242
243static inline s64 timeval_to_ns(const struct timeval *tv)
244{
245 return ((s64) tv->tv_sec * NSEC_PER_SEC) +
246 tv->tv_usec * NSEC_PER_USEC;
247}
248
249
250
251
252
253
254
255extern struct timespec ns_to_timespec(const s64 nsec);
256
257
258
259
260
261
262
263extern struct timeval ns_to_timeval(const s64 nsec);
264
265
266
267
268
269
270
271
272
273static __always_inline void timespec_add_ns(struct timespec *a, u64 ns)
274{
275 a->tv_sec += __iter_div_u64_rem(a->tv_nsec + ns, NSEC_PER_SEC, &ns);
276 a->tv_nsec = ns;
277}
278
279static inline bool itimerspec64_valid(const struct itimerspec64 *its)
280{
281 if (!timespec64_valid(&(its->it_interval)) ||
282 !timespec64_valid(&(its->it_value)))
283 return false;
284
285 return true;
286}
287
288#endif
289