Subversion Repositories Kolibri OS

Rev

Rev 4065 | Rev 6082 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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