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