Commit | Line | Data |
---|---|---|
cff65c4f GS |
1 | /* |
2 | * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) | |
3 | * Licensed under the GPL | |
4 | */ | |
5 | ||
6 | #include <stdio.h> | |
1da177e4 | 7 | #include <stdlib.h> |
cff65c4f GS |
8 | #include <unistd.h> |
9 | #include <time.h> | |
1da177e4 | 10 | #include <sys/time.h> |
cff65c4f GS |
11 | #include <signal.h> |
12 | #include <errno.h> | |
cff65c4f GS |
13 | #include "kern_util.h" |
14 | #include "user.h" | |
15 | #include "process.h" | |
16 | #include "kern_constants.h" | |
17 | #include "os.h" | |
493e3758 | 18 | #include "uml-config.h" |
cff65c4f | 19 | |
537ae946 | 20 | int set_interval(int is_virtual) |
cff65c4f GS |
21 | { |
22 | int usec = 1000000/hz(); | |
537ae946 | 23 | int timer_type = is_virtual ? ITIMER_VIRTUAL : ITIMER_REAL; |
cff65c4f GS |
24 | struct itimerval interval = ((struct itimerval) { { 0, usec }, |
25 | { 0, usec } }); | |
26 | ||
27 | if(setitimer(timer_type, &interval, NULL) == -1) | |
537ae946 JD |
28 | return -errno; |
29 | ||
30 | return 0; | |
cff65c4f GS |
31 | } |
32 | ||
cff65c4f GS |
33 | void disable_timer(void) |
34 | { | |
35 | struct itimerval disable = ((struct itimerval) { { 0, 0 }, { 0, 0 }}); | |
36 | if((setitimer(ITIMER_VIRTUAL, &disable, NULL) < 0) || | |
37 | (setitimer(ITIMER_REAL, &disable, NULL) < 0)) | |
38 | printk("disnable_timer - setitimer failed, errno = %d\n", | |
39 | errno); | |
40 | /* If there are signals already queued, after unblocking ignore them */ | |
4b84c69b JD |
41 | signal(SIGALRM, SIG_IGN); |
42 | signal(SIGVTALRM, SIG_IGN); | |
cff65c4f GS |
43 | } |
44 | ||
45 | void switch_timers(int to_real) | |
46 | { | |
47 | struct itimerval disable = ((struct itimerval) { { 0, 0 }, { 0, 0 }}); | |
48 | struct itimerval enable = ((struct itimerval) { { 0, 1000000/hz() }, | |
49 | { 0, 1000000/hz() }}); | |
50 | int old, new; | |
51 | ||
52 | if(to_real){ | |
53 | old = ITIMER_VIRTUAL; | |
54 | new = ITIMER_REAL; | |
55 | } | |
56 | else { | |
57 | old = ITIMER_REAL; | |
58 | new = ITIMER_VIRTUAL; | |
59 | } | |
60 | ||
61 | if((setitimer(old, &disable, NULL) < 0) || | |
62 | (setitimer(new, &enable, NULL))) | |
63 | printk("switch_timers - setitimer failed, errno = %d\n", | |
64 | errno); | |
65 | } | |
1da177e4 | 66 | |
cff65c4f | 67 | unsigned long long os_nsecs(void) |
1da177e4 LT |
68 | { |
69 | struct timeval tv; | |
70 | ||
71 | gettimeofday(&tv, NULL); | |
cff65c4f | 72 | return((unsigned long long) tv.tv_sec * BILLION + tv.tv_usec * 1000); |
1da177e4 LT |
73 | } |
74 | ||
cff65c4f GS |
75 | void idle_sleep(int secs) |
76 | { | |
77 | struct timespec ts; | |
78 | ||
79 | ts.tv_sec = secs; | |
80 | ts.tv_nsec = 0; | |
81 | nanosleep(&ts, NULL); | |
82 | } |