home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk1.iso / altsrc / articles / 11167 < prev    next >
Text File  |  1994-08-24  |  45KB  |  1,339 lines

  1. Path: wupost!math.ohio-state.edu!scipio.cyberstore.ca!vanbc.wimsey.com!vanbc.wimsey.com!not-for-mail
  2. From: markh@vanbc.wimsey.com (Mark C. Henderson)
  3. Newsgroups: alt.sources
  4. Subject: change sun hostid 1.3.1 - part 2 of 3
  5. Date: 23 Aug 1994 23:22:33 -0700
  6. Organization: Wimsey Information Services
  7. Lines: 1328
  8. Message-ID: <33eov9$t62@vanbc.wimsey.com>
  9. NNTP-Posting-Host: vanbc.wimsey.com
  10.  
  11. #!/bin/sh
  12. # This is part 02 of a multipart archive
  13. # ============= hid-1.3.1/hostid-by-egid-modload/sethostid.exec ==============
  14. if test ! -d 'hid-1.3.1'; then
  15.     echo 'x - creating directory hid-1.3.1'
  16.     mkdir 'hid-1.3.1'
  17. fi
  18. if test ! -d 'hid-1.3.1/hostid-by-egid-modload'; then
  19.     echo 'x - creating directory hid-1.3.1/hostid-by-egid-modload'
  20.     mkdir 'hid-1.3.1/hostid-by-egid-modload'
  21. fi
  22. if test -f 'hid-1.3.1/hostid-by-egid-modload/sethostid.exec' -a X"$1" != X"-c"; then
  23.     echo 'x - skipping hid-1.3.1/hostid-by-egid-modload/sethostid.exec (File already exists)'
  24. else
  25. echo 'x - extracting hid-1.3.1/hostid-by-egid-modload/sethostid.exec (Text)'
  26. sed 's/^X//' << 'SHAR_EOF' > 'hid-1.3.1/hostid-by-egid-modload/sethostid.exec' &&
  27. #!/bin/csh -f
  28. echo "#define SYS_sethostid $3" > sethostid.h
  29. SHAR_EOF
  30. chmod 0700 hid-1.3.1/hostid-by-egid-modload/sethostid.exec ||
  31. echo 'restore of hid-1.3.1/hostid-by-egid-modload/sethostid.exec failed'
  32. Wc_c="`wc -c < 'hid-1.3.1/hostid-by-egid-modload/sethostid.exec'`"
  33. test 60 -eq "$Wc_c" ||
  34.     echo 'hid-1.3.1/hostid-by-egid-modload/sethostid.exec: original size 60, current size' "$Wc_c"
  35. fi
  36. # ============= hid-1.3.1/hostid-by-egid/README ==============
  37. if test ! -d 'hid-1.3.1/hostid-by-egid'; then
  38.     echo 'x - creating directory hid-1.3.1/hostid-by-egid'
  39.     mkdir 'hid-1.3.1/hostid-by-egid'
  40. fi
  41. if test -f 'hid-1.3.1/hostid-by-egid/README' -a X"$1" != X"-c"; then
  42.     echo 'x - skipping hid-1.3.1/hostid-by-egid/README (File already exists)'
  43. else
  44. echo 'x - extracting hid-1.3.1/hostid-by-egid/README (Text)'
  45. sed 's/^X//' << 'SHAR_EOF' > 'hid-1.3.1/hostid-by-egid/README' &&
  46. Contributed by someone who wishes to remain anonymous. 
  47. X
  48. I've made a couple of minor modifications. - markh@wimsey.bc.ca
  49. X
  50. This program is distributed in the hope that it will be useful,
  51. but without any warranty; without even the implied warranty of
  52. merchantability or fitness for a particular purpose. You use
  53. this program at your own risk. The author disclaims responsibility for
  54. any damages that might result from the use of this program, even
  55. if they result from negligence on the part of the author.
  56. X
  57. Also, please don't use this program to steal software. The intended
  58. use is for emergency situations where an application has to be moved from
  59. one computer to another (e.g. in the event of a hardware malfunction)
  60. and licence keys cannot be obtained quickly from the vendor. Many
  61. vendors will not supply licence keys outside of business hours.
  62. X
  63. --
  64. X
  65. X     Most commericial packages are bounded to machine hostid for protection.
  66. This ID is built in PROM on Sun Sparc machine.  The purpose of this program
  67. is to let you specify the hostid freely and you can run the commericial
  68. programs on another machine with differnet machine hostid.  This package is
  69. tested and works fine on SunOS 4.1.2, 4.1.3 and 4.1.3_U1.
  70. X
  71. INSTALLATION:
  72. X
  73. step 1.
  74. X  Copy kern_hostid.c into /sys/os
  75. X
  76. step 2.
  77. X  Add the following line in /sys/conf.common/files.cmn
  78. X    os/kern_hostid.c    standard
  79. X
  80. step 3.
  81. X  Replace gethostid declartion with Gethostid, and add the new declartion
  82. of sethostid.  Change system call 143 into sethostid.  The modified version
  83. of /sys/os/init_sysent.c should contain the following lines.
  84. X
  85. line 25:
  86. int     Gethostid(),sethostname(),gethostname(),getpid();
  87. line 32:
  88. int    sethostid();
  89. line 362:
  90. X        2, Gethostid,                   /* 142 = gethostid */
  91. X        2, sethostid,                   /* 143 = old sethostid */
  92. X
  93. step 4:
  94. X  Configure your own kernel and rebuild it.  Install it in /vmunix and
  95. reboot.
  96. X
  97. step 5:
  98. X  Compile sethostid.c and install sethostid in /bin.
  99. X
  100. step 6:
  101. X  Done.
  102. X
  103. USAGE:
  104. X     This package check running process's effective gid and user's gid
  105. to determine which hostid should be returned.  If the gid is between
  106. 900 to 909, the specified hostid will be returned.  Otherwise, the original
  107. hostid will be returned.  Therefore, you can setgid the target checking
  108. excutable file and it will get what you want when the gethostid system
  109. call is called.  For example, we run '/bin/sethostid 0 12345678'.  All
  110. running processes with gid 900 will get hostid as 12345678 rather than
  111. the real hostid.  Remember the hostid above are all heximal value.
  112. X     If you have any problem, try to see the source code.  No help is
  113. provided.
  114. X
  115. see ../run for a small utility for use with this.
  116. SHAR_EOF
  117. chmod 0600 hid-1.3.1/hostid-by-egid/README ||
  118. echo 'restore of hid-1.3.1/hostid-by-egid/README failed'
  119. Wc_c="`wc -c < 'hid-1.3.1/hostid-by-egid/README'`"
  120. test 2686 -eq "$Wc_c" ||
  121.     echo 'hid-1.3.1/hostid-by-egid/README: original size 2686, current size' "$Wc_c"
  122. fi
  123. # ============= hid-1.3.1/hostid-by-egid/kern_hostid.c ==============
  124. if test -f 'hid-1.3.1/hostid-by-egid/kern_hostid.c' -a X"$1" != X"-c"; then
  125.     echo 'x - skipping hid-1.3.1/hostid-by-egid/kern_hostid.c (File already exists)'
  126. else
  127. echo 'x - extracting hid-1.3.1/hostid-by-egid/kern_hostid.c (Text)'
  128. sed 's/^X//' << 'SHAR_EOF' > 'hid-1.3.1/hostid-by-egid/kern_hostid.c' &&
  129. /*
  130. This program is distributed in the hope that it will be useful,
  131. but without any warranty; without even the implied warranty of
  132. merchantability or fitness for a particular purpose. You use
  133. this program at your own risk. The author disclaims responsibility for
  134. any damages that might result from the use of this program, even
  135. if they result from negligence on the part of the author.
  136. X
  137. Also, please don't use this program to steal software. The intended
  138. use is for emergency situations where an application has to be moved from
  139. one computer to another (e.g. in the event of a hardware malfunction)
  140. and licence keys cannot be obtained quickly from the vendor. Many
  141. vendors will not supply licence keys outside of business hours.
  142. */
  143. X
  144. #include <sys/user.h>
  145. #define NHOSTID 10
  146. X
  147. static unsigned hostid[NHOSTID]={0};
  148. X
  149. Gethostid()
  150. {
  151. X    unsigned machineid;
  152. X    u_short gid;
  153. X    int i;
  154. X
  155. X    gethostid();
  156. X    machineid = u.u_r.r_val1;
  157. X
  158. X    gid = u.u_gid;
  159. X    if (gid >= 900 && gid < 900+NHOSTID) {
  160. X        u.u_r.r_val1 = hostid[gid-900] ? hostid[gid-900] : machineid;
  161. X        return;
  162. X    }
  163. X
  164. X    i = 0;
  165. X    while (gid=u.u_groups[i++]) {
  166. X        if (gid >= 900 && gid < 900+NHOSTID) {
  167. X            u.u_r.r_val1 = hostid[gid-900] ? hostid[gid-900] : machineid;
  168. X            return;
  169. X        }
  170. X    }
  171. X    u.u_r.r_val1 = machineid;
  172. X    return;
  173. }
  174. X
  175. sethostid(uap)
  176. X    register struct a {
  177. X        int n;
  178. X        unsigned hostid;
  179. X    } *uap;
  180. {
  181. X    if (!suser()) {
  182. X        u.u_error = EACCES;
  183. X        return;
  184. X    }
  185. X
  186. X    if ((uap->n >= NHOSTID )||(uap->n < 0)) {  /* small change - markh */
  187. X        u.u_error = EINVAL;
  188. X        return;
  189. X    }
  190. X
  191. X    u.u_r.r_val1 = hostid[uap->n] = uap->hostid;
  192. X    u.u_error = 0;
  193. X    return;
  194. }
  195. SHAR_EOF
  196. chmod 0600 hid-1.3.1/hostid-by-egid/kern_hostid.c ||
  197. echo 'restore of hid-1.3.1/hostid-by-egid/kern_hostid.c failed'
  198. Wc_c="`wc -c < 'hid-1.3.1/hostid-by-egid/kern_hostid.c'`"
  199. test 1700 -eq "$Wc_c" ||
  200.     echo 'hid-1.3.1/hostid-by-egid/kern_hostid.c: original size 1700, current size' "$Wc_c"
  201. fi
  202. # ============= hid-1.3.1/hostid-by-egid/sethostid.c ==============
  203. if test -f 'hid-1.3.1/hostid-by-egid/sethostid.c' -a X"$1" != X"-c"; then
  204.     echo 'x - skipping hid-1.3.1/hostid-by-egid/sethostid.c (File already exists)'
  205. else
  206. echo 'x - extracting hid-1.3.1/hostid-by-egid/sethostid.c (Text)'
  207. sed 's/^X//' << 'SHAR_EOF' > 'hid-1.3.1/hostid-by-egid/sethostid.c' &&
  208. /*
  209. This program is distributed in the hope that it will be useful,
  210. but without any warranty; without even the implied warranty of
  211. merchantability or fitness for a particular purpose. You use
  212. this program at your own risk. The author disclaims responsibility for
  213. any damages that might result from the use of this program, even
  214. if they result from negligence on the part of the author.
  215. X
  216. Also, please don't use this program to steal software. The intended
  217. use is for emergency situations where an application has to be moved from
  218. one computer to another (e.g. in the event of a hardware malfunction)
  219. and licence keys cannot be obtained quickly from the vendor. Many
  220. vendors will not supply licence keys outside of business hours.
  221. */
  222. X
  223. #include <stdio.h>
  224. #include <sys/syscall.h>
  225. #include <errno.h>
  226. X
  227. main(argc, argv)
  228. int argc;
  229. char *argv[];
  230. {
  231. X  unsigned hostid;
  232. X  int n;
  233. X
  234. X  if (argc<3) {
  235. X    fprintf(stderr, "%s <n> <hostid>\n", argv[0]);
  236. X    exit(1);
  237. X  }
  238. X  n=atoi(argv[1]);
  239. X  sscanf(argv[2], "%x", &hostid);
  240. X  if (syscall(143, n, hostid)==-1) {
  241. X    perror(argv[0]);
  242. X    exit(1);
  243. X  }
  244. }  
  245. X
  246. SHAR_EOF
  247. chmod 0600 hid-1.3.1/hostid-by-egid/sethostid.c ||
  248. echo 'restore of hid-1.3.1/hostid-by-egid/sethostid.c failed'
  249. Wc_c="`wc -c < 'hid-1.3.1/hostid-by-egid/sethostid.c'`"
  250. test 1085 -eq "$Wc_c" ||
  251.     echo 'hid-1.3.1/hostid-by-egid/sethostid.c: original size 1085, current size' "$Wc_c"
  252. fi
  253. # ============= hid-1.3.1/newhostid ==============
  254. if test -f 'hid-1.3.1/newhostid' -a X"$1" != X"-c"; then
  255.     echo 'x - skipping hid-1.3.1/newhostid (File already exists)'
  256. else
  257. echo 'x - extracting hid-1.3.1/newhostid (Text)'
  258. sed 's/^X//' << 'SHAR_EOF' > 'hid-1.3.1/newhostid' &&
  259. #!/bin/sh
  260. #newhostid
  261. #Author: Jean-Louis Faraut [jlf]
  262. #Organization: Ecole Superieure en Sciences Informatiques 
  263. #   (Universite de Nice Sophia-Antipolis)
  264. #Address: Sophia-Antipolis (France)
  265. #
  266. # This program is distributed in the hope that it will be useful,
  267. # but without any warranty; without even the implied warranty of
  268. # merchantability or fitness for a particular purpose. You use
  269. # this program at your own risk. The author disclaims responsibility for
  270. # any damages that might result from the use of this program, even
  271. # if they result from negligence on the part of the author.
  272. # Also, please don't use this program to steal software. The intended
  273. # use is for emergency situations where an application has to be moved from
  274. # one computer to another (e.g. in the event of a hardware malfunction)
  275. # and licence keys cannot be obtained quickly from the vendor. Many
  276. # vendors will not supply licence keys outside of business hours.
  277. #
  278. #run a Sun dynamically linked executable  with a new hostid
  279. # - notes - only works on a Sun. Only tested under Solaris 2.3 and 1.[01]
  280. #         - only works with dymanically linked executables.
  281. #
  282. # SunOS 5.x code is an alpha release (not fully tested)
  283. # usage:
  284. #   newhostid Base10Hostid command [args]
  285. # On Solaris 1.x (Sun OS 4.1.x) you can also
  286. #  newhostid 0x72000000 command
  287. #   if you want to use hex
  288. # Sun OS 5.x note:
  289. # if it turns out that you need somewhat more complete sysinfo emulation
  290. #  check out sidump.c
  291. #Warning: The following file names are used by this script:
  292. #/tmp/gethostid.{c,o,so}           -> if OS == SunOS 4.1.x
  293. #/tmp/sysinfo.{c,c.head,c.tail,so} -> if OS == SunOS 5.x
  294. #
  295. #modify the following line to meet your site requirement
  296. GCC=/opt/gnu/bin/gcc    #only required by SunOS 5.x
  297. #
  298. if [ $# -lt 2 ] 
  299. then
  300. X    echo 'Usage:newhostid hostid(base 10) command [args]'
  301. X    exit 1
  302. fi
  303. X
  304. case `/usr/bin/uname -s` in
  305. X     SunOS) ;;
  306. X     *) echo 'Only for SunOS. Sorry.'
  307. X     exit 1 ;;
  308. esac
  309. X
  310. case `/usr/bin/uname -r` in
  311. X     4.1.*)
  312. X     (cd /tmp
  313. X     cat > gethostid.c <<!
  314. X     gethostid()
  315. X     {
  316. X       return $1;
  317. X       }
  318. !
  319. X       cc -c gethostid.c
  320. X       ld gethostid.o -assert pure-text -o gethostid.so
  321. X       rm gethostid.o gethostid.c
  322. X       )
  323. X
  324. X       shift
  325. X       LD_PRELOAD="/tmp/gethostid.so" $*
  326. X       rm /tmp/gethostid.so
  327. X     ;;
  328. X
  329. X     5.*)
  330. X     (cd /tmp
  331. X     # first part of program
  332. X     STRLEN=`expr $1 : '.*'`
  333. X     cat > sysinfo.c.head <<!
  334. X     long sysinfo(command,buf,count)
  335. X     int command; char *buf; long count;
  336. X     {
  337. !
  338. X
  339. X     # second part of program
  340. X     touch sysinfo.c.tail
  341. X     DOT=""
  342. X     COUNT=0
  343. X     while [ $COUNT -lt $STRLEN ]
  344. X     do
  345. X         echo "  buf[$COUNT] = '`expr $1 : ${DOT}'\(.\)'`';" >> sysinfo.c.tail
  346. X        DOT=${DOT}.
  347. X            COUNT=`expr $COUNT + 1`
  348. X
  349. X            done
  350. X            echo "buf[$COUNT] = 0;"  >> sysinfo.c.tail
  351. X            cat >> sysinfo.c.tail <<!
  352. X              return 11l;
  353. X              }
  354. !
  355. X
  356. X              cat sysinfo.c.head sysinfo.c.tail > sysinfo.c
  357. X              rm sysinfo.c.head sysinfo.c.tail
  358. X              #debug: cat sysinfo.c
  359. X              $GCC -fpic -c sysinfo.c
  360. X              ld sysinfo.o  -G -o sysinfo.so
  361. X              rm sysinfo.o sysinfo.c
  362. X              )
  363. X
  364. X              shift
  365. X              LD_PRELOAD=/tmp/sysinfo.so $*
  366. X              rm /tmp/sysinfo.so
  367. X    ;;
  368. X
  369. esac
  370. X
  371. X
  372. SHAR_EOF
  373. chmod 0700 hid-1.3.1/newhostid ||
  374. echo 'restore of hid-1.3.1/newhostid failed'
  375. Wc_c="`wc -c < 'hid-1.3.1/newhostid'`"
  376. test 3145 -eq "$Wc_c" ||
  377.     echo 'hid-1.3.1/newhostid: original size 3145, current size' "$Wc_c"
  378. fi
  379. # ============= hid-1.3.1/newhostid.old ==============
  380. if test -f 'hid-1.3.1/newhostid.old' -a X"$1" != X"-c"; then
  381.     echo 'x - skipping hid-1.3.1/newhostid.old (File already exists)'
  382. else
  383. echo 'x - extracting hid-1.3.1/newhostid.old (Text)'
  384. sed 's/^X//' << 'SHAR_EOF' > 'hid-1.3.1/newhostid.old' &&
  385. #!/bin/sh
  386. #newhostid
  387. #Solaris 1.x only
  388. #Author: Jean-Louis Faraut [jlf]
  389. #Organization: Ecole Superieure en Sciences Informatiques (Universite de Nice Sophia-Antipolis)
  390. #Address: Sophia-Antipolis (France)
  391. #run a command with a new hostid
  392. #
  393. # This program is distributed in the hope that it will be useful,
  394. # but without any warranty; without even the implied warranty of
  395. # merchantability or fitness for a particular purpose. You use
  396. # this program at your own risk. The author disclaims responsibility for
  397. # any damages that might result from the use of this program, even
  398. # if they result from negligence on the part of the author.
  399. # Also, please don't use this program to steal software. The intended
  400. # use is for emergency situations where an application has to be moved from
  401. # one computer to another (e.g. in the event of a hardware malfunction)
  402. # and licence keys cannot be obtained quickly from the vendor. Many
  403. # vendors will not supply licence keys outside of business hours.
  404. #
  405. if [ $# -lt 2 ] 
  406. then
  407. X    echo Usage:newhostid hostid command [args]
  408. X    exit 1
  409. fi
  410. (cd /tmp
  411. cat > gethostid.c <<!
  412. gethostid()
  413. {
  414. X  return 0x$1;
  415. }
  416. !
  417. cc -c gethostid.c
  418. ld gethostid.o -assert pure-text -o gethostid.so
  419. rm gethostid.o gethostid.c
  420. )
  421. X
  422. shift
  423. LD_PRELOAD="/tmp/gethostid.so" $*
  424. rm /tmp/gethostid.so
  425. SHAR_EOF
  426. chmod 0700 hid-1.3.1/newhostid.old ||
  427. echo 'restore of hid-1.3.1/newhostid.old failed'
  428. Wc_c="`wc -c < 'hid-1.3.1/newhostid.old'`"
  429. test 1289 -eq "$Wc_c" ||
  430.     echo 'hid-1.3.1/newhostid.old: original size 1289, current size' "$Wc_c"
  431. fi
  432. # ============= hid-1.3.1/nvram.c ==============
  433. if test -f 'hid-1.3.1/nvram.c' -a X"$1" != X"-c"; then
  434.     echo 'x - skipping hid-1.3.1/nvram.c (File already exists)'
  435. else
  436. echo 'x - extracting hid-1.3.1/nvram.c (Text)'
  437. sed 's/^X//' << 'SHAR_EOF' > 'hid-1.3.1/nvram.c' &&
  438. #include <fcntl.h>
  439. #include <unistd.h>
  440. #include <stdio.h>
  441. #include <sys/types.h>
  442. #include <sys/uio.h>
  443. #include <nlist.h>
  444. X
  445. X
  446. /* 
  447. get/change hostid in NVRAM -- Solaris 1.1 only
  448. X
  449. Instructions:
  450. X
  451. 1. Read this entire comment. Especially the warnings and disclaimers.
  452. X
  453. 2. compile nvram
  454. X   cc -o nvram nvram.c
  455. X
  456. 3. Run nvram without any parameters.
  457. If it fails with some bizarre error message, then your architecture
  458. is not supported. If you don't mind hacking the kernel you can probably
  459. hack in support for your architecture.  If you send me mods I'll fold
  460. them in to the distribution.  It should suggest a few adb commands
  461. to execute to make a kernel modification.
  462. X
  463. 4. Run nvram again without any parameters.  It just prints out the
  464. hostid and hw ethernet address.  Check this against the arp tables on
  465. another machine or against to information displayed on boot. If it is
  466. not correct, do not proceed with the next step.
  467. X
  468. 5. now you can try and modify the hostid by running
  469. nvram with the desired hostid as the second parameter (without 0x)
  470. e.g.
  471. nvram b0b1fb0b
  472. X
  473. 6. Run the eeprom command suggested by the program.
  474. ---
  475. X
  476. Notes:
  477. only tested on sun4m architecture and sun4c architecture. The
  478. kernel patches will be different for Sun4 and I don't have one
  479. to play with. 
  480. X
  481. you can actually do this on a sun3x machine (sun 3/80). Just remove the
  482. stuff that tries to suggest and check for kernel patches
  483. (check_eeprom_driver). The appropriate bytes are accessible directly
  484. via /dev/eeprom. (Sun OS 4.1.1)
  485. X
  486. If your particular machine is not supported, you may be able
  487. to hack support for the machine into this program.
  488. X
  489. This program is still experimental. Dangerous and tricky stuff.
  490. If you are unwilling to experiment and clean up after disasters
  491. don't use it.  USE AT YOUR OWN RISK.  If this program malfunctions
  492. or it is misused, you can get your Sun into a state where it will
  493. not boot, even from CDROM.
  494. X
  495. Running this might invalidate the overall EEPROM checksum. So after it
  496. make some trivial change with the eeprom command (change the baud
  497. rate on a serial port or something like that
  498. e.g.
  499. /usr/etc/eeprom diag-switch?=false
  500. )
  501. X
  502. first you need to turn off the protection in the OS to keep
  503. you from modifying /dev/eeprom locations after 017730 (or the other offset)
  504. X
  505. nvram will try and figure out what your kernel looks like and suggest
  506. a change to execute using adb. 
  507. X
  508. If you don't care about technical details, follow the instructions below.
  509. The commands will be one of the following:
  510. sun4m machines 
  511. adb -k -w /vmunix /dev/mem
  512. _mmeeprom+8/W 901223ff
  513. X
  514. which changes
  515. or      %o1, 0x3d8, %o1
  516. to
  517. or      %o1, 0x3ff, %o1
  518. X
  519. X
  520. OR
  521. (Sun4c)
  522. X
  523. adb -w /vmunix /dev/mem
  524. _mmeeprom+4/W 80a6a7ff
  525. _mmeeprom+0x28/W 80a6a7ff
  526. which changes a couple of compare operations. 
  527. X
  528. Also be very careful choosing a new hostid.  The first byte of the
  529. hostid identifies the type of system you are running. On modern Suns, OS
  530. boot CDs depend on this information to get the correct architecture. If
  531. you change it you may be reduced to poking around in NVRAM from the
  532. monitor next time you have to boot from CD.
  533. X
  534. Here's a mapping of what gets read into buf (at OFFSET)
  535. buf[0] = always 01?
  536. buf[1] = system id/first byte of hostid.
  537. buf[2] \
  538. buf[3]  \
  539. buf[4]   \  HW ethernet address (6 bytes)
  540. buf[5]    /  
  541. buf[6]  /
  542. buf[7]/
  543. buf[8],...,buf[11] = always 00?
  544. buf[12] = second byte of hostid
  545. buf[13] = third byte of hostid
  546. buf[14] = fourth byte of hostid
  547. buf[15] = checksum
  548. X
  549. the checksum is buf[0] ^ buf[1] ^ ... ^ buf[14]
  550. i.e. it must be the case that the  xor of buf[0] through buf[15] is 0
  551. X
  552. X
  553. Mark Henderson <markh@wimsey.bc.ca>
  554. Placed in the public domain by the author - 23 June 1994
  555. X
  556. This program is distributed in the hope that it will be useful,
  557. but without any warranty; without even the implied warranty of
  558. merchantability or fitness for a particular purpose. You use
  559. this program at your own risk. The author disclaims responsibility for
  560. any damages that might result from the use of this program, even
  561. if they result from negligence on the part of the author.
  562. X
  563. Also, please don't use this program to steal software. The intended
  564. use is for emergency situations where an application has to be moved from
  565. one computer to another (e.g. in the event of a hardware malfunction)
  566. and licence keys cannot be obtained quickly from the vendor. Many
  567. vendors will not supply licence keys outside of business hours.
  568. X
  569. Sorry about all the legal BS, but given that use of this program is
  570. dangerous and inexperienced people will use it, I don't have much choice
  571. from both an ethical and legal point of view.
  572. X
  573. */
  574. X
  575. X
  576. #define OFFSET1 017730       /* for Sun 4m, Sun OS 4.1.3 */
  577. #define OFFSET2 03730     /* for Sun 4c, SUN OS 4.1.1 */
  578. X
  579. #define SANITY_CHECK        /* don't turn this off unless you need to. If this
  580. X                               fails it generally means that the program won't
  581. X                               work and very well may be destructive */
  582. X
  583. /* #define TEST        /* doesn't actually do mods if TEST is defined */
  584. unsigned char buf[17];  /* larger than it needs to be */ 
  585. X
  586. /* offset table -- in ascending order of magnitude */
  587. off_t offtab[2] = { OFFSET2, OFFSET1 };
  588. #define nofftab  (sizeof(offtab) / sizeof(off_t))
  589. off_t offset;
  590. X
  591. struct nlist nl[] = { "_mmeeprom" };
  592. void check_eeprom_driver()
  593. {
  594. X    int kmem;
  595. X    off_t where;
  596. X    unsigned int kbuf[12];
  597. X    if ((kmem = open("/dev/kmem", O_RDONLY)) < 0) {
  598. X        fprintf(stderr, "cannot open /dev/kmem\n");
  599. X        exit(1);
  600. X    }
  601. X    fprintf(stderr,"nvram - Mark Henderson <markh@wimsey.bc.ca>\n");
  602. X    fprintf(stderr,
  603. X        "Placed in the public domain by the author - 23 June 1994\n\n");
  604. X    fprintf(stderr,
  605. X        "This program is distributed in the hope that it will be useful,\n");
  606. X    fprintf(stderr,
  607. X        "but without any warranty; without even the implied warranty of\n");
  608. X    fprintf(stderr,
  609. X        "merchantability or fitness for a particular purpose. You use\n");
  610. X    fprintf(stderr,
  611. X    "this program at your own risk. The author disclaims responsibility for\n");
  612. X    fprintf(stderr,
  613. X        "any damages that might result from the use of this program, even\n");
  614. X    fprintf(stderr,
  615. X        "if they result from negligence on the part of the author.\n");
  616. X    fprintf(stderr, 
  617. X        "Malfunction or misuse of this program can damage your computer.\n\n");
  618. X    if (nlist("/vmunix", nl) < 0) {
  619. X        fprintf(stderr, "cannot read namelist out of /vmunix\n");
  620. X        exit(1);
  621. X    }
  622. X    if ((where = nl[0].n_value) == 0) {
  623. X        fprintf(stderr, "unknown kernel variable _mmeeprom\n");
  624. X        fprintf(stderr, 
  625. X            "your kernel is strange - nvram modifier won't operate\n");
  626. X        exit(1);
  627. X    }
  628. X    if (lseek(kmem, where, SEEK_SET) == (-1)) {
  629. X        fprintf(stderr, "lseek on /dev/kmem failed\n");
  630. X        fprintf(stderr, 
  631. X            "your kernel is strange - nvram modifier won't operate\n");
  632. X        exit(1);
  633. X    }
  634. X    if (read(kmem, (char *)&kbuf[0], 48) < 48) {
  635. X        fprintf(stderr, "read from /dev/kmem failed\n");
  636. X        fprintf(stderr, 
  637. X            "your kernel is strange - nvram modifier won't operate\n");
  638. X        exit(1);
  639. X    }
  640. X    close(kmem);
  641. X    if (kbuf[1] == 0x80a6a7d8 && kbuf[10] == 0x80a6a7d8) {
  642. X        fprintf(stderr, "please execute the following:\n");
  643. X        fprintf(stderr, 
  644. X            "adb -w -k /vmunix /dev/mem <<END\n_mmeeprom+4/W 80a6a7ff\n");
  645. X        fprintf(stderr, "_mmeeprom+0x28/W 80a6a7ff\nEND\n");
  646. X        exit(0);
  647. X    }
  648. X    if (kbuf[2] == 0x901223d8) {
  649. X        fprintf(stderr, "please execute the following:\n");
  650. X        fprintf(stderr, 
  651. X            "adb -k -w /vmunix /dev/mem <<END\n_mmeeprom+8/W 901223ff\nEND\n");
  652. X        exit(0);
  653. X    }
  654. X    if (kbuf[1] == 0x80a6a7ff && kbuf[10] == 0x80a6a7ff) {
  655. X        fprintf(stderr, "your kernel looks good (sun4c)\n");
  656. X    }
  657. X    if (kbuf[2] == 0x901223ff) {
  658. X        fprintf(stderr, "your kernel looks good (sun4m)\n");
  659. X    }
  660. }
  661. X    
  662. X
  663. main(argc,argv)
  664. int argc;
  665. char *argv[];
  666. {
  667. X    unsigned int hid;
  668. X    int fd;
  669. X    int i;
  670. X    int j;
  671. X    unsigned int acc;
  672. X    int read_hostid;
  673. X    unsigned int hid_reported_by_gethostid = gethostid();
  674. X
  675. X    if (argc == 1) {
  676. X        /* no args - just get hostid from prom */
  677. X        read_hostid = 1;
  678. X    }
  679. X    else if (argc == 2) {
  680. X        read_hostid = 0;
  681. X        sscanf(argv[1],"%08x",&hid);
  682. X    }
  683. X    else {
  684. X        fprintf(stderr, "usage: %s [hostid]\n",argv[0]);
  685. X        fprintf(stderr, "  e.g. %s b0b1fb0b\n", argv[0]);
  686. X        exit(1);
  687. X    }
  688. X    check_eeprom_driver(); /* note: if you know what you are doing you might 
  689. X                                want to comment this line out. */
  690. X    if (read_hostid) {
  691. X        if ((fd = open("/dev/eeprom", O_RDONLY)) < 0) {
  692. X            fprintf(stderr, "cannot open /dev/eeprom for read\n");
  693. X            exit(1);
  694. X        }
  695. X    } 
  696. X    else {
  697. #ifdef TEST
  698. X        if ((fd = open("/dev/eeprom", O_RDONLY)) < 0) {
  699. X            fprintf(stderr, "cannot open /dev/eeprom for read\n");
  700. X            exit(1);
  701. X        }
  702. #else
  703. X        if ((fd = open("/dev/eeprom", O_RDWR)) < 0) {
  704. X            fprintf(stderr, "cannot open /dev/eeprom for write\n");
  705. X            exit(1);
  706. X        }
  707. #endif
  708. X    }
  709. X
  710. X    offset = 0xffffffff;     /* dummy value */
  711. X
  712. X    for (j = 0; j < nofftab; j++) {
  713. X        if (lseek(fd,offtab[j],SEEK_SET) < 0) { 
  714. X            fprintf(stderr, "lseek failed for %o\n", offtab[j]);
  715. X            continue;
  716. X        }
  717. X        if (read(fd,buf,16) < 16) {
  718. X            fprintf(stderr, "read of /dev/eeprom failed for %o\n", offtab[j]);
  719. X            continue;
  720. X        }
  721. #ifdef TEST
  722. X        for (i=0; i<16; i++)
  723. X            printf("%02x ", buf[i]);
  724. X        printf("\n");
  725. #endif
  726. /* this will fail if you have modified the value returned by
  727. X   gethostid by using one of the other programs in this package.
  728. X   In that case I wouldn't disable this check, but restore your old 
  729. X   gethostid behaviour or replace the gethostid call in this code 
  730. X   with a reference to your "real" hostid. If your architecture 
  731. X   is weird this should detect the problem and not try and
  732. X   write into places we shouldn't. (remember the AT YOUR OWN RISK comment
  733. X  */
  734. X
  735. X        for (acc = 0 , i=0; i<15; i++) acc^=buf[i];
  736. X        if ((acc != buf[15]) 
  737. X            || (buf[1] != (hid_reported_by_gethostid >> 24) )
  738. X            || (buf[12] != ((hid_reported_by_gethostid >> 16) &0xff))
  739. X            || (buf[13] != ((hid_reported_by_gethostid >> 8) &0xff))
  740. X            || (buf[14] != (hid_reported_by_gethostid &0xff))) {
  741. X            continue;
  742. X        }
  743. X        offset = offtab[j];
  744. X        break;
  745. X    }
  746. X    if (offset == 0xffffffff) {
  747. X        fprintf(stderr, "perhaps you have a weird kernel -- failed\n");
  748. X        exit(1);
  749. X    }
  750. X    printf("current hostid = %02x%02x%02x%02x\n", 
  751. X    buf[1], buf[12], buf[13], buf[14]);
  752. X
  753. X    /* may as well print this out */
  754. X    printf("enetaddr       = %02x:%02x:%02x:%02x:%02x:%02x\n", 
  755. X    buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]);
  756. X    if (!read_hostid) {
  757. X        if (lseek(fd,offset,SEEK_SET) < 0) { 
  758. X            fprintf(stderr, "lseek failed\n");
  759. X            exit(1);
  760. X        }
  761. X
  762. X        buf[1] = hid >> 24;
  763. X        buf[12] = (hid >> 16) &0xff;
  764. X        buf[13] = (hid >> 8) &0xff;
  765. X        buf[14] = hid &0xff;
  766. X        for (acc = 0 , i=0; i<15; i++) acc^=buf[i];
  767. X        buf[15] = acc & 0xff;
  768. #ifndef TEST
  769. X        if (write(fd,buf,16) < 16) {
  770. X            fprintf(stderr, "write failed\n");
  771. X        }
  772. #else
  773. X    for (i=0; i<16; i++)
  774. X        printf("%02x ", buf[i]);
  775. X    printf("\n");
  776. #endif
  777. X    fprintf(stderr, "now please execute the following command\n");
  778. X    fprintf(stderr, "/usr/etc/eeprom 'diag-switch?=false'\n");
  779. X    }
  780. X    close(fd);
  781. }
  782. X
  783. SHAR_EOF
  784. chmod 0600 hid-1.3.1/nvram.c ||
  785. echo 'restore of hid-1.3.1/nvram.c failed'
  786. Wc_c="`wc -c < 'hid-1.3.1/nvram.c'`"
  787. test 11553 -eq "$Wc_c" ||
  788.     echo 'hid-1.3.1/nvram.c: original size 11553, current size' "$Wc_c"
  789. fi
  790. # ============= hid-1.3.1/nvram.info ==============
  791. if test -f 'hid-1.3.1/nvram.info' -a X"$1" != X"-c"; then
  792.     echo 'x - skipping hid-1.3.1/nvram.info (File already exists)'
  793. else
  794. echo 'x - extracting hid-1.3.1/nvram.info (Text)'
  795. sed 's/^X//' << 'SHAR_EOF' > 'hid-1.3.1/nvram.info' &&
  796. USE THIS AT YOUR OWN RISK. IF THIS INFORMATION IS ABUSED OR INCORRECT
  797. YOU CAN RENDER YOUR COMPUTER UNBOOTABLE AND MY BET IS THAT SUN WILL
  798. CHARGE A LOT OF MONEY TO FIX THE DAMAGE.
  799. X
  800. Be careful, mistakes can cost a lot.
  801. X
  802. The information in this document is distributed in the hope that 
  803. it will be useful, but without any warranty; without even the 
  804. implied warranty of merchantability or fitness for a particular 
  805. purpose. You use this document at your own risk. The author 
  806. disclaims responsibility for any damages that might result from the 
  807. use of this document, even if they result from negligence or errors 
  808. on the part of the author.
  809. X
  810. Placed in the public domain by the author - 21 Aug 1994
  811. - Mark Henderson <markh@wimsey.bc.ca>
  812. X
  813. X
  814. All numbers in here are in hex.
  815. X
  816. At the bottom of this file, there's also some information on the Sun
  817. 3/80.
  818. X
  819. Also look at the NVRAM FAQ. anon ftp from 
  820. thor.ece.uc.edu:/pub/sun-faq/FAQs/eeprom-nvram.faq
  821. X
  822. Here's some information on changing the NVRAM from the Forth based Sun 
  823. Openprom monitor. Consider this a beta release. Eventually I'll probably
  824. submit it to the folks who put out the nvram faq, but for now this
  825. is a seperate document. Also, there is the really nice nvram FAQ which
  826. is posted to comp.sys.sun.hardware routinely.
  827. X
  828. As far as I know, this is only applicable to Sun4m and Sun4c class
  829. machines.  If you have a copy of the Sun Openprom manual (you can get it
  830. off the Solaris 2.3 answerbook), it might be handy to have that on hand
  831. as a reference.
  832. X
  833. These steps are not the shorted path to getting this changed.  Take a
  834. look at nvram.c if you are just interested in modifying your NVRAM
  835. hostid, are running Sun OS 4.1.x and don't care about the details. This
  836. information might also be useful in putting things back together if
  837. nvram.c malfunctions.
  838. X
  839. Before doing anything else, write down a copy of the nvram "idprom" 
  840. information. You can get it under Sun OS 4.1.x by running 
  841. /usr/etc/devinfo -vp (on Solaris 2.x, /usr/sbin/prtconf -vp) or at 
  842. the Openprom monitor prompt by typing the command
  843. .idprom
  844. (yes the "." is part of the command)
  845. You'll need this information if the NVRAM gets screwed up and you need
  846. to try and back out. Having it does not guarantee that you'll be able
  847. to restore it, but life will be easier if you have it.
  848. X
  849. Step 1.
  850. Determine the physical address of the NVRAM (in the case of Sun4m machines
  851. I'm interested in the second page). If you're system is on this table you 
  852. can probably just read it off the table and skip to step 2.
  853. X
  854. X                addr        space       arch
  855. Sun ELC         02000000    obio        sun4c
  856. SS2             02000000    obio        sun4c
  857. Sun Classic     71201000    0           sun4m
  858. Sun LX          71201000    0           sun4m
  859. Sun SS20        f1201000    f           sun4m
  860. Sun SS10-51     f1201000    f           sun4m
  861. X
  862. Thanks to weindlin@pcs.mot.com for supplying some of the data in 
  863. this table.
  864. X
  865. Hopefully this table will get larger as people send me info.
  866. X
  867. If not, proceed as follows (you must be running Sun OS 4.1.x for this):
  868. X
  869. While Sun OS 4.1.x is running (and while the system is idle!!) do the 
  870. following. Modify the instructions accordingly if you have some of 
  871. the security features installed.
  872. X
  873. hold down the L1/Stop key and type a 
  874. you will get a prompt which says
  875. ok
  876. X
  877. For Sun4m machines:
  878. type the command
  879. fefff000 pgmap?
  880. X
  881. the output will list a physical address which might look like
  882. f.f120.1000
  883. X
  884. the part before the first dot is the address space and the rest is
  885. the actual address. This is the SS20 case from the above table.
  886. X
  887. Now type 
  888. go
  889. to resume Sun OS operation.
  890. --
  891. X
  892. For Sun4c machines:
  893. type the command
  894. ffff8000 pgmap?
  895. X
  896. the physical address will probably list a space (in the ELC case the
  897. address space is given as I/O) and an address (again for the ELC
  898. 02000000).
  899. X
  900. the monitor will want you to type in this address space as obio
  901. later. The Sun Openprom manual also gives sbus and obmem as possible
  902. address spaces.
  903. X
  904. Now type
  905. go
  906. to resume Sun OS operation.
  907. --
  908. X
  909. At this point if you're really nice, you'll send me an Email message
  910. with your Sun model and physical address/address space so I can add it 
  911. to my table. Indicate whether or not you want me to give credit. Unless
  912. you ask me not to, I'll credit you just below the table.
  913. X
  914. X
  915. 2. From this point on it doesn't matter what version of Solaris you
  916. are running.
  917. X
  918. Shut down  your system (e.g. with /etc/halt)
  919. X
  920. 3. Make sure you wrote down your original idprom info. You can 
  921. get it by typing .idprom now. 
  922. X
  923. Figure out what your desired hostid and ethernet address are. Note that
  924. you shouldn't change either the first hex byte of the hostid or the
  925. first three bytes of the ethernet address. Doing so can cause problems.
  926. X
  927. 4. Map the physical address determined above to address 0 using
  928. the map-page command. The format of the command is:
  929. X
  930. <physical address>  <address space>  <map_to>  map-page
  931. X
  932. e.g. ELC     71201000    obio 0   map-page
  933. X     SS20    f1201000    f    0   map-page
  934. X     Classic 71201000    0    0   map-page
  935. X
  936. 5. 
  937. If you are on a Sun4c the virtual address of the idprom information is now 7d8
  938. If you are on a Sun4m the virtual address of the idprom information is now fd8
  939. X
  940. type either
  941. 7d8 20 dump
  942. for sun4c
  943. or 
  944. fd8 20 dump
  945. for sun4m
  946. X
  947. as appropriate.
  948. X
  949. 6. The information which starts at f/7d8 is as follows:
  950. byte    contents
  951. d8      01    - version number - always 01
  952. d9      first byte of hostid (system type)
  953. da-df   6 byte ethernet address (first three bytes are 08,00,20)
  954. e0-e3   date of manufacture. Often all 0s
  955. e4      second byte of hostid
  956. e5      third byte of hostid
  957. e6      fourth byte of hostid
  958. e7      idprom checksum  - xor of contents of bytes d8-e6
  959. X
  960. Verify that the information the dump command spits out is consistent
  961. with the above. If not, DO NOT PROCEED. 
  962. X
  963. 7. Now you can make changes. Be very careful and be sure to recompute
  964. the checksum after making changes. If you don't, you'll get nasty
  965. warnings about an incorrect idprom checksum on boot. I'm know repeating
  966. myself, but don't change the first byte of the hostid or the first three
  967. bytes of the ethernet address. I'm told that the first byte of the
  968. hostid is used to determine the architecture when booting from CDROM on
  969. most current Sun models. If you alter the first three bytes of the
  970. ethernet address you might get message which say that you have a
  971. defective motherboard (but then I don't know of any other consequences
  972. of changing this to some _reasonable_ value, especially avoid 
  973. ff:ff:ff:ff:ff:ff !)
  974. X
  975. The openprom command to change a single byte is
  976. X
  977. <value> <addr> c!
  978. e.g.
  979. 44 7dd c!
  980. will change byte 7dd (virtual address) to 44.
  981. X
  982. 7d8 20 dump      
  983. or
  984. fd8 20 dump
  985. will give you a listing of this area of NVRAM.
  986. X
  987. X
  988. 8. Type reset at the ok prompt. You should then reboot with your new 
  989. hostid/enet addr. 
  990. X
  991. ---------------------------------------------------------------------
  992. Here's a table which matches system models with the first byte of the
  993. hostid. This is from a posting to comp.sys.sun.admin by
  994. Andy.Behrens@coat.com
  995. X
  996. X    01  2/1x0
  997. X    02  2/50
  998. X    11  3/160
  999. X    12  3/50
  1000. X    13  3/2x0
  1001. X    14  3/110
  1002. X    17  3/60
  1003. X    18  3/e
  1004. X    21  4/2x0
  1005. X    22  4/1x0
  1006. X    23  4/3x0
  1007. X    24  4/4x0
  1008. X    31  386i/150 or 386i/250
  1009. X    41  3/4x0
  1010. X    42  3/80
  1011. X    51  SPARCstation 1   (4/60)
  1012. X    52  SPARCstation IPC (4/40)
  1013. X    53  SPARCstation 1+  (4/65)
  1014. X    54  SPARCstation SLC (4/20)
  1015. X    55  SPARCstation 2   (4/75)
  1016. X    56  SPARCstation ELC (4/25)
  1017. X    57  SPARCstation IPX (4/50)
  1018. X    61  4/e
  1019. X    71  4/6x0   (670)
  1020. X    72  SPARCstation 10
  1021. X    80  SPARCclassic /or/ SPARC 5
  1022. X
  1023. X
  1024. X
  1025. ---------------------------------------------------------------------
  1026. X
  1027. Quick steps to modify NVRAM IDPROM info on a Sun 3/80 (people have
  1028. to do this because of the usual battery problem, as with the sun4c
  1029. machines)
  1030. X
  1031. All numbers in hex. Tested with version 2.9 PROMS.
  1032. X
  1033. This may not be the most elegant procedure, but this should allow you
  1034. to modify the NVRAM IDPROM info on a sun 3/80.
  1035. X
  1036. Hit L1-A after you turn it on
  1037. X
  1038. comment: ^t is a command. Don't try control-T. Only tested with 2.9.2
  1039. PROMS.
  1040. X
  1041. > ^t fef04000
  1042. you'll get output which includes the following (samples included)
  1043. TIA entry = 33FA500
  1044. TIB entry = 33FB80A
  1045. PTE = 64000049
  1046. X
  1047. Write these values down!!
  1048. X
  1049. now change the TIA entry for fedfa000 to match the above
  1050. X
  1051. > m a fedfa000
  1052. TIA MAP FEDFA000 [...] ? 33FA500
  1053. X   hit control-D at next ? prompt
  1054. X
  1055. now change the TIB entry to match the above
  1056. X
  1057. > m b fedfa000
  1058. TIB MAP FEDFA000 [...] ? 33FB80A
  1059. X
  1060. now change the pagemap entry to match the above
  1061. > p fedfa000
  1062. PageMap FEDFA000 [...] ? 64000049
  1063. X
  1064. > o fedfa7d8
  1065. ...
  1066. X
  1067. now enter new IDPROM values. You need to get the checksum right.
  1068. X
  1069. byte          contents
  1070. fedfa7d8      01    - version number - always 01
  1071. fedfa7d9      first byte of hostid (system type, 42 for sun 3/80)
  1072. fedfa7da-df   6 byte ethernet address (first three bytes are 08,00,20)
  1073. fedfa7e0-e3   date of manufacture. Often all 0s
  1074. fedfa7e4      second byte of hostid
  1075. fedfa7e5      third byte of hostid
  1076. fedfa7e6      fourth byte of hostid
  1077. fedfa7e7      idprom checksum  - xor of contents of bytes d8-e6
  1078. X
  1079. X
  1080. Note if you have SUN OS 4.1.1 booted (i.e. you're doing this for some other
  1081. reason than an IDPROM with invalid data), you can just write values into
  1082. fedfa7d8 ... fedfa7e7 with the o command. You don't need to do all the
  1083. mapping stuff.
  1084. SHAR_EOF
  1085. chmod 0600 hid-1.3.1/nvram.info ||
  1086. echo 'restore of hid-1.3.1/nvram.info failed'
  1087. Wc_c="`wc -c < 'hid-1.3.1/nvram.info'`"
  1088. test 9273 -eq "$Wc_c" ||
  1089.     echo 'hid-1.3.1/nvram.info: original size 9273, current size' "$Wc_c"
  1090. fi
  1091. # ============= hid-1.3.1/nvram_old.c ==============
  1092. if test -f 'hid-1.3.1/nvram_old.c' -a X"$1" != X"-c"; then
  1093.     echo 'x - skipping hid-1.3.1/nvram_old.c (File already exists)'
  1094. else
  1095. echo 'x - extracting hid-1.3.1/nvram_old.c (Text)'
  1096. sed 's/^X//' << 'SHAR_EOF' > 'hid-1.3.1/nvram_old.c' &&
  1097. #include <fcntl.h>
  1098. #include <unistd.h>
  1099. #include <stdio.h>
  1100. X
  1101. /* 
  1102. get/change hostid in NVRAM --
  1103. X
  1104. old version -- I should throw this away. Less friendly but perhaps
  1105. X  easier to modify for other types of machines.
  1106. X
  1107. only tested on sun4m architecture and sun4c architecture. The
  1108. kernel patches will be different for Sun4 and I don't have one
  1109. to play with. 
  1110. X
  1111. This program is still experimental. Dangerous and tricky stuff.
  1112. If you are unwilling to experiment and clean up after disasters
  1113. don't use it. hid is probably safer. USE AT YOUR OWN RISK.
  1114. X
  1115. Note the define OFFSET below!
  1116. X
  1117. running this will invalidate the overall NVRAM checksum. So after it
  1118. make some trivial change with the eeprom command (change the baud
  1119. rate on a serial port or something like that
  1120. e.g.
  1121. /usr/etc/eeprom diag-switch?=false
  1122. )
  1123. X
  1124. first you need to turn off the protection in the OS to keep
  1125. you from modifying /dev/eeprom locations after 017730 
  1126. use adb
  1127. adb -k -w /vmunix /dev/mem
  1128. _mmeeprom+8/W 901223ff
  1129. X
  1130. which changes
  1131. or      %o1, 0x3d8, %o1
  1132. to
  1133. or      %o1, 0x3ff, %o1
  1134. X
  1135. X
  1136. Unfortunately this change with adb to the eeprom device seems to depend
  1137. on the exact version of Sun OS you are running. Don't assume it will
  1138. work without looking around intelligently.
  1139. X
  1140. e.g. For SUN OS 4.1.1 on a Sun 4c you need to:
  1141. adb -w /vmunix /dev/mem
  1142. _mmeeprom+4/W 80a6a7ff
  1143. _mmeeprom+0x28/W 80a6a7ff
  1144. which changes a couple of compare operations. 
  1145. X
  1146. Also be very careful. The first byte of the hostid identifies the type 
  1147. of system you are running. On modern Suns OS boot CDs depend on this 
  1148. information to get the correct architecture. If you change it you may 
  1149. be reduced to poking around in NVRAM from the monitor next time you have
  1150. to boot from CD.
  1151. X
  1152. Here's a mapping of what gets read into buf (at OFFSET)
  1153. buf[0] = always 01?
  1154. buf[1] = system id/first byte of hostid.
  1155. buf[2] \
  1156. buf[3]  \
  1157. buf[4]   \  HW ethernet address (6 bytes)
  1158. buf[5]    /  
  1159. buf[6]  /
  1160. buf[7]/
  1161. buf[8],...,buf[11] = always 00?
  1162. buf[12] = second byte of hostid
  1163. buf[13] = third byte of hostid
  1164. buf[14] = fourth byte of hostid
  1165. buf[15] = checksum
  1166. X
  1167. the checksum is buf[0] ^ buf[1] ^ ... ^ buf[14]
  1168. i.e. it must be the case that the  xor of buf[0] through buf[15] is 0
  1169. X
  1170. Without any parameters, it reports the hostid from NVRAM. Otherwise it
  1171. changes it. 
  1172. X
  1173. Mark Henderson <markh@wimsey.bc.ca>
  1174. Placed in the public domain by the author - 23 June 1994
  1175. X
  1176. This program is distributed in the hope that it will be useful,
  1177. but without any warranty; without even the implied warranty of
  1178. merchantability or fitness for a particular purpose. You use
  1179. this program at your own risk. The author disclaims responsibility for
  1180. any damages that might result from the use of this program, even
  1181. if they result from negligence on the part of the author.
  1182. X
  1183. Also, please don't use this program to steal software. The intended
  1184. use is for emergency situations where an application has to be moved from
  1185. one computer to another (e.g. in the event of a hardware malfunction)
  1186. and licence keys cannot be obtained quickly from the vendor. Many
  1187. vendors will not supply licence keys outside of business hours.
  1188. X
  1189. */
  1190. X
  1191. X
  1192. #define OFFSET 017730       /* for Sun 4m, Sun OS 4.1.3 */
  1193. /* #define OFFSET 03730     /* for Sun 4c, SUN OS 4.1.1 */
  1194. X
  1195. #define SANITY_CHECK        /* don't turn this off unless you need to. If this
  1196. X                               fails it generally means that the program won't
  1197. X                               work and very well may be destructive */
  1198. X
  1199. #undef TEST         /* doesn't actually do mods if TEST is defined */
  1200. unsigned char buf[17]; 
  1201. X
  1202. main(argc,argv)
  1203. int argc;
  1204. char *argv[];
  1205. {
  1206. X    unsigned int hid;
  1207. X    int fd;
  1208. X    int i;
  1209. X    unsigned int acc;
  1210. X    int read_hostid;
  1211. X    unsigned int hid_reported_by_gethostid = gethostid();
  1212. X
  1213. X    if (argc == 1) {
  1214. X        /* no args - just get hostid from prom */
  1215. X        read_hostid = 1;
  1216. X    }
  1217. X    else if (argc == 2) {
  1218. X        read_hostid = 0;
  1219. X        sscanf(argv[1],"%08x",&hid);
  1220. X    }
  1221. X    else {
  1222. X        fprintf(stderr, "usage: %s [hostid]\n",argv[0]);
  1223. X        fprintf(stderr, "  e.g. %s b0b1fb0b\n", argv[0]);
  1224. X        exit(1);
  1225. X    }
  1226. X    if (read_hostid) {
  1227. X        if ((fd = open("/dev/eeprom", O_RDONLY)) < 0) {
  1228. X            fprintf(stderr, "cannot open /dev/eeprom for read\n");
  1229. X            exit(1);
  1230. X        }
  1231. X    } 
  1232. X    else {
  1233. #ifdef TEST
  1234. X        if ((fd = open("/dev/eeprom", O_RDONLY)) < 0) {
  1235. X            fprintf(stderr, "cannot open /dev/eeprom for read\n");
  1236. X            exit(1);
  1237. X        }
  1238. #else
  1239. X        if ((fd = open("/dev/eeprom", O_RDWR)) < 0) {
  1240. X            fprintf(stderr, "cannot open /dev/eeprom for read\n");
  1241. X            exit(1);
  1242. X        }
  1243. #endif
  1244. X    }
  1245. X
  1246. X    if (lseek(fd,OFFSET,SEEK_SET) < 0) { 
  1247. X        fprintf(stderr, "lseek failed\n");
  1248. X        exit(1);
  1249. X    }
  1250. X
  1251. X    if (read_hostid) {
  1252. X        if (read(fd,buf,16) < 16) {
  1253. X            fprintf(stderr, "read of /dev/eeprom failed\n");
  1254. X            exit(1);
  1255. X        }
  1256. X        printf("%02x%02x%02x%02x\n", buf[1], buf[12], buf[13], buf[14]);
  1257. X        for (acc = 0 , i=0; i<15; i++) acc^=buf[i];
  1258. X        if (acc != buf[15])  {
  1259. X            fprintf(stderr, "warning: ID CHKSUM INVALID\n");
  1260. X            fprintf(stderr,"^buf = %02x\n", acc & 0xff);
  1261. X            fprintf(stderr,"buf[15] = %02x\n", buf[15] & 0xff);
  1262. X        }
  1263. X    }
  1264. X    else {
  1265. #ifdef SANITY_CHECK 
  1266. /* this will fail if you have modified the value returned by
  1267. X   gethostid by using one of the other programs in this package.
  1268. X   In that case I wouldn't turn this off but restore your old 
  1269. X   gethostid behaviour or replace the gethostid call above with
  1270. X   a reference to your "real" hostid, if your architecture 
  1271. X   is weird this should detect the problem and not try and
  1272. X   write into places we shouldn't. */
  1273. X
  1274. X        if (read(fd,buf,16) < 16) {
  1275. X            fprintf(stderr, "read of /dev/eeprom failed\n");
  1276. X            exit(1);
  1277. X        }
  1278. #ifdef TEST
  1279. X        for (i=0; i<16; i++)
  1280. X            printf("%02x ", buf[i]);
  1281. X        printf("\n");
  1282. #endif
  1283. X        for (acc = 0 , i=0; i<15; i++) acc^=buf[i];
  1284. X        if ((acc != buf[15]) 
  1285. X            || (buf[1] != (hid_reported_by_gethostid >> 24) )
  1286. X            || (buf[12] != ((hid_reported_by_gethostid >> 16) &0xff))
  1287. X            || (buf[13] != ((hid_reported_by_gethostid >> 8) &0xff))
  1288. X            || (buf[14] != (hid_reported_by_gethostid &0xff))) {
  1289. X        
  1290. X            fprintf(stderr, "SANITY CHECK FAILED -- aborting\n");
  1291. X            fprintf(stderr, 
  1292. X                "perhaps the value of the define OFFSET is wrong\n");
  1293. X            exit(1);
  1294. X        }
  1295. X            
  1296. X        if (lseek(fd,OFFSET,SEEK_SET) < 0) { 
  1297. X            fprintf(stderr, "lseek failed\n");
  1298. X            exit(1);
  1299. X        }
  1300. X
  1301. #endif
  1302. X        buf[1] = hid >> 24;
  1303. X        buf[12] = (hid >> 16) &0xff;
  1304. X        buf[13] = (hid >> 8) &0xff;
  1305. X        buf[14] = hid &0xff;
  1306. X        for (acc = 0 , i=0; i<15; i++) acc^=buf[i];
  1307. X        buf[15] = acc & 0xff;
  1308. #ifndef TEST
  1309. X        if (write(fd,buf,16) < 16) {
  1310. X            fprintf(stderr, "write failed\n");
  1311. X        }
  1312. #else
  1313. X    for (i=0; i<16; i++)
  1314. X        printf("%02x ", buf[i]);
  1315. X    printf("\n");
  1316. X
  1317. #endif
  1318. X    }
  1319. X    close(fd);
  1320. }
  1321. X
  1322. SHAR_EOF
  1323. chmod 0600 hid-1.3.1/nvram_old.c ||
  1324. echo 'restore of hid-1.3.1/nvram_old.c failed'
  1325. Wc_c="`wc -c < 'hid-1.3.1/nvram_old.c'`"
  1326. test 7012 -eq "$Wc_c" ||
  1327.     echo 'hid-1.3.1/nvram_old.c: original size 7012, current size' "$Wc_c"
  1328. fi
  1329. true || echo 'restore of hid-1.3.1/sidump.c failed'
  1330. echo End of part 2, continue with part 3
  1331. exit 0
  1332. -- 
  1333. Mark Henderson markh@wimsey.bc.ca - RIPEM MD5: F1F5F0C3984CBEAF3889ADAFA2437433
  1334. ViaCrypt PGP key fingerprint: 21 F6 AF 2B 6A 8A 0B E1  A1 2A 2A 06 4A D5 92 46
  1335. low security key fingerprint: EC E7 C3 A9 2C 30 25 C6  F9 E1 25 F3 F5 AF 92 E3
  1336. cryptography archive maintainer -- anon ftp to ftp.wimsey.bc.ca:/pub/crypto
  1337.