2015-03-11 17:40:08 -07:00
/* ADJ_FREQ Skew change test
* by : john stultz ( johnstul @ us . ibm . com )
* ( C ) Copyright IBM 2012
* Licensed under the GPLv2
*
* NOTE : This is a meta - test which cranks the ADJ_FREQ knob and
* then uses other tests to detect problems . Thus this test requires
* that the raw_skew , inconsistency - check and nanosleep tests be
* present in the same directory it is run from .
*
* To build :
* $ gcc change_skew . c - o change_skew - lrt
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*/
# include <stdio.h>
# include <stdlib.h>
# include <sys/time.h>
# include <sys/timex.h>
# include <time.h>
# include "../kselftest.h"
# define NSEC_PER_SEC 1000000000LL
int change_skew_test ( int ppm )
{
struct timex tx ;
int ret ;
tx . modes = ADJ_FREQUENCY ;
tx . freq = ppm < < 16 ;
ret = adjtimex ( & tx ) ;
if ( ret < 0 ) {
printf ( " Error adjusting freq \n " ) ;
return ret ;
}
ret = system ( " ./raw_skew " ) ;
ret | = system ( " ./inconsistency-check " ) ;
ret | = system ( " ./nanosleep " ) ;
return ret ;
}
2022-07-13 22:46:14 +02:00
int main ( int argc , char * * argv )
2015-03-11 17:40:08 -07:00
{
struct timex tx ;
int i , ret ;
int ppm [ 5 ] = { 0 , 250 , 500 , - 250 , - 500 } ;
/* Kill ntpd */
ret = system ( " killall -9 ntpd " ) ;
/* Make sure there's no offset adjustment going on */
tx . modes = ADJ_OFFSET ;
tx . offset = 0 ;
ret = adjtimex ( & tx ) ;
if ( ret < 0 ) {
printf ( " Maybe you're not running as root? \n " ) ;
return - 1 ;
}
for ( i = 0 ; i < 5 ; i + + ) {
printf ( " Using %i ppm adjustment \n " , ppm [ i ] ) ;
ret = change_skew_test ( ppm [ i ] ) ;
if ( ret )
break ;
}
/* Set things back */
tx . modes = ADJ_FREQUENCY ;
tx . offset = 0 ;
adjtimex ( & tx ) ;
if ( ret ) {
printf ( " [FAIL] " ) ;
return ksft_exit_fail ( ) ;
}
printf ( " [OK] " ) ;
return ksft_exit_pass ( ) ;
}