Commit | Line | Data |
---|---|---|
b1078c35 | 1 | /* |
a6f89995 | 2 | * Copyright (c) 1980,1986 Regents of the University of California. |
b1078c35 KM |
3 | * All rights reserved. The Berkeley software License Agreement |
4 | * specifies the terms and conditions for redistribution. | |
5 | */ | |
6 | ||
70385c9b MK |
7 | /* "@(#)hpboot.c 7.2 (Berkeley) %G%" */ |
8 | #include <sys/disklabel.h> | |
b1078c35 | 9 | |
71b1fc7a SL |
10 | |
11 | /* | |
12 | * RP??/RM?? 1st level boot program: loads next 7.5Kbytes from | |
a6f89995 MK |
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 | |
71b1fc7a SL |
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 */ | |
a6f89995 | 27 | .set M_sr,8 /* MBA status reg */ |
71b1fc7a SL |
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 */ | |
a6f89995 MK |
32 | .set MBABUSY,0x80000000 /* MBA SR: data transfer busy */ |
33 | .set pMBABUSY,31 /* bit position of MBABUSY */ | |
71b1fc7a SL |
34 | /* Drive information */ |
35 | .set RP,0x400 /* start of drive registers */ | |
a6f89995 MK |
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 */ | |
71b1fc7a SL |
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: | |
a6f89995 MK |
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 */ | |
a6f89995 MK |
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 */ | |
71b1fc7a | 68 | movl r5,r11 |
a6f89995 MK |
69 | movl r1,r9 /* save adaptor address */ |
70 | movl r3,r8 /* and unit number */ | |
70385c9b MK |
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: | |
71b1fc7a SL |
82 | movl $RELOC,sp |
83 | moval init,r6 | |
84 | movc3 $end,(r6),(sp) | |
85 | jmp *$RELOC+start1 | |
86 | /* running relocated */ | |
87 | start1: | |
71b1fc7a SL |
88 | movl $MBAinit,M_cr(r9) |
89 | /* read-in-preset the drive and set format */ | |
a6f89995 MK |
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) | |
71b1fc7a SL |
94 | |
95 | .set PROGSIZE,(BOOTSIZE*RPBPSECT) | |
96 | start2: | |
a6f89995 MK |
97 | movl $0,RP_cyl(r8) |
98 | movl $1,RP_stk(r8) | |
71b1fc7a SL |
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) | |
a6f89995 | 106 | movl $RP_RED+RP_GO,RP_cr(r8) |
71b1fc7a | 107 | rprdy: |
a6f89995 | 108 | movl RP_sr(r8),r0 |
71b1fc7a SL |
109 | bbc $RP_pDRY,r0,rprdy |
110 | bbs $RP_pERR,r0,rperr | |
a6f89995 MK |
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.) */ | |
9b9c54f6 | 116 | clrl r3 |
9b9c54f6 | 117 | buzz: acbl $2000,$1,r3,buzz |
71b1fc7a SL |
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 */ | |
71b1fc7a SL |
129 | calls $0,*$0 |
130 | brw start2 | |
131 | ||
71b1fc7a | 132 | end: |