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
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
}
2007-10-16 01:27:25 -07:00
int timer_one_shot ( int ticks )
{
unsigned long usec = ticks * 1000000 / UM_HZ ;
unsigned long sec = usec / 1000000 ;
struct itimerval interval ;
usec % = 1000000 ;
interval = ( ( struct itimerval ) { { 0 , 0 } , { sec , usec } } ) ;
if ( setitimer ( ITIMER_VIRTUAL , & interval , NULL ) = = - 1 )
return - errno ;
return 0 ;
}
2007-10-16 01:27:26 -07:00
unsigned long long disable_timer ( void )
2006-01-18 17:42:42 -08:00
{
2007-10-16 01:27:26 -07:00
struct itimerval time = ( ( struct itimerval ) { { 0 , 0 } , { 0 , 0 } } ) ;
2007-10-16 01:26:54 -07:00
2007-10-16 01:27:26 -07:00
if ( setitimer ( ITIMER_VIRTUAL , & time , & time ) < 0 )
2007-10-16 01:26:54 -07:00
printk ( UM_KERN_ERR " disable_timer - setitimer failed, "
" errno = %d \n " , errno ) ;
2007-10-16 01:27:22 -07:00
2007-10-16 01:27:26 -07:00
return tv_to_nsec ( & time . it_value ) ;
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:27:25 -07:00
return timeval_to_ns ( & tv ) ;
2005-04-16 15:20:36 -07:00
}
2007-10-16 01:27:26 -07:00
extern void alarm_handler ( int sig , struct sigcontext * sc ) ;
void idle_sleep ( unsigned long long nsecs )
2006-01-18 17:42:42 -08:00
{
2007-10-16 01:27:26 -07:00
struct timespec ts = { . tv_sec = nsecs / BILLION ,
. tv_nsec = nsecs % BILLION } ;
2006-01-18 17:42:42 -08:00
2007-10-16 01:27:26 -07:00
if ( nanosleep ( & ts , & ts ) = = 0 )
alarm_handler ( SIGVTALRM , NULL ) ;
2006-01-18 17:42:42 -08:00
}