Subversion Repositories Kolibri OS

Rev

Rev 5270 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  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 <uapi/linux/time.h>
  8.  
  9. extern struct timezone sys_tz;
  10.  
  11. /* Parameters used to convert the timespec values: */
  12. #define MSEC_PER_SEC    1000L
  13. #define USEC_PER_MSEC   1000L
  14. #define NSEC_PER_USEC   1000L
  15. #define NSEC_PER_MSEC   1000000L
  16. #define USEC_PER_SEC    1000000L
  17. #define NSEC_PER_SEC    1000000000L
  18. #define FSEC_PER_SEC    1000000000000000LL
  19.  
  20. #define TIME_T_MAX      (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
  21.  
  22. static 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.  * lhs < rhs:  return <0
  30.  * lhs == rhs: return 0
  31.  * lhs > rhs:  return >0
  32.  */
  33. static 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.  
  42. static 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.  
  51. extern unsigned long mktime(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. extern void set_normalized_timespec(struct timespec *ts, time_t sec, s64 nsec);
  56.  
  57. /*
  58.  * timespec_add_safe assumes both values are positive and checks
  59.  * for overflow. It will return TIME_T_MAX if the reutrn would be
  60.  * smaller then either of the arguments.
  61.  */
  62. extern struct timespec timespec_add_safe(const struct timespec lhs,
  63.                                          const struct timespec rhs);
  64.  
  65.  
  66. static inline struct timespec timespec_add(struct timespec lhs,
  67.                                                 struct timespec rhs)
  68. {
  69.         struct timespec ts_delta;
  70.         set_normalized_timespec(&ts_delta, lhs.tv_sec + rhs.tv_sec,
  71.                                 lhs.tv_nsec + rhs.tv_nsec);
  72.         return ts_delta;
  73. }
  74.  
  75. /*
  76.  * sub = lhs - rhs, in normalized form
  77.  */
  78. static inline struct timespec timespec_sub(struct timespec lhs,
  79.                                                 struct timespec rhs)
  80. {
  81.         struct timespec ts_delta;
  82.         set_normalized_timespec(&ts_delta, lhs.tv_sec - rhs.tv_sec,
  83.                                 lhs.tv_nsec - rhs.tv_nsec);
  84.         return ts_delta;
  85. }
  86.  
  87. #define KTIME_MAX                       ((s64)~((u64)1 << 63))
  88. #if (BITS_PER_LONG == 64)
  89. # define KTIME_SEC_MAX                  (KTIME_MAX / NSEC_PER_SEC)
  90. #else
  91. # define KTIME_SEC_MAX                  LONG_MAX
  92. #endif
  93.  
  94. /*
  95.  * Returns true if the timespec is norm, false if denorm:
  96.  */
  97. static inline bool timespec_valid(const struct timespec *ts)
  98. {
  99.         /* Dates before 1970 are bogus */
  100.         if (ts->tv_sec < 0)
  101.                 return false;
  102.         /* Can't have more nanoseconds then a second */
  103.         if ((unsigned long)ts->tv_nsec >= NSEC_PER_SEC)
  104.                 return false;
  105.         return true;
  106. }
  107.  
  108. static inline bool timespec_valid_strict(const struct timespec *ts)
  109. {
  110.         if (!timespec_valid(ts))
  111.                 return false;
  112.         /* Disallow values that could overflow ktime_t */
  113.         if ((unsigned long long)ts->tv_sec >= KTIME_SEC_MAX)
  114.                 return false;
  115.         return true;
  116. }
  117.  
  118. extern bool persistent_clock_exist;
  119.  
  120. static inline bool has_persistent_clock(void)
  121. {
  122.         return persistent_clock_exist;
  123. }
  124.  
  125. extern void read_persistent_clock(struct timespec *ts);
  126. extern void read_boot_clock(struct timespec *ts);
  127. extern int persistent_clock_is_local;
  128. extern int update_persistent_clock(struct timespec now);
  129. void timekeeping_init(void);
  130. extern int timekeeping_suspended;
  131.  
  132. unsigned long get_seconds(void);
  133. struct timespec current_kernel_time(void);
  134. struct timespec __current_kernel_time(void); /* does not take xtime_lock */
  135. struct timespec get_monotonic_coarse(void);
  136. void get_xtime_and_monotonic_and_sleep_offset(struct timespec *xtim,
  137.                                 struct timespec *wtom, struct timespec *sleep);
  138. void timekeeping_inject_sleeptime(struct timespec *delta);
  139.  
  140. #define CURRENT_TIME            (current_kernel_time())
  141. #define CURRENT_TIME_SEC        ((struct timespec) { get_seconds(), 0 })
  142.  
  143. /* Some architectures do not supply their own clocksource.
  144.  * This is mainly the case in architectures that get their
  145.  * inter-tick times by reading the counter on their interval
  146.  * timer. Since these timers wrap every tick, they're not really
  147.  * useful as clocksources. Wrapping them to act like one is possible
  148.  * but not very efficient. So we provide a callout these arches
  149.  * can implement for use with the jiffies clocksource to provide
  150.  * finer then tick granular time.
  151.  */
  152. #ifdef CONFIG_ARCH_USES_GETTIMEOFFSET
  153. extern u32 (*arch_gettimeoffset)(void);
  154. #endif
  155.  
  156. extern void do_gettimeofday(struct timeval *tv);
  157. extern int do_settimeofday(const struct timespec *tv);
  158. extern int do_sys_settimeofday(const struct timespec *tv,
  159.                                const struct timezone *tz);
  160. #define do_posix_clock_monotonic_gettime(ts) ktime_get_ts(ts)
  161. extern long do_utimes(int dfd, const char __user *filename, struct timespec *times, int flags);
  162. struct itimerval;
  163. extern int do_setitimer(int which, struct itimerval *value,
  164.                         struct itimerval *ovalue);
  165. extern unsigned int alarm_setitimer(unsigned int seconds);
  166. extern int do_getitimer(int which, struct itimerval *value);
  167. extern int __getnstimeofday(struct timespec *tv);
  168. extern void getnstimeofday(struct timespec *tv);
  169. extern void getrawmonotonic(struct timespec *ts);
  170. extern void getnstime_raw_and_real(struct timespec *ts_raw,
  171.                 struct timespec *ts_real);
  172. extern void getboottime(struct timespec *ts);
  173. extern void monotonic_to_bootbased(struct timespec *ts);
  174. extern void get_monotonic_boottime(struct timespec *ts);
  175.  
  176. extern struct timespec timespec_trunc(struct timespec t, unsigned gran);
  177. extern int timekeeping_valid_for_hres(void);
  178. extern u64 timekeeping_max_deferment(void);
  179. extern int timekeeping_inject_offset(struct timespec *ts);
  180. extern s32 timekeeping_get_tai_offset(void);
  181. extern void timekeeping_set_tai_offset(s32 tai_offset);
  182. extern void timekeeping_clocktai(struct timespec *ts);
  183.  
  184. struct tms;
  185. extern void do_sys_times(struct tms *);
  186.  
  187. /*
  188.  * Similar to the struct tm in userspace <time.h>, but it needs to be here so
  189.  * that the kernel source is self contained.
  190.  */
  191. struct tm {
  192.         /*
  193.          * the number of seconds after the minute, normally in the range
  194.          * 0 to 59, but can be up to 60 to allow for leap seconds
  195.          */
  196.         int tm_sec;
  197.         /* the number of minutes after the hour, in the range 0 to 59*/
  198.         int tm_min;
  199.         /* the number of hours past midnight, in the range 0 to 23 */
  200.         int tm_hour;
  201.         /* the day of the month, in the range 1 to 31 */
  202.         int tm_mday;
  203.         /* the number of months since January, in the range 0 to 11 */
  204.         int tm_mon;
  205.         /* the number of years since 1900 */
  206.         long tm_year;
  207.         /* the number of days since Sunday, in the range 0 to 6 */
  208.         int tm_wday;
  209.         /* the number of days since January 1, in the range 0 to 365 */
  210.         int tm_yday;
  211. };
  212.  
  213. void time_to_tm(time_t totalsecs, int offset, struct tm *result);
  214.  
  215. /**
  216.  * timespec_to_ns - Convert timespec to nanoseconds
  217.  * @ts:         pointer to the timespec variable to be converted
  218.  *
  219.  * Returns the scalar nanosecond representation of the timespec
  220.  * parameter.
  221.  */
  222. static inline s64 timespec_to_ns(const struct timespec *ts)
  223. {
  224.         return ((s64) ts->tv_sec * NSEC_PER_SEC) + ts->tv_nsec;
  225. }
  226.  
  227. /**
  228.  * timeval_to_ns - Convert timeval to nanoseconds
  229.  * @ts:         pointer to the timeval variable to be converted
  230.  *
  231.  * Returns the scalar nanosecond representation of the timeval
  232.  * parameter.
  233.  */
  234. static inline s64 timeval_to_ns(const struct timeval *tv)
  235. {
  236.         return ((s64) tv->tv_sec * NSEC_PER_SEC) +
  237.                 tv->tv_usec * NSEC_PER_USEC;
  238. }
  239.  
  240. /**
  241.  * ns_to_timespec - Convert nanoseconds to timespec
  242.  * @nsec:       the nanoseconds value to be converted
  243.  *
  244.  * Returns the timespec representation of the nsec parameter.
  245.  */
  246. extern struct timespec ns_to_timespec(const s64 nsec);
  247.  
  248. /**
  249.  * ns_to_timeval - Convert nanoseconds to timeval
  250.  * @nsec:       the nanoseconds value to be converted
  251.  *
  252.  * Returns the timeval representation of the nsec parameter.
  253.  */
  254. extern struct timeval ns_to_timeval(const s64 nsec);
  255.  
  256. /**
  257.  * timespec_add_ns - Adds nanoseconds to a timespec
  258.  * @a:          pointer to timespec to be incremented
  259.  * @ns:         unsigned nanoseconds value to be added
  260.  *
  261.  * This must always be inlined because its used from the x86-64 vdso,
  262.  * which cannot call other kernel functions.
  263.  */
  264. static __always_inline void timespec_add_ns(struct timespec *a, u64 ns)
  265. {
  266.         a->tv_sec += __iter_div_u64_rem(a->tv_nsec + ns, NSEC_PER_SEC, &ns);
  267.         a->tv_nsec = ns;
  268. }
  269.  
  270. #endif
  271.