Subversion Repositories shark

Rev

Rev 422 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
422 giacomo 1
#ifndef _LINUX_TIME_H
2
#define _LINUX_TIME_H
3
 
4
#include <asm/param.h>
5
#include <linux/types.h>
6
 
7
#ifndef _STRUCT_TIMESPEC
8
#define _STRUCT_TIMESPEC
9
struct timespec {
10
        time_t  tv_sec;         /* seconds */
11
        long    tv_nsec;        /* nanoseconds */
12
};
13
#endif /* _STRUCT_TIMESPEC */
14
 
15
struct timeval {
16
        time_t          tv_sec;         /* seconds */
17
        suseconds_t     tv_usec;        /* microseconds */
18
};
19
 
20
struct timezone {
21
        int     tz_minuteswest; /* minutes west of Greenwich */
22
        int     tz_dsttime;     /* type of dst correction */
23
};
24
 
25
#ifdef __KERNEL__
26
 
27
#include <linux/spinlock.h>
28
#include <linux/seqlock.h>
29
#include <linux/timex.h>
30
#include <asm/div64.h>
31
#ifndef div_long_long_rem
32
 
33
#define div_long_long_rem(dividend,divisor,remainder) ({ \
34
                       u64 result = dividend;           \
35
                       *remainder = do_div(result,divisor); \
36
                       result; })
37
 
38
#endif
39
 
40
/*
41
 * Have the 32 bit jiffies value wrap 5 minutes after boot
42
 * so jiffies wrap bugs show up earlier.
43
 */
44
#define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ))
45
 
46
/*
47
 * Change timeval to jiffies, trying to avoid the
48
 * most obvious overflows..
49
 *
50
 * And some not so obvious.
51
 *
52
 * Note that we don't want to return MAX_LONG, because
53
 * for various timeout reasons we often end up having
54
 * to wait "jiffies+1" in order to guarantee that we wait
55
 * at _least_ "jiffies" - so "jiffies+1" had better still
56
 * be positive.
57
 */
58
#define MAX_JIFFY_OFFSET ((~0UL >> 1)-1)
59
 
60
/* Parameters used to convert the timespec values */
61
#ifndef USEC_PER_SEC
62
#define USEC_PER_SEC (1000000L)
63
#endif
64
 
65
#ifndef NSEC_PER_SEC
66
#define NSEC_PER_SEC (1000000000L)
67
#endif
68
 
69
#ifndef NSEC_PER_USEC
70
#define NSEC_PER_USEC (1000L)
71
#endif
72
 
73
/*
74
 * We want to do realistic conversions of time so we need to use the same
75
 * values the update wall clock code uses as the jiffies size.  This value
76
 * is: TICK_NSEC (which is defined in timex.h).  This
77
 * is a constant and is in nanoseconds.  We will used scaled math
78
 * with a set of scales defined here as SEC_JIFFIE_SC,  USEC_JIFFIE_SC and
79
 * NSEC_JIFFIE_SC.  Note that these defines contain nothing but
80
 * constants and so are computed at compile time.  SHIFT_HZ (computed in
81
 * timex.h) adjusts the scaling for different HZ values.
82
 
83
 * Scaled math???  What is that?
84
 *
85
 * Scaled math is a way to do integer math on values that would,
86
 * otherwise, either overflow, underflow, or cause undesired div
87
 * instructions to appear in the execution path.  In short, we "scale"
88
 * up the operands so they take more bits (more precision, less
89
 * underflow), do the desired operation and then "scale" the result back
90
 * by the same amount.  If we do the scaling by shifting we avoid the
91
 * costly mpy and the dastardly div instructions.
92
 
93
 * Suppose, for example, we want to convert from seconds to jiffies
94
 * where jiffies is defined in nanoseconds as NSEC_PER_JIFFIE.  The
95
 * simple math is: jiff = (sec * NSEC_PER_SEC) / NSEC_PER_JIFFIE; We
96
 * observe that (NSEC_PER_SEC / NSEC_PER_JIFFIE) is a constant which we
97
 * might calculate at compile time, however, the result will only have
98
 * about 3-4 bits of precision (less for smaller values of HZ).
99
 *
100
 * So, we scale as follows:
101
 * jiff = (sec) * (NSEC_PER_SEC / NSEC_PER_JIFFIE);
102
 * jiff = ((sec) * ((NSEC_PER_SEC * SCALE)/ NSEC_PER_JIFFIE)) / SCALE;
103
 * Then we make SCALE a power of two so:
104
 * jiff = ((sec) * ((NSEC_PER_SEC << SCALE)/ NSEC_PER_JIFFIE)) >> SCALE;
105
 * Now we define:
106
 * #define SEC_CONV = ((NSEC_PER_SEC << SCALE)/ NSEC_PER_JIFFIE))
107
 * jiff = (sec * SEC_CONV) >> SCALE;
108
 *
109
 * Often the math we use will expand beyond 32-bits so we tell C how to
110
 * do this and pass the 64-bit result of the mpy through the ">> SCALE"
111
 * which should take the result back to 32-bits.  We want this expansion
112
 * to capture as much precision as possible.  At the same time we don't
113
 * want to overflow so we pick the SCALE to avoid this.  In this file,
114
 * that means using a different scale for each range of HZ values (as
115
 * defined in timex.h).
116
 *
117
 * For those who want to know, gcc will give a 64-bit result from a "*"
118
 * operator if the result is a long long AND at least one of the
119
 * operands is cast to long long (usually just prior to the "*" so as
120
 * not to confuse it into thinking it really has a 64-bit operand,
121
 * which, buy the way, it can do, but it take more code and at least 2
122
 * mpys).
123
 
124
 * We also need to be aware that one second in nanoseconds is only a
125
 * couple of bits away from overflowing a 32-bit word, so we MUST use
126
 * 64-bits to get the full range time in nanoseconds.
127
 
128
 */
