12faf5ee6Smckusick /* 27a4751a2Skarels * Copyright (c) 1980,1986 Regents of the University of California. 32faf5ee6Smckusick * All rights reserved. The Berkeley software License Agreement 42faf5ee6Smckusick * specifies the terms and conditions for redistribution. 52faf5ee6Smckusick */ 62faf5ee6Smckusick 7*8f26171aSkarels /* "@(#)hpboot.c 7.2 (Berkeley) 08/28/86" */ 8*8f26171aSkarels #include <sys/disklabel.h> 92faf5ee6Smckusick 104a4da72bSsam 114a4da72bSsam /* 124a4da72bSsam * RP??/RM?? 1st level boot program: loads next 7.5Kbytes from 137a4751a2Skarels * boot sectors of file system and sets it up to run. 147a4751a2Skarels * Reads from the controller and drive passed in from the boot 157a4751a2Skarels * rom. 167a4751a2Skarels * R1: address of the boot device's adapter 177a4751a2Skarels * R2: controller number of the boot device 187a4751a2Skarels * R3: unit number of the boot device 197a4751a2Skarels * R5: software boot control flags 207a4751a2Skarels * R6: address of driver subroutine from ROM 217a4751a2Skarels * SP: base address of usable memory + 0x200 224a4da72bSsam */ 234a4da72bSsam .set BOOTSIZE,15 /* size of boot in sectors */ 244a4da72bSsam .set RELOC,0x70000 254a4da72bSsam /* MBA registers */ 264a4da72bSsam .set M_cr,4 /* MBA control reg */ 277a4751a2Skarels .set M_sr,8 /* MBA status reg */ 284a4da72bSsam .set M_var,12 /* MBA virt addr reg */ 294a4da72bSsam .set M_bc,16 /* MBA byte count reg */ 304a4da72bSsam .set M_map,0x800 /* start of MBA map reg's */ 314a4da72bSsam .set MBAinit,1 /* MBA init bit in MBA control reg */ 327a4751a2Skarels .set MBABUSY,0x80000000 /* MBA SR: data transfer busy */ 337a4751a2Skarels .set pMBABUSY,31 /* bit position of MBABUSY */ 344a4da72bSsam /* Drive information */ 354a4da72bSsam .set RP,0x400 /* start of drive registers */ 367a4751a2Skarels .set RPDR,0x80 /* offset per drive unit */ 377a4751a2Skarels .set RP_cr,0 /* control status register */ 387a4751a2Skarels .set RP_sr,4 /* drive status reg */ 397a4751a2Skarels .set RP_stk,0x14 /* desired track/sector reg */ 407a4751a2Skarels .set RP_dt,0x18 /* drive type reg */ 417a4751a2Skarels .set RP_off,0x24 /* RP offset reg */ 427a4751a2Skarels .set RP_cyl,0x28 /* desired cyl reg */ 434a4da72bSsam .set RPBPSECT,512 /* bytes per sector */ 444a4da72bSsam /* RP?? function codes, status bits */ 454a4da72bSsam .set RP_GO,1 /* go */ 464a4da72bSsam .set RP_RED,070 /* read */ 474a4da72bSsam .set RP_DC,010 /* drive clear */ 484a4da72bSsam .set RP_RIP,020 /* read in preset */ 494a4da72bSsam .set RP_FMT,0x1000 /* format 22 */ 504a4da72bSsam .set RP_MOL,0x1000 /* medium on line */ 514a4da72bSsam .set RP_DRY,0200 /* drive ready */ 524a4da72bSsam .set RP_ERR,040000 /* composite error */ 534a4da72bSsam .set RP_pDRY,7 /* bit position of RP_DRY */ 544a4da72bSsam .set RP_pERR,14 /* bit position of RP_ERR */ 554a4da72bSsam 564a4da72bSsam init: 574a4da72bSsam .word 0 /* entry mask for DEC monitor */ 584a4da72bSsam nop;nop;nop;nop;nop;nop;nop;nop /* some no-ops for 750 boot to skip */ 594a4da72bSsam nop;nop; 604a4da72bSsam start: 617a4751a2Skarels clrl r10 /* major("/dev/hp0a") */ 627a4751a2Skarels extzv $13,$2,r1,r4 /* get MBA number from R1 */ 637a4751a2Skarels insv r4,$24,$8,r10 /* set MBA number */ 647a4751a2Skarels insv r3,$16,$8,r10 /* drive number */ 657a4751a2Skarels extzv $12,$4,r5,r4 /* get partition from r5 */ 667a4751a2Skarels bicw2 $0xf000,r5 /* remove from r5 */ 677a4751a2Skarels insv r4,$8,$4,r10 /* set partition */ 684a4da72bSsam movl r5,r11 697a4751a2Skarels movl r1,r9 /* save adaptor address */ 707a4751a2Skarels movl r3,r8 /* and unit number */ 71*8f26171aSkarels brw start0 72*8f26171aSkarels 73*8f26171aSkarels /* 74*8f26171aSkarels * Leave space for pack label. 75*8f26171aSkarels */ 76*8f26171aSkarels pad: 77*8f26171aSkarels .space LABELOFFSET - (pad - init) 78*8f26171aSkarels packlabel: 79*8f26171aSkarels .space d_end_ 80*8f26171aSkarels 81*8f26171aSkarels start0: 824a4da72bSsam movl $RELOC,sp 834a4da72bSsam moval init,r6 844a4da72bSsam movc3 $end,(r6),(sp) 854a4da72bSsam jmp *$RELOC+start1 864a4da72bSsam /* running relocated */ 874a4da72bSsam start1: 884a4da72bSsam movl $MBAinit,M_cr(r9) 894a4da72bSsam /* read-in-preset the drive and set format */ 907a4751a2Skarels mull2 $RPDR,r8 917a4751a2Skarels movab RP(r9)[r8],r8 927a4751a2Skarels movl $RP_RIP+RP_GO,RP_cr(r8) 937a4751a2Skarels movl $RP_FMT,RP_off(r8) 944a4da72bSsam 954a4da72bSsam .set PROGSIZE,(BOOTSIZE*RPBPSECT) 964a4da72bSsam start2: 977a4751a2Skarels movl $0,RP_cyl(r8) 987a4751a2Skarels movl $1,RP_stk(r8) 994a4da72bSsam movl $-PROGSIZE,M_bc(r9) 1004a4da72bSsam /* set up MASSBUS map for DMA */ 1014a4da72bSsam clrl r0 1024a4da72bSsam 1: 1034a4da72bSsam bisl3 $0x80000000,r0,M_map(r9)[r0] 1044a4da72bSsam aobleq $BOOTSIZE,r0,1b 1054a4da72bSsam clrl M_var(r9) 1067a4751a2Skarels movl $RP_RED+RP_GO,RP_cr(r8) 1074a4da72bSsam rprdy: 1087a4751a2Skarels movl RP_sr(r8),r0 1094a4da72bSsam bbc $RP_pDRY,r0,rprdy 1104a4da72bSsam bbs $RP_pERR,r0,rperr 1117a4751a2Skarels rprdy2: 1127a4751a2Skarels bbs $pMBABUSY,M_sr(r9),rprdy2 1137a4751a2Skarels 1147a4751a2Skarels /* Eagles are too fast for the controller. Slow the thing down. */ 1157a4751a2Skarels /* (May not be needed with wait for mba above.) */ 116c65273c1Ssam clrl r3 117c65273c1Ssam buzz: acbl $2000,$1,r3,buzz 1184a4da72bSsam bicpsw $2 1194a4da72bSsam jbr clear 1204a4da72bSsam rperr: 1214a4da72bSsam halt 1224a4da72bSsam /* clear core and execute program */ 1234a4da72bSsam clear: 1244a4da72bSsam movl $PROGSIZE,r3 1254a4da72bSsam clrcor: 1264a4da72bSsam clrq (r3) 1274a4da72bSsam acbl $RELOC,$8,r3,clrcor 1284a4da72bSsam /* run loaded program */ 1294a4da72bSsam calls $0,*$0 1304a4da72bSsam brw start2 1314a4da72bSsam 1324a4da72bSsam end: 133