srt0.S revision 1.7 1 1.7 thorpej /* $NetBSD: srt0.S,v 1.7 1999/07/31 17:20:22 thorpej Exp $ */
2 1.1 thorpej
3 1.1 thorpej /*
4 1.1 thorpej * Copyright (c) 1988 University of Utah.
5 1.1 thorpej * Copyright (c) 1982, 1990, 1993
6 1.1 thorpej * The Regents of the University of California. All rights reserved.
7 1.1 thorpej *
8 1.1 thorpej * This code is derived from software contributed to Berkeley by
9 1.1 thorpej * the Systems Programming Group of the University of Utah Computer
10 1.1 thorpej * Science Department.
11 1.1 thorpej *
12 1.1 thorpej * Redistribution and use in source and binary forms, with or without
13 1.1 thorpej * modification, are permitted provided that the following conditions
14 1.1 thorpej * are met:
15 1.1 thorpej * 1. Redistributions of source code must retain the above copyright
16 1.1 thorpej * notice, this list of conditions and the following disclaimer.
17 1.1 thorpej * 2. Redistributions in binary form must reproduce the above copyright
18 1.1 thorpej * notice, this list of conditions and the following disclaimer in the
19 1.1 thorpej * documentation and/or other materials provided with the distribution.
20 1.1 thorpej * 3. All advertising materials mentioning features or use of this software
21 1.1 thorpej * must display the following acknowledgement:
22 1.1 thorpej * This product includes software developed by the University of
23 1.1 thorpej * California, Berkeley and its contributors.
24 1.1 thorpej * 4. Neither the name of the University nor the names of its contributors
25 1.1 thorpej * may be used to endorse or promote products derived from this software
26 1.1 thorpej * without specific prior written permission.
27 1.1 thorpej *
28 1.1 thorpej * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
29 1.1 thorpej * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
30 1.1 thorpej * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
31 1.1 thorpej * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
32 1.1 thorpej * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33 1.1 thorpej * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
34 1.1 thorpej * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
35 1.1 thorpej * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
36 1.1 thorpej * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
37 1.1 thorpej * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
38 1.1 thorpej * SUCH DAMAGE.
39 1.1 thorpej *
40 1.1 thorpej * from: Utah $Hdr: srt0.c 1.18 92/12/21$
41 1.1 thorpej *
42 1.1 thorpej * @(#)srt0.c 8.1 (Berkeley) 6/10/93
43 1.1 thorpej */
44 1.1 thorpej
45 1.1 thorpej /*
46 1.1 thorpej * Startup code for standalone system
47 1.1 thorpej */
48 1.1 thorpej
49 1.3 thorpej /* For machineid and mmuid constants */
50 1.3 thorpej #include <machine/hp300spu.h>
51 1.1 thorpej
52 1.3 thorpej /* For _C_LABEL() and friends. */
53 1.3 thorpej #include <machine/asm.h>
54 1.3 thorpej
55 1.3 thorpej STACK = 0xfffff000 | below the ROM page
56 1.1 thorpej BOOTTYPE = 0xfffffdc0
57 1.1 thorpej LOWRAM = 0xfffffdce
58 1.3 thorpej SYSFLAG = 0xfffffed2 | system flags
59 1.3 thorpej MSUS = 0xfffffedc | MSUS (?) structure
60 1.3 thorpej VECTORS = 0xfffffee0 | beginning of jump vectors
61 1.3 thorpej NMIRESET = 0xffffff9c | reset vector
62 1.1 thorpej BUSERR = 0xfffffffc
63 1.1 thorpej MAXADDR = 0xfffff000
64 1.1 thorpej NBPG = 4096
65 1.3 thorpej MMUCMD = 0x005f400c | MMU command/status register
66 1.1 thorpej
67 1.1 thorpej .data
68 1.3 thorpej GLOBAL(bootdev)
69 1.1 thorpej .long 0
70 1.3 thorpej
71 1.3 thorpej GLOBAL(howto)
72 1.1 thorpej .long 0
73 1.3 thorpej
74 1.3 thorpej GLOBAL(lowram)
75 1.1 thorpej .long 0
76 1.3 thorpej
77 1.3 thorpej GLOBAL(machineid)
78 1.1 thorpej .long 0
79 1.1 thorpej
80 1.7 thorpej GLOBAL(mmuid)
81 1.7 thorpej .long 0
82 1.7 thorpej
83 1.1 thorpej .text
84 1.3 thorpej ASENTRY_NOPROFILE(begin)
85 1.1 thorpej movl #STACK,sp
86 1.3 thorpej moveq #47,d0 | # of vectors - 1
87 1.3 thorpej movl #VECTORS+2,a0 | addr part of first vector
88 1.3 thorpej 1:
89 1.3 thorpej movl #_ASM_LABEL(__trap),a0@ | make it direct to __trap
90 1.3 thorpej addql #6,a0 | move to next vector addr
91 1.3 thorpej dbf d0,1b | go til done
92 1.3 thorpej movl #NMIRESET,a0 | NMI keyboard reset addr
93 1.3 thorpej movl #nmi,a0@ | catch in reset routine
94 1.3 thorpej
95 1.1 thorpej /*
96 1.3 thorpej * Determine our SPU type and look for internal HP-IB
97 1.1 thorpej */
98 1.3 thorpej lea _C_LABEL(machineid),a0
99 1.1 thorpej movl #0x808,d0
100 1.3 thorpej movc d0,cacr | clear and disable on-chip cache(s)
101 1.3 thorpej movl #0x200,d0 | data freeze bit
102 1.3 thorpej movc d0,cacr | only exists on 68030
103 1.3 thorpej movc cacr,d0 | read it back
104 1.3 thorpej tstl d0 | zero?
105 1.3 thorpej jeq not68030 | yes, we have 68020/68040
106 1.3 thorpej
107 1.1 thorpej movl #0x808,d0
108 1.3 thorpej movc d0,cacr | clear data freeze bit again
109 1.3 thorpej
110 1.3 thorpej /*
111 1.3 thorpej * 68030 models
112 1.3 thorpej */
113 1.1 thorpej
114 1.3 thorpej movl #0x80,MMUCMD | set magic cookie
115 1.3 thorpej movl MMUCMD,d0 | read it back
116 1.3 thorpej btst #7,d0 | cookie still on?
117 1.3 thorpej jeq not370 | no, 360 or 375
118 1.3 thorpej movl #HP_370,a0@ | consider a 370 for now
119 1.3 thorpej movl #0,MMUCMD | clear magic cookie
120 1.3 thorpej movl MMUCMD,d0 | read it back
121 1.3 thorpej btst #7,d0 | still on?
122 1.3 thorpej jeq ihpibcheck | no, a 370
123 1.3 thorpej movl #HP_340,a0@ | yes, must be a 340
124 1.1 thorpej jra ihpibcheck
125 1.3 thorpej
126 1.1 thorpej not370:
127 1.3 thorpej movl #HP_360,a0@ | type is at least a 360
128 1.3 thorpej movl #0,MMUCMD | clear magic cookie2
129 1.3 thorpej movl MMUCMD,d0 | read it back
130 1.3 thorpej btst #16,d0 | still on?
131 1.3 thorpej jeq ihpibcheck | no, a 360
132 1.7 thorpej lea _C_LABEL(mmuid),a0
133 1.3 thorpej lsrl #MMUID_SHIFT,d0 | save MMU ID
134 1.3 thorpej andl #MMUID_MASK,d0
135 1.7 thorpej movl d0,a0@
136 1.7 thorpej lea _C_LABEL(machineid),a0
137 1.3 thorpej cmpb #MMUID_345,d0 | are we a 345?
138 1.3 thorpej jeq isa345
139 1.3 thorpej cmpb #MMUID_375,d0 | how about a 375?
140 1.3 thorpej jeq isa375
141 1.3 thorpej movl #HP_400,a0@ | must be a 400
142 1.3 thorpej jra ihpibcheck
143 1.3 thorpej isa345:
144 1.3 thorpej movl #HP_345,a0@
145 1.1 thorpej jra ihpibcheck
146 1.3 thorpej isa375:
147 1.3 thorpej movl #HP_375,a0@
148 1.3 thorpej jra ihpibcheck
149 1.3 thorpej
150 1.3 thorpej /*
151 1.3 thorpej * End of 68030 section
152 1.3 thorpej */
153 1.3 thorpej
154 1.1 thorpej not68030:
155 1.3 thorpej bset #31,d0 | data cache enable bit
156 1.3 thorpej movc d0,cacr | only exists on 68040
157 1.3 thorpej movc cacr,d0 | read it back
158 1.3 thorpej tstl d0 | zero?
159 1.3 thorpej beq is68020 | yes, we have 68020
160 1.3 thorpej moveq #0,d0 | now turn it back off
161 1.3 thorpej movec d0,cacr | before we access any data
162 1.3 thorpej
163 1.3 thorpej .long 0x4e7b0004 | movc d0,itt0
164 1.3 thorpej .long 0x4e7b0005 | movc d0,itt1
165 1.3 thorpej .long 0x4e7b0006 | movc d0,dtt0
166 1.3 thorpej .long 0x4e7b0007 | movc d0,dtt1
167 1.3 thorpej .word 0xf4d8 | cinva bc
168 1.3 thorpej
169 1.3 thorpej /*
170 1.3 thorpej * 68040 models
171 1.3 thorpej */
172 1.3 thorpej
173 1.7 thorpej lea _C_LABEL(mmuid),a0
174 1.3 thorpej movl MMUCMD,d0 | get MMU ID
175 1.3 thorpej lsrl #MMUID_SHIFT,d0
176 1.3 thorpej andl #MMUID_MASK,d0
177 1.7 thorpej movl d0,a0@ | save it
178 1.7 thorpej lea _C_LABEL(machineid),a0
179 1.3 thorpej cmpb #MMUID_425_T,d0 | are we a 425t?
180 1.3 thorpej jeq isa425
181 1.3 thorpej cmpb #MMUID_425_S,d0 | how about 425s?
182 1.3 thorpej jeq isa425
183 1.6 thorpej cmpb #MMUID_425_E,d0 | or maybe a 425e?
184 1.6 thorpej jeq isa425
185 1.3 thorpej cmpb #MMUID_433_T,d0 | or a 433t?
186 1.3 thorpej jeq isa433
187 1.6 thorpej cmpb #MMUID_433_S,d0 | or a 433s?
188 1.3 thorpej jeq isa433
189 1.6 thorpej cmpb #MMUID_385,d0 | or a 385?
190 1.6 thorpej jeq isa385
191 1.5 he movl #HP_380,a0@ | guess we are a 380
192 1.1 thorpej jra ihpibcheck
193 1.3 thorpej isa425:
194 1.3 thorpej movl #HP_425,a0@
195 1.1 thorpej jra ihpibcheck
196 1.3 thorpej isa433:
197 1.3 thorpej movl #HP_433,a0@
198 1.6 thorpej jra ihpibcheck
199 1.6 thorpej isa385:
200 1.6 thorpej movl #HP_385,a0@
201 1.3 thorpej jra ihpibcheck
202 1.3 thorpej
203 1.3 thorpej /*
204 1.3 thorpej * End 68040 section
205 1.3 thorpej */
206 1.3 thorpej
207 1.3 thorpej /*
208 1.3 thorpej * 68020 models
209 1.3 thorpej */
210 1.3 thorpej
211 1.1 thorpej is68020:
212 1.3 thorpej movl #HP_330,a0@ | consider a 330 for now
213 1.3 thorpej movl #1,MMUCMD | a 68020, write HP MMU location
214 1.3 thorpej movl MMUCMD,d0 | read it back
215 1.3 thorpej btst #0,d0 | zero?
216 1.3 thorpej jeq ihpibcheck | yes, a 330
217 1.3 thorpej movl #HP_320,a0@ | no, consider a 320 for now
218 1.3 thorpej movl #0x80,MMUCMD | set magic cookie
219 1.3 thorpej movl MMUCMD,d0 | read it back
220 1.3 thorpej btst #7,d0 | cookie still on?
221 1.3 thorpej jeq ihpibcheck | no, just a 320
222 1.3 thorpej movl #HP_350,a0@ | yes, a 350
223 1.3 thorpej
224 1.3 thorpej /*
225 1.3 thorpej * End 68020 section
226 1.3 thorpej */
227 1.3 thorpej
228 1.1 thorpej ihpibcheck:
229 1.3 thorpej movl #0,MMUCMD | make sure MMU is off
230 1.3 thorpej btst #5,SYSFLAG | do we have an internal HP-IB?
231 1.3 thorpej jeq boottype | yes, continue
232 1.3 thorpej clrl _C_LABEL(internalhpib) | no, clear the internal address
233 1.1 thorpej /*
234 1.1 thorpej * If this is a reboot, extract howto/bootdev stored by kernel
235 1.1 thorpej */
236 1.1 thorpej boottype:
237 1.3 thorpej cmpw #12,BOOTTYPE | is this a reboot (REQ_REBOOT)?
238 1.3 thorpej jne notreboot | no, skip
239 1.3 thorpej lea MAXADDR,a0 | find last page
240 1.3 thorpej movl a0@+,d7 | and extract howto, bootdev
241 1.3 thorpej movl a0@+,d6 | from where doboot() left them
242 1.1 thorpej jra boot1
243 1.1 thorpej /*
244 1.1 thorpej * At this point we do not know which logical device the MSUS select
245 1.1 thorpej * code refers to so we cannot construct bootdev. So we just punt
246 1.1 thorpej * and let configure() construct it.
247 1.1 thorpej */
248 1.1 thorpej notreboot:
249 1.3 thorpej moveq #0,d6 | make sure bootdev is invalid
250 1.3 thorpej cmpw #18,BOOTTYPE | does the user want to interact?
251 1.3 thorpej jeq askme | yes, go to it
252 1.3 thorpej moveq #0,d7 | default to RB_AUTOBOOT
253 1.1 thorpej jra boot1
254 1.1 thorpej askme:
255 1.3 thorpej moveq #3,d7 | default to RB_SINGLE|RB_ASKNAME
256 1.1 thorpej boot1:
257 1.3 thorpej movl d6,_C_LABEL(bootdev) | save bootdev and howto
258 1.3 thorpej movl d7,_C_LABEL(howto) | globally so all can access
259 1.3 thorpej movl LOWRAM,d0 | read lowram value from bootrom
260 1.2 thorpej /*
261 1.2 thorpej * Must preserve the scratch area for the BOOT ROM.
262 1.2 thorpej * Round up to the next 8k boundary.
263 1.2 thorpej */
264 1.2 thorpej addl #((2*NBPG)-1),d0
265 1.2 thorpej andl #-(2*NBPG),d0
266 1.3 thorpej movl d0,_C_LABEL(lowram) | stash that value
267 1.1 thorpej start:
268 1.3 thorpej movl #_C_LABEL(edata),a2 | start of BSS
269 1.3 thorpej movl #_C_LABEL(end),a3 | end
270 1.3 thorpej 1:
271 1.3 thorpej clrb a2@+ | clear BSS
272 1.3 thorpej cmpl a2,a3 | done?
273 1.3 thorpej bne 1b | no, keep going
274 1.3 thorpej jsr _C_LABEL(configure) | configure critical devices
275 1.3 thorpej jsr _C_LABEL(main) | lets go
276 1.3 thorpej GLOBAL(_rtt)
277 1.3 thorpej movl #3,_C_LABEL(howto) | restarts get RB_SINGLE|RB_ASKNAME
278 1.1 thorpej jmp start
279 1.1 thorpej
280 1.1 thorpej /*
281 1.1 thorpej * probe a location and see if it causes a bus error
282 1.1 thorpej */
283 1.3 thorpej ENTRY_NOPROFILE(badaddr)
284 1.3 thorpej movl BUSERR,_C_LABEL(_bsave) | save ROM bus error handler address
285 1.3 thorpej movl sp,_C_LABEL(_ssave) | and current stack pointer
286 1.3 thorpej movl #catchbad,BUSERR | plug in our handler
287 1.3 thorpej movl sp@(4),a0 | address to probe
288 1.3 thorpej movw a0@,d1 | do it
289 1.3 thorpej movl _C_LABEL(_bsave),BUSERR | if we got here, it did not fault
290 1.3 thorpej clrl d0 | return that this was not a bad addr
291 1.1 thorpej rts
292 1.1 thorpej
293 1.1 thorpej catchbad:
294 1.3 thorpej movl _C_LABEL(_bsave),BUSERR | got a bus error, so restore
295 1.3 thorpej | old handler
296 1.3 thorpej movl _C_LABEL(_ssave),sp | manually restore stack
297 1.3 thorpej moveq #1,d0 | indicate that we got a fault
298 1.3 thorpej rts | return to caller of badaddr()
299 1.1 thorpej
300 1.3 thorpej .data
301 1.3 thorpej GLOBAL(_bsave)
302 1.1 thorpej .long 0
303 1.3 thorpej
304 1.3 thorpej GLOBAL(_ssave)
305 1.1 thorpej .long 0
306 1.1 thorpej
307 1.3 thorpej ASENTRY_NOPROFILE(__trap)
308 1.3 thorpej moveml #0xFFFF,sp@- | save registers
309 1.3 thorpej movl sp,sp@- | push pointer to frame
310 1.3 thorpej jsr _C_LABEL(trap) | call C routine to deal with it
311 1.1 thorpej tstl d0
312 1.1 thorpej jeq Lstop
313 1.1 thorpej addql #4,sp
314 1.1 thorpej moveml sp@+,#0x7FFF
315 1.1 thorpej addql #8,sp
316 1.1 thorpej rte
317 1.1 thorpej Lstop:
318 1.3 thorpej stop #0x2700 | stop cold
319 1.1 thorpej
320 1.3 thorpej ASENTRY_NOPROFILE(nmi)
321 1.3 thorpej movw #18,BOOTTYPE | mark as system switch
322 1.4 thorpej jsr _C_LABEL(kbdnmi) | clear the interrupt, and
323 1.4 thorpej | reset the system
324 1.4 thorpej stop #0 | SCREEEECH!
325 1.3 thorpej
326 1.3 thorpej ENTRY_NOPROFILE(call_req_reboot)
327 1.3 thorpej jmp 0x1A4 | call ROM reboot function
328 1.3 thorpej rts | XXX: just in case?
329 1.1 thorpej
330 1.3 thorpej ENTRY_NOPROFILE(romout)
331 1.3 thorpej movl sp@(4),d0 | line number
332 1.3 thorpej movl sp@(8),a0 | string
333 1.3 thorpej jsr 0x150 | do it
334 1.1 thorpej rts
335