Annotation of embedaddon/ntp/html/hints/solaris.xtra.patchfreq, revision 1.1.1.1

1.1       misho       1: #!/bin/ksh
                      2: 
                      3: #
                      4: # File:         patchfreq
                      5: # Author:       Bryan Cantrill (bmc@eng.sun.com), Solaris Performance
                      6: # Modified:     Sat Apr 26 04:00:59 PDT 1997
                      7: #
                      8: # This is a little script to patch a 5.5 or 5.5.1 kernel to get around
                      9: # the cpu_tick_freq inaccuracy.  Before running this script, one must
                     10: # know the true frequency of one's CPU;  this can be derived by NTP,
                     11: # or by observing the clock relative to the time-of-day chip over a
                     12: # long period of time (the TOD will pull system time when it drifts
                     13: # by more than two seconds).
                     14: #
                     15: # Patching a kernel can render a machine unbootable;  do not run this
                     16: # script unless you are prepared to accept that possibility.  It
                     17: # is advisable to have a backout path (e.g. net booting, an alternate
                     18: # boot disk, an installation CD) should your machine fail to boot.
                     19: #
                     20: # This is not a product of Sun Microsystems, and is provided "as is",
                     21: # without warranty of any kind expressed or implied including, but not
                     22: # limited to, the suitability of this script for any purpose.
                     23: #
                     24: 
                     25: if [ $# -eq 0 ]; then
                     26:         echo "Usage:  $0 cpu_tick_freq [ alternate_kernel ]"
                     27:         exit 1
                     28: fi
                     29: 
                     30: cpu_tick_freq=$1
                     31: kernel=/platform/sun4u/kernel/unix
                     32: 
                     33: if [ $# -eq 2 ]; then
                     34:         kernel=$2
                     35: fi
                     36: 
                     37: if [ ! -w $kernel ]; then
                     38:         echo "$0:  Cannot open $kernel for writing."
                     39:         exit 1
                     40: fi
                     41: 
                     42: arch=`echo utsname+404?s | adb $kernel | cut -d: -f2`
                     43: 
                     44: if [ ! $arch = "sun4u" ]; then
                     45:         echo "Patch only applies to sun4u"
                     46:         exit 1
                     47: fi
                     48: 
                     49: rel=`echo utsname+202?s | adb $kernel | cut -d: -f2`
                     50: 
                     51: if [ ! $rel = "5.5" ] && [ ! $rel = "5.5.1" ]; then
                     52:         echo "Patch only applies to 5.5 or 5.5.1..."
                     53:         exit 1
                     54: fi
                     55: 
                     56: nop="1000000"           # nop
                     57: store_mask="ffffe000"   # mask out low 13 bits
                     58: store="da256000"        # st      %o5, [%l5 + offset]
                     59: 
                     60: instr=`echo setcpudelay+34?X | adb $kernel | cut -d: -f 2 | nawk '{ print $1 }'`
                     61: 
                     62: if [ $instr = $nop ]; then
                     63:         echo "Instruction already patched..."
                     64: else
                     65:         let masked="(16#$store_mask & 16#$instr) - 16#$store"
                     66:         if [ $masked -ne 0 ]; then
                     67:                 echo "Couldn't find instruction to patch;  aborting."
                     68:                 exit 1
                     69:         fi
                     70: 
                     71:         if ! echo setcpudelay+34?W $nop | adb -w $kernel 1> /dev/null
                     72:         then
                     73:                 echo "adb returned an unexpected error;  aborting."
                     74:         fi
                     75: fi
                     76: 
                     77: echo "Patching cpu_tick_freq to $cpu_tick_freq..."
                     78: 
                     79: if ! echo cpu_tick_freq?W 0t$cpu_tick_freq | adb -w $kernel 1> /dev/null; then
                     80:         echo "adb returned an unexpected error;  aborting."
                     81:         exit 1
                     82: fi
                     83: 
                     84: echo "$kernel successfully patched."
                     85: exit 0

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