2006-01-19 04:42:42 +03:00
/*
* Copyright ( C ) 2000 , 2001 , 2002 Jeff Dike ( jdike @ karaya . com )
* Licensed under the GPL
*/
# include <stdio.h>
2005-04-17 02:20:36 +04:00
# include <stdlib.h>
2006-01-19 04:42:42 +03:00
# include <unistd.h>
# include <time.h>
2005-04-17 02:20:36 +04:00
# include <sys/time.h>
2006-01-19 04:42:42 +03:00
# include <signal.h>
# include <errno.h>
# include "kern_util.h"
# include "user.h"
# include "process.h"
# include "kern_constants.h"
# include "os.h"
2006-10-20 10:28:22 +04:00
# include "uml-config.h"
2006-01-19 04:42:42 +03:00
2006-09-26 10:33:05 +04:00
int set_interval ( int is_virtual )
2006-01-19 04:42:42 +03:00
{
int usec = 1000000 / hz ( ) ;
2006-09-26 10:33:05 +04:00
int timer_type = is_virtual ? ITIMER_VIRTUAL : ITIMER_REAL ;
2006-01-19 04:42:42 +03:00
struct itimerval interval = ( ( struct itimerval ) { { 0 , usec } ,
{ 0 , usec } } ) ;
if ( setitimer ( timer_type , & interval , NULL ) = = - 1 )
2006-09-26 10:33:05 +04:00
return - errno ;
return 0 ;
2006-01-19 04:42:42 +03:00
}
void disable_timer ( void )
{
struct itimerval disable = ( ( struct itimerval ) { { 0 , 0 } , { 0 , 0 } } ) ;
if ( ( setitimer ( ITIMER_VIRTUAL , & disable , NULL ) < 0 ) | |
( setitimer ( ITIMER_REAL , & disable , NULL ) < 0 ) )
printk ( " disnable_timer - setitimer failed, errno = %d \n " ,
errno ) ;
/* If there are signals already queued, after unblocking ignore them */
2006-09-26 10:33:04 +04:00
signal ( SIGALRM , SIG_IGN ) ;
signal ( SIGVTALRM , SIG_IGN ) ;
2006-01-19 04:42:42 +03:00
}
void switch_timers ( int to_real )
{
struct itimerval disable = ( ( struct itimerval ) { { 0 , 0 } , { 0 , 0 } } ) ;
struct itimerval enable = ( ( struct itimerval ) { { 0 , 1000000 / hz ( ) } ,
{ 0 , 1000000 / hz ( ) } } ) ;
int old , new ;
if ( to_real ) {
old = ITIMER_VIRTUAL ;
new = ITIMER_REAL ;
}
else {
old = ITIMER_REAL ;
new = ITIMER_VIRTUAL ;
}
if ( ( setitimer ( old , & disable , NULL ) < 0 ) | |
( setitimer ( new , & enable , NULL ) ) )
printk ( " switch_timers - setitimer failed, errno = %d \n " ,
errno ) ;
}
2005-04-17 02:20:36 +04:00
2006-01-19 04:42:42 +03:00
unsigned long long os_nsecs ( void )
2005-04-17 02:20:36 +04:00
{
struct timeval tv ;
gettimeofday ( & tv , NULL ) ;
2006-01-19 04:42:42 +03:00
return ( ( unsigned long long ) tv . tv_sec * BILLION + tv . tv_usec * 1000 ) ;
2005-04-17 02:20:36 +04:00
}
2006-01-19 04:42:42 +03:00
void idle_sleep ( int secs )
{
struct timespec ts ;
ts . tv_sec = secs ;
ts . tv_nsec = 0 ;
nanosleep ( & ts , NULL ) ;
}