1 /* 2 * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) 3 * Licensed under the GPL 4 */ 5 6 #include <stdio.h> 7 #include <stdlib.h> 8 #include <unistd.h> 9 #include <time.h> 10 #include <sys/time.h> 11 #include <signal.h> 12 #include <errno.h> 13 #include "kern_util.h" 14 #include "user.h" 15 #include "process.h" 16 #include "kern_constants.h" 17 #include "os.h" 18 #include "uml-config.h" 19 20 int set_interval(int is_virtual) 21 { 22 int usec = 1000000/hz(); 23 int timer_type = is_virtual ? ITIMER_VIRTUAL : ITIMER_REAL; 24 struct itimerval interval = ((struct itimerval) { { 0, usec }, 25 { 0, usec } }); 26 27 if(setitimer(timer_type, &interval, NULL) == -1) 28 return -errno; 29 30 return 0; 31 } 32 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 */ 41 signal(SIGALRM, SIG_IGN); 42 signal(SIGVTALRM, SIG_IGN); 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 } 66 67 unsigned long long os_nsecs(void) 68 { 69 struct timeval tv; 70 71 gettimeofday(&tv, NULL); 72 return((unsigned long long) tv.tv_sec * BILLION + tv.tv_usec * 1000); 73 } 74 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 } 83