129
 
130
/*
131
 * Here are the scales we will use.  One for seconds, nanoseconds and
132
 * microseconds.
133
 *
134
 * Within the limits of cpp we do a rough cut at the SEC_JIFFIE_SC and
135
 * check if the sign bit is set.  If not, we bump the shift count by 1.
136
 * (Gets an extra bit of precision where we can use it.)
137
 * We know it is set for HZ = 1024 and HZ = 100 not for 1000.
138
 * Haven't tested others.
139
 
140
 * Limits of cpp (for #if expressions) only long (no long long), but
141
 * then we only need the most signicant bit.
142
 */
143
 
144
#define SEC_JIFFIE_SC (31 - SHIFT_HZ)
145
#if !((((NSEC_PER_SEC << 2) / TICK_NSEC) << (SEC_JIFFIE_SC - 2)) & 0x80000000)
146
#undef SEC_JIFFIE_SC
147
#define SEC_JIFFIE_SC (32 - SHIFT_HZ)
148
#endif
149
#define NSEC_JIFFIE_SC (SEC_JIFFIE_SC + 29)
150
#define USEC_JIFFIE_SC (SEC_JIFFIE_SC + 19)
151
#define SEC_CONVERSION ((unsigned long)((((u64)NSEC_PER_SEC << SEC_JIFFIE_SC))\
152
                                         / (u64)TICK_NSEC))
153
 
154
#define NSEC_CONVERSION ((unsigned long)((((u64)1 << NSEC_JIFFIE_SC))\
155
                                         / (u64)TICK_NSEC))
156
#define USEC_CONVERSION  \
157
                    ((unsigned long)((((u64)NSEC_PER_USEC << USEC_JIFFIE_SC)) \
158
                                         / (u64)TICK_NSEC))
159
/*
160
 * USEC_ROUND is used in the timeval to jiffie conversion.  See there
161
 * for more details.  It is the scaled resolution rounding value.  Note
162
 * that it is a 64-bit value.  Since, when it is applied, we are already
163
 * in jiffies (albit scaled), it is nothing but the bits we will shift
164
 * off.
165
 */
166
#define USEC_ROUND (u64)(((u64)1 << USEC_JIFFIE_SC) - 1)
167
/*
168
 * The maximum jiffie value is (MAX_INT >> 1).  Here we translate that
169
 * into seconds.  The 64-bit case will overflow if we are not careful,
170
 * so use the messy SH_DIV macro to do it.  Still all constants.
171
 */
172
#if BITS_PER_LONG < 64
173
# define MAX_SEC_IN_JIFFIES \
174
        (long)((u64)((u64)MAX_JIFFY_OFFSET * TICK_NSEC) / NSEC_PER_SEC)
175
#else   /* take care of overflow on 64 bits machines */
176
# define MAX_SEC_IN_JIFFIES \
177
        (SH_DIV((MAX_JIFFY_OFFSET >> SEC_JIFFIE_SC) * TICK_NSEC, NSEC_PER_SEC, 1) - 1)
178
 
