From: "Steven M. Schultz" Date: Tue, 22 Sep 1998 17:43:44 -0700 (PDT) 4.3 CAN run on a uVax. But, in true chicken-and-egg fashion, you must have access to a working TK50 tape drive so that you may build a TK50 boot tape for that medium. Check out the README in the shar file. It is assumed that you have installed previous fixes in /sys/vax regarding uVaxen. But just in case you haven't, another article has been posted with those fixes. Rick #!/bin/sh # # This is a shell archive. Remove anything before the above #! line, # then unpack it by saving it in a file and typing "sh file". (Files # unpacked will be owned by you and have default permissions.) # # This archive contains: # README # mdec.Makefile.diff # mdec.rdboot.s # mdec.tmscpboot.s # stand.Makefile.diff # stand.autoconf.c.diff # stand.conf.c.diff # stand.srt0.c.diff # stand.tmscp.c.diff # stand.uda.c.diff echo x - README cat > "README" << '//E*O*F README//' THE RECIPE or, how to make a tk50 boot tape and/or boot a uVax. These are really two separate problems. They are only related if all you have is a tk50 drive on your uVax. These are not idiot-proof instructions, but I've tried to make them as complete as possible. All these instructions (and some of the code; see srt0.c) assume root on the uVax will be ra0. YOU MUST ALREADY HAVE A WORKING VAX! These instructions are useless on a cold machine. You must have a 4.3 machine and a working uVax (probably Ultrix!) with a tk50 drive. The enterprising person can also make a 9-track boot tape, if your uVax is so equipped. However, I've not examined what changes or values may be necessary for those standalone drivers, so I won't speculate. To the ambitious: autoconf.c probably contains the magic you need, and /sys/dist (and Installing and Operating 4.3bsd -- Appendix A) contains the programs and instructions on how to build a boot tape. You will also require a spare, root-size partition on the working 4.3 machine. This is primarily to build the miniroot. I. Install the patches. Note that you MUST have installed the uVax instruction emulation fix posted some time ago to the net. Because it was posted some time ago, I've not included it as part of the diffs. However, because it was posted some time ago :) I've posted it again as a second shar file for those who didn't grab it the first time. These diffs should be applied to copies of the source on the working 4.3 machine. (Copies, in case you or "patch" make some terrible error.) II. The format of a TK50 boot tape. The basic format of the tape should be: tape 1: file 1: tmscpboot, and tp file containing boot and copy file 2: miniroot file 3: dump of / file 4: tar image of /usr file 5: tar image of /sys file 6: tar image of /usr/src file 7: tar image of /usr/lib/vfont tape 2: file 1: tar image of /usr/src/new file 2: tar image of /usr/ingres Now mostly because tk50's take so darn long to write, I suggest the following shorter tape: file 1: as before file 2: as before file 3: as before file 4: as before file 5: as before You can pull in the other stuff later if you want via tk50 or (more likely) the network; this will be enough for you to come up multi-user. III. Building the tape. I assume below that /dev/rmt8 is the tk50 tape drive to which you are writing, and nrmt8 is the non-rewind drive (also known as rmt12). References to /sys/... here actually refer to your copy of the sources, wherever you may have chosen for them to live. Persons familiar with building boot tapes may be able to shorten this procedure by taking any file after #3 directly from the distribution tape instead of doing what is listed here. Since this shortcut can be difficult to explain for all the various commands involved, it is not gone into here. Shortcuts will be briefly mentioned in []. Where possible, methods of moving things from one machine to another via rsh are mentioned. This will require a /.rhosts to do this as root. It's not the *only* method, just a suggested one. How to build file 1: cd mdec make tmscpboot cd /sys/stand make tpboot tpcopy mv tpboot boot; mv tpcopy copy tp cmf tp.file boot copy cat /sys/mdec/tmscpboot tp.file | dd of=/dev/nrmt8 bs=512 conv=sync (or, remotely) cat /sys/mdec/tmscpboot tp.file | rsh uVax dd of=/dev/nrmt8 bs=512 conv=sync How to build file 2: Here you will need that spare partition. I'll call it, rather generically, /dev/rraXX here. You must remake the GENERIC kernel. Alter /sys/conf/GENERIC and add the line cpu "VAX630" Then make the directory /sys/GENERIC, if it doesn't exist, and cd /sys/conf config GENERIC cd ../GENERIC make depend make vmunix The last two will take some time, the last one taking longest. After this is finished, you will use that spare partition. Now you must build the miniroot and add the new GENERIC kernel. [You can also retrieve the miniroot from the original distribution tape, move your new GENERIC kernel onto the miniroot, and put the miniroot to the tk50 tape.] You will need to investigate /sys/dist/buildmini. It is a simple shell script, but it will need to be tailored to fit your setup. Change "miniroot" and "minitype" at the top to reflect the disk you are using. mv /genvmunix /genvmunix.old cp /sys/GENERIC/vmunix /genvmunix /sys/dist/buildmini mount /dev/raXX /mnt cp /sys/GENERIC/vmunix /mnt/vmunix ln /mnt/vmunix /mnt/genvmunix umount /dev/raXX dd if=/dev/rraXX of=/dev/nrmt8 bs=10k conv=sync (or, remotely) rsh uVax dd of=/dev/nrmt8 bs=10k conv=sync < /dev/rraXX How to make file 3: This is a simple dump. Just make a dump of your own /. [ Or, you may copy the one from the distribution tape. In this case, be sure to copy the generic kernel to your new root partition after "copy"ing in the Installation, or your kernel won't know about uVaxen.] dump 0f /dev/nrmt8 / (or, remotely) rdump 0f uVax:/dev/nrmt8 / How to make file 4: You only want *some* directories from /usr. The following minimal set is suggested. You can retrieve others later from the working 4.3 vax via the network (or more laborious tk50 tapes): cd /usr tar cf /dev/nrmt8 adm bin include lib man mdec ucb [ or copy the one on the distribution. More directories there, but certainly easier. ] How to make file 5: MAKE SURE YOU ARE USING YOUR CHANGED SET OF SYS SOURCES HERE!! cd /sys; tar cf /dev/nrmt8 . IV. Booting from tape. Once you have the TK50 tape built, you should be able to insert it on your cold machine and issue the command "b mu0" in response to the >>> prompt. It will take between 1 and 2 minutes to load and issue a '=' prompt. Then you proceed as directed in "Installing and Operating", except when booting, use "genvmunix" rather than "vmunix" until you have made a machine-specific kernel. V. Booting from disk. Once you have a running Unix system, you will quickly tire of having to boot from tape every time. It is easy to boot from disk (and thus have autoboot work.) Rdboot.s is the key. You want your root disk to have rdboot in its boot block (first sector) and bootra in the next 15 sectors. First, recompile them. cd /sys/stand; make bootra cd /sys/mdec; make rdboot Then install them on the root disk: cd /usr/mdec installboot rdboot bootra /dev/ra0a You will also need a new /boot: cd /sys/stand; make boot cp boot /boot Anytime you newfs your root partition, you will need to do this, because newfs will, by default, copy rdboot and bootrd or raboot and bootra. In fact, you may need to link bootra to bootrd to keep newfs happy. //E*O*F README// echo x - mdec.Makefile.diff cat > "mdec.Makefile.diff" << '//E*O*F mdec.Makefile.diff//' *** /tmp/Makefile Thu Dec 10 09:28:12 1987 --- Makefile Thu Dec 10 09:27:46 1987 *************** *** 60,65 **** --- 60,79 ---- dd if=a.out of=b.out bs=32 skip=1 dd if=b.out of=tmboot conv=sync + rdboot: rdboot.s + as rdboot.s + nm -u a.out + strip a.out + dd if=a.out of=b.out bs=32 skip=1 + dd if=b.out of=rdboot conv=sync + + tmscpboot: tmscpboot.s + as tmscpboot.s + nm -u a.out + strip a.out + dd if=a.out of=b.out bs=32 skip=1 + dd if=b.out of=tmscpboot conv=sync + tsboot: tsboot.s as tsboot.s nm -u a.out //E*O*F mdec.Makefile.diff// echo x - mdec.rdboot.s cat > "mdec.rdboot.s" << '//E*O*F mdec.rdboot.s//' /* ** This is a VMB boot block for microvax. For more info, see ** the KA-630 User's manual. */ /* ** --------------------------------------------------- ** BB + 0: | 1 | N | any value | ** --------------------------------------------------- */ xxx: .long 0x001040000 /* ** --------------------------------------------------- ** 4: | low lbn | high lbn | ** --------------------------------------------------- */ .long 0x000010000 /* ** BB + 2*N ** --------------------------------------------------- ** + 0: | check byte | K | 0 | 18 (HEX) | ** --------------------------------------------------- */ .long 0x0e7000018 /* ** --------------------------------------------------- ** + 4: | any value | 1 or 81 | 0 | ** --------------------------------------------------- */ .long 0x000008100 /* ** --------------------------------------------------- ** + 8: | size in blocks of the image | ** --------------------------------------------------- */ .long 0x00000000f /* ** --------------------------------------------------- ** +12: | load offset from default load address | ** --------------------------------------------------- */ .long 0x000000000 /* ** --------------------------------------------------- ** +16: | offset into image to start execution | ** --------------------------------------------------- */ .long 0x000000002 /* ** --------------------------------------------------- ** +20: | sum of previous three longwords | ** --------------------------------------------------- */ .long 0x000000011 /* ** ** BB +0: These two bytes can have any value ** ** BB+2: This value is the word offset from the start of the ** bootblock to the identification area described below. ** ** BB+3: This byte must be one. ** ** BB+4: This longword contains the logical block number ** (word swapped) of the secondary image. ** ** BB+(2*n)+0: This byte defines the expected instruction set. ** 18(hex) means VAX. ** ** BB+(2*n)+1: This byte defines the expected controller type, 0 ** means unknown. ** ** BB+(2*n)+2: This byte defines the file structure on the volume, ** it may be any value. ** ** BB+(2*n)+3: This byte must be the ones complement of the sum of ** the previous three bytes. ** ** BB+(2*n)+4: This byte must be zero. ** ** BB+(2*n)+5: This byte must be 1 or 81 (hex). This byte defines ** the version number of the format standard and the ** type of disk. The version is one, the high bit is 0 ** for single sided, 1 for double sided. ** ** BB+(2*n)+6: These two bytes may be any value, but generally they ** are zero. ** ** BB+(2*n)+8: This entry is a longword containing the size in ** blocks of the secondary bootstrap image. ** ** BB+(2*n)+12: This entry is a longword containing a load offset ** (usually zero) from the default load address of the ** secondary bootstrap. ** ** BB+(2*n)+16: This entry is a longword containing the byte offset ** into the secondary bootstrap where execution is to ** begin. ** ** BB+(2*n)+20: This entry is a longword containing the sum of the ** previous three longwords. */ //E*O*F mdec.rdboot.s// echo x - mdec.tmscpboot.s cat > "mdec.tmscpboot.s" << '//E*O*F mdec.tmscpboot.s//' # # TK50 tape boot block for distribution tapes # works on Q-bus tk50 drive on uVaxen # # reads a program from a tp directory on a tape and executes it # program must be stripped of the header and is loaded ``bits as is'' # you can return to this loader via ``ret'' as you are called ``calls $0,ent'' # .set RELOC,0x70000 /* tp directory definitions */ .set FILSIZ,38 # tp direc offset for file size .set BNUM,44 # tp dir offset for start block no. .set ENTSIZ,64 # size of 1 TP dir entry, bytes .set PTHSIZ,32 # size of TP path name, bytes .set BLKSIZ,512 # tape block size, bytes .set NUMDIR,24 # no. of dir blocks on tape .set ENTBLK,8 # no. of dir entries per tape block /* processor registers and bits */ .set RXCS,32 .set RXDB,33 .set TXCS,34 .set TXDB,35 .set RXCS_DONE,0x80 .set TXCS_RDY,0x80 .set TXCS_pr,7 /* bit position of TXCS ready bit */ .set RXCS_pd,7 /* bit position of RXCS done bit */ /* UBA registers */ .set MAPSTART,0x20088000 # for a uVax, anyway .set UBAMEM,0x1ffc2000 # again, for a uVax .set MRV,0x80000000 # map register valid bit /* TMSCP UBA registers */ .set TMSCP_CSR, 0774500 # CSR of tk50 .set TMSCPip,0 # initialization and polling .set TMSCPsa,2 # status and address /* handy values for tmscp communication area */ .set TMSCP_OWN,0x80000000 .set TMSCP_ERR,0x8000 .set TMSCP_STEP4,0x4000 .set TMSCP_STEP3,0x2000 .set TMSCP_STEP2,0x1000 .set TMSCP_STEP1,0x800 .set TMSCP_IE,0x80 .set TMSCP_GO,1 /* handy offsets into tmscp communication area (from tmscpca) */ .set cmdint,4 .set rspint,6 .set rspdsc,8 .set cmddsc,12 /* handy offsets into mscp packets (from %rCMD or %rRSP) */ .set msglen,0 .set vcid,3 .set unit,8 .set op,12 .set status,14 .set modifier,14 .set bytecnt,16 .set cntflgs,18 .set buffer,20 .set tmkcnt,20 .set lbn,32 .set dscptr,40 /* TMSCP commands and modifiers */ .set M_OP_STCON,4 .set M_OP_ONLIN,9 .set M_OP_READ,33 .set M_OP_REPOS,37 .set M_MD_REWND,2 .set M_MD_IMMED,0x80 .set M_MD_CLSEX,0x200 .set M_ST_MASK,0x1f .set M_ST_TAPEM,14 /* miscellaneous */ .set IUR, 0x37 .set SID, 0x3e .set VAX_630,8 /* local stack variables */ .set tmscpca,-240-PTHSIZ-26 # struct tmscpca (see tmscpreg.h) .set rsp,-240-PTHSIZ-10 # tmscp response area .set cmd,-120-PTHSIZ-10 # tmscp command area .set name,-PTHSIZ-10 # operator-typed file name .set dirread,-10 # is the tape directory incore already? .set mtapa,-8 # cur tape addr (last blk we read) .set tapa,-4 # desired tape addr (inclusive) /* register usage */ .set rCMD,r7 .set rRSP,r8 .set rUBADDR,r9 .set rMAPREGS,r10 .set rCSR,r11 /* ===== */ /* initialization */ init: /* * if on a uVax, we were loaded by VMB from tape. We also have * only one unibus, at 0x1fffc2000 (see above). Elstwise, this * boot program will almost certainly need help. */ mfpr $SID,r0 cmpzv $24,$8,r0,$VAX_630 beql 1f halt /* * We must have been loaded by VMB, and thus we are at a non-zero * location. sp will contain the base address of the area at which * we were loaded. So we add sp to $end to get the true end-of-program * address. */ 1: movl sp,r6 # r6 - beginning of program movl $RELOC,fp # core loc to which to move this program addl3 $-512,fp,sp # set stack pointer; leave room for locals addl3 $-512,fp,r0 # zero our destination mem .. we start here addl3 $end,fp,r1 # and end here clr: clrl (r0)+ cmpl r0,r1 jlss clr movc3 $end,(r6),(fp) # copy to relocated position # movzbl $'a,r0 # bsbw putc addl3 $reginit,$RELOC,r0 jmp (r0) # and go there reginit: /* initialize our registers. Should need to do this only once */ # movzbl $'b,r0 # bsbw putc addl3 $UBAMEM, $TMSCP_CSR, %rCSR # set up CSR register movl $MAPSTART, %rMAPREGS # locate map registers moval tmscpca(fp), %rUBADDR # set unibus address for comm area extzv $0,$9,%rUBADDR,%rUBADDR # format: (MR# << 9) | (&comm & 0x1ff) ashl $-9,$RELOC-512,r0 # setting up map register for our stack bisl3 $MRV,r0,(%rMAPREGS) # mark our stack valid (MR #0) moval cmd(fp),%rCMD # location of cmd mscp packet moval rsp(fp),%rRSP # location of rsp mscp packet bsbw inittmscp # init the unit bsbw onlin # set tape online bsbw rew # rewind tape start: # movzbl $11,r0 # newline # bsbw putc # movzbl $13,r0 # return # bsbw putc movzbl $'=,r0 # prompt bsbw putc bsbw getname # desired TP filename is in name(fp). Now read in entire tp directory # contents into low core, starting at loc 0 tstw dirread(fp) # if directory needs to be read in, do so bneq 1f bsbw readdir 1: # all of directory is now in locore, @ 0. # search for filename; return to start if it isn't there. clrl r0 # start at location 0 nxtdir: moval name(fp),r2 movl r0,r1 1: cmpb (r1),(r2) bneq 2f tstb (r1) beql found incl r1 incl r2 brb 1b 2: acbl $NUMDIR*BLKSIZ-1,$ENTSIZ,r0,nxtdir brw start # entry not in directory; start over # entry IS here; read it in from tape found: movzwl BNUM(r0),tapa(fp) # start block no., 2 bytes addl2 $2-1,tapa(fp) # skip over this program (2 blocks) # minus 1 because we will read THROUGH # this block; so we want to stop just # before it movzwl FILSIZ(r0),r4 # low 2 bytes file size insv FILSIZ-1(r0),$16,$8,r4 # file size, high byte cmpl r4,$RELOC-512 # check if file fits below stack bgeq start # file too large # Now advance to proper place on tape. tapa has our # desired address clrw dirread(fp) # we are about to obliterate our incore copy # of the directory 2: clrl r3 # rrec expects r3 to point to a buffer. 0 will do ... bsbw rrec cmpl mtapa(fp),tapa(fp) blss 2b # tape now positioned correctly. Read in program. Number of bytes # to read is in r4. We must round up to an even BLKSIZ boundary. # Clear the area we are putting it at; unix expects zeroes in its # data and bss section. addl2 $BLKSIZ-1,r4 # round up bicl2 $BLKSIZ-1,r4 # mask out movl r4,r5 # use r5; need to save r4 for later 1: clrl (r5) sobgtr r5,1b # now read in file. clrl r3 # read into page 0 (incremented by rrec) ashl $-9,r4,r5 # r5 now holds # blks to read addl2 r5,tapa(fp) # compute desired tape blk # 1: bsbw rrec cmpl mtapa(fp),tapa(fp) # got it yet? blss 1b # begin execution. Call as a function. clrl r5 calls $0,(r5) # now, since the called function has reset the tape drive for # us (!) we must reinit it again ourselves. ashl $-9,$RELOC-512,r0 # set up map register for our stack bisl3 $MRV,r0,(%rMAPREGS) # mark our stack valid (MR #0) bsbw inittmscp # re-init drive bsbw onlin # re-online it brw start # getname will set name(fp) and leave len(name(fp)) in r6 getname:moval name(fp),r1 # mov to register for ease of access nxtc: bsbw getc cmpb r0,$012 # end of line? beql nullc movb r0,(r1)+ brb nxtc nullc: moval name(fp),r0 subl3 r0,r1,r6 # length of path name jeql start # just hit return; nothing useful here clrb (r1)+ # add null at end incl r6 # add null to length rsb getc: mfpr $RXCS,r0 bbc $RXCS_pd,r0,getc /* receiver ready ? */ mfpr $RXDB,r0 extzv $0,$7,r0,r0 cmpb r0,$015 bneq putc bsbw putc movb $0,r0 bsbw putc movb $012,r0 putc: mfpr $TXCS,r2 bbc $TXCS_pr,r2,putc /* transmitter ready ? */ extzv $0,$7,r0,r0 mtpr r0,$TXDB rsb inittmscp: movw $0,TMSCPip(%rCSR) # start step 1 1: bitw $TMSCP_STEP1,TMSCPsa(%rCSR) beql 1b # movzbl $'1,r0 # bsbw putc init2: movw $TMSCP_ERR,TMSCPsa(%rCSR) # start step 2 2: bitw $TMSCP_STEP2,TMSCPsa(%rCSR) beql 2b # movzbl $'2,r0 # bsbw putc init3: addl3 $8,%rUBADDR,r0 # start step 3 cvtlw r0,TMSCPsa(%rCSR) 3: bitw $TMSCP_STEP3,TMSCPsa(%rCSR) beql 3b # movzbl $'3,r0 # bsbw putc init4: addl3 $8,%rUBADDR,r0 # start step 4 ashl $-16,r0,r0 cvtlw r0,TMSCPsa(%rCSR) 4: bitw $TMSCP_STEP4,TMSCPsa(%rCSR) beql 4b # movzbl $'4,r0 # bsbw putc setchar: movw $TMSCP_GO,TMSCPsa(%rCSR) moval 140(%rUBADDR),tmscpca+cmddsc(fp) moval tmscpca+cmddsc(fp),dscptr(%rCMD) movb $1,vcid(%rCMD) moval 20(%rUBADDR),tmscpca+rspdsc(fp) moval tmscpca+rspdsc(fp),dscptr(%rRSP) clrw cntflgs(%rCMD) movb $M_OP_STCON,op(%rCMD) clrw modifier(%rCMD) clrl buffer(%rCMD) clrl bytecnt(%rCMD) bsbw tmscpcmd # movzbl $'S,r0 # bsbw putc rsb tmscpcmd: movw $116,msglen(%rCMD) # 116 -- size of an mscp packet bisl2 $TMSCP_OWN,tmscpca+cmddsc(fp) movw $116,msglen(%rRSP) bisl2 $TMSCP_OWN,tmscpca+rspdsc(fp) movw TMSCPip(%rCSR),r0 # start polling wait: cvtwl TMSCPsa(%rCSR),r0 bitl $TMSCP_ERR,r0 beql 1f movw modifier(%rRSP),r1 # so we can read status easily halt # some error or other 1: tstl tmscpca+4(fp) beql 2f clrw tmscpca+4(fp) 2: bitl $TMSCP_OWN,tmscpca+rspdsc(fp) bneq wait # cmd done clrw tmscpca+rspint(fp) extzv $0,$5,status(%rRSP),r0 tstl r0 beql ok # no errors cmpl $M_ST_TAPEM, r0 beql ok # not an error, just a tape mark halt # some unknown error ok: rsb rew: movb $M_OP_REPOS,op(%rCMD) movw $M_MD_REWND|M_MD_IMMED,modifier(%rCMD) clrl buffer(%rCMD) clrl bytecnt(%rCMD) bsbw tmscpcmd # movzbl $'r,r0 # to indicate r)ewind # bsbw putc movl $-1,mtapa(fp) # no blocks read yet rsb onlin: movb $M_OP_ONLIN,op(%rCMD) clrw modifier(%rCMD) clrl buffer(%rCMD) clrl bytecnt(%rCMD) bsbw tmscpcmd # movzbl $'O,r0 # to indicate O)nline # bsbw putc rsb # Read the tp directory. Number of blocks to read is in tapa(fp), # and will be read into memory starting at location 0. readdir:bsbw rew # beginning of tape addl3 $2,$NUMDIR,tapa(fp) # blocks to read (skip this 1k program) clrl r3 # using mem starting at 0 as free space bsbw rrec; bsbw rrec # read and discard first two blocks -- # those are this program bsbw rrec # read and discard first tp block clrl r3 # reset starting place incw dirread(fp) # show that directory is incore 1: bsbw rrec cmpl mtapa(fp),tapa(fp) # done yet? blss 1b rsb # read 1 block from mag tape into page indicated by r3, which will # automatically be incremented here. mtapa is also advanced. rrec: bisl3 $MRV,r3,4(%rMAPREGS) # using map register #1 movl $BLKSIZ,bytecnt(%rCMD) # how much to read ashl $9,$1,buffer(%rCMD) # indicating mr #1. We just happen to # be on a page boundary, so filling in # the low 9 bits is not necessary. movb $M_OP_READ,op(%rCMD) clrw modifier(%rCMD) bsbw tmscpcmd # movzbl $'R,r0 # to indicate R)ead a record # bsbw putc incl mtapa(fp) incl r3 rsb end: //E*O*F mdec.tmscpboot.s// echo x - stand.Makefile.diff cat > "stand.Makefile.diff" << '//E*O*F stand.Makefile.diff//' *** /sys/stand/Makefile Thu Jun 5 01:48:32 1986 --- Makefile Wed Dec 9 14:31:56 1987 *************** *** 8,25 **** DESTDIR=/ INCPATH=-I. -I../h CFLAGS= -O ${INCPATH} -DSTANDALONE ${COPTS} ! COPTS= -DVAX780 -DVAX750 -DVAX730 -DVAX8600 730OPTS=-O ${INCPATH} -DSTANDALONE -DVAX730 RELOC= 70000 ! SRCS= sys.c conf.c prf.c machdep.c \ autoconf.c hp.c hpmaptype.c ht.c idc.c mba.c mt.c rk.c \ ! rl.c tm.c ts.c up.c upmaptype.c uba.c uda.c ut.c \ drtest.c format.c up.old.c hp.old.c ../vax/dkbad.c DUMMIES= bootxx.c confxx.c DRIVERS=autoconf.o hp.o hpmaptype.o ht.o idc.o mba.o mt.o \ rk.o rl.o tm.o ts.o \ ! up.o upmaptype.o uba.o uda.o ut.o # These drivers don't have ecc correction and bad sector forwarding; # they are placed in the file system boot area for 750's. If your # root has bad sectors you can try and squeeze the newer drivers in... --- 8,25 ---- DESTDIR=/ INCPATH=-I. -I../h CFLAGS= -O ${INCPATH} -DSTANDALONE ${COPTS} ! COPTS= -DVAX780 -DVAX750 -DVAX730 -DVAX8600 -DVAX630 730OPTS=-O ${INCPATH} -DSTANDALONE -DVAX730 RELOC= 70000 ! SRCS= sys.c conf.c prf.c machdep.c strings.c \ autoconf.c hp.c hpmaptype.c ht.c idc.c mba.c mt.c rk.c \ ! rl.c tm.c ts.c up.c upmaptype.c uba.c uda.c ut.c tmscp.c \ drtest.c format.c up.old.c hp.old.c ../vax/dkbad.c DUMMIES= bootxx.c confxx.c DRIVERS=autoconf.o hp.o hpmaptype.o ht.o idc.o mba.o mt.o \ rk.o rl.o tm.o ts.o \ ! up.o upmaptype.o uba.o uda.o ut.o tmscp.o # These drivers don't have ecc correction and bad sector forwarding; # they are placed in the file system boot area for 750's. If your # root has bad sectors you can try and squeeze the newer drivers in... *************** *** 32,38 **** all: ${ALL} ! ${LIBSA}: sys.o conf.o ${DRIVERS} prf.o machdep.o dkbad.o ar crv ${LIBSA} $? ranlib ${LIBSA} --- 32,38 ---- all: ${ALL} ! ${LIBSA}: sys.o conf.o ${DRIVERS} prf.o machdep.o dkbad.o strings.o ar crv ${LIBSA} $? ranlib ${LIBSA} //E*O*F stand.Makefile.diff// echo x - stand.autoconf.c.diff cat > "stand.autoconf.c.diff" << '//E*O*F stand.autoconf.c.diff//' *** /usr/tmp/autoconf.c Wed Dec 9 14:38:25 1987 --- autoconf.c Wed Dec 9 14:31:56 1987 *************** *** 51,56 **** --- 51,70 ---- #undef UTR #undef UMA + /* + * The map registers start right at 20088000 on the + * ka630, so we have to subtract out the 2k offset to make + * the pointers work ... + */ + #define UTR(i) ((struct uba_regs *)((caddr_t) (NEX630+(i))-0x800)) + #define UMA ((caddr_t)UMEM630) + + struct uba_regs *ubaddr630[] = { UTR(0) }; + caddr_t umaddr630[] = { UMA }; + + #undef UTR + #undef UMA + configure() { union cpusid cpusid; *************** *** 82,87 **** --- 96,107 ---- umaddr = umaddr730; nmba = nuba = 0; break; + + case VAX_630: + ubaddr = ubaddr630; + umaddr = umaddr630; + nmba = nuba = 0; + break; } /* * Forward into the past... *************** *** 96,101 **** --- 116,128 ---- ubaddr[i]->uba_cr = UBACR_ADINIT; if ((cpu != VAX_780) && (cpu != VAX_8600)) mtpr(IUR, 0); + /* + * enable external access to local memory + * - aka the interprocessor doorbell + * cf Emulex QD01/D disk controller technical manual, p 6-9 + */ + if (cpu == VAX_630) + *(ubamem(0,017777500)) = 0x20; /* give unibus devices a chance to recover... */ if (nuba > 0) DELAY(2000000); //E*O*F stand.autoconf.c.diff// echo x - stand.conf.c.diff cat > "stand.conf.c.diff" << '//E*O*F stand.conf.c.diff//' *** /usr/tmp/conf.c Wed Dec 9 14:38:26 1987 --- conf.c Wed Dec 9 14:31:57 1987 *************** *** 94,99 **** --- 94,102 ---- int idcstrategy(), idcopen(), idcioctl(); #endif int rlstrategy(), rlopen(), rlioctl(); + #if defined(VAX630) + int tmscpstrategy(), tmscpopen(), tmscpclose(); + #endif #ifndef BOOT int tmstrategy(), tmopen(), tmclose(); int tsstrategy(), tsopen(), tsclose(); *************** *** 117,122 **** --- 120,128 ---- { "rb", idcstrategy, idcopen, nullsys, idcioctl }, #endif { "rl", rlstrategy, rlopen, nullsys, rlioctl }, + #if defined(VAX630) + { "tk", tmscpstrategy, tmscpopen, tmscpclose, nullioctl }, + #endif #ifndef BOOT { "ts", tsstrategy, tsopen, tsclose, nullioctl }, #if defined(VAX780) || defined(VAX750) || defined(VAX8600) //E*O*F stand.conf.c.diff// echo x - stand.srt0.c.diff cat > "stand.srt0.c.diff" << '//E*O*F stand.srt0.c.diff//' *** /tmp/,RCSt1a19865 Tue Mar 22 17:22:57 1988 --- srt0.c Tue Mar 22 17:12:22 1988 *************** *** 3,9 * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. * ! * @(#)srt0.c 7.1 (Berkeley) 6/5/86 */ #include "../vax/mtpr.h" --- 3,9 ----- * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. * ! * @(#)srt0.c 7.3 (Berkeley) 4/2/87 */ #include "../vax/mtpr.h" *************** *** 23,28 .globl _configure .globl _cpu .globl _openfirst .set HIGH,31 # mask for total disable --- 23,30 ----- .globl _configure .globl _cpu .globl _openfirst + .globl _boothowto + .globl _bootdev .set HIGH,31 # mask for total disable *************** *** 27,33 .set HIGH,31 # mask for total disable entry: .globl entry ! .word 0x0 mtpr $HIGH,$IPL # just in case #ifdef REL movl $RELOC,sp --- 29,35 ----- .set HIGH,31 # mask for total disable entry: .globl entry ! nop; nop # .word 0x0101 mtpr $HIGH,$IPL # just in case #ifdef REL *************** *** 29,34 entry: .globl entry .word 0x0 mtpr $HIGH,$IPL # just in case #ifdef REL movl $RELOC,sp #else --- 31,37 ----- entry: .globl entry nop; nop # .word 0x0101 mtpr $HIGH,$IPL # just in case + #ifdef REL # we need to do special stuff on microvax II mfpr $SID,r0 *************** *** 30,35 .word 0x0 mtpr $HIGH,$IPL # just in case #ifdef REL movl $RELOC,sp #else movl $RELOC-0x2400,sp --- 33,65 ----- mtpr $HIGH,$IPL # just in case #ifdef REL + # we need to do special stuff on microvax II + mfpr $SID,r0 + cmpzv $24,$8,r0,$VAX_630 + bneq 1f + + /* + * Were we booted by VMB? If so, r11 is not boothowto, + * but rather the address of the `Extended RPB' (see KA630 + * User's Manual, pp 3-21). These tests were devised by + * richl@tektronix, 11/10/87. + */ + cmpl (r11),r11 # if boothowto, r11 will be small + bneq 1f # and these will not fault + cmpl 4(r11),$0 + bneq 1f + cmpl 8(r11),$-1 + bneq 1f + tstl 0xc(r11) + bneq 1f + + /* + * Booted by VMB: get flags from extended rpb. + * We can only guess at the boot device (here ra(0,0)). + */ + movl 0x30(r11),r11 + movl $9,r10 # device = ra(0,0) + 1: movl $RELOC,sp #else movl $RELOC-0x2400,sp *************** *** 35,40 movl $RELOC-0x2400,sp #endif start: movl aedata,r0 clr: clrl (r0)+ --- 65,74 ----- movl $RELOC-0x2400,sp #endif start: + #ifndef REL + /* + * Clear bss segment + */ movl aedata,r0 clr: clrl (r0)+ *************** *** 40,51 clrl (r0)+ cmpl r0,sp jlss clr ! #ifdef REL ! movc3 aedata,*$0,(sp) ! /* ! * Reclear bss segment separately from text and data ! * since movc3 can't move more than 64K bytes ! */ dclr: clrl (r3)+ cmpl r3,$_end --- 74,86 ----- clrl (r0)+ cmpl r0,sp jlss clr ! #else ! /* ! * `entry' below generates a pc-relative reference to the ! * code, so this works no matter where we are now. ! * Clear bss segment *after* moving text and data. ! */ ! movc3 aedata,entry,(sp) dclr: clrl (r3)+ cmpl r3,$_end *************** *** 58,63 jmp *abegin begin: #endif mtpr $0,$SCBB calls $0,_configure movl $1,_openfirst --- 93,101 ----- jmp *abegin begin: #endif + movl r11,_boothowto + movl r10,_bootdev + again: mtpr $0,$SCBB calls $0,_configure movl $1,_openfirst *************** *** 62,69 calls $0,_configure movl $1,_openfirst calls $0,_main ! #ifndef TP ! jmp start #else ret #endif --- 100,107 ----- calls $0,_configure movl $1,_openfirst calls $0,_main ! #ifdef REL ! jmp again #else ret #endif *************** *** 75,80 #else aedata: .long _edata #endif __rtt: .word 0x0 --- 113,121 ----- #else aedata: .long _edata #endif + _bootdev: .long 0 + _boothowto: .long 0 + .text __rtt: .word 0x0 *************** *** 84,89 jmp start #endif .globl _badloc _badloc: .word 0 --- 125,131 ----- jmp start #endif + .globl _badaddr .globl _badloc _badloc: _badaddr: *************** *** 86,91 .globl _badloc _badloc: .word 0 movl $1,r0 movl 4(ap),r3 --- 128,134 ----- .globl _badaddr .globl _badloc _badloc: + _badaddr: .word 0 movl $1,r0 movl 4(ap),r3 *************** *** 89,94 .word 0 movl $1,r0 movl 4(ap),r3 movl $4,r2 movab 9f,(r2) tstl (r3) --- 132,138 ----- .word 0 movl $1,r0 movl 4(ap),r3 + movl 8(ap),r4 movl $4,r2 movab 9f,(r2) bbc $0,r4,1f; tstb (r3) *************** *** 91,97 movl 4(ap),r3 movl $4,r2 movab 9f,(r2) ! tstl (r3) 1: clrl r0 # made it w/o machine checks 2: movl $4,r2 clrl (r2) --- 135,143 ----- movl 8(ap),r4 movl $4,r2 movab 9f,(r2) ! bbc $0,r4,1f; tstb (r3) ! 1: bbc $1,r4,1f; tstw (r3) ! 1: bbc $2,r4,1f; tstl (r3) 1: clrl r0 # made it w/o machine checks 2: movl $4,r2 clrl (r2) *************** *** 104,109 .word 5f-0b # 2 is 750 .word 5f-0b # 3 is 730 .word 6f-0b # 4 is 8600 5: mtpr $0xf,$MCESR brb 1f --- 150,159 ----- .word 5f-0b # 2 is 750 .word 5f-0b # 3 is 730 .word 6f-0b # 4 is 8600 + .word 5f-0b # 5 is 8200 + .word 1f-0b # 6 is 8800 + .word 1f-0b # 7 is 610 + .word 5f-0b # 8 is 630 5: mtpr $0xf,$MCESR brb 1f *************** *** 116,118 addl2 (sp)+,sp # discard mchchk trash movab 2b,(sp) rei --- 166,206 ----- addl2 (sp)+,sp # discard mchchk trash movab 2b,(sp) rei + + /* + * Short assembly versions of strcmp, strcpy, and strlen + * that do not use special instructions. + */ + .globl _strcmp + _strcmp: + .word 0 + movq 4(ap),r0 + 0: cmpb (r0),(r1)+ + bneq 1f + tstb (r0)+ + bneq 0b + clrl r0 + ret + 1: cvtbl (r0),r0 + cvtbl -(r1),r1 + subl2 r1,r0 + ret + + .globl _strcpy + _strcpy: + .word 0 + movq 4(ap),r0 + 0: movb (r1)+,(r0)+ + bneq 0b + movl 4(ap),r0 + ret + + .globl _strlen + _strlen: + .word 0 + movl 4(ap),r0 + 0: tstb (r0)+ + bneq 0b + decl r0 + subl2 4(ap),r0 + ret //E*O*F stand.srt0.c.diff// echo x - stand.tmscp.c.diff cat > "stand.tmscp.c.diff" << '//E*O*F stand.tmscp.c.diff//' *** /usr/tmp/tmscp.c Wed Dec 9 14:38:32 1987 --- tmscp.c Wed Dec 9 14:31:58 1987 *************** *** 46,53 **** #include "../machine/pte.h" #include "../h/param.h" ! #include "../h/gnode.h" ! #include "../h/devio.h" #include "savax.h" --- 46,53 ---- #include "../machine/pte.h" #include "../h/param.h" ! #include "../h/inode.h" ! #include "../h/fs.h" #include "savax.h" *************** *** 177,182 **** --- 177,188 ---- _stop("tms: bad offset"); else if (io->i_boff > 0) /* + * rewind tape -- incidentally clears serious exception, + * if present + */ + tmscprew(io); + + /* * Skip forward the appropriate number of files on the tape. */ { *************** *** 193,202 **** tmscpclose(io) register struct iob *io; { ! tmscpcmd(M_OP_REPOS, M_MD_REWND); } - /* * Set up tmscp command packet. Cause the controller to poll to pick up * the command. --- 199,224 ---- tmscpclose(io) register struct iob *io; { ! tmscprew(io); } + + /* + * rewind the tape. Clear the serious exception that may have occured if we + * hit EOF previously. + */ + tmscprew(io) + register struct iob *io; + { + tmscp.tmscp_cmd.mscp_unit = io->i_unit; + tmscp.tmscp_cmd.mscp_buffer = 0; + tmscp.tmscp_cmd.mscp_bytecnt = 0; + if (tmscpcmd(M_OP_REPOS, M_MD_REWND|M_MD_CLSEX) == 0) { + printf("tms: rewind failed\n"); + return(1); + } + return(0); + } /* * Set up tmscp command packet. Cause the controller to poll to pick up * the command. *************** *** 281,291 **** ubafree(io, ubinfo); /* * Detect hitting tape mark so we do it gracefully and return a ! * character count of 0 to signify end of copy. Rewind the tape ! * before returning. */ ! if ((mp->mscp_status & M_ST_MASK) == M_ST_TAPEM) return(0); return(io->i_cc); } --- 303,315 ---- ubafree(io, ubinfo); /* * Detect hitting tape mark so we do it gracefully and return a ! * character count of 0 to signify end of copy. Clear the exception ! * and rewind before returning. */ ! if ((mp->mscp_status & M_ST_MASK) == M_ST_TAPEM) { ! tmscprew(io); return(0); + } return(io->i_cc); } //E*O*F stand.tmscp.c.diff// echo x - stand.uda.c.diff cat > "stand.uda.c.diff" << '//E*O*F stand.uda.c.diff//' *** /usr/tmp/uda.c Wed Dec 9 14:38:34 1987 --- uda.c Wed Dec 9 14:31:59 1987 *************** *** 7,12 **** --- 7,20 ---- */ /* + * decided NOT to put an RCS header into standalone code -- don't know how + * critical space may be ... + * + * $Header: uda.c,v 1.1 87/03/27 16:26:37 richl Exp $ + * + */ + + /* * UDA50/RAxx disk device driver */ #include "../machine/pte.h" *************** *** 48,62 **** int ra25_off[] = { 0, 15884, 0, -1, -1, -1, 25916, -1 }; int ra60_off[] = { 0, 15884, 0, 49324, 131404, 49324, 242606, 49324 }; int ra80_off[] = { 0, 15884, 0, -1, 49324, 49324, 49910, 131404 }; - #ifndef UCBRA - #ifdef RA_COMPAT - int ra81_off[] = { 0, 16422, 0, 49324, 131404, 412490, 375564, 83538 }; - #else - int ra81_off[] = { 0, 16422, 0, 375564, 391986, 699720, 375564, 83538 }; - #endif - #else int ra81_off[] = { 0, 15884, 0, 242606, 258490, 565690, 242606, 49324 }; ! #endif struct mscp *udcmd(); static int ratype[NRA]; --- 56,64 ---- int ra25_off[] = { 0, 15884, 0, -1, -1, -1, 25916, -1 }; int ra60_off[] = { 0, 15884, 0, 49324, 131404, 49324, 242606, 49324 }; int ra80_off[] = { 0, 15884, 0, -1, 49324, 49324, 49910, 131404 }; int ra81_off[] = { 0, 15884, 0, 242606, 258490, 565690, 242606, 49324 }; ! int rd52_off[] = { 0, 15884, 0, -1, -1, -1, 25650, -1 }; ! int rd53_off[] = { 0, 15884, 0, -1, 0, 33440, 49324, 15884 }; struct mscp *udcmd(); static int ratype[NRA]; *************** *** 128,133 **** --- 130,141 ---- break; case 81: off = ra81_off[io->i_boff]; + break; + case 52: + off = rd52_off[io->i_boff]; + break; + case 53: + off = rd53_off[io->i_boff]; break; default: printf("uda%d: don't support ra%d's\n", i, ratype[i]); //E*O*F stand.uda.c.diff// exit 0