V8/usr/sys/boot/bb/hpboot.s
/*
* RP??/RM?? disk boot program to load "/boot" from
* a UNIX filesystem (starting at block 1 on pack on
* drive 0) into low core and to execute that file.
* This program can only read regular small version 7 files
* from the root of a UNIX filesystem.
*/
.set BLKSIZ,1024 /* file system block size */
.set RELOC,0x70000
.set HDRSIZ,040
.set INOSIZ,64 /* no. bytes/inode entry */
.set INOBLK,BLKSIZ/INOSIZ /* no. inodes/disc block */
.set INOMSK,0xfffffff0 /* changes with inode size */
.set NAMSIZ,14 /* bytes in directory name */
.set ENTADR,024 /* offset to entry addr in a.out */
.set DIRSIZ,16 /* size of directory entry, bytes */
.set ROOTINO,2 /* root dir inode no. */
.set NBOO,1
.set NSUP,1
/* MBA registers */
.set M_cr,4 /* MBA control reg */
.set M_var,12 /* MBA virt addr reg */
.set M_bc,16 /* MBA byte count reg */
.set M_map,0x800 /* start of MBA map reg's */
.set MBAinit,1 /* MBA init bit in MBA control reg */
/* Drive information */
.set RP6TRK,19
.set RP6SEC,22
.set RM3SEC,32
.set RM3TRK,5
.set RM5SEC,32
.set RM5TRK,19
.set RM80SEC,31
.set RM80TRK,14
.set RP7TRK,32
.set RP7SEC,50
.set RP6typ,022
.set RM3typ,024
.set RM5typ,027
.set RM80typ,026
.set RP7typ,042
.set RP,0x400 /* start of drive registers */
.set RP_cr,RP+0 /* control status register */
.set RP_sr,RP+4 /* drive status reg */
.set RP_stk,RP+0x14 /* desired track/sector reg */
.set RP_dt,RP+0x18 /* drive type reg */
.set RP_off,RP+0x24 /* RP offset reg */
.set RP_cyl,RP+0x28 /* desired cyl reg */
/* RP06 function codes, status bits */
.set RP_GO,1 /* go */
.set RP_RED,070 /* read */
.set RP_DC,010 /* drive clear */
.set RP_RIP,020 /* read in preset */
.set RP_FMT,0x1000 /* format 22 */
.set RP_MOL,0x1000 /* medium on line */
.set RP_DRY,0200 /* drive ready */
.set RP_ERR,040000 /* composite error */
.set RP_pDRY,7 /* bit position of RP_DRY */
.set RP_pERR,14 /* bit position of RP_ERR */
init:
.word 0 /* entry mask for DEC monitor */
nop;nop;nop;nop;nop;nop;nop;nop /* some no-ops for 750 boot to skip */
nop;nop;
start:
movl r5,r11
movl $RELOC,sp
moval init,r6
movc3 $end,(r6),(sp)
jmp *$RELOC+start1
/* running relocated */
start1:
/* get cpu type */
.set SID,0x3e
mfpr $SID,r0
extzv $24,$8,r0,r0
ashl $2,r0,r1
/* get mba location and init it */
moval physMBA,r2
addl3 r1,r2,r3
movl (r3),r9
movl $MBAinit,M_cr(r9)
/* read-in-preset the drive and set format */
movl $RP_RIP+RP_GO,RP_cr(r9)
movl $RP_FMT,RP_off(r9)
/* get drive type */
movl RP_dt(r9),r0
cmpb $RP6typ,r0; bneq 1f; movzwl $(RP6SEC<<8)|RP6TRK,r1; 1:
cmpb $RM3typ,r0; bneq 1f; movzwl $(RM3SEC<<8)|RM3TRK,r1; 1:
cmpb $RM5typ,r0; bneq 1f; movzwl $(RM5SEC<<8)|RM5TRK,r1; 1:
cmpb $RM80typ,r0; bneq 1f; movzwl $(RM80SEC<<8)|RM80TRK,r1; 1:
cmpb $RP7typ,r0; bneq 1f; movzwl $(RP7SEC<<8)|RP7TRK,r1; 1:
movzbl r1,*$rptrk
ashl $-8,r1,r1
movzbl r1,*$rpsec
mull3 *$rpsec,*$rptrk,*$rpst
start2:
/* search for ``boot'' program in root inode */
movl $names+RELOC,r6
movzbl $ROOTINO,r0
nxti:
clrw *$bno
bsbw iget
tstb (r6)
beql getfil
get1b:
bsbw rmblk
beql start2
movl $buf,r7
nxtent:
tstw (r7)
beql dirchk
cmpc3 $NAMSIZ,(r6),2(r7)
bneq dirchk
movzwl (r7),r0
addl2 $NAMSIZ,r6
brb nxti
dirchk:
acbl $buf+BLKSIZ-1,$DIRSIZ,r7,nxtent
brb get1b
/* found inode, get desired file */
getfil:
clrl bufptr
getlop:
bsbb rmblk
beql clear
addl2 $BLKSIZ,bufptr
brb getlop
/* clear core and execute program */
clear:
movl *$size,r3
clrcor:
clrq (r3)
acbl $RELOC,$8,r3,clrcor
/* run loaded program */
clrl r10 /* major("/dev/hp0a") */
calls $0,*$0
brw start2
/* iget: get inode whose number is in r0 */
iget:
addl3 $(INOBLK*(NBOO+NSUP))-1,r0,r8
divl3 $INOBLK,r8,r4
bsbw rblk
bicl2 $INOMSK,r8
mull2 $INOSIZ,r8
addl2 $buf,r8
movc3 $time-inode,(r8),*$inode
rsb
/* rmblk: read block bno into addr */
rmblk:
movzwl *$bno,r0
addw2 $3,*$bno
addl2 $addr,r0
/* this boot assumes only small files (<=20 blocks) */
extzv $0,$24,(r0),r4
bneq rblk
rsb
/* rblk: read block in r4 */
rblk:
mull2 $BLKSIZ/512,r4
clrl r5
ediv *$rpst,r4,RP_cyl(r9),r1
clrl r2
ediv *$rpsec,r1,r1,r0
insv r1,$8,$5,r0
movl r0,RP_stk(r9)
movl $-BLKSIZ,M_bc(r9)
ashl $-9,bufptr,r0
bisl3 $0x80000000,r0,M_map(r9)
incl r0
bisl3 $0x80000000,r0,M_map+4(r9)
clrl M_var(r9)
movl $RP_RED+RP_GO,RP_cr(r9)
rprdy:
movl RP_sr(r9),r0
bbc $RP_pDRY,r0,rprdy
bbs $RP_pERR,r0,rperr
bicpsw $2
rsb
rperr:
halt
bufptr: .long buf
names:
.byte 'b,'o,'o,'t,0,0,0,0,0,0,0,0,0,0
.byte 0
.align 2
physMBA:
.long 0
.long 0x20010000
.long 0xf28000
end:
.set buf,RELOC-1536
.set inode,RELOC-512
.set mode,inode
.set nlink,mode+2
.set uid,nlink+2
.set gid,uid+2
.set size,gid+2
.set addr,size+4
.set time,addr+40
.set bno,time+12
.set rptrk,bno+4
.set rpsec,rptrk+4
.set rpst,rpsec+4