179
#endif
180
/*
181
 * The TICK_NSEC - 1 rounds up the value to the next resolution.  Note
182
 * that a remainder subtract here would not do the right thing as the
183
 * resolution values don't fall on second boundries.  I.e. the line:
184
 * nsec -= nsec % TICK_NSEC; is NOT a correct resolution rounding.
185
 *
186
 * Rather, we just shift the bits off the right.
187
 *
188
 * The >> (NSEC_JIFFIE_SC - SEC_JIFFIE_SC) converts the scaled nsec
189
 * value to a scaled second value.
190
 */
191
static __inline__ unsigned long
192
timespec_to_jiffies(struct timespec *value)
193
{
194
        unsigned long sec = value->tv_sec;
195
        long nsec = value->tv_nsec + TICK_NSEC - 1;
196
 
197
        if (sec >= MAX_SEC_IN_JIFFIES){
198
                sec = MAX_SEC_IN_JIFFIES;
199
                nsec = 0;
200
        }
201
        return (((u64)sec * SEC_CONVERSION) +
202
                (((u64)nsec * NSEC_CONVERSION) >>
203
                 (NSEC_JIFFIE_SC - SEC_JIFFIE_SC))) >> SEC_JIFFIE_SC;
204
 
205
}
206
 
207
static __inline__ void
208
jiffies_to_timespec(unsigned long jiffies, struct timespec *value)
209
{
210
        /*
211
         * Convert jiffies to nanoseconds and separate with
212
         * one divide.
213
         */
214
        u64 nsec = (u64)jiffies * TICK_NSEC;
215
        value->tv_sec = div_long_long_rem(nsec, NSEC_PER_SEC, &value->tv_nsec);
216
}
217
 
218
/* Same for "timeval"
219
 *
220
 * Well, almost.  The problem here is that the real system resolution is
221
 * in nanoseconds and the value being converted is in micro seconds.
222
 * Also for some machines (those that use HZ = 1024, in-particular),
223
 * there is a LARGE error in the tick size in microseconds.
224
 
225
 * The solution we use is to do the rounding AFTER we convert the
226
 * microsecond part.  Thus the USEC_ROUND, the bits to be shifted off.
227
 * Instruction wise, this should cost only an additional add with carry
228
 * instruction above the way it was done above.
229
 */
230
static __inline__ unsigned long
231
timeval_to_jiffies(struct timeval *value)
232
{
233
        unsigned long sec = value->tv_sec;
234
        long usec = value->tv_usec;
235
 
236
        if (sec >= MAX_SEC_IN_JIFFIES){
237
                sec = MAX_SEC_IN_JIFFIES;
238
                usec = 0;
239
        }
240
        return (((u64)sec * SEC_CONVERSION) +
241
                (((u64)usec * USEC_CONVERSION + USEC_ROUND) >>
242
                 (USEC_JIFFIE_SC - SEC_JIFFIE_SC))) >> SEC_JIFFIE_SC;
243
}
244
 
245
static __inline__ void
246
jiffies_to_timeval(unsigned long jiffies, struct timeval *value)
247
{
248
        /*
249
         * Convert jiffies to nanoseconds and separate with
250
         * one divide.
251
         */
252
        u64 nsec = (u64)jiffies * TICK_NSEC;
253
        value->tv_sec = div_long_long_rem(nsec, NSEC_PER_SEC, &value->tv_usec);
254
        value->tv_usec /= NSEC_PER_USEC;
255
}
256
 
257
static __inline__ int timespec_equal(struct timespec *a, struct timespec *b)
258
{
259
        return (a->tv_sec == b->tv_sec) && (a->tv_nsec == b->tv_nsec);
260
}
261
 
262
/* Converts Gregorian date to seconds since 1970-01-01 00:00:00.
263
 * Assumes input in normal date format, i.e. 1980-12-31 23:59:59
264
 * => year=1980, mon=12, day=31, hour=23, min=59, sec=59.
265
 *
266
 * [For the Julian calendar (which was used in Russia before 1917,
267
 * Britain & colonies before 1752, anywhere else before 1582,
268
 * and is still in use by some communities) leave out the
269
 * -year/100+year/400 terms, and add 10.]
270
 *
271
 * This algorithm was first published by Gauss (I think).
272
 *
273
 * WARNING: this function will overflow on 2106-02-07 06:28:16 on
274
 * machines were long is 32-bit! (However, as time_t is signed, we
275
 * will already get problems at other places on 2038-01-19 03:14:08)
276
 */
