xref: /openbmc/linux/kernel/time/time.c (revision d0dd63a8)
15cee9645SThomas Gleixner /*
25cee9645SThomas Gleixner  *  linux/kernel/time.c
35cee9645SThomas Gleixner  *
45cee9645SThomas Gleixner  *  Copyright (C) 1991, 1992  Linus Torvalds
55cee9645SThomas Gleixner  *
65cee9645SThomas Gleixner  *  This file contains the interface functions for the various
75cee9645SThomas Gleixner  *  time related system calls: time, stime, gettimeofday, settimeofday,
85cee9645SThomas Gleixner  *			       adjtime
95cee9645SThomas Gleixner  */
105cee9645SThomas Gleixner /*
115cee9645SThomas Gleixner  * Modification history kernel/time.c
125cee9645SThomas Gleixner  *
135cee9645SThomas Gleixner  * 1993-09-02    Philip Gladstone
145cee9645SThomas Gleixner  *      Created file with time related functions from sched/core.c and adjtimex()
155cee9645SThomas Gleixner  * 1993-10-08    Torsten Duwe
165cee9645SThomas Gleixner  *      adjtime interface update and CMOS clock write code
175cee9645SThomas Gleixner  * 1995-08-13    Torsten Duwe
185cee9645SThomas Gleixner  *      kernel PLL updated to 1994-12-13 specs (rfc-1589)
195cee9645SThomas Gleixner  * 1999-01-16    Ulrich Windl
205cee9645SThomas Gleixner  *	Introduced error checking for many cases in adjtimex().
215cee9645SThomas Gleixner  *	Updated NTP code according to technical memorandum Jan '96
225cee9645SThomas Gleixner  *	"A Kernel Model for Precision Timekeeping" by Dave Mills
235cee9645SThomas Gleixner  *	Allow time_constant larger than MAXTC(6) for NTP v4 (MAXTC == 10)
245cee9645SThomas Gleixner  *	(Even though the technical memorandum forbids it)
255cee9645SThomas Gleixner  * 2004-07-14	 Christoph Lameter
265cee9645SThomas Gleixner  *	Added getnstimeofday to allow the posix timer functions to return
275cee9645SThomas Gleixner  *	with nanosecond accuracy
285cee9645SThomas Gleixner  */
295cee9645SThomas Gleixner 
305cee9645SThomas Gleixner #include <linux/export.h>
315cee9645SThomas Gleixner #include <linux/timex.h>
325cee9645SThomas Gleixner #include <linux/capability.h>
335cee9645SThomas Gleixner #include <linux/timekeeper_internal.h>
345cee9645SThomas Gleixner #include <linux/errno.h>
355cee9645SThomas Gleixner #include <linux/syscalls.h>
365cee9645SThomas Gleixner #include <linux/security.h>
375cee9645SThomas Gleixner #include <linux/fs.h>
385cee9645SThomas Gleixner #include <linux/math64.h>
395cee9645SThomas Gleixner #include <linux/ptrace.h>
405cee9645SThomas Gleixner 
417c0f6ba6SLinus Torvalds #include <linux/uaccess.h>
423a4d44b6SAl Viro #include <linux/compat.h>
435cee9645SThomas Gleixner #include <asm/unistd.h>
445cee9645SThomas Gleixner 
450a227985SNicholas Mc Guire #include <generated/timeconst.h>
468b094cd0SThomas Gleixner #include "timekeeping.h"
475cee9645SThomas Gleixner 
485cee9645SThomas Gleixner /*
495cee9645SThomas Gleixner  * The timezone where the local system is located.  Used as a default by some
505cee9645SThomas Gleixner  * programs who obtain this value by using gettimeofday.
515cee9645SThomas Gleixner  */
525cee9645SThomas Gleixner struct timezone sys_tz;
535cee9645SThomas Gleixner 
545cee9645SThomas Gleixner EXPORT_SYMBOL(sys_tz);
555cee9645SThomas Gleixner 
565cee9645SThomas Gleixner #ifdef __ARCH_WANT_SYS_TIME
575cee9645SThomas Gleixner 
585cee9645SThomas Gleixner /*
595cee9645SThomas Gleixner  * sys_time() can be implemented in user-level using
605cee9645SThomas Gleixner  * sys_gettimeofday().  Is this for backwards compatibility?  If so,
615cee9645SThomas Gleixner  * why not move it into the appropriate arch directory (for those
625cee9645SThomas Gleixner  * architectures that need it).
635cee9645SThomas Gleixner  */
645cee9645SThomas Gleixner SYSCALL_DEFINE1(time, time_t __user *, tloc)
655cee9645SThomas Gleixner {
66f5a89295SArnd Bergmann 	time_t i = (time_t)ktime_get_real_seconds();
675cee9645SThomas Gleixner 
685cee9645SThomas Gleixner 	if (tloc) {
695cee9645SThomas Gleixner 		if (put_user(i,tloc))
705cee9645SThomas Gleixner 			return -EFAULT;
715cee9645SThomas Gleixner 	}
725cee9645SThomas Gleixner 	force_successful_syscall_return();
735cee9645SThomas Gleixner 	return i;
745cee9645SThomas Gleixner }
755cee9645SThomas Gleixner 
765cee9645SThomas Gleixner /*
775cee9645SThomas Gleixner  * sys_stime() can be implemented in user-level using
785cee9645SThomas Gleixner  * sys_settimeofday().  Is this for backwards compatibility?  If so,
795cee9645SThomas Gleixner  * why not move it into the appropriate arch directory (for those
805cee9645SThomas Gleixner  * architectures that need it).
815cee9645SThomas Gleixner  */
825cee9645SThomas Gleixner 
835cee9645SThomas Gleixner SYSCALL_DEFINE1(stime, time_t __user *, tptr)
845cee9645SThomas Gleixner {
854eb1bca1SArnd Bergmann 	struct timespec64 tv;
865cee9645SThomas Gleixner 	int err;
875cee9645SThomas Gleixner 
885cee9645SThomas Gleixner 	if (get_user(tv.tv_sec, tptr))
895cee9645SThomas Gleixner 		return -EFAULT;
905cee9645SThomas Gleixner 
915cee9645SThomas Gleixner 	tv.tv_nsec = 0;
925cee9645SThomas Gleixner 
934eb1bca1SArnd Bergmann 	err = security_settime64(&tv, NULL);
945cee9645SThomas Gleixner 	if (err)
955cee9645SThomas Gleixner 		return err;
965cee9645SThomas Gleixner 
974eb1bca1SArnd Bergmann 	do_settimeofday64(&tv);
985cee9645SThomas Gleixner 	return 0;
995cee9645SThomas Gleixner }
1005cee9645SThomas Gleixner 
1015cee9645SThomas Gleixner #endif /* __ARCH_WANT_SYS_TIME */
1025cee9645SThomas Gleixner 
103b180db2cSAl Viro #ifdef CONFIG_COMPAT
104b180db2cSAl Viro #ifdef __ARCH_WANT_COMPAT_SYS_TIME
105b180db2cSAl Viro 
106b180db2cSAl Viro /* compat_time_t is a 32 bit "long" and needs to get converted. */
107b180db2cSAl Viro COMPAT_SYSCALL_DEFINE1(time, compat_time_t __user *, tloc)
108b180db2cSAl Viro {
109b180db2cSAl Viro 	compat_time_t i;
110b180db2cSAl Viro 
111f5a89295SArnd Bergmann 	i = (compat_time_t)ktime_get_real_seconds();
112b180db2cSAl Viro 
113b180db2cSAl Viro 	if (tloc) {
114b180db2cSAl Viro 		if (put_user(i,tloc))
115b180db2cSAl Viro 			return -EFAULT;
116b180db2cSAl Viro 	}
117b180db2cSAl Viro 	force_successful_syscall_return();
118b180db2cSAl Viro 	return i;
119b180db2cSAl Viro }
120b180db2cSAl Viro 
121b180db2cSAl Viro COMPAT_SYSCALL_DEFINE1(stime, compat_time_t __user *, tptr)
122b180db2cSAl Viro {
1234eb1bca1SArnd Bergmann 	struct timespec64 tv;
124b180db2cSAl Viro 	int err;
125b180db2cSAl Viro 
126b180db2cSAl Viro 	if (get_user(tv.tv_sec, tptr))
127b180db2cSAl Viro 		return -EFAULT;
128b180db2cSAl Viro 
129b180db2cSAl Viro 	tv.tv_nsec = 0;
130b180db2cSAl Viro 
1314eb1bca1SArnd Bergmann 	err = security_settime64(&tv, NULL);
132b180db2cSAl Viro 	if (err)
133b180db2cSAl Viro 		return err;
134b180db2cSAl Viro 
1354eb1bca1SArnd Bergmann 	do_settimeofday64(&tv);
136b180db2cSAl Viro 	return 0;
137b180db2cSAl Viro }
138b180db2cSAl Viro 
139b180db2cSAl Viro #endif /* __ARCH_WANT_COMPAT_SYS_TIME */
140b180db2cSAl Viro #endif
141b180db2cSAl Viro 
1425cee9645SThomas Gleixner SYSCALL_DEFINE2(gettimeofday, struct timeval __user *, tv,
1435cee9645SThomas Gleixner 		struct timezone __user *, tz)
1445cee9645SThomas Gleixner {
1455cee9645SThomas Gleixner 	if (likely(tv != NULL)) {
1465cee9645SThomas Gleixner 		struct timeval ktv;
1475cee9645SThomas Gleixner 		do_gettimeofday(&ktv);
1485cee9645SThomas Gleixner 		if (copy_to_user(tv, &ktv, sizeof(ktv)))
1495cee9645SThomas Gleixner 			return -EFAULT;
1505cee9645SThomas Gleixner 	}
1515cee9645SThomas Gleixner 	if (unlikely(tz != NULL)) {
1525cee9645SThomas Gleixner 		if (copy_to_user(tz, &sys_tz, sizeof(sys_tz)))
1535cee9645SThomas Gleixner 			return -EFAULT;
1545cee9645SThomas Gleixner 	}
1555cee9645SThomas Gleixner 	return 0;
1565cee9645SThomas Gleixner }
1575cee9645SThomas Gleixner 
1585cee9645SThomas Gleixner /*
1595cee9645SThomas Gleixner  * In case for some reason the CMOS clock has not already been running
1605cee9645SThomas Gleixner  * in UTC, but in some local time: The first time we set the timezone,
1615cee9645SThomas Gleixner  * we will warp the clock so that it is ticking UTC time instead of
1625cee9645SThomas Gleixner  * local time. Presumably, if someone is setting the timezone then we
1635cee9645SThomas Gleixner  * are running in an environment where the programs understand about
1645cee9645SThomas Gleixner  * timezones. This should be done at boot time in the /etc/rc script,
1655cee9645SThomas Gleixner  * as soon as possible, so that the clock can be set right. Otherwise,
1665cee9645SThomas Gleixner  * various programs will get confused when the clock gets warped.
1675cee9645SThomas Gleixner  */
1685cee9645SThomas Gleixner 
16986d34732SBaolin Wang int do_sys_settimeofday64(const struct timespec64 *tv, const struct timezone *tz)
1705cee9645SThomas Gleixner {
1715cee9645SThomas Gleixner 	static int firsttime = 1;
1725cee9645SThomas Gleixner 	int error = 0;
1735cee9645SThomas Gleixner 
17486d34732SBaolin Wang 	if (tv && !timespec64_valid(tv))
1755cee9645SThomas Gleixner 		return -EINVAL;
1765cee9645SThomas Gleixner 
17786d34732SBaolin Wang 	error = security_settime64(tv, tz);
1785cee9645SThomas Gleixner 	if (error)
1795cee9645SThomas Gleixner 		return error;
1805cee9645SThomas Gleixner 
1815cee9645SThomas Gleixner 	if (tz) {
1826f7d7984SSasha Levin 		/* Verify we're witin the +-15 hrs range */
1836f7d7984SSasha Levin 		if (tz->tz_minuteswest > 15*60 || tz->tz_minuteswest < -15*60)
1846f7d7984SSasha Levin 			return -EINVAL;
1856f7d7984SSasha Levin 
1865cee9645SThomas Gleixner 		sys_tz = *tz;
1875cee9645SThomas Gleixner 		update_vsyscall_tz();
1885cee9645SThomas Gleixner 		if (firsttime) {
1895cee9645SThomas Gleixner 			firsttime = 0;
1905cee9645SThomas Gleixner 			if (!tv)
191e0956dccSArnd Bergmann 				timekeeping_warp_clock();
1925cee9645SThomas Gleixner 		}
1935cee9645SThomas Gleixner 	}
1945cee9645SThomas Gleixner 	if (tv)
19586d34732SBaolin Wang 		return do_settimeofday64(tv);
1965cee9645SThomas Gleixner 	return 0;
1975cee9645SThomas Gleixner }
1985cee9645SThomas Gleixner 
1995cee9645SThomas Gleixner SYSCALL_DEFINE2(settimeofday, struct timeval __user *, tv,
2005cee9645SThomas Gleixner 		struct timezone __user *, tz)
2015cee9645SThomas Gleixner {
2022ac00f17SDeepa Dinamani 	struct timespec64 new_ts;
2035cee9645SThomas Gleixner 	struct timeval user_tv;
2045cee9645SThomas Gleixner 	struct timezone new_tz;
2055cee9645SThomas Gleixner 
2065cee9645SThomas Gleixner 	if (tv) {
2075cee9645SThomas Gleixner 		if (copy_from_user(&user_tv, tv, sizeof(*tv)))
2085cee9645SThomas Gleixner 			return -EFAULT;
2096ada1fc0SSasha Levin 
2106ada1fc0SSasha Levin 		if (!timeval_valid(&user_tv))
2116ada1fc0SSasha Levin 			return -EINVAL;
2126ada1fc0SSasha Levin 
2135cee9645SThomas Gleixner 		new_ts.tv_sec = user_tv.tv_sec;
2145cee9645SThomas Gleixner 		new_ts.tv_nsec = user_tv.tv_usec * NSEC_PER_USEC;
2155cee9645SThomas Gleixner 	}
2165cee9645SThomas Gleixner 	if (tz) {
2175cee9645SThomas Gleixner 		if (copy_from_user(&new_tz, tz, sizeof(*tz)))
2185cee9645SThomas Gleixner 			return -EFAULT;
2195cee9645SThomas Gleixner 	}
2205cee9645SThomas Gleixner 
2212ac00f17SDeepa Dinamani 	return do_sys_settimeofday64(tv ? &new_ts : NULL, tz ? &new_tz : NULL);
2225cee9645SThomas Gleixner }
2235cee9645SThomas Gleixner 
2242b2d0285SAl Viro #ifdef CONFIG_COMPAT
2252b2d0285SAl Viro COMPAT_SYSCALL_DEFINE2(gettimeofday, struct compat_timeval __user *, tv,
2262b2d0285SAl Viro 		       struct timezone __user *, tz)
2272b2d0285SAl Viro {
2282b2d0285SAl Viro 	if (tv) {
2292b2d0285SAl Viro 		struct timeval ktv;
2302b2d0285SAl Viro 
2312b2d0285SAl Viro 		do_gettimeofday(&ktv);
2322b2d0285SAl Viro 		if (compat_put_timeval(&ktv, tv))
2332b2d0285SAl Viro 			return -EFAULT;
2342b2d0285SAl Viro 	}
2352b2d0285SAl Viro 	if (tz) {
2362b2d0285SAl Viro 		if (copy_to_user(tz, &sys_tz, sizeof(sys_tz)))
2372b2d0285SAl Viro 			return -EFAULT;
2382b2d0285SAl Viro 	}
2392b2d0285SAl Viro 
2402b2d0285SAl Viro 	return 0;
2412b2d0285SAl Viro }
2422b2d0285SAl Viro 
2432b2d0285SAl Viro COMPAT_SYSCALL_DEFINE2(settimeofday, struct compat_timeval __user *, tv,
2442b2d0285SAl Viro 		       struct timezone __user *, tz)
2452b2d0285SAl Viro {
2462b2d0285SAl Viro 	struct timespec64 new_ts;
2472b2d0285SAl Viro 	struct timeval user_tv;
2482b2d0285SAl Viro 	struct timezone new_tz;
2492b2d0285SAl Viro 
2502b2d0285SAl Viro 	if (tv) {
2512b2d0285SAl Viro 		if (compat_get_timeval(&user_tv, tv))
2522b2d0285SAl Viro 			return -EFAULT;
2532b2d0285SAl Viro 		new_ts.tv_sec = user_tv.tv_sec;
2542b2d0285SAl Viro 		new_ts.tv_nsec = user_tv.tv_usec * NSEC_PER_USEC;
2552b2d0285SAl Viro 	}
2562b2d0285SAl Viro 	if (tz) {
2572b2d0285SAl Viro 		if (copy_from_user(&new_tz, tz, sizeof(*tz)))
2582b2d0285SAl Viro 			return -EFAULT;
2592b2d0285SAl Viro 	}
2602b2d0285SAl Viro 
2612b2d0285SAl Viro 	return do_sys_settimeofday64(tv ? &new_ts : NULL, tz ? &new_tz : NULL);
2622b2d0285SAl Viro }
2632b2d0285SAl Viro #endif
2642b2d0285SAl Viro 
2655cee9645SThomas Gleixner SYSCALL_DEFINE1(adjtimex, struct timex __user *, txc_p)
2665cee9645SThomas Gleixner {
2675cee9645SThomas Gleixner 	struct timex txc;		/* Local copy of parameter */
2685cee9645SThomas Gleixner 	int ret;
2695cee9645SThomas Gleixner 
2705cee9645SThomas Gleixner 	/* Copy the user data space into the kernel copy
2715cee9645SThomas Gleixner 	 * structure. But bear in mind that the structures
2725cee9645SThomas Gleixner 	 * may change
2735cee9645SThomas Gleixner 	 */
2745cee9645SThomas Gleixner 	if (copy_from_user(&txc, txc_p, sizeof(struct timex)))
2755cee9645SThomas Gleixner 		return -EFAULT;
2765cee9645SThomas Gleixner 	ret = do_adjtimex(&txc);
2775cee9645SThomas Gleixner 	return copy_to_user(txc_p, &txc, sizeof(struct timex)) ? -EFAULT : ret;
2785cee9645SThomas Gleixner }
2795cee9645SThomas Gleixner 
2803a4d44b6SAl Viro #ifdef CONFIG_COMPAT
2813a4d44b6SAl Viro 
2823a4d44b6SAl Viro COMPAT_SYSCALL_DEFINE1(adjtimex, struct compat_timex __user *, utp)
2833a4d44b6SAl Viro {
2843a4d44b6SAl Viro 	struct timex txc;
2853a4d44b6SAl Viro 	int err, ret;
2863a4d44b6SAl Viro 
2873a4d44b6SAl Viro 	err = compat_get_timex(&txc, utp);
2883a4d44b6SAl Viro 	if (err)
2893a4d44b6SAl Viro 		return err;
2903a4d44b6SAl Viro 
2913a4d44b6SAl Viro 	ret = do_adjtimex(&txc);
2923a4d44b6SAl Viro 
2933a4d44b6SAl Viro 	err = compat_put_timex(utp, &txc);
2943a4d44b6SAl Viro 	if (err)
2953a4d44b6SAl Viro 		return err;
2963a4d44b6SAl Viro 
2973a4d44b6SAl Viro 	return ret;
2983a4d44b6SAl Viro }
2993a4d44b6SAl Viro #endif
3003a4d44b6SAl Viro 
3015cee9645SThomas Gleixner /*
3025cee9645SThomas Gleixner  * Convert jiffies to milliseconds and back.
3035cee9645SThomas Gleixner  *
3045cee9645SThomas Gleixner  * Avoid unnecessary multiplications/divisions in the
3055cee9645SThomas Gleixner  * two most common HZ cases:
3065cee9645SThomas Gleixner  */
3075cee9645SThomas Gleixner unsigned int jiffies_to_msecs(const unsigned long j)
3085cee9645SThomas Gleixner {
3095cee9645SThomas Gleixner #if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)
3105cee9645SThomas Gleixner 	return (MSEC_PER_SEC / HZ) * j;
3115cee9645SThomas Gleixner #elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)
3125cee9645SThomas Gleixner 	return (j + (HZ / MSEC_PER_SEC) - 1)/(HZ / MSEC_PER_SEC);
3135cee9645SThomas Gleixner #else
3145cee9645SThomas Gleixner # if BITS_PER_LONG == 32
3155cee9645SThomas Gleixner 	return (HZ_TO_MSEC_MUL32 * j) >> HZ_TO_MSEC_SHR32;
3165cee9645SThomas Gleixner # else
3175cee9645SThomas Gleixner 	return (j * HZ_TO_MSEC_NUM) / HZ_TO_MSEC_DEN;
3185cee9645SThomas Gleixner # endif
3195cee9645SThomas Gleixner #endif
3205cee9645SThomas Gleixner }
3215cee9645SThomas Gleixner EXPORT_SYMBOL(jiffies_to_msecs);
3225cee9645SThomas Gleixner 
3235cee9645SThomas Gleixner unsigned int jiffies_to_usecs(const unsigned long j)
3245cee9645SThomas Gleixner {
325e0758676SFrederic Weisbecker 	/*
326e0758676SFrederic Weisbecker 	 * Hz usually doesn't go much further MSEC_PER_SEC.
327e0758676SFrederic Weisbecker 	 * jiffies_to_usecs() and usecs_to_jiffies() depend on that.
328e0758676SFrederic Weisbecker 	 */
329e0758676SFrederic Weisbecker 	BUILD_BUG_ON(HZ > USEC_PER_SEC);
330e0758676SFrederic Weisbecker 
331e0758676SFrederic Weisbecker #if !(USEC_PER_SEC % HZ)
3325cee9645SThomas Gleixner 	return (USEC_PER_SEC / HZ) * j;
3335cee9645SThomas Gleixner #else
3345cee9645SThomas Gleixner # if BITS_PER_LONG == 32
3355cee9645SThomas Gleixner 	return (HZ_TO_USEC_MUL32 * j) >> HZ_TO_USEC_SHR32;
3365cee9645SThomas Gleixner # else
3375cee9645SThomas Gleixner 	return (j * HZ_TO_USEC_NUM) / HZ_TO_USEC_DEN;
3385cee9645SThomas Gleixner # endif
3395cee9645SThomas Gleixner #endif
3405cee9645SThomas Gleixner }
3415cee9645SThomas Gleixner EXPORT_SYMBOL(jiffies_to_usecs);
3425cee9645SThomas Gleixner 
3435cee9645SThomas Gleixner /**
3445cee9645SThomas Gleixner  * timespec_trunc - Truncate timespec to a granularity
3455cee9645SThomas Gleixner  * @t: Timespec
3465cee9645SThomas Gleixner  * @gran: Granularity in ns.
3475cee9645SThomas Gleixner  *
348de4a95faSKarsten Blees  * Truncate a timespec to a granularity. Always rounds down. gran must
349de4a95faSKarsten Blees  * not be 0 nor greater than a second (NSEC_PER_SEC, or 10^9 ns).
3505cee9645SThomas Gleixner  */
3515cee9645SThomas Gleixner struct timespec timespec_trunc(struct timespec t, unsigned gran)
3525cee9645SThomas Gleixner {
353de4a95faSKarsten Blees 	/* Avoid division in the common cases 1 ns and 1 s. */
354de4a95faSKarsten Blees 	if (gran == 1) {
3555cee9645SThomas Gleixner 		/* nothing */
356de4a95faSKarsten Blees 	} else if (gran == NSEC_PER_SEC) {
3575cee9645SThomas Gleixner 		t.tv_nsec = 0;
358de4a95faSKarsten Blees 	} else if (gran > 1 && gran < NSEC_PER_SEC) {
3595cee9645SThomas Gleixner 		t.tv_nsec -= t.tv_nsec % gran;
360de4a95faSKarsten Blees 	} else {
361de4a95faSKarsten Blees 		WARN(1, "illegal file time granularity: %u", gran);
3625cee9645SThomas Gleixner 	}
3635cee9645SThomas Gleixner 	return t;
3645cee9645SThomas Gleixner }
3655cee9645SThomas Gleixner EXPORT_SYMBOL(timespec_trunc);
3665cee9645SThomas Gleixner 
36790b6ce9cSpang.xunlei /*
36890b6ce9cSpang.xunlei  * mktime64 - Converts date to seconds.
36990b6ce9cSpang.xunlei  * Converts Gregorian date to seconds since 1970-01-01 00:00:00.
3705cee9645SThomas Gleixner  * Assumes input in normal date format, i.e. 1980-12-31 23:59:59
3715cee9645SThomas Gleixner  * => year=1980, mon=12, day=31, hour=23, min=59, sec=59.
3725cee9645SThomas Gleixner  *
3735cee9645SThomas Gleixner  * [For the Julian calendar (which was used in Russia before 1917,
3745cee9645SThomas Gleixner  * Britain & colonies before 1752, anywhere else before 1582,
3755cee9645SThomas Gleixner  * and is still in use by some communities) leave out the
3765cee9645SThomas Gleixner  * -year/100+year/400 terms, and add 10.]
3775cee9645SThomas Gleixner  *
3785cee9645SThomas Gleixner  * This algorithm was first published by Gauss (I think).
379ede5147dSDavid Howells  *
380ede5147dSDavid Howells  * A leap second can be indicated by calling this function with sec as
381ede5147dSDavid Howells  * 60 (allowable under ISO 8601).  The leap second is treated the same
382ede5147dSDavid Howells  * as the following second since they don't exist in UNIX time.
383ede5147dSDavid Howells  *
384ede5147dSDavid Howells  * An encoding of midnight at the end of the day as 24:00:00 - ie. midnight
385ede5147dSDavid Howells  * tomorrow - (allowable under ISO 8601) is supported.
3865cee9645SThomas Gleixner  */
38790b6ce9cSpang.xunlei time64_t mktime64(const unsigned int year0, const unsigned int mon0,
3885cee9645SThomas Gleixner 		const unsigned int day, const unsigned int hour,
3895cee9645SThomas Gleixner 		const unsigned int min, const unsigned int sec)
3905cee9645SThomas Gleixner {
3915cee9645SThomas Gleixner 	unsigned int mon = mon0, year = year0;
3925cee9645SThomas Gleixner 
3935cee9645SThomas Gleixner 	/* 1..12 -> 11,12,1..10 */
3945cee9645SThomas Gleixner 	if (0 >= (int) (mon -= 2)) {
3955cee9645SThomas Gleixner 		mon += 12;	/* Puts Feb last since it has leap day */
3965cee9645SThomas Gleixner 		year -= 1;
3975cee9645SThomas Gleixner 	}
3985cee9645SThomas Gleixner 
39990b6ce9cSpang.xunlei 	return ((((time64_t)
4005cee9645SThomas Gleixner 		  (year/4 - year/100 + year/400 + 367*mon/12 + day) +
4015cee9645SThomas Gleixner 		  year*365 - 719499
402ede5147dSDavid Howells 	    )*24 + hour /* now have hours - midnight tomorrow handled here */
4035cee9645SThomas Gleixner 	  )*60 + min /* now have minutes */
4045cee9645SThomas Gleixner 	)*60 + sec; /* finally seconds */
4055cee9645SThomas Gleixner }
40690b6ce9cSpang.xunlei EXPORT_SYMBOL(mktime64);
4075cee9645SThomas Gleixner 
4085cee9645SThomas Gleixner /**
4095cee9645SThomas Gleixner  * set_normalized_timespec - set timespec sec and nsec parts and normalize
4105cee9645SThomas Gleixner  *
4115cee9645SThomas Gleixner  * @ts:		pointer to timespec variable to be set
4125cee9645SThomas Gleixner  * @sec:	seconds to set
4135cee9645SThomas Gleixner  * @nsec:	nanoseconds to set
4145cee9645SThomas Gleixner  *
4155cee9645SThomas Gleixner  * Set seconds and nanoseconds field of a timespec variable and
4165cee9645SThomas Gleixner  * normalize to the timespec storage format
4175cee9645SThomas Gleixner  *
4185cee9645SThomas Gleixner  * Note: The tv_nsec part is always in the range of
4195cee9645SThomas Gleixner  *	0 <= tv_nsec < NSEC_PER_SEC
4205cee9645SThomas Gleixner  * For negative values only the tv_sec field is negative !
4215cee9645SThomas Gleixner  */
4225cee9645SThomas Gleixner void set_normalized_timespec(struct timespec *ts, time_t sec, s64 nsec)
4235cee9645SThomas Gleixner {
4245cee9645SThomas Gleixner 	while (nsec >= NSEC_PER_SEC) {
4255cee9645SThomas Gleixner 		/*
4265cee9645SThomas Gleixner 		 * The following asm() prevents the compiler from
4275cee9645SThomas Gleixner 		 * optimising this loop into a modulo operation. See
4285cee9645SThomas Gleixner 		 * also __iter_div_u64_rem() in include/linux/time.h
4295cee9645SThomas Gleixner 		 */
4305cee9645SThomas Gleixner 		asm("" : "+rm"(nsec));
4315cee9645SThomas Gleixner 		nsec -= NSEC_PER_SEC;
4325cee9645SThomas Gleixner 		++sec;
4335cee9645SThomas Gleixner 	}
4345cee9645SThomas Gleixner 	while (nsec < 0) {
4355cee9645SThomas Gleixner 		asm("" : "+rm"(nsec));
4365cee9645SThomas Gleixner 		nsec += NSEC_PER_SEC;
4375cee9645SThomas Gleixner 		--sec;
4385cee9645SThomas Gleixner 	}
4395cee9645SThomas Gleixner 	ts->tv_sec = sec;
4405cee9645SThomas Gleixner 	ts->tv_nsec = nsec;
4415cee9645SThomas Gleixner }
4425cee9645SThomas Gleixner EXPORT_SYMBOL(set_normalized_timespec);
4435cee9645SThomas Gleixner 
4445cee9645SThomas Gleixner /**
4455cee9645SThomas Gleixner  * ns_to_timespec - Convert nanoseconds to timespec
4465cee9645SThomas Gleixner  * @nsec:       the nanoseconds value to be converted
4475cee9645SThomas Gleixner  *
4485cee9645SThomas Gleixner  * Returns the timespec representation of the nsec parameter.
4495cee9645SThomas Gleixner  */
4505cee9645SThomas Gleixner struct timespec ns_to_timespec(const s64 nsec)
4515cee9645SThomas Gleixner {
4525cee9645SThomas Gleixner 	struct timespec ts;
4535cee9645SThomas Gleixner 	s32 rem;
4545cee9645SThomas Gleixner 
4555cee9645SThomas Gleixner 	if (!nsec)
4565cee9645SThomas Gleixner 		return (struct timespec) {0, 0};
4575cee9645SThomas Gleixner 
4585cee9645SThomas Gleixner 	ts.tv_sec = div_s64_rem(nsec, NSEC_PER_SEC, &rem);
4595cee9645SThomas Gleixner 	if (unlikely(rem < 0)) {
4605cee9645SThomas Gleixner 		ts.tv_sec--;
4615cee9645SThomas Gleixner 		rem += NSEC_PER_SEC;
4625cee9645SThomas Gleixner 	}
4635cee9645SThomas Gleixner 	ts.tv_nsec = rem;
4645cee9645SThomas Gleixner 
4655cee9645SThomas Gleixner 	return ts;
4665cee9645SThomas Gleixner }
4675cee9645SThomas Gleixner EXPORT_SYMBOL(ns_to_timespec);
4685cee9645SThomas Gleixner 
4695cee9645SThomas Gleixner /**
4705cee9645SThomas Gleixner  * ns_to_timeval - Convert nanoseconds to timeval
4715cee9645SThomas Gleixner  * @nsec:       the nanoseconds value to be converted
4725cee9645SThomas Gleixner  *
4735cee9645SThomas Gleixner  * Returns the timeval representation of the nsec parameter.
4745cee9645SThomas Gleixner  */
4755cee9645SThomas Gleixner struct timeval ns_to_timeval(const s64 nsec)
4765cee9645SThomas Gleixner {
4775cee9645SThomas Gleixner 	struct timespec ts = ns_to_timespec(nsec);
4785cee9645SThomas Gleixner 	struct timeval tv;
4795cee9645SThomas Gleixner 
4805cee9645SThomas Gleixner 	tv.tv_sec = ts.tv_sec;
4815cee9645SThomas Gleixner 	tv.tv_usec = (suseconds_t) ts.tv_nsec / 1000;
4825cee9645SThomas Gleixner 
4835cee9645SThomas Gleixner 	return tv;
4845cee9645SThomas Gleixner }
4855cee9645SThomas Gleixner EXPORT_SYMBOL(ns_to_timeval);
4865cee9645SThomas Gleixner 
487a84d1169SArnd Bergmann struct __kernel_old_timeval ns_to_kernel_old_timeval(const s64 nsec)
488a84d1169SArnd Bergmann {
489a84d1169SArnd Bergmann 	struct timespec64 ts = ns_to_timespec64(nsec);
490a84d1169SArnd Bergmann 	struct __kernel_old_timeval tv;
491a84d1169SArnd Bergmann 
492a84d1169SArnd Bergmann 	tv.tv_sec = ts.tv_sec;
493a84d1169SArnd Bergmann 	tv.tv_usec = (suseconds_t)ts.tv_nsec / 1000;
494a84d1169SArnd Bergmann 
495a84d1169SArnd Bergmann 	return tv;
496a84d1169SArnd Bergmann }
497a84d1169SArnd Bergmann EXPORT_SYMBOL(ns_to_kernel_old_timeval);
498a84d1169SArnd Bergmann 
49949cd6f86SJohn Stultz /**
50049cd6f86SJohn Stultz  * set_normalized_timespec - set timespec sec and nsec parts and normalize
50149cd6f86SJohn Stultz  *
50249cd6f86SJohn Stultz  * @ts:		pointer to timespec variable to be set
50349cd6f86SJohn Stultz  * @sec:	seconds to set
50449cd6f86SJohn Stultz  * @nsec:	nanoseconds to set
50549cd6f86SJohn Stultz  *
50649cd6f86SJohn Stultz  * Set seconds and nanoseconds field of a timespec variable and
50749cd6f86SJohn Stultz  * normalize to the timespec storage format
50849cd6f86SJohn Stultz  *
50949cd6f86SJohn Stultz  * Note: The tv_nsec part is always in the range of
51049cd6f86SJohn Stultz  *	0 <= tv_nsec < NSEC_PER_SEC
51149cd6f86SJohn Stultz  * For negative values only the tv_sec field is negative !
51249cd6f86SJohn Stultz  */
51349cd6f86SJohn Stultz void set_normalized_timespec64(struct timespec64 *ts, time64_t sec, s64 nsec)
51449cd6f86SJohn Stultz {
51549cd6f86SJohn Stultz 	while (nsec >= NSEC_PER_SEC) {
51649cd6f86SJohn Stultz 		/*
51749cd6f86SJohn Stultz 		 * The following asm() prevents the compiler from
51849cd6f86SJohn Stultz 		 * optimising this loop into a modulo operation. See
51949cd6f86SJohn Stultz 		 * also __iter_div_u64_rem() in include/linux/time.h
52049cd6f86SJohn Stultz 		 */
52149cd6f86SJohn Stultz 		asm("" : "+rm"(nsec));
52249cd6f86SJohn Stultz 		nsec -= NSEC_PER_SEC;
52349cd6f86SJohn Stultz 		++sec;
52449cd6f86SJohn Stultz 	}
52549cd6f86SJohn Stultz 	while (nsec < 0) {
52649cd6f86SJohn Stultz 		asm("" : "+rm"(nsec));
52749cd6f86SJohn Stultz 		nsec += NSEC_PER_SEC;
52849cd6f86SJohn Stultz 		--sec;
52949cd6f86SJohn Stultz 	}
53049cd6f86SJohn Stultz 	ts->tv_sec = sec;
53149cd6f86SJohn Stultz 	ts->tv_nsec = nsec;
53249cd6f86SJohn Stultz }
53349cd6f86SJohn Stultz EXPORT_SYMBOL(set_normalized_timespec64);
53449cd6f86SJohn Stultz 
53549cd6f86SJohn Stultz /**
53649cd6f86SJohn Stultz  * ns_to_timespec64 - Convert nanoseconds to timespec64
53749cd6f86SJohn Stultz  * @nsec:       the nanoseconds value to be converted
53849cd6f86SJohn Stultz  *
53949cd6f86SJohn Stultz  * Returns the timespec64 representation of the nsec parameter.
54049cd6f86SJohn Stultz  */
54149cd6f86SJohn Stultz struct timespec64 ns_to_timespec64(const s64 nsec)
54249cd6f86SJohn Stultz {
54349cd6f86SJohn Stultz 	struct timespec64 ts;
54449cd6f86SJohn Stultz 	s32 rem;
54549cd6f86SJohn Stultz 
54649cd6f86SJohn Stultz 	if (!nsec)
54749cd6f86SJohn Stultz 		return (struct timespec64) {0, 0};
54849cd6f86SJohn Stultz 
54949cd6f86SJohn Stultz 	ts.tv_sec = div_s64_rem(nsec, NSEC_PER_SEC, &rem);
55049cd6f86SJohn Stultz 	if (unlikely(rem < 0)) {
55149cd6f86SJohn Stultz 		ts.tv_sec--;
55249cd6f86SJohn Stultz 		rem += NSEC_PER_SEC;
55349cd6f86SJohn Stultz 	}
55449cd6f86SJohn Stultz 	ts.tv_nsec = rem;
55549cd6f86SJohn Stultz 
55649cd6f86SJohn Stultz 	return ts;
55749cd6f86SJohn Stultz }
55849cd6f86SJohn Stultz EXPORT_SYMBOL(ns_to_timespec64);
559abc8f96eSArnd Bergmann 
560ca42aaf0SNicholas Mc Guire /**
561ca42aaf0SNicholas Mc Guire  * msecs_to_jiffies: - convert milliseconds to jiffies
562ca42aaf0SNicholas Mc Guire  * @m:	time in milliseconds
563ca42aaf0SNicholas Mc Guire  *
564ca42aaf0SNicholas Mc Guire  * conversion is done as follows:
5655cee9645SThomas Gleixner  *
5665cee9645SThomas Gleixner  * - negative values mean 'infinite timeout' (MAX_JIFFY_OFFSET)
5675cee9645SThomas Gleixner  *
5685cee9645SThomas Gleixner  * - 'too large' values [that would result in larger than
5695cee9645SThomas Gleixner  *   MAX_JIFFY_OFFSET values] mean 'infinite timeout' too.
5705cee9645SThomas Gleixner  *
5715cee9645SThomas Gleixner  * - all other values are converted to jiffies by either multiplying
572ca42aaf0SNicholas Mc Guire  *   the input value by a factor or dividing it with a factor and
573ca42aaf0SNicholas Mc Guire  *   handling any 32-bit overflows.
574ca42aaf0SNicholas Mc Guire  *   for the details see __msecs_to_jiffies()
5755cee9645SThomas Gleixner  *
576ca42aaf0SNicholas Mc Guire  * msecs_to_jiffies() checks for the passed in value being a constant
577ca42aaf0SNicholas Mc Guire  * via __builtin_constant_p() allowing gcc to eliminate most of the
578ca42aaf0SNicholas Mc Guire  * code, __msecs_to_jiffies() is called if the value passed does not
579ca42aaf0SNicholas Mc Guire  * allow constant folding and the actual conversion must be done at
580ca42aaf0SNicholas Mc Guire  * runtime.
581ca42aaf0SNicholas Mc Guire  * the _msecs_to_jiffies helpers are the HZ dependent conversion
582ca42aaf0SNicholas Mc Guire  * routines found in include/linux/jiffies.h
5835cee9645SThomas Gleixner  */
584ca42aaf0SNicholas Mc Guire unsigned long __msecs_to_jiffies(const unsigned int m)
5855cee9645SThomas Gleixner {
5865cee9645SThomas Gleixner 	/*
5875cee9645SThomas Gleixner 	 * Negative value, means infinite timeout:
5885cee9645SThomas Gleixner 	 */
5895cee9645SThomas Gleixner 	if ((int)m < 0)
5905cee9645SThomas Gleixner 		return MAX_JIFFY_OFFSET;
591ca42aaf0SNicholas Mc Guire 	return _msecs_to_jiffies(m);
5925cee9645SThomas Gleixner }
593ca42aaf0SNicholas Mc Guire EXPORT_SYMBOL(__msecs_to_jiffies);
5945cee9645SThomas Gleixner 
595ae60d6a0SNicholas Mc Guire unsigned long __usecs_to_jiffies(const unsigned int u)
5965cee9645SThomas Gleixner {
5975cee9645SThomas Gleixner 	if (u > jiffies_to_usecs(MAX_JIFFY_OFFSET))
5985cee9645SThomas Gleixner 		return MAX_JIFFY_OFFSET;
599ae60d6a0SNicholas Mc Guire 	return _usecs_to_jiffies(u);
6005cee9645SThomas Gleixner }
601ae60d6a0SNicholas Mc Guire EXPORT_SYMBOL(__usecs_to_jiffies);
6025cee9645SThomas Gleixner 
6035cee9645SThomas Gleixner /*
6045cee9645SThomas Gleixner  * The TICK_NSEC - 1 rounds up the value to the next resolution.  Note
6055cee9645SThomas Gleixner  * that a remainder subtract here would not do the right thing as the
6065cee9645SThomas Gleixner  * resolution values don't fall on second boundries.  I.e. the line:
6075cee9645SThomas Gleixner  * nsec -= nsec % TICK_NSEC; is NOT a correct resolution rounding.
608d78c9300SAndrew Hunter  * Note that due to the small error in the multiplier here, this
609d78c9300SAndrew Hunter  * rounding is incorrect for sufficiently large values of tv_nsec, but
610d78c9300SAndrew Hunter  * well formed timespecs should have tv_nsec < NSEC_PER_SEC, so we're
611d78c9300SAndrew Hunter  * OK.
6125cee9645SThomas Gleixner  *
6135cee9645SThomas Gleixner  * Rather, we just shift the bits off the right.
6145cee9645SThomas Gleixner  *
6155cee9645SThomas Gleixner  * The >> (NSEC_JIFFIE_SC - SEC_JIFFIE_SC) converts the scaled nsec
6165cee9645SThomas Gleixner  * value to a scaled second value.
6175cee9645SThomas Gleixner  */
618d78c9300SAndrew Hunter static unsigned long
6199ca30850SBaolin Wang __timespec64_to_jiffies(u64 sec, long nsec)
6205cee9645SThomas Gleixner {
621d78c9300SAndrew Hunter 	nsec = nsec + TICK_NSEC - 1;
6225cee9645SThomas Gleixner 
6235cee9645SThomas Gleixner 	if (sec >= MAX_SEC_IN_JIFFIES){
6245cee9645SThomas Gleixner 		sec = MAX_SEC_IN_JIFFIES;
6255cee9645SThomas Gleixner 		nsec = 0;
6265cee9645SThomas Gleixner 	}
6279ca30850SBaolin Wang 	return ((sec * SEC_CONVERSION) +
6285cee9645SThomas Gleixner 		(((u64)nsec * NSEC_CONVERSION) >>
6295cee9645SThomas Gleixner 		 (NSEC_JIFFIE_SC - SEC_JIFFIE_SC))) >> SEC_JIFFIE_SC;
6305cee9645SThomas Gleixner 
6315cee9645SThomas Gleixner }
632d78c9300SAndrew Hunter 
6339ca30850SBaolin Wang static unsigned long
6349ca30850SBaolin Wang __timespec_to_jiffies(unsigned long sec, long nsec)
635d78c9300SAndrew Hunter {
6369ca30850SBaolin Wang 	return __timespec64_to_jiffies((u64)sec, nsec);
637d78c9300SAndrew Hunter }
638d78c9300SAndrew Hunter 
6399ca30850SBaolin Wang unsigned long
6409ca30850SBaolin Wang timespec64_to_jiffies(const struct timespec64 *value)
6419ca30850SBaolin Wang {
6429ca30850SBaolin Wang 	return __timespec64_to_jiffies(value->tv_sec, value->tv_nsec);
6439ca30850SBaolin Wang }
6449ca30850SBaolin Wang EXPORT_SYMBOL(timespec64_to_jiffies);
6455cee9645SThomas Gleixner 
6465cee9645SThomas Gleixner void
6479ca30850SBaolin Wang jiffies_to_timespec64(const unsigned long jiffies, struct timespec64 *value)
6485cee9645SThomas Gleixner {
6495cee9645SThomas Gleixner 	/*
6505cee9645SThomas Gleixner 	 * Convert jiffies to nanoseconds and separate with
6515cee9645SThomas Gleixner 	 * one divide.
6525cee9645SThomas Gleixner 	 */
6535cee9645SThomas Gleixner 	u32 rem;
6545cee9645SThomas Gleixner 	value->tv_sec = div_u64_rem((u64)jiffies * TICK_NSEC,
6555cee9645SThomas Gleixner 				    NSEC_PER_SEC, &rem);
6565cee9645SThomas Gleixner 	value->tv_nsec = rem;
6575cee9645SThomas Gleixner }
6589ca30850SBaolin Wang EXPORT_SYMBOL(jiffies_to_timespec64);
6595cee9645SThomas Gleixner 
660d78c9300SAndrew Hunter /*
661d78c9300SAndrew Hunter  * We could use a similar algorithm to timespec_to_jiffies (with a
662d78c9300SAndrew Hunter  * different multiplier for usec instead of nsec). But this has a
663d78c9300SAndrew Hunter  * problem with rounding: we can't exactly add TICK_NSEC - 1 to the
664d78c9300SAndrew Hunter  * usec value, since it's not necessarily integral.
6655cee9645SThomas Gleixner  *
666d78c9300SAndrew Hunter  * We could instead round in the intermediate scaled representation
667d78c9300SAndrew Hunter  * (i.e. in units of 1/2^(large scale) jiffies) but that's also
668d78c9300SAndrew Hunter  * perilous: the scaling introduces a small positive error, which
669d78c9300SAndrew Hunter  * combined with a division-rounding-upward (i.e. adding 2^(scale) - 1
670d78c9300SAndrew Hunter  * units to the intermediate before shifting) leads to accidental
671d78c9300SAndrew Hunter  * overflow and overestimates.
672d78c9300SAndrew Hunter  *
673d78c9300SAndrew Hunter  * At the cost of one additional multiplication by a constant, just
674d78c9300SAndrew Hunter  * use the timespec implementation.
6755cee9645SThomas Gleixner  */
6765cee9645SThomas Gleixner unsigned long
6775cee9645SThomas Gleixner timeval_to_jiffies(const struct timeval *value)
6785cee9645SThomas Gleixner {
679d78c9300SAndrew Hunter 	return __timespec_to_jiffies(value->tv_sec,
680d78c9300SAndrew Hunter 				     value->tv_usec * NSEC_PER_USEC);
6815cee9645SThomas Gleixner }
6825cee9645SThomas Gleixner EXPORT_SYMBOL(timeval_to_jiffies);
6835cee9645SThomas Gleixner 
6845cee9645SThomas Gleixner void jiffies_to_timeval(const unsigned long jiffies, struct timeval *value)
6855cee9645SThomas Gleixner {
6865cee9645SThomas Gleixner 	/*
6875cee9645SThomas Gleixner 	 * Convert jiffies to nanoseconds and separate with
6885cee9645SThomas Gleixner 	 * one divide.
6895cee9645SThomas Gleixner 	 */
6905cee9645SThomas Gleixner 	u32 rem;
6915cee9645SThomas Gleixner 
6925cee9645SThomas Gleixner 	value->tv_sec = div_u64_rem((u64)jiffies * TICK_NSEC,
6935cee9645SThomas Gleixner 				    NSEC_PER_SEC, &rem);
6945cee9645SThomas Gleixner 	value->tv_usec = rem / NSEC_PER_USEC;
6955cee9645SThomas Gleixner }
6965cee9645SThomas Gleixner EXPORT_SYMBOL(jiffies_to_timeval);
6975cee9645SThomas Gleixner 
6985cee9645SThomas Gleixner /*
6995cee9645SThomas Gleixner  * Convert jiffies/jiffies_64 to clock_t and back.
7005cee9645SThomas Gleixner  */
7015cee9645SThomas Gleixner clock_t jiffies_to_clock_t(unsigned long x)
7025cee9645SThomas Gleixner {
7035cee9645SThomas Gleixner #if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0
7045cee9645SThomas Gleixner # if HZ < USER_HZ
7055cee9645SThomas Gleixner 	return x * (USER_HZ / HZ);
7065cee9645SThomas Gleixner # else
7075cee9645SThomas Gleixner 	return x / (HZ / USER_HZ);
7085cee9645SThomas Gleixner # endif
7095cee9645SThomas Gleixner #else
7105cee9645SThomas Gleixner 	return div_u64((u64)x * TICK_NSEC, NSEC_PER_SEC / USER_HZ);
7115cee9645SThomas Gleixner #endif
7125cee9645SThomas Gleixner }
7135cee9645SThomas Gleixner EXPORT_SYMBOL(jiffies_to_clock_t);
7145cee9645SThomas Gleixner 
7155cee9645SThomas Gleixner unsigned long clock_t_to_jiffies(unsigned long x)
7165cee9645SThomas Gleixner {
7175cee9645SThomas Gleixner #if (HZ % USER_HZ)==0
7185cee9645SThomas Gleixner 	if (x >= ~0UL / (HZ / USER_HZ))
7195cee9645SThomas Gleixner 		return ~0UL;
7205cee9645SThomas Gleixner 	return x * (HZ / USER_HZ);
7215cee9645SThomas Gleixner #else
7225cee9645SThomas Gleixner 	/* Don't worry about loss of precision here .. */
7235cee9645SThomas Gleixner 	if (x >= ~0UL / HZ * USER_HZ)
7245cee9645SThomas Gleixner 		return ~0UL;
7255cee9645SThomas Gleixner 
7265cee9645SThomas Gleixner 	/* .. but do try to contain it here */
7275cee9645SThomas Gleixner 	return div_u64((u64)x * HZ, USER_HZ);
7285cee9645SThomas Gleixner #endif
7295cee9645SThomas Gleixner }
7305cee9645SThomas Gleixner EXPORT_SYMBOL(clock_t_to_jiffies);
7315cee9645SThomas Gleixner 
7325cee9645SThomas Gleixner u64 jiffies_64_to_clock_t(u64 x)
7335cee9645SThomas Gleixner {
7345cee9645SThomas Gleixner #if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0
7355cee9645SThomas Gleixner # if HZ < USER_HZ
7365cee9645SThomas Gleixner 	x = div_u64(x * USER_HZ, HZ);
7375cee9645SThomas Gleixner # elif HZ > USER_HZ
7385cee9645SThomas Gleixner 	x = div_u64(x, HZ / USER_HZ);
7395cee9645SThomas Gleixner # else
7405cee9645SThomas Gleixner 	/* Nothing to do */
7415cee9645SThomas Gleixner # endif
7425cee9645SThomas Gleixner #else
7435cee9645SThomas Gleixner 	/*
7445cee9645SThomas Gleixner 	 * There are better ways that don't overflow early,
7455cee9645SThomas Gleixner 	 * but even this doesn't overflow in hundreds of years
7465cee9645SThomas Gleixner 	 * in 64 bits, so..
7475cee9645SThomas Gleixner 	 */
7485cee9645SThomas Gleixner 	x = div_u64(x * TICK_NSEC, (NSEC_PER_SEC / USER_HZ));
7495cee9645SThomas Gleixner #endif
7505cee9645SThomas Gleixner 	return x;
7515cee9645SThomas Gleixner }
7525cee9645SThomas Gleixner EXPORT_SYMBOL(jiffies_64_to_clock_t);
7535cee9645SThomas Gleixner 
7545cee9645SThomas Gleixner u64 nsec_to_clock_t(u64 x)
7555cee9645SThomas Gleixner {
7565cee9645SThomas Gleixner #if (NSEC_PER_SEC % USER_HZ) == 0
7575cee9645SThomas Gleixner 	return div_u64(x, NSEC_PER_SEC / USER_HZ);
7585cee9645SThomas Gleixner #elif (USER_HZ % 512) == 0
7595cee9645SThomas Gleixner 	return div_u64(x * USER_HZ / 512, NSEC_PER_SEC / 512);
7605cee9645SThomas Gleixner #else
7615cee9645SThomas Gleixner 	/*
7625cee9645SThomas Gleixner          * max relative error 5.7e-8 (1.8s per year) for USER_HZ <= 1024,
7635cee9645SThomas Gleixner          * overflow after 64.99 years.
7645cee9645SThomas Gleixner          * exact for HZ=60, 72, 90, 120, 144, 180, 300, 600, 900, ...
7655cee9645SThomas Gleixner          */
7665cee9645SThomas Gleixner 	return div_u64(x * 9, (9ull * NSEC_PER_SEC + (USER_HZ / 2)) / USER_HZ);
7675cee9645SThomas Gleixner #endif
7685cee9645SThomas Gleixner }
7695cee9645SThomas Gleixner 
77007e5f5e3SFrederic Weisbecker u64 jiffies64_to_nsecs(u64 j)
77107e5f5e3SFrederic Weisbecker {
77207e5f5e3SFrederic Weisbecker #if !(NSEC_PER_SEC % HZ)
77307e5f5e3SFrederic Weisbecker 	return (NSEC_PER_SEC / HZ) * j;
77407e5f5e3SFrederic Weisbecker # else
77507e5f5e3SFrederic Weisbecker 	return div_u64(j * HZ_TO_NSEC_NUM, HZ_TO_NSEC_DEN);
77607e5f5e3SFrederic Weisbecker #endif
77707e5f5e3SFrederic Weisbecker }
77807e5f5e3SFrederic Weisbecker EXPORT_SYMBOL(jiffies64_to_nsecs);
77907e5f5e3SFrederic Weisbecker 
7805cee9645SThomas Gleixner /**
7815cee9645SThomas Gleixner  * nsecs_to_jiffies64 - Convert nsecs in u64 to jiffies64
7825cee9645SThomas Gleixner  *
7835cee9645SThomas Gleixner  * @n:	nsecs in u64
7845cee9645SThomas Gleixner  *
7855cee9645SThomas Gleixner  * Unlike {m,u}secs_to_jiffies, type of input is not unsigned int but u64.
7865cee9645SThomas Gleixner  * And this doesn't return MAX_JIFFY_OFFSET since this function is designed
7875cee9645SThomas Gleixner  * for scheduler, not for use in device drivers to calculate timeout value.
7885cee9645SThomas Gleixner  *
7895cee9645SThomas Gleixner  * note:
7905cee9645SThomas Gleixner  *   NSEC_PER_SEC = 10^9 = (5^9 * 2^9) = (1953125 * 512)
7915cee9645SThomas Gleixner  *   ULLONG_MAX ns = 18446744073.709551615 secs = about 584 years
7925cee9645SThomas Gleixner  */
7935cee9645SThomas Gleixner u64 nsecs_to_jiffies64(u64 n)
7945cee9645SThomas Gleixner {
7955cee9645SThomas Gleixner #if (NSEC_PER_SEC % HZ) == 0
7965cee9645SThomas Gleixner 	/* Common case, HZ = 100, 128, 200, 250, 256, 500, 512, 1000 etc. */
7975cee9645SThomas Gleixner 	return div_u64(n, NSEC_PER_SEC / HZ);
7985cee9645SThomas Gleixner #elif (HZ % 512) == 0
7995cee9645SThomas Gleixner 	/* overflow after 292 years if HZ = 1024 */
8005cee9645SThomas Gleixner 	return div_u64(n * HZ / 512, NSEC_PER_SEC / 512);
8015cee9645SThomas Gleixner #else
8025cee9645SThomas Gleixner 	/*
8035cee9645SThomas Gleixner 	 * Generic case - optimized for cases where HZ is a multiple of 3.
8045cee9645SThomas Gleixner 	 * overflow after 64.99 years, exact for HZ = 60, 72, 90, 120 etc.
8055cee9645SThomas Gleixner 	 */
8065cee9645SThomas Gleixner 	return div_u64(n * 9, (9ull * NSEC_PER_SEC + HZ / 2) / HZ);
8075cee9645SThomas Gleixner #endif
8085cee9645SThomas Gleixner }
8097bd0e226SDaniel Vetter EXPORT_SYMBOL(nsecs_to_jiffies64);
8105cee9645SThomas Gleixner 
8115cee9645SThomas Gleixner /**
8125cee9645SThomas Gleixner  * nsecs_to_jiffies - Convert nsecs in u64 to jiffies
8135cee9645SThomas Gleixner  *
8145cee9645SThomas Gleixner  * @n:	nsecs in u64
8155cee9645SThomas Gleixner  *
8165cee9645SThomas Gleixner  * Unlike {m,u}secs_to_jiffies, type of input is not unsigned int but u64.
8175cee9645SThomas Gleixner  * And this doesn't return MAX_JIFFY_OFFSET since this function is designed
8185cee9645SThomas Gleixner  * for scheduler, not for use in device drivers to calculate timeout value.
8195cee9645SThomas Gleixner  *
8205cee9645SThomas Gleixner  * note:
8215cee9645SThomas Gleixner  *   NSEC_PER_SEC = 10^9 = (5^9 * 2^9) = (1953125 * 512)
8225cee9645SThomas Gleixner  *   ULLONG_MAX ns = 18446744073.709551615 secs = about 584 years
8235cee9645SThomas Gleixner  */
8245cee9645SThomas Gleixner unsigned long nsecs_to_jiffies(u64 n)
8255cee9645SThomas Gleixner {
8265cee9645SThomas Gleixner 	return (unsigned long)nsecs_to_jiffies64(n);
8275cee9645SThomas Gleixner }
828d560fed6SThomas Gleixner EXPORT_SYMBOL_GPL(nsecs_to_jiffies);
8295cee9645SThomas Gleixner 
8305cee9645SThomas Gleixner /*
831bc2c53e5SDeepa Dinamani  * Add two timespec64 values and do a safety check for overflow.
832bc2c53e5SDeepa Dinamani  * It's assumed that both values are valid (>= 0).
833bc2c53e5SDeepa Dinamani  * And, each timespec64 is in normalized form.
834bc2c53e5SDeepa Dinamani  */
835bc2c53e5SDeepa Dinamani struct timespec64 timespec64_add_safe(const struct timespec64 lhs,
836bc2c53e5SDeepa Dinamani 				const struct timespec64 rhs)
837bc2c53e5SDeepa Dinamani {
838bc2c53e5SDeepa Dinamani 	struct timespec64 res;
839bc2c53e5SDeepa Dinamani 
840469e857fSVegard Nossum 	set_normalized_timespec64(&res, (timeu64_t) lhs.tv_sec + rhs.tv_sec,
841bc2c53e5SDeepa Dinamani 			lhs.tv_nsec + rhs.tv_nsec);
842bc2c53e5SDeepa Dinamani 
843bc2c53e5SDeepa Dinamani 	if (unlikely(res.tv_sec < lhs.tv_sec || res.tv_sec < rhs.tv_sec)) {
844bc2c53e5SDeepa Dinamani 		res.tv_sec = TIME64_MAX;
845bc2c53e5SDeepa Dinamani 		res.tv_nsec = 0;
846bc2c53e5SDeepa Dinamani 	}
847bc2c53e5SDeepa Dinamani 
848bc2c53e5SDeepa Dinamani 	return res;
849bc2c53e5SDeepa Dinamani }
850f59dd9c8SDeepa Dinamani 
851f59dd9c8SDeepa Dinamani int get_timespec64(struct timespec64 *ts,
852ea2ce8f3SDeepa Dinamani 		   const struct __kernel_timespec __user *uts)
853f59dd9c8SDeepa Dinamani {
854ea2ce8f3SDeepa Dinamani 	struct __kernel_timespec kts;
855f59dd9c8SDeepa Dinamani 	int ret;
856f59dd9c8SDeepa Dinamani 
857f59dd9c8SDeepa Dinamani 	ret = copy_from_user(&kts, uts, sizeof(kts));
858f59dd9c8SDeepa Dinamani 	if (ret)
859f59dd9c8SDeepa Dinamani 		return -EFAULT;
860f59dd9c8SDeepa Dinamani 
861f59dd9c8SDeepa Dinamani 	ts->tv_sec = kts.tv_sec;
862ea2ce8f3SDeepa Dinamani 
863ea2ce8f3SDeepa Dinamani 	/* Zero out the padding for 32 bit systems or in compat mode */
864ea2ce8f3SDeepa Dinamani 	if (IS_ENABLED(CONFIG_64BIT_TIME) && (!IS_ENABLED(CONFIG_64BIT) || in_compat_syscall()))
865ea2ce8f3SDeepa Dinamani 		kts.tv_nsec &= 0xFFFFFFFFUL;
866ea2ce8f3SDeepa Dinamani 
867f59dd9c8SDeepa Dinamani 	ts->tv_nsec = kts.tv_nsec;
868f59dd9c8SDeepa Dinamani 
869f59dd9c8SDeepa Dinamani 	return 0;
870f59dd9c8SDeepa Dinamani }
871f59dd9c8SDeepa Dinamani EXPORT_SYMBOL_GPL(get_timespec64);
872f59dd9c8SDeepa Dinamani 
873f59dd9c8SDeepa Dinamani int put_timespec64(const struct timespec64 *ts,
874ea2ce8f3SDeepa Dinamani 		   struct __kernel_timespec __user *uts)
875f59dd9c8SDeepa Dinamani {
876ea2ce8f3SDeepa Dinamani 	struct __kernel_timespec kts = {
877f59dd9c8SDeepa Dinamani 		.tv_sec = ts->tv_sec,
878f59dd9c8SDeepa Dinamani 		.tv_nsec = ts->tv_nsec
879f59dd9c8SDeepa Dinamani 	};
880ea2ce8f3SDeepa Dinamani 
881f59dd9c8SDeepa Dinamani 	return copy_to_user(uts, &kts, sizeof(kts)) ? -EFAULT : 0;
882f59dd9c8SDeepa Dinamani }
883f59dd9c8SDeepa Dinamani EXPORT_SYMBOL_GPL(put_timespec64);
884d5b7ffbfSDeepa Dinamani 
8851c68adf6SDeepa Dinamani int __compat_get_timespec64(struct timespec64 *ts64,
8861c68adf6SDeepa Dinamani 				   const struct compat_timespec __user *cts)
8871c68adf6SDeepa Dinamani {
8881c68adf6SDeepa Dinamani 	struct compat_timespec ts;
8891c68adf6SDeepa Dinamani 	int ret;
8901c68adf6SDeepa Dinamani 
8911c68adf6SDeepa Dinamani 	ret = copy_from_user(&ts, cts, sizeof(ts));
8921c68adf6SDeepa Dinamani 	if (ret)
8931c68adf6SDeepa Dinamani 		return -EFAULT;
8941c68adf6SDeepa Dinamani 
8951c68adf6SDeepa Dinamani 	ts64->tv_sec = ts.tv_sec;
8961c68adf6SDeepa Dinamani 	ts64->tv_nsec = ts.tv_nsec;
8971c68adf6SDeepa Dinamani 
8981c68adf6SDeepa Dinamani 	return 0;
8991c68adf6SDeepa Dinamani }
9001c68adf6SDeepa Dinamani 
9011c68adf6SDeepa Dinamani int __compat_put_timespec64(const struct timespec64 *ts64,
9021c68adf6SDeepa Dinamani 				   struct compat_timespec __user *cts)
9031c68adf6SDeepa Dinamani {
9041c68adf6SDeepa Dinamani 	struct compat_timespec ts = {
9051c68adf6SDeepa Dinamani 		.tv_sec = ts64->tv_sec,
9061c68adf6SDeepa Dinamani 		.tv_nsec = ts64->tv_nsec
9071c68adf6SDeepa Dinamani 	};
9081c68adf6SDeepa Dinamani 	return copy_to_user(cts, &ts, sizeof(ts)) ? -EFAULT : 0;
9091c68adf6SDeepa Dinamani }
9101c68adf6SDeepa Dinamani 
9111c68adf6SDeepa Dinamani int compat_get_timespec64(struct timespec64 *ts, const void __user *uts)
9121c68adf6SDeepa Dinamani {
9131c68adf6SDeepa Dinamani 	if (COMPAT_USE_64BIT_TIME)
9141c68adf6SDeepa Dinamani 		return copy_from_user(ts, uts, sizeof(*ts)) ? -EFAULT : 0;
9151c68adf6SDeepa Dinamani 	else
9161c68adf6SDeepa Dinamani 		return __compat_get_timespec64(ts, uts);
9171c68adf6SDeepa Dinamani }
9181c68adf6SDeepa Dinamani EXPORT_SYMBOL_GPL(compat_get_timespec64);
9191c68adf6SDeepa Dinamani 
9201c68adf6SDeepa Dinamani int compat_put_timespec64(const struct timespec64 *ts, void __user *uts)
9211c68adf6SDeepa Dinamani {
9221c68adf6SDeepa Dinamani 	if (COMPAT_USE_64BIT_TIME)
9231c68adf6SDeepa Dinamani 		return copy_to_user(uts, ts, sizeof(*ts)) ? -EFAULT : 0;
9241c68adf6SDeepa Dinamani 	else
9251c68adf6SDeepa Dinamani 		return __compat_put_timespec64(ts, uts);
9261c68adf6SDeepa Dinamani }
9271c68adf6SDeepa Dinamani EXPORT_SYMBOL_GPL(compat_put_timespec64);
9281c68adf6SDeepa Dinamani 
929d5b7ffbfSDeepa Dinamani int get_itimerspec64(struct itimerspec64 *it,
930d0dd63a8SDeepa Dinamani 			const struct __kernel_itimerspec __user *uit)
931d5b7ffbfSDeepa Dinamani {
932d5b7ffbfSDeepa Dinamani 	int ret;
933d5b7ffbfSDeepa Dinamani 
934d5b7ffbfSDeepa Dinamani 	ret = get_timespec64(&it->it_interval, &uit->it_interval);
935d5b7ffbfSDeepa Dinamani 	if (ret)
936d5b7ffbfSDeepa Dinamani 		return ret;
937d5b7ffbfSDeepa Dinamani 
938d5b7ffbfSDeepa Dinamani 	ret = get_timespec64(&it->it_value, &uit->it_value);
939d5b7ffbfSDeepa Dinamani 
940d5b7ffbfSDeepa Dinamani 	return ret;
941d5b7ffbfSDeepa Dinamani }
942d5b7ffbfSDeepa Dinamani EXPORT_SYMBOL_GPL(get_itimerspec64);
943d5b7ffbfSDeepa Dinamani 
944d5b7ffbfSDeepa Dinamani int put_itimerspec64(const struct itimerspec64 *it,
945d0dd63a8SDeepa Dinamani 			struct __kernel_itimerspec __user *uit)
946d5b7ffbfSDeepa Dinamani {
947d5b7ffbfSDeepa Dinamani 	int ret;
948d5b7ffbfSDeepa Dinamani 
949d5b7ffbfSDeepa Dinamani 	ret = put_timespec64(&it->it_interval, &uit->it_interval);
950d5b7ffbfSDeepa Dinamani 	if (ret)
951d5b7ffbfSDeepa Dinamani 		return ret;
952d5b7ffbfSDeepa Dinamani 
953d5b7ffbfSDeepa Dinamani 	ret = put_timespec64(&it->it_value, &uit->it_value);
954d5b7ffbfSDeepa Dinamani 
955d5b7ffbfSDeepa Dinamani 	return ret;
956d5b7ffbfSDeepa Dinamani }
957d5b7ffbfSDeepa Dinamani EXPORT_SYMBOL_GPL(put_itimerspec64);
958