Annotation of embedaddon/ntp/scripts/freq_adj.in, revision 1.1.1.1

1.1       misho       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>