277
static inline unsigned long
278
mktime (unsigned int year, unsigned int mon,
279
        unsigned int day, unsigned int hour,
280
        unsigned int min, unsigned int sec)
281
{
282
        if (0 >= (int) (mon -= 2)) {    /* 1..12 -> 11,12,1..10 */
283
                mon += 12;              /* Puts Feb last since it has leap day */
284
                year -= 1;
285
        }
286
 
287
        return (((
288
                (unsigned long) (year/4 - year/100 + year/400 + 367*mon/12 + day) +
289
                        year*365 - 719499
290
            )*24 + hour /* now have hours */
291
          )*60 + min /* now have minutes */
292
        )*60 + sec; /* finally seconds */
293
}
294
 
295
extern struct timespec xtime;
296
extern struct timespec wall_to_monotonic;
297
extern seqlock_t xtime_lock;
298
 
299
static inline unsigned long get_seconds(void)
300
{
301
        return xtime.tv_sec;
302
}
303
 
304
struct timespec current_kernel_time(void);
305
 
306
#define CURRENT_TIME (current_kernel_time())
307
 
308
#endif /* __KERNEL__ */
309
 
310
#define NFDBITS                 __NFDBITS
311
 
312
#ifdef __KERNEL__
313
extern void do_gettimeofday(struct timeval *tv);
314
extern int do_settimeofday(struct timespec *tv);
315
extern int do_sys_settimeofday(struct timespec *tv, struct timezone *tz);
316
extern void clock_was_set(void); // call when ever the clock is set
317
extern int do_posix_clock_monotonic_gettime(struct timespec *tp);
318
extern long do_nanosleep(struct timespec *t);
319
extern long do_utimes(char __user * filename, struct timeval * times);
320
struct itimerval;
321
extern int do_setitimer(int which, struct itimerval *value, struct itimerval *ovalue);
322
extern int do_getitimer(int which, struct itimerval *value);
323
 
324
static inline void
325
set_normalized_timespec (struct timespec *ts, time_t sec, long nsec)
326
{
327
        while (nsec > NSEC_PER_SEC) {
328
                nsec -= NSEC_PER_SEC;
329
                ++sec;
330
        }
331
        while (nsec < 0) {
332
                nsec += NSEC_PER_SEC;
333
                --sec;
334
        }
335
        ts->tv_sec = sec;
336
        ts->tv_nsec = nsec;
337
}
338
#endif
339
 
340
#define FD_SETSIZE              __FD_SETSIZE
341
#define FD_SET(fd,fdsetp)       __FD_SET(fd,fdsetp)
342
#define FD_CLR(fd,fdsetp)       __FD_CLR(fd,fdsetp)
343
#define FD_ISSET(fd,fdsetp)     __FD_ISSET(fd,fdsetp)
344
#define FD_ZERO(fdsetp)         __FD_ZERO(fdsetp)
345
 
346
/*
347
 * Names of the interval timers, and structure
348
 * defining a timer setting.
349
 */
350
#define ITIMER_REAL     0
351
#define ITIMER_VIRTUAL  1
352
#define ITIMER_PROF     2
353
 
354
struct  itimerspec {
355
        struct  timespec it_interval;    /* timer period */
356
        struct  timespec it_value;       /* timer expiration */
357
};
358
 
359
struct  itimerval {
360
        struct  timeval it_interval;    /* timer interval */
361
        struct  timeval it_value;       /* current value */
362
};
363
 
364
 
365
/*
366
 * The IDs of the various system clocks (for POSIX.1b interval timers).
367
 */
368
#define CLOCK_REALTIME            0
369
#define CLOCK_MONOTONIC   1
370
#define CLOCK_PROCESS_CPUTIME_ID 2
371
#define CLOCK_THREAD_CPUTIME_ID  3
372
#define CLOCK_REALTIME_HR        4
373
#define CLOCK_MONOTONIC_HR        5
374
 
375
#define MAX_CLOCKS 6
376
#define CLOCKS_MASK  (CLOCK_REALTIME | CLOCK_MONOTONIC | \
377
                     CLOCK_REALTIME_HR | CLOCK_MONOTONIC_HR)
378
#define CLOCKS_MONO (CLOCK_MONOTONIC & CLOCK_MONOTONIC_HR)
379
 
380
/*
381
 * The various flags for setting POSIX.1b interval timers.
382
 */
383
 
384
#define TIMER_ABSTIME 0x01
385
 
386
 
387
#endif