File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / ntp / scripts / freq_adj.in
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue May 29 12:08:38 2012 UTC (12 years, 1 month ago) by misho
Branches: ntp, MAIN
CVS tags: v4_2_6p5p0, v4_2_6p5, HEAD
ntp 4.2.6p5

    1: #! @PATH_PERL@ -w
    2: 
    3: die "perl5 needed\n" unless ($] > 5);
    4: 
    5: use Getopt::Std;
    6: use vars qw($opt_n);
    7: 
    8: getopts('d:nt:');
    9: 
   10: #chop($ncpu = `sysctl -n hw.ncpu`);
   11: #die "Found $ncpu CPUs; can only be run on systems with 1 CPU.\n" if ($ncpu > 1);
   12: 
   13: $driftfile = "/etc/ntp.drift";
   14: $driftfile = $opt_d if defined($opt_d);
   15: 
   16: chop($timer = `sysctl -n kern.timecounter.hardware 2> /dev/null`);
   17: 
   18: $timer =~ tr/\U/\L/;
   19: 
   20: if ($timer eq '') {
   21:   open(DM, "/var/run/dmesg.boot");
   22:   while(<DM>) {
   23:     # Timecounter "i8254"  frequency 1193182 Hz
   24:     if (/^Timecounter "(\w+)"\s+/) {
   25:       $timer = $1;
   26:       last;
   27:     }
   28:   }
   29:   close(DM);
   30: }
   31: 
   32: $opt_t = $timer if !defined($opt_t);
   33: 
   34: if ($timer ne '') {		# $timer found...
   35:   if ($opt_t ne  '') {		# - and $opt_t found
   36:     if ($timer ne $opt_t) {	# - - and they differ
   37:       warn "You specified a $opt_t timer but I detected a $timer timer.\n";
   38:       usage();
   39:       exit 1;
   40:     } else {			# - - and they are the same
   41:       ;
   42:     }
   43:   } else {			# - but no $opt_t specified; this is OK
   44:     ;
   45:   }
   46: } else {			# No $timer found...
   47:   if ($opt_t ne '') {		# - but $opt_t was specified
   48:     $timer = $opt_t;		# - - so use it.
   49:   } else {			# - and neither was $opt_t
   50:     warn "I can't tell what timer you have.  Please specify one.\n";
   51:     usage();
   52:     exit 1;
   53:   }
   54: }
   55: 
   56: open(DF, $driftfile) || die "Can't open driftfile ($driftfile): $!\n";
   57: while(<DF>) {
   58:     chop;
   59:     if (/^(-?\d+\.\d+)(\s\d)?$/) {
   60: 	$drift = $1;
   61:     } else {
   62: 	die "Bogus value in driftfile $driftfile: <$_>\n";
   63:     }
   64: }
   65: close(DF);
   66: 
   67: print "NTP drift is <$drift>\n";
   68: 
   69: # Convert from NTP's idea of PPM to a decimal equivalent
   70: $freq_adj = int ( $drift * ( 10 ** 6 / 2 ** 20) );
   71: print "normalized freq_adj  is <$freq_adj>\n";
   72: 
   73: $freq_adj = int ( ( $freq_adj - 1 ) / 2 );
   74: print "Applying freq_adj of <".-$freq_adj.">\n";
   75: 
   76: $sysctl = "machdep.".$timer."_freq";
   77: 
   78: chop($mach_freq = `sysctl -n $sysctl`);
   79: 
   80: print "$sysctl is <$mach_freq>\n";
   81: 
   82: $n_mach_freq = $mach_freq - $freq_adj;
   83: 
   84: if (defined($opt_n)) {
   85:   print "$sysctl $mach_freq -> $n_mach_freq\n";
   86: } else {
   87:   print "i8254: ".`sysctl -w $sysctl=$n_mach_freq`;
   88: }
   89: 
   90: sub usage {
   91:   print STDERR <<EOUsage
   92: Usage: $0 [-d drift_file] [-n] [-t timer]
   93: where "drift_file" defaults to /etc/ntp.drift
   94: and "timer" is usually "tsc" or "i8254"
   95: and "-n" says "don't really change anything, just say what would happen".
   96: EOUsage
   97: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>