1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30#include <linux/module.h>
31#include <linux/timex.h>
32#include <linux/capability.h>
33#include <linux/clocksource.h>
34#include <linux/errno.h>
35#include <linux/syscalls.h>
36#include <linux/security.h>
37#include <linux/fs.h>
38#include <linux/slab.h>
39#include <linux/math64.h>
40#include <linux/ptrace.h>
41
42#include <asm/uaccess.h>
43#include <asm/unistd.h>
44
45#include "timeconst.h"
46
47
48
49
50
51struct timezone sys_tz;
52
53EXPORT_SYMBOL(sys_tz);
54
55#ifdef __ARCH_WANT_SYS_TIME
56
57
58
59
60
61
62
63SYSCALL_DEFINE1(time, time_t __user *, tloc)
64{
65 time_t i = get_seconds();
66
67 if (tloc) {
68 if (put_user(i,tloc))
69 return -EFAULT;
70 }
71 force_successful_syscall_return();
72 return i;
73}
74
75
76
77
78
79
80
81
82SYSCALL_DEFINE1(stime, time_t __user *, tptr)
83{
84 struct timespec tv;
85 int err;
86
87 if (get_user(tv.tv_sec, tptr))
88 return -EFAULT;
89
90 tv.tv_nsec = 0;
91
92 err = security_settime(&tv, NULL);
93 if (err)
94 return err;
95
96 do_settimeofday(&tv);
97 return 0;
98}
99
100#endif
101
102SYSCALL_DEFINE2(gettimeofday, struct timeval __user *, tv,
103 struct timezone __user *, tz)
104{
105 if (likely(tv != NULL)) {
106 struct timeval ktv;
107 do_gettimeofday(&ktv);
108 if (copy_to_user(tv, &ktv, sizeof(ktv)))
109 return -EFAULT;
110 }
111 if (unlikely(tz != NULL)) {
112 if (copy_to_user(tz, &sys_tz, sizeof(sys_tz)))
113 return -EFAULT;
114 }
115 return 0;
116}
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134static inline void warp_clock(void)
135{
136 write_seqlock_irq(&xtime_lock);
137 wall_to_monotonic.tv_sec -= sys_tz.tz_minuteswest * 60;
138 xtime.tv_sec += sys_tz.tz_minuteswest * 60;
139 update_xtime_cache(0);
140 write_sequnlock_irq(&xtime_lock);
141 clock_was_set();
142}
143
144
145
146
147
148
149
150
151
152
153
154
155int do_sys_settimeofday(struct timespec *tv, struct timezone *tz)
156{
157 static int firsttime = 1;
158 int error = 0;
159
160 if (tv && !timespec_valid(tv))
161 return -EINVAL;
162
163 error = security_settime(tv, tz);
164 if (error)
165 return error;
166
167 if (tz) {
168
169 sys_tz = *tz;
170 update_vsyscall_tz();
171 if (firsttime) {
172 firsttime = 0;
173 if (!tv)
174 warp_clock();
175 }
176 }
177 if (tv)
178 {
179
180
181
182 return do_settimeofday(tv);
183 }
184 return 0;
185}
186
187SYSCALL_DEFINE2(settimeofday, struct timeval __user *, tv,
188 struct timezone __user *, tz)
189{
190 struct timeval user_tv;
191 struct timespec new_ts;
192 struct timezone new_tz;
193
194 if (tv) {
195 if (copy_from_user(&user_tv, tv, sizeof(*tv)))
196 return -EFAULT;
197 new_ts.tv_sec = user_tv.tv_sec;
198 new_ts.tv_nsec = user_tv.tv_usec * NSEC_PER_USEC;
199 }
200 if (tz) {
201 if (copy_from_user(&new_tz, tz, sizeof(*tz)))
202 return -EFAULT;
203 }
204
205 return do_sys_settimeofday(tv ? &new_ts : NULL, tz ? &new_tz : NULL);
206}
207
208SYSCALL_DEFINE1(adjtimex, struct timex __user *, txc_p)
209{
210 struct timex txc;
211 int ret;
212
213
214
215
216
217 if(copy_from_user(&txc, txc_p, sizeof(struct timex)))
218 return -EFAULT;
219 ret = do_adjtimex(&txc);
220 return copy_to_user(txc_p, &txc, sizeof(struct timex)) ? -EFAULT : ret;
221}
222
223
224
225
226
227
228
229
230struct timespec current_fs_time(struct super_block *sb)
231{
232 struct timespec now = current_kernel_time();
233 return timespec_trunc(now, sb->s_time_gran);
234}
235EXPORT_SYMBOL(current_fs_time);
236
237
238
239
240
241
242
243unsigned int inline jiffies_to_msecs(const unsigned long j)
244{
245#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)
246 return (MSEC_PER_SEC / HZ) * j;
247#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)
248 return (j + (HZ / MSEC_PER_SEC) - 1)/(HZ / MSEC_PER_SEC);
249#else
250# if BITS_PER_LONG == 32
251 return (HZ_TO_MSEC_MUL32 * j) >> HZ_TO_MSEC_SHR32;
252# else
253 return (j * HZ_TO_MSEC_NUM) / HZ_TO_MSEC_DEN;
254# endif
255#endif
256}
257EXPORT_SYMBOL(jiffies_to_msecs);
258
259unsigned int inline jiffies_to_usecs(const unsigned long j)
260{
261#if HZ <= USEC_PER_SEC && !(USEC_PER_SEC % HZ)
262 return (USEC_PER_SEC / HZ) * j;
263#elif HZ > USEC_PER_SEC && !(HZ % USEC_PER_SEC)
264 return (j + (HZ / USEC_PER_SEC) - 1)/(HZ / USEC_PER_SEC);
265#else
266# if BITS_PER_LONG == 32
267 return (HZ_TO_USEC_MUL32 * j) >> HZ_TO_USEC_SHR32;
268# else
269 return (j * HZ_TO_USEC_NUM) / HZ_TO_USEC_DEN;
270# endif
271#endif
272}
273EXPORT_SYMBOL(jiffies_to_usecs);
274
275
276
277
278
279
280
281
282
283
284
285
286
287struct timespec timespec_trunc(struct timespec t, unsigned gran)
288{
289
290
291
292
293
294 if (gran <= jiffies_to_usecs(1) * 1000) {
295
296 } else if (gran == 1000000000) {
297 t.tv_nsec = 0;
298 } else {
299 t.tv_nsec -= t.tv_nsec % gran;
300 }
301 return t;
302}
303EXPORT_SYMBOL(timespec_trunc);
304
305#ifndef CONFIG_GENERIC_TIME
306
307
308
309
310void getnstimeofday(struct timespec *tv)
311{
312 struct timeval x;
313
314 do_gettimeofday(&x);
315 tv->tv_sec = x.tv_sec;
316 tv->tv_nsec = x.tv_usec * NSEC_PER_USEC;
317}
318EXPORT_SYMBOL_GPL(getnstimeofday);
319#endif
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336unsigned long
337mktime(const unsigned int year0, const unsigned int mon0,
338 const unsigned int day, const unsigned int hour,
339 const unsigned int min, const unsigned int sec)
340{
341 unsigned int mon = mon0, year = year0;
342
343
344 if (0 >= (int) (mon -= 2)) {
345 mon += 12;
346 year -= 1;
347 }
348
349 return ((((unsigned long)
350 (year/4 - year/100 + year/400 + 367*mon/12 + day) +
351 year*365 - 719499
352 )*24 + hour
353 )*60 + min
354 )*60 + sec;
355}
356
357EXPORT_SYMBOL(mktime);
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373void set_normalized_timespec(struct timespec *ts, time_t sec, s64 nsec)
374{
375 while (nsec >= NSEC_PER_SEC) {
376
377
378
379
380
381 asm("" : "+rm"(nsec));
382 nsec -= NSEC_PER_SEC;
383 ++sec;
384 }
385 while (nsec < 0) {
386 asm("" : "+rm"(nsec));
387 nsec += NSEC_PER_SEC;
388 --sec;
389 }
390 ts->tv_sec = sec;
391 ts->tv_nsec = nsec;
392}
393EXPORT_SYMBOL(set_normalized_timespec);
394
395
396
397
398
399
400
401struct timespec ns_to_timespec(const s64 nsec)
402{
403 struct timespec ts;
404 s32 rem;
405
406 if (!nsec)
407 return (struct timespec) {0, 0};
408
409 ts.tv_sec = div_s64_rem(nsec, NSEC_PER_SEC, &rem);
410 if (unlikely(rem < 0)) {
411 ts.tv_sec--;
412 rem += NSEC_PER_SEC;
413 }
414 ts.tv_nsec = rem;
415
416 return ts;
417}
418EXPORT_SYMBOL(ns_to_timespec);
419
420
421
422
423
424
425
426struct timeval ns_to_timeval(const s64 nsec)
427{
428 struct timespec ts = ns_to_timespec(nsec);
429 struct timeval tv;
430
431 tv.tv_sec = ts.tv_sec;
432 tv.tv_usec = (suseconds_t) ts.tv_nsec / 1000;
433
434 return tv;
435}
436EXPORT_SYMBOL(ns_to_timeval);
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452unsigned long msecs_to_jiffies(const unsigned int m)
453{
454
455
456
457 if ((int)m < 0)
458 return MAX_JIFFY_OFFSET;
459
460#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)
461
462
463
464
465
466 return (m + (MSEC_PER_SEC / HZ) - 1) / (MSEC_PER_SEC / HZ);
467#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)
468
469
470
471
472
473
474
475 if (m > jiffies_to_msecs(MAX_JIFFY_OFFSET))
476 return MAX_JIFFY_OFFSET;
477
478 return m * (HZ / MSEC_PER_SEC);
479#else
480
481
482
483
484
485 if (HZ > MSEC_PER_SEC && m > jiffies_to_msecs(MAX_JIFFY_OFFSET))
486 return MAX_JIFFY_OFFSET;
487
488 return (MSEC_TO_HZ_MUL32 * m + MSEC_TO_HZ_ADJ32)
489 >> MSEC_TO_HZ_SHR32;
490#endif
491}
492EXPORT_SYMBOL(msecs_to_jiffies);
493
494unsigned long usecs_to_jiffies(const unsigned int u)
495{
496 if (u > jiffies_to_usecs(MAX_JIFFY_OFFSET))
497 return MAX_JIFFY_OFFSET;
498#if HZ <= USEC_PER_SEC && !(USEC_PER_SEC % HZ)
499 return (u + (USEC_PER_SEC / HZ) - 1) / (USEC_PER_SEC / HZ);
500#elif HZ > USEC_PER_SEC && !(HZ % USEC_PER_SEC)
501 return u * (HZ / USEC_PER_SEC);
502#else
503 return (USEC_TO_HZ_MUL32 * u + USEC_TO_HZ_ADJ32)
504 >> USEC_TO_HZ_SHR32;
505#endif
506}
507EXPORT_SYMBOL(usecs_to_jiffies);
508
509
510
511
512
513
514
515
516
517
518
519
520unsigned long
521timespec_to_jiffies(const struct timespec *value)
522{
523 unsigned long sec = value->tv_sec;
524 long nsec = value->tv_nsec + TICK_NSEC - 1;
525
526 if (sec >= MAX_SEC_IN_JIFFIES){
527 sec = MAX_SEC_IN_JIFFIES;
528 nsec = 0;
529 }
530 return (((u64)sec * SEC_CONVERSION) +
531 (((u64)nsec * NSEC_CONVERSION) >>
532 (NSEC_JIFFIE_SC - SEC_JIFFIE_SC))) >> SEC_JIFFIE_SC;
533
534}
535EXPORT_SYMBOL(timespec_to_jiffies);
536
537void
538jiffies_to_timespec(const unsigned long jiffies, struct timespec *value)
539{
540
541
542
543
544 u32 rem;
545 value->tv_sec = div_u64_rem((u64)jiffies * TICK_NSEC,
546 NSEC_PER_SEC, &rem);
547 value->tv_nsec = rem;
548}
549EXPORT_SYMBOL(jiffies_to_timespec);
550
551
552
553
554
555
556
557
558
559
560
561
562
563unsigned long
564timeval_to_jiffies(const struct timeval *value)
565{
566 unsigned long sec = value->tv_sec;
567 long usec = value->tv_usec;
568
569 if (sec >= MAX_SEC_IN_JIFFIES){
570 sec = MAX_SEC_IN_JIFFIES;
571 usec = 0;
572 }
573 return (((u64)sec * SEC_CONVERSION) +
574 (((u64)usec * USEC_CONVERSION + USEC_ROUND) >>
575 (USEC_JIFFIE_SC - SEC_JIFFIE_SC))) >> SEC_JIFFIE_SC;
576}
577EXPORT_SYMBOL(timeval_to_jiffies);
578
579void jiffies_to_timeval(const unsigned long jiffies, struct timeval *value)
580{
581
582
583
584
585 u32 rem;
586
587 value->tv_sec = div_u64_rem((u64)jiffies * TICK_NSEC,
588 NSEC_PER_SEC, &rem);
589 value->tv_usec = rem / NSEC_PER_USEC;
590}
591EXPORT_SYMBOL(jiffies_to_timeval);
592
593
594
595
596clock_t jiffies_to_clock_t(long x)
597{
598#if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0
599# if HZ < USER_HZ
600 return x * (USER_HZ / HZ);
601# else
602 return x / (HZ / USER_HZ);
603# endif
604#else
605 return div_u64((u64)x * TICK_NSEC, NSEC_PER_SEC / USER_HZ);
606#endif
607}
608EXPORT_SYMBOL(jiffies_to_clock_t);
609
610unsigned long clock_t_to_jiffies(unsigned long x)
611{
612#if (HZ % USER_HZ)==0
613 if (x >= ~0UL / (HZ / USER_HZ))
614 return ~0UL;
615 return x * (HZ / USER_HZ);
616#else
617
618 if (x >= ~0UL / HZ * USER_HZ)
619 return ~0UL;
620
621
622 return div_u64((u64)x * HZ, USER_HZ);
623#endif
624}
625EXPORT_SYMBOL(clock_t_to_jiffies);
626
627u64 jiffies_64_to_clock_t(u64 x)
628{
629#if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0
630# if HZ < USER_HZ
631 x = div_u64(x * USER_HZ, HZ);
632# elif HZ > USER_HZ
633 x = div_u64(x, HZ / USER_HZ);
634# else
635
636# endif
637#else
638
639
640
641
642
643 x = div_u64(x * TICK_NSEC, (NSEC_PER_SEC / USER_HZ));
644#endif
645 return x;
646}
647EXPORT_SYMBOL(jiffies_64_to_clock_t);
648
649u64 nsec_to_clock_t(u64 x)
650{
651#if (NSEC_PER_SEC % USER_HZ) == 0
652 return div_u64(x, NSEC_PER_SEC / USER_HZ);
653#elif (USER_HZ % 512) == 0
654 return div_u64(x * USER_HZ / 512, NSEC_PER_SEC / 512);
655#else
656
657
658
659
660
661 return div_u64(x * 9, (9ull * NSEC_PER_SEC + (USER_HZ / 2)) / USER_HZ);
662#endif
663}
664
665#if (BITS_PER_LONG < 64)
666u64 get_jiffies_64(void)
667{
668 unsigned long seq;
669 u64 ret;
670
671 do {
672 seq = read_seqbegin(&xtime_lock);
673 ret = jiffies_64;
674 } while (read_seqretry(&xtime_lock, seq));
675 return ret;
676}
677EXPORT_SYMBOL(get_jiffies_64);
678#endif
679
680EXPORT_SYMBOL(jiffies);
681
682
683
684
685
686struct timespec timespec_add_safe(const struct timespec lhs,
687 const struct timespec rhs)
688{
689 struct timespec res;
690
691 set_normalized_timespec(&res, lhs.tv_sec + rhs.tv_sec,
692 lhs.tv_nsec + rhs.tv_nsec);
693
694 if (res.tv_sec < lhs.tv_sec || res.tv_sec < rhs.tv_sec)
695 res.tv_sec = TIME_T_MAX;
696
697 return res;
698}
699