start.S revision 1.2 1 /* $NetBSD: start.S,v 1.2 2003/11/10 08:51:52 wiz Exp $ */
2 /*
3 * Copyright (c) 1995 Ludd, University of Lule}, Sweden.
4 * All rights reserved.
5 *
6 * This code is derived from software contributed to Ludd by
7 * Bertram Barth.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. All advertising materials mentioning features or use of this software
18 * must display the following acknowledgement:
19 * This product includes software developed at Ludd, University of
20 * Lule}, Sweden and its contributors.
21 * 4. The name of the author may not be used to endorse or promote products
22 * derived from this software without specific prior written permission
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
25 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
26 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
27 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
28 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
29 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
33 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 */
35
36 /* All bugs are subject to removal without further notice */
37
38
39 #define _LOCORE
40
41 #include "sys/disklabel.h"
42
43 #include "../include/mtpr.h"
44 #include "../include/asm.h"
45
46 _C_LABEL(_start):
47 _C_LABEL(start):
48 .globl _C_LABEL(start) # this is the symbolic name for the start
49 .globl _C_LABEL(_start) # of code to be relocated. We can use this
50 # to get the actual/real address (pc-rel)
51 # or to get the relocated address (abs).
52
53 .org 0x00 # uVAX booted from TK50 starts here
54 brb from_0x00 # continue behind dispatch-block
55
56 .org 0x02 # information used by uVAX-ROM
57 .byte 0xcf # offset in words to identification area
58 .byte 1 # this byte must be 1
59 .word 0 # logical block number (word swapped)
60 .word 0 # of the secondary image
61
62 .org 0x08 #
63 brb from_0x08 # skip ...
64
65 .org 0x0C # 11/750 & 8200 starts here
66 movzbl $1,_C_LABEL(from)# We booted from "old" rom.
67 brw cont_750
68
69
70 from_0x00: # uVAX from TK50
71 brw start_uvax # all uVAXen continue there
72
73 from_0x08: # Any machine from VMB
74 movzbl $4,_C_LABEL(from) # Booted from full VMB
75 brw start_vmb
76
77 # the complete area reserved for label
78 # must be empty (i.e. filled with zeroes).
79 # disklabel(8) checks that before installing
80 # the bootblocks over existing label.
81
82 .org LABELOFFSET
83 .globl _C_LABEL(romlabel)
84 _C_LABEL(romlabel):
85 .long 0
86
87 .org LABELOFFSET + d_end_
88 start_vmb:
89 /*
90 * Read in block 1-15.
91 */
92 movl 52(%r11), %r7 # load iovec/bqo into %r7
93 addl3 (%r7), %r7, %r6 # load qio into %r6
94 pushl %r11 # base of rpb
95 pushl $0 # virtual-flag
96 pushl $33 # read-logical-block
97 pushl $1 # lbn to start reading
98 pushl $7680 # number of bytes to read
99 pushab start_uvax # buffer-address
100 calls $6, (%r6) # call the qio-routine
101 brw start_uvax
102
103 /*
104 * Parameter block for uVAX boot.
105 */
106 #define VOLINFO 0 /* 1=single-sided 81=double-sided volumes */
107 #define SISIZE 16 /* size in blocks of secondary image */
108 #define SILOAD 0 /* load offset (usually 0) from the default */
109 #define SIOFF 0x200 /* byte offset into secondary image */
110
111 .org 0x19e
112 .byte 0x18 # must be 0x18
113 .byte 0x00 # must be 0x00 (MBZ)
114 .byte 0x00 # any value
115 .byte 0xFF - (0x18 + 0x00 + 0x00)
116 /* 4th byte holds 1s' complement of sum of previous 3 bytes */
117
118 .byte 0x00 # must be 0x00 (MBZ)
119 .byte VOLINFO
120 .byte 0x00 # any value
121 .byte 0x00 # any value
122
123 .long SISIZE # size in blocks of secondary image
124 .long SILOAD # load offset (usually 0)
125 .long SIOFF # byte offset into secondary image
126 .long (SISIZE + SILOAD + SIOFF) # sum of previous 3
127
128
129 .align 2
130 .globl _C_LABEL(from)
131 _C_LABEL(from):
132 .long 0
133
134 /*
135 * After bootblock (LBN0) has been loaded into the first page
136 * of good memory by 11/750's ROM-code (transfer address
137 * of bootblock-code is: base of good memory + 0x0C) registers
138 * are initialized as:
139 * R0: type of boot-device
140 * 0: Massbus device
141 * 1: RK06/RK07
142 * 2: RL02
143 * 17: UDA50
144 * 35: TK50
145 * 64: TU58
146 * R1: (UBA) address of UNIBUS I/O-page
147 * (MBA) address of boot device's adapter
148 * R2: (UBA) address of the boot device's CSR
149 * (MBA) controller number of boot device
150 * R6: address of driver subroutine in ROM
151 *
152 * cont_750 reads in LBN1-15 for further execution.
153 */
154 cont_750:
155 movl $_C_LABEL(start), %sp # move stack to avoid clobbering the code
156 pushr $0x131 # save clobbered registers
157 clrl %r4 # %r4 == # of blocks transferred
158 movab _C_LABEL(start),%r5 # %r5 have base address for next transfer
159 pushl %r5 # ...on stack also (Why?)
160 1: incl %r4 # increment block count
161 movl %r4,%r8 # LBN is in %r8 for rom routine
162 addl2 $0x200,%r5 # Increase address for next read
163 cmpl $16,%r4 # read 15 blocks?
164 beql 2f # Yep
165 movl %r5,(%sp) # move address to stack also
166 jsb (%r6) # read 512 bytes
167 blbs %r0,1b # jump if read succeeded
168 halt # otherwise die...
169 2: tstl (%sp)+ # remove boring arg from stack
170 popr $0x131 # restore clobbered registers
171 brw start_all # Ok, continue...
172
173 /* uVAX main entry is at the start of the second disk block. This is
174 * needed for multi-arch CD booting where multiple architecture need
175 * to shove stuff in boot block 0.
176 */
177 .org 0x200 # uVAX booted from disk starts here
178
179 start_uvax:
180 movzbl $2,_C_LABEL(from) # Booted from subset-VMB
181 brb start_all
182
183 /*
184 * start_all: stack already at RELOC, we save registers, move ourself
185 * to RELOC and loads boot.
186 */
187 start_all:
188 movl $_C_LABEL(start), %sp # move stack to a better
189 pushr $0x1fff # save all regs, used later.
190
191 subl3 $_C_LABEL(start), $_C_LABEL(edata), %r0
192 # get size of text+data (w/o bss)
193 moval _C_LABEL(start), %r1 # get actual base-address of code
194 subl3 $_C_LABEL(start), $_C_LABEL(end), %r2
195 # get complete size (incl. bss)
196 movl $_C_LABEL(start), %r3 # get relocated base-address of code
197 movc5 %r0, (%r1), $0, %r2, (%r3) # copy code to new location
198
199 movpsl -(%sp)
200 movl $relocated, -(%sp) # return-address on top of stack
201 rei # can be replaced with new address
202 relocated: # now relocation is done !!!
203 movl %sp, _C_LABEL(bootregs)
204 calls $0, _C_LABEL(Xmain) # call Xmain (gcc workaround)which is
205 halt # not intended to return ...
206
207 /*
208 * hoppabort() is called when jumping to the newly loaded program.
209 */
210 ENTRY(hoppabort, 0)
211 movl 4(%ap),%r6
212 movl _C_LABEL(rpb),%r11
213 mnegl $1,%ap # Hack to figure out boot device.
214 movpsl -(%sp)
215 pushab 2(%r6)
216 mnegl $1,_C_LABEL(vax_load_failure)
217 rei
218 # calls $0,(%r6)
219 halt
220
221 ENTRY(unit_init, R6|R7|R8|R9|R10|R11)
222 mfpr $17,%r7 # Wanted bu KDB
223 movl 4(%ap),%r0 # init routine address
224 movl 8(%ap),%r9 # RPB in %r9
225 movl 12(%ap),%r1 # VMB argument list
226 callg (%r1),(%r0)
227 ret
228
229 # A bunch of functions unwanted in boot blocks.
230 ENTRY(getchar, 0)
231 halt
232
233 #ifndef USE_PRINTF
234 ENTRY(putchar, 0)
235 ret
236
237 ENTRY(printf, 0)
238 ret
239 #endif
240
241 ENTRY(panic, 0)
242 halt
243