xref: /original-bsd/sys/vax/mdec/hpboot.c (revision e59fb703)
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