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/export.h>
31#include <linux/timex.h>
32#include <linux/capability.h>
33#include <linux/timekeeper_internal.h>
34#include <linux/errno.h>
35#include <linux/syscalls.h>
36#include <linux/security.h>
37#include <linux/fs.h>
38#include <linux/math64.h>
39#include <linux/ptrace.h>
40
41#include <linux/uaccess.h>
42#include <linux/compat.h>
43#include <asm/unistd.h>
44
45#include <generated/timeconst.h>
46#include "timekeeping.h"
47
48
49
50
51
52struct timezone sys_tz;
53
54EXPORT_SYMBOL(sys_tz);
55
56#ifdef __ARCH_WANT_SYS_TIME
57
58
59
60
61
62
63
64SYSCALL_DEFINE1(time, time_t __user *, tloc)
65{
66 time_t i = get_seconds();
67
68 if (tloc) {
69 if (put_user(i,tloc))
70 return -EFAULT;
71 }
72 force_successful_syscall_return();
73 return i;
74}
75
76
77
78
79
80
81
82
83SYSCALL_DEFINE1(stime, time_t __user *, tptr)
84{
85 struct timespec tv;
86 int err;
87
88 if (get_user(tv.tv_sec, tptr))
89 return -EFAULT;
90
91 tv.tv_nsec = 0;
92
93 err = security_settime(&tv, NULL);
94 if (err)
95 return err;
96
97 do_settimeofday(&tv);
98 return 0;
99}
100
101#endif
102
103#ifdef CONFIG_COMPAT
104#ifdef __ARCH_WANT_COMPAT_SYS_TIME
105
106
107COMPAT_SYSCALL_DEFINE1(time, compat_time_t __user *, tloc)
108{
109 struct timeval tv;
110 compat_time_t i;
111
112 do_gettimeofday(&tv);
113 i = tv.tv_sec;
114
115 if (tloc) {
116 if (put_user(i,tloc))
117 return -EFAULT;
118 }
119 force_successful_syscall_return();
120 return i;
121}
122
123COMPAT_SYSCALL_DEFINE1(stime, compat_time_t __user *, tptr)
124{
125 struct timespec tv;
126 int err;
127
128 if (get_user(tv.tv_sec, tptr))
129 return -EFAULT;
130
131 tv.tv_nsec = 0;
132
133 err = security_settime(&tv, NULL);
134 if (err)
135 return err;
136
137 do_settimeofday(&tv);
138 return 0;
139}
140
141#endif
142#endif
143
144SYSCALL_DEFINE2(gettimeofday, struct timeval __user *, tv,
145 struct timezone __user *, tz)
146{
147 if (likely(tv != NULL)) {
148 struct timeval ktv;
149 do_gettimeofday(&ktv);
150 if (copy_to_user(tv, &ktv, sizeof(ktv)))
151 return -EFAULT;
152 }
153 if (unlikely(tz != NULL)) {
154 if (copy_to_user(tz, &sys_tz, sizeof(sys_tz)))
155 return -EFAULT;
156 }
157 return 0;
158}
159
160
161
162
163
164int persistent_clock_is_local;
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182static inline void warp_clock(void)
183{
184 if (sys_tz.tz_minuteswest != 0) {
185 struct timespec adjust;
186
187 persistent_clock_is_local = 1;
188 adjust.tv_sec = sys_tz.tz_minuteswest * 60;
189 adjust.tv_nsec = 0;
190 timekeeping_inject_offset(&adjust);
191 }
192}
193
194
195
196
197
198
199
200
201
202
203
204
205int do_sys_settimeofday64(const struct timespec64 *tv, const struct timezone *tz)
206{
207 static int firsttime = 1;
208 int error = 0;
209
210 if (tv && !timespec64_valid(tv))
211 return -EINVAL;
212
213 error = security_settime64(tv, tz);
214 if (error)
215 return error;
216
217 if (tz) {
218
219 if (tz->tz_minuteswest > 15*60 || tz->tz_minuteswest < -15*60)
220 return -EINVAL;
221
222 sys_tz = *tz;
223 update_vsyscall_tz();
224 if (firsttime) {
225 firsttime = 0;
226 if (!tv)
227 warp_clock();
228 }
229 }
230 if (tv)
231 return do_settimeofday64(tv);
232 return 0;
233}
234
235SYSCALL_DEFINE2(settimeofday, struct timeval __user *, tv,
236 struct timezone __user *, tz)
237{
238 struct timespec64 new_ts;
239 struct timeval user_tv;
240 struct timezone new_tz;
241
242 if (tv) {
243 if (copy_from_user(&user_tv, tv, sizeof(*tv)))
244 return -EFAULT;
245
246 if (!timeval_valid(&user_tv))
247 return -EINVAL;
248
249 new_ts.tv_sec = user_tv.tv_sec;
250 new_ts.tv_nsec = user_tv.tv_usec * NSEC_PER_USEC;
251 }
252 if (tz) {
253 if (copy_from_user(&new_tz, tz, sizeof(*tz)))
254 return -EFAULT;
255 }
256
257 return do_sys_settimeofday64(tv ? &new_ts : NULL, tz ? &new_tz : NULL);
258}
259
260#ifdef CONFIG_COMPAT
261COMPAT_SYSCALL_DEFINE2(gettimeofday, struct compat_timeval __user *, tv,
262 struct timezone __user *, tz)
263{
264 if (tv) {
265 struct timeval ktv;
266
267 do_gettimeofday(&ktv);
268 if (compat_put_timeval(&ktv, tv))
269 return -EFAULT;
270 }
271 if (tz) {
272 if (copy_to_user(tz, &sys_tz, sizeof(sys_tz)))
273 return -EFAULT;
274 }
275
276 return 0;
277}
278
279COMPAT_SYSCALL_DEFINE2(settimeofday, struct compat_timeval __user *, tv,
280 struct timezone __user *, tz)
281{
282 struct timespec64 new_ts;
283 struct timeval user_tv;
284 struct timezone new_tz;
285
286 if (tv) {
287 if (compat_get_timeval(&user_tv, tv))
288 return -EFAULT;
289 new_ts.tv_sec = user_tv.tv_sec;
290 new_ts.tv_nsec = user_tv.tv_usec * NSEC_PER_USEC;
291 }
292 if (tz) {
293 if (copy_from_user(&new_tz, tz, sizeof(*tz)))
294 return -EFAULT;
295 }
296
297 return do_sys_settimeofday64(tv ? &new_ts : NULL, tz ? &new_tz : NULL);
298}
299#endif
300
301SYSCALL_DEFINE1(adjtimex, struct timex __user *, txc_p)
302{
303 struct timex txc;
304 int ret;
305
306
307
308
309
310 if (copy_from_user(&txc, txc_p, sizeof(struct timex)))
311 return -EFAULT;
312 ret = do_adjtimex(&txc);
313 return copy_to_user(txc_p, &txc, sizeof(struct timex)) ? -EFAULT : ret;
314}
315
316#ifdef CONFIG_COMPAT
317
318COMPAT_SYSCALL_DEFINE1(adjtimex, struct compat_timex __user *, utp)
319{
320 struct timex txc;
321 int err, ret;
322
323 err = compat_get_timex(&txc, utp);
324 if (err)
325 return err;
326
327 ret = do_adjtimex(&txc);
328
329 err = compat_put_timex(utp, &txc);
330 if (err)
331 return err;
332
333 return ret;
334}
335#endif
336
337
338
339
340
341
342
343unsigned int jiffies_to_msecs(const unsigned long j)
344{
345#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)
346 return (MSEC_PER_SEC / HZ) * j;
347#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)
348 return (j + (HZ / MSEC_PER_SEC) - 1)/(HZ / MSEC_PER_SEC);
349#else
350# if BITS_PER_LONG == 32
351 return (HZ_TO_MSEC_MUL32 * j) >> HZ_TO_MSEC_SHR32;
352# else
353 return (j * HZ_TO_MSEC_NUM) / HZ_TO_MSEC_DEN;
354# endif
355#endif
356}
357EXPORT_SYMBOL(jiffies_to_msecs);
358
359unsigned int jiffies_to_usecs(const unsigned long j)
360{
361
362
363
364
365 BUILD_BUG_ON(HZ > USEC_PER_SEC);
366
367#if !(USEC_PER_SEC % HZ)
368 return (USEC_PER_SEC / HZ) * j;
369#else
370# if BITS_PER_LONG == 32
371 return (HZ_TO_USEC_MUL32 * j) >> HZ_TO_USEC_SHR32;
372# else
373 return (j * HZ_TO_USEC_NUM) / HZ_TO_USEC_DEN;
374# endif
375#endif
376}
377EXPORT_SYMBOL(jiffies_to_usecs);
378
379
380
381
382
383
384
385
386
387struct timespec timespec_trunc(struct timespec t, unsigned gran)
388{
389
390 if (gran == 1) {
391
392 } else if (gran == NSEC_PER_SEC) {
393 t.tv_nsec = 0;
394 } else if (gran > 1 && gran < NSEC_PER_SEC) {
395 t.tv_nsec -= t.tv_nsec % gran;
396 } else {
397 WARN(1, "illegal file time granularity: %u", gran);
398 }
399 return t;
400}
401EXPORT_SYMBOL(timespec_trunc);
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423time64_t mktime64(const unsigned int year0, const unsigned int mon0,
424 const unsigned int day, const unsigned int hour,
425 const unsigned int min, const unsigned int sec)
426{
427 unsigned int mon = mon0, year = year0;
428
429
430 if (0 >= (int) (mon -= 2)) {
431 mon += 12;
432 year -= 1;
433 }
434
435 return ((((time64_t)
436 (year/4 - year/100 + year/400 + 367*mon/12 + day) +
437 year*365 - 719499
438 )*24 + hour
439 )*60 + min
440 )*60 + sec;
441}
442EXPORT_SYMBOL(mktime64);
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458void set_normalized_timespec(struct timespec *ts, time_t sec, s64 nsec)
459{
460 while (nsec >= NSEC_PER_SEC) {
461
462
463
464
465
466 asm("" : "+rm"(nsec));
467 nsec -= NSEC_PER_SEC;
468 ++sec;
469 }
470 while (nsec < 0) {
471 asm("" : "+rm"(nsec));
472 nsec += NSEC_PER_SEC;
473 --sec;
474 }
475 ts->tv_sec = sec;
476 ts->tv_nsec = nsec;
477}
478EXPORT_SYMBOL(set_normalized_timespec);
479
480
481
482
483
484
485
486struct timespec ns_to_timespec(const s64 nsec)
487{
488 struct timespec ts;
489 s32 rem;
490
491 if (!nsec)
492 return (struct timespec) {0, 0};
493
494 ts.tv_sec = div_s64_rem(nsec, NSEC_PER_SEC, &rem);
495 if (unlikely(rem < 0)) {
496 ts.tv_sec--;
497 rem += NSEC_PER_SEC;
498 }
499 ts.tv_nsec = rem;
500
501 return ts;
502}
503EXPORT_SYMBOL(ns_to_timespec);
504
505
506
507
508
509
510
511struct timeval ns_to_timeval(const s64 nsec)
512{
513 struct timespec ts = ns_to_timespec(nsec);
514 struct timeval tv;
515
516 tv.tv_sec = ts.tv_sec;
517 tv.tv_usec = (suseconds_t) ts.tv_nsec / 1000;
518
519 return tv;
520}
521EXPORT_SYMBOL(ns_to_timeval);
522
523#if BITS_PER_LONG == 32
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538void set_normalized_timespec64(struct timespec64 *ts, time64_t sec, s64 nsec)
539{
540 while (nsec >= NSEC_PER_SEC) {
541
542
543
544
545
546 asm("" : "+rm"(nsec));
547 nsec -= NSEC_PER_SEC;
548 ++sec;
549 }
550 while (nsec < 0) {
551 asm("" : "+rm"(nsec));
552 nsec += NSEC_PER_SEC;
553 --sec;
554 }
555 ts->tv_sec = sec;
556 ts->tv_nsec = nsec;
557}
558EXPORT_SYMBOL(set_normalized_timespec64);
559
560
561
562
563
564
565
566struct timespec64 ns_to_timespec64(const s64 nsec)
567{
568 struct timespec64 ts;
569 s32 rem;
570
571 if (!nsec)
572 return (struct timespec64) {0, 0};
573
574 ts.tv_sec = div_s64_rem(nsec, NSEC_PER_SEC, &rem);
575 if (unlikely(rem < 0)) {
576 ts.tv_sec--;
577 rem += NSEC_PER_SEC;
578 }
579 ts.tv_nsec = rem;
580
581 return ts;
582}
583EXPORT_SYMBOL(ns_to_timespec64);
584#endif
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609unsigned long __msecs_to_jiffies(const unsigned int m)
610{
611
612
613
614 if ((int)m < 0)
615 return MAX_JIFFY_OFFSET;
616 return _msecs_to_jiffies(m);
617}
618EXPORT_SYMBOL(__msecs_to_jiffies);
619
620unsigned long __usecs_to_jiffies(const unsigned int u)
621{
622 if (u > jiffies_to_usecs(MAX_JIFFY_OFFSET))
623 return MAX_JIFFY_OFFSET;
624 return _usecs_to_jiffies(u);
625}
626EXPORT_SYMBOL(__usecs_to_jiffies);
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643static unsigned long
644__timespec64_to_jiffies(u64 sec, long nsec)
645{
646 nsec = nsec + TICK_NSEC - 1;
647
648 if (sec >= MAX_SEC_IN_JIFFIES){
649 sec = MAX_SEC_IN_JIFFIES;
650 nsec = 0;
651 }
652 return ((sec * SEC_CONVERSION) +
653 (((u64)nsec * NSEC_CONVERSION) >>
654 (NSEC_JIFFIE_SC - SEC_JIFFIE_SC))) >> SEC_JIFFIE_SC;
655
656}
657
658static unsigned long
659__timespec_to_jiffies(unsigned long sec, long nsec)
660{
661 return __timespec64_to_jiffies((u64)sec, nsec);
662}
663
664unsigned long
665timespec64_to_jiffies(const struct timespec64 *value)
666{
667 return __timespec64_to_jiffies(value->tv_sec, value->tv_nsec);
668}
669EXPORT_SYMBOL(timespec64_to_jiffies);
670
671void
672jiffies_to_timespec64(const unsigned long jiffies, struct timespec64 *value)
673{
674
675
676
677
678 u32 rem;
679 value->tv_sec = div_u64_rem((u64)jiffies * TICK_NSEC,
680 NSEC_PER_SEC, &rem);
681 value->tv_nsec = rem;
682}
683EXPORT_SYMBOL(jiffies_to_timespec64);
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701unsigned long
702timeval_to_jiffies(const struct timeval *value)
703{
704 return __timespec_to_jiffies(value->tv_sec,
705 value->tv_usec * NSEC_PER_USEC);
706}
707EXPORT_SYMBOL(timeval_to_jiffies);
708
709void jiffies_to_timeval(const unsigned long jiffies, struct timeval *value)
710{
711
712
713
714
715 u32 rem;
716
717 value->tv_sec = div_u64_rem((u64)jiffies * TICK_NSEC,
718 NSEC_PER_SEC, &rem);
719 value->tv_usec = rem / NSEC_PER_USEC;
720}
721EXPORT_SYMBOL(jiffies_to_timeval);
722
723
724
725
726clock_t jiffies_to_clock_t(unsigned long x)
727{
728#if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0
729# if HZ < USER_HZ
730 return x * (USER_HZ / HZ);
731# else
732 return x / (HZ / USER_HZ);
733# endif
734#else
735 return div_u64((u64)x * TICK_NSEC, NSEC_PER_SEC / USER_HZ);
736#endif
737}
738EXPORT_SYMBOL(jiffies_to_clock_t);
739
740unsigned long clock_t_to_jiffies(unsigned long x)
741{
742#if (HZ % USER_HZ)==0
743 if (x >= ~0UL / (HZ / USER_HZ))
744 return ~0UL;
745 return x * (HZ / USER_HZ);
746#else
747
748 if (x >= ~0UL / HZ * USER_HZ)
749 return ~0UL;
750
751
752 return div_u64((u64)x * HZ, USER_HZ);
753#endif
754}
755EXPORT_SYMBOL(clock_t_to_jiffies);
756
757u64 jiffies_64_to_clock_t(u64 x)
758{
759#if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0
760# if HZ < USER_HZ
761 x = div_u64(x * USER_HZ, HZ);
762# elif HZ > USER_HZ
763 x = div_u64(x, HZ / USER_HZ);
764# else
765
766# endif
767#else
768
769
770
771
772
773 x = div_u64(x * TICK_NSEC, (NSEC_PER_SEC / USER_HZ));
774#endif
775 return x;
776}
777EXPORT_SYMBOL(jiffies_64_to_clock_t);
778
779u64 nsec_to_clock_t(u64 x)
780{
781#if (NSEC_PER_SEC % USER_HZ) == 0
782 return div_u64(x, NSEC_PER_SEC / USER_HZ);
783#elif (USER_HZ % 512) == 0
784 return div_u64(x * USER_HZ / 512, NSEC_PER_SEC / 512);
785#else
786
787
788
789
790
791 return div_u64(x * 9, (9ull * NSEC_PER_SEC + (USER_HZ / 2)) / USER_HZ);
792#endif
793}
794
795u64 jiffies64_to_nsecs(u64 j)
796{
797#if !(NSEC_PER_SEC % HZ)
798 return (NSEC_PER_SEC / HZ) * j;
799# else
800 return div_u64(j * HZ_TO_NSEC_NUM, HZ_TO_NSEC_DEN);
801#endif
802}
803EXPORT_SYMBOL(jiffies64_to_nsecs);
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818u64 nsecs_to_jiffies64(u64 n)
819{
820#if (NSEC_PER_SEC % HZ) == 0
821
822 return div_u64(n, NSEC_PER_SEC / HZ);
823#elif (HZ % 512) == 0
824
825 return div_u64(n * HZ / 512, NSEC_PER_SEC / 512);
826#else
827
828
829
830
831 return div_u64(n * 9, (9ull * NSEC_PER_SEC + HZ / 2) / HZ);
832#endif
833}
834EXPORT_SYMBOL(nsecs_to_jiffies64);
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849unsigned long nsecs_to_jiffies(u64 n)
850{
851 return (unsigned long)nsecs_to_jiffies64(n);
852}
853EXPORT_SYMBOL_GPL(nsecs_to_jiffies);
854
855
856
857
858
859struct timespec timespec_add_safe(const struct timespec lhs,
860 const struct timespec rhs)
861{
862 struct timespec res;
863
864 set_normalized_timespec(&res, lhs.tv_sec + rhs.tv_sec,
865 lhs.tv_nsec + rhs.tv_nsec);
866
867 if (res.tv_sec < lhs.tv_sec || res.tv_sec < rhs.tv_sec)
868 res.tv_sec = TIME_T_MAX;
869
870 return res;
871}
872
873
874
875
876
877
878struct timespec64 timespec64_add_safe(const struct timespec64 lhs,
879 const struct timespec64 rhs)
880{
881 struct timespec64 res;
882
883 set_normalized_timespec64(&res, (timeu64_t) lhs.tv_sec + rhs.tv_sec,
884 lhs.tv_nsec + rhs.tv_nsec);
885
886 if (unlikely(res.tv_sec < lhs.tv_sec || res.tv_sec < rhs.tv_sec)) {
887 res.tv_sec = TIME64_MAX;
888 res.tv_nsec = 0;
889 }
890
891 return res;
892}
893
894int get_timespec64(struct timespec64 *ts,
895 const struct timespec __user *uts)
896{
897 struct timespec kts;
898 int ret;
899
900 ret = copy_from_user(&kts, uts, sizeof(kts));
901 if (ret)
902 return -EFAULT;
903
904 ts->tv_sec = kts.tv_sec;
905 ts->tv_nsec = kts.tv_nsec;
906
907 return 0;
908}
909EXPORT_SYMBOL_GPL(get_timespec64);
910
911int put_timespec64(const struct timespec64 *ts,
912 struct timespec __user *uts)
913{
914 struct timespec kts = {
915 .tv_sec = ts->tv_sec,
916 .tv_nsec = ts->tv_nsec
917 };
918 return copy_to_user(uts, &kts, sizeof(kts)) ? -EFAULT : 0;
919}
920EXPORT_SYMBOL_GPL(put_timespec64);
921
922int get_itimerspec64(struct itimerspec64 *it,
923 const struct itimerspec __user *uit)
924{
925 int ret;
926
927 ret = get_timespec64(&it->it_interval, &uit->it_interval);
928 if (ret)
929 return ret;
930
931 ret = get_timespec64(&it->it_value, &uit->it_value);
932
933 return ret;
934}
935EXPORT_SYMBOL_GPL(get_itimerspec64);
936
937int put_itimerspec64(const struct itimerspec64 *it,
938 struct itimerspec __user *uit)
939{
940 int ret;
941
942 ret = put_timespec64(&it->it_interval, &uit->it_interval);
943 if (ret)
944 return ret;
945
946 ret = put_timespec64(&it->it_value, &uit->it_value);
947
948 return ret;
949}
950EXPORT_SYMBOL_GPL(put_itimerspec64);
951