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