2006-01-18 17:42:42 -08:00
/*
2007-10-16 01:26:54 -07:00
* Copyright ( C ) 2000 - 2007 Jeff Dike ( jdike { addtoit , linux . intel } . com )
2006-01-18 17:42:42 -08:00
* Licensed under the GPL
*/
2007-10-16 01:26:54 -07:00
# include <stddef.h>
# include <errno.h>
# include <signal.h>
2006-01-18 17:42:42 -08:00
# include <time.h>
2005-04-16 15:20:36 -07:00
# include <sys/time.h>
2006-01-18 17:42:42 -08:00
# include "kern_constants.h"
# include "os.h"
2007-10-16 01:26:54 -07:00
# include "user.h"
2006-01-18 17:42:42 -08:00
2007-10-16 01:27:22 -07:00
static int is_real_timer = 0 ;
2007-10-16 01:27:22 -07:00
int set_interval ( void )
2006-01-18 17:42:42 -08:00
{
2007-10-16 01:27:21 -07:00
int usec = 1000000 / UM_HZ ;
2006-01-18 17:42:42 -08:00
struct itimerval interval = ( ( struct itimerval ) { { 0 , usec } ,
{ 0 , usec } } ) ;
2007-10-16 01:27:22 -07:00
if ( setitimer ( ITIMER_VIRTUAL , & interval , NULL ) = = - 1 )
2006-09-25 23:33:05 -07:00
return - errno ;
return 0 ;
2006-01-18 17:42:42 -08:00
}
void disable_timer ( void )
{
struct itimerval disable = ( ( struct itimerval ) { { 0 , 0 } , { 0 , 0 } } ) ;
2007-10-16 01:26:54 -07:00
if ( ( setitimer ( ITIMER_VIRTUAL , & disable , NULL ) < 0 ) | |
( setitimer ( ITIMER_REAL , & disable , NULL ) < 0 ) )
printk ( UM_KERN_ERR " disable_timer - setitimer failed, "
" errno = %d \n " , errno ) ;
2006-01-18 17:42:42 -08:00
}
2007-10-16 01:27:22 -07:00
int switch_timers ( int to_real )
2006-01-18 17:42:42 -08:00
{
struct itimerval disable = ( ( struct itimerval ) { { 0 , 0 } , { 0 , 0 } } ) ;
2007-10-16 01:27:22 -07:00
struct itimerval enable ;
int old , new , old_type = is_real_timer ;
if ( to_real = = old_type )
return to_real ;
2006-01-18 17:42:42 -08:00
2007-10-16 01:26:54 -07:00
if ( to_real ) {
2006-01-18 17:42:42 -08:00
old = ITIMER_VIRTUAL ;
new = ITIMER_REAL ;
}
else {
old = ITIMER_REAL ;
new = ITIMER_VIRTUAL ;
}
2007-10-16 01:27:22 -07:00
if ( setitimer ( old , & disable , & enable ) < 0 )
printk ( UM_KERN_ERR " switch_timers - setitimer disable failed, "
" errno = %d \n " , errno ) ;
if ( ( enable . it_value . tv_sec = = 0 ) & & ( enable . it_value . tv_usec = = 0 ) )
enable . it_value = enable . it_interval ;
if ( setitimer ( new , & enable , NULL ) )
printk ( UM_KERN_ERR " switch_timers - setitimer enable failed, "
2007-10-16 01:26:54 -07:00
" errno = %d \n " , errno ) ;
2007-10-16 01:27:22 -07:00
is_real_timer = to_real ;
return old_type ;
2006-01-18 17:42:42 -08:00
}
2005-04-16 15:20:36 -07:00
2006-01-18 17:42:42 -08:00
unsigned long long os_nsecs ( void )
2005-04-16 15:20:36 -07:00
{
struct timeval tv ;
gettimeofday ( & tv , NULL ) ;
2007-10-16 01:26:54 -07:00
return ( unsigned long long ) tv . tv_sec * BILLION + tv . tv_usec * 1000 ;
2005-04-16 15:20:36 -07:00
}
2006-01-18 17:42:42 -08:00
void idle_sleep ( int secs )
{
struct timespec ts ;
ts . tv_sec = secs ;
ts . tv_nsec = 0 ;
nanosleep ( & ts , NULL ) ;
}