1 /* 2 * Copyright (c) 1980,1986 Regents of the University of California. 3 * All rights reserved. The Berkeley software License Agreement 4 * specifies the terms and conditions for redistribution. 5 */ 6 7 /* "@(#)hpboot.c 7.2 (Berkeley) 08/28/86" */ 8 #include <sys/disklabel.h> 9 10 11 /* 12 * RP??/RM?? 1st level boot program: loads next 7.5Kbytes from 13 * boot sectors of file system and sets it up to run. 14 * Reads from the controller and drive passed in from the boot 15 * rom. 16 * R1: address of the boot device's adapter 17 * R2: controller number of the boot device 18 * R3: unit number of the boot device 19 * R5: software boot control flags 20 * R6: address of driver subroutine from ROM 21 * SP: base address of usable memory + 0x200 22 */ 23 .set BOOTSIZE,15 /* size of boot in sectors */ 24 .set RELOC,0x70000 25 /* MBA registers */ 26 .set M_cr,4 /* MBA control reg */ 27 .set M_sr,8 /* MBA status reg */ 28 .set M_var,12 /* MBA virt addr reg */ 29 .set M_bc,16 /* MBA byte count reg */ 30 .set M_map,0x800 /* start of MBA map reg's */ 31 .set MBAinit,1 /* MBA init bit in MBA control reg */ 32 .set MBABUSY,0x80000000 /* MBA SR: data transfer busy */ 33 .set pMBABUSY,31 /* bit position of MBABUSY */ 34 /* Drive information */ 35 .set RP,0x400 /* start of drive registers */ 36 .set RPDR,0x80 /* offset per drive unit */ 37 .set RP_cr,0 /* control status register */ 38 .set RP_sr,4 /* drive status reg */ 39 .set RP_stk,0x14 /* desired track/sector reg */ 40 .set RP_dt,0x18 /* drive type reg */ 41 .set RP_off,0x24 /* RP offset reg */ 42 .set RP_cyl,0x28 /* desired cyl reg */ 43 .set RPBPSECT,512 /* bytes per sector */ 44 /* RP?? function codes, status bits */ 45 .set RP_GO,1 /* go */ 46 .set RP_RED,070 /* read */ 47 .set RP_DC,010 /* drive clear */ 48 .set RP_RIP,020 /* read in preset */ 49 .set RP_FMT,0x1000 /* format 22 */ 50 .set RP_MOL,0x1000 /* medium on line */ 51 .set RP_DRY,0200 /* drive ready */ 52 .set RP_ERR,040000 /* composite error */ 53 .set RP_pDRY,7 /* bit position of RP_DRY */ 54 .set RP_pERR,14 /* bit position of RP_ERR */ 55 56 init: 57 .word 0 /* entry mask for DEC monitor */ 58 nop;nop;nop;nop;nop;nop;nop;nop /* some no-ops for 750 boot to skip */ 59 nop;nop; 60 start: 61 clrl r10 /* major("/dev/hp0a") */ 62 extzv $13,$2,r1,r4 /* get MBA number from R1 */ 63 insv r4,$24,$8,r10 /* set MBA number */ 64 insv r3,$16,$8,r10 /* drive number */ 65 extzv $12,$4,r5,r4 /* get partition from r5 */ 66 bicw2 $0xf000,r5 /* remove from r5 */ 67 insv r4,$8,$4,r10 /* set partition */ 68 movl r5,r11 69 movl r1,r9 /* save adaptor address */ 70 movl r3,r8 /* and unit number */ 71 brw start0 72 73 /* 74 * Leave space for pack label. 75 */ 76 pad: 77 .space LABELOFFSET - (pad - init) 78 packlabel: 79 .space d_end_ 80 81 start0: 82 movl $RELOC,sp 83 moval init,r6 84 movc3 $end,(r6),(sp) 85 jmp *$RELOC+start1 86 /* running relocated */ 87 start1: 88 movl $MBAinit,M_cr(r9) 89 /* read-in-preset the drive and set format */ 90 mull2 $RPDR,r8 91 movab RP(r9)[r8],r8 92 movl $RP_RIP+RP_GO,RP_cr(r8) 93 movl $RP_FMT,RP_off(r8) 94 95 .set PROGSIZE,(BOOTSIZE*RPBPSECT) 96 start2: 97 movl $0,RP_cyl(r8) 98 movl $1,RP_stk(r8) 99 movl $-PROGSIZE,M_bc(r9) 100 /* set up MASSBUS map for DMA */ 101 clrl r0 102 1: 103 bisl3 $0x80000000,r0,M_map(r9)[r0] 104 aobleq $BOOTSIZE,r0,1b 105 clrl M_var(r9) 106 movl $RP_RED+RP_GO,RP_cr(r8) 107 rprdy: 108 movl RP_sr(r8),r0 109 bbc $RP_pDRY,r0,rprdy 110 bbs $RP_pERR,r0,rperr 111 rprdy2: 112 bbs $pMBABUSY,M_sr(r9),rprdy2 113 114 /* Eagles are too fast for the controller. Slow the thing down. */ 115 /* (May not be needed with wait for mba above.) */ 116 clrl r3 117 buzz: acbl $2000,$1,r3,buzz 118 bicpsw $2 119 jbr clear 120 rperr: 121 halt 122 /* clear core and execute program */ 123 clear: 124 movl $PROGSIZE,r3 125 clrcor: 126 clrq (r3) 127 acbl $RELOC,$8,r3,clrcor 128 /* run loaded program */ 129 calls $0,*$0 130 brw start2 131 132 end: 133