srt0.S revision 1.11 1 1.11 thorpej /* $NetBSD: srt0.S,v 1.11 1999/12/14 20:57:44 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.9 thorpej STACK = 0xfffff000 /* below the ROM page */
56 1.1 thorpej BOOTTYPE = 0xfffffdc0
57 1.1 thorpej LOWRAM = 0xfffffdce
58 1.9 thorpej SYSFLAG = 0xfffffed2 /* system flags */
59 1.9 thorpej MSUS = 0xfffffedc /* MSUS (?) structure */
60 1.9 thorpej VECTORS = 0xfffffee0 /* beginning of jump vectors */
61 1.9 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.9 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.10 thorpej movl #STACK,%sp
86 1.10 thorpej moveq #47,%d0 /* # of vectors - 1 */
87 1.10 thorpej movl #VECTORS+2,%a0 /* addr part of first vector */
88 1.3 thorpej 1:
89 1.10 thorpej movl #_ASM_LABEL(__trap),%a0@ /* make it direct to __trap */
90 1.10 thorpej addql #6,%a0 /* move to next vector addr */
91 1.10 thorpej dbf %d0,1b /* go til done */
92 1.8 thorpej #ifdef ITECONSOLE
93 1.10 thorpej movl #NMIRESET,%a0 /* NMI keyboard reset addr */
94 1.10 thorpej movl #nmi,%a0@ /* catch in reset routine */
95 1.8 thorpej #else
96 1.8 thorpej /*
97 1.8 thorpej * Built without ITE console support; leave the ROM's NMI
98 1.8 thorpej * vector in place, so the system will still reset if a
99 1.8 thorpej * keyboard NMI is issued.
100 1.8 thorpej */
101 1.8 thorpej #endif
102 1.3 thorpej
103 1.1 thorpej /*
104 1.3 thorpej * Determine our SPU type and look for internal HP-IB
105 1.1 thorpej */
106 1.10 thorpej lea _C_LABEL(machineid),%a0
107 1.10 thorpej movl #0x808,%d0
108 1.10 thorpej movc %d0,%cacr /* clear and disable on-chip cache(s) */
109 1.10 thorpej movl #0x200,%d0 /* data freeze bit */
110 1.10 thorpej movc %d0,%cacr /* only exists on 68030 */
111 1.10 thorpej movc %cacr,%d0 /* read it back */
112 1.10 thorpej tstl %d0 /* zero? */
113 1.9 thorpej jeq not68030 /* yes, we have 68020/68040 */
114 1.3 thorpej
115 1.10 thorpej movl #0x808,%d0
116 1.10 thorpej movc %d0,%cacr /* clear data freeze bit again */
117 1.3 thorpej
118 1.3 thorpej /*
119 1.3 thorpej * 68030 models
120 1.3 thorpej */
121 1.1 thorpej
122 1.9 thorpej movl #0x80,MMUCMD /* set magic cookie */
123 1.10 thorpej movl MMUCMD,%d0 /* read it back */
124 1.10 thorpej btst #7,%d0 /* cookie still on? */
125 1.9 thorpej jeq not370 /* no, 360 or 375 */
126 1.10 thorpej movl #HP_370,%a0@ /* consider a 370 for now */
127 1.9 thorpej movl #0,MMUCMD /* clear magic cookie */
128 1.10 thorpej movl MMUCMD,%d0 /* read it back */
129 1.10 thorpej btst #7,%d0 /* still on? */
130 1.9 thorpej jeq ihpibcheck /* no, a 370 */
131 1.10 thorpej movl #HP_340,%a0@ /* yes, must be a 340 */
132 1.1 thorpej jra ihpibcheck
133 1.3 thorpej
134 1.1 thorpej not370:
135 1.10 thorpej movl #HP_360,%a0@ /* type is at least a 360 */
136 1.9 thorpej movl #0,MMUCMD /* clear magic cookie2 */
137 1.10 thorpej movl MMUCMD,%d0 /* read it back */
138 1.10 thorpej btst #16,%d0 /* still on? */
139 1.9 thorpej jeq ihpibcheck /* no, a 360 */
140 1.10 thorpej lea _C_LABEL(mmuid),%a0
141 1.10 thorpej lsrl #MMUID_SHIFT,%d0 /* save MMU ID */
142 1.10 thorpej andl #MMUID_MASK,%d0
143 1.10 thorpej movl %d0,%a0@
144 1.10 thorpej lea _C_LABEL(machineid),%a0
145 1.10 thorpej cmpb #MMUID_345,%d0 /* are we a 345? */
146 1.3 thorpej jeq isa345
147 1.10 thorpej cmpb #MMUID_375,%d0 /* how about a 375? */
148 1.3 thorpej jeq isa375
149 1.10 thorpej movl #HP_400,%a0@ /* must be a 400 */
150 1.3 thorpej jra ihpibcheck
151 1.3 thorpej isa345:
152 1.10 thorpej movl #HP_345,%a0@
153 1.1 thorpej jra ihpibcheck
154 1.3 thorpej isa375:
155 1.10 thorpej movl #HP_375,%a0@
156 1.3 thorpej jra ihpibcheck
157 1.3 thorpej
158 1.3 thorpej /*
159 1.3 thorpej * End of 68030 section
160 1.3 thorpej */
161 1.3 thorpej
162 1.1 thorpej not68030:
163 1.10 thorpej bset #31,%d0 /* data cache enable bit */
164 1.10 thorpej movc %d0,%cacr /* only exists on 68040 */
165 1.10 thorpej movc %cacr,%d0 /* read it back */
166 1.10 thorpej tstl %d0 /* zero? */
167 1.9 thorpej beq is68020 /* yes, we have 68020 */
168 1.10 thorpej moveq #0,%d0 /* now turn it back off */
169 1.10 thorpej movec %d0,%cacr /* before we access any data */
170 1.9 thorpej
171 1.10 thorpej .long 0x4e7b0004 /* movc %d0,%itt0 */
172 1.10 thorpej .long 0x4e7b0005 /* movc %d0,%itt1 */
173 1.10 thorpej .long 0x4e7b0006 /* movc %d0,%dtt0 */
174 1.10 thorpej .long 0x4e7b0007 /* movc %d0,%dtt1 */
175 1.9 thorpej .word 0xf4d8 /* cinva bc */
176 1.3 thorpej
177 1.3 thorpej /*
178 1.3 thorpej * 68040 models
179 1.3 thorpej */
180 1.3 thorpej
181 1.10 thorpej lea _C_LABEL(mmuid),%a0
182 1.10 thorpej movl MMUCMD,%d0 /* get MMU ID */
183 1.10 thorpej lsrl #MMUID_SHIFT,%d0
184 1.10 thorpej andl #MMUID_MASK,%d0
185 1.10 thorpej movl %d0,%a0@ /* save it */
186 1.10 thorpej lea _C_LABEL(machineid),%a0
187 1.10 thorpej cmpb #MMUID_425_T,%d0 /* are we a 425t? */
188 1.3 thorpej jeq isa425
189 1.10 thorpej cmpb #MMUID_425_S,%d0 /* how about 425s? */
190 1.3 thorpej jeq isa425
191 1.10 thorpej cmpb #MMUID_425_E,%d0 /* or maybe a 425e? */
192 1.6 thorpej jeq isa425
193 1.10 thorpej cmpb #MMUID_433_T,%d0 /* or a 433t? */
194 1.3 thorpej jeq isa433
195 1.10 thorpej cmpb #MMUID_433_S,%d0 /* or a 433s? */
196 1.3 thorpej jeq isa433
197 1.10 thorpej cmpb #MMUID_385,%d0 /* or a 385? */
198 1.6 thorpej jeq isa385
199 1.10 thorpej movl #HP_380,%a0@ /* guess we are a 380 */
200 1.1 thorpej jra ihpibcheck
201 1.3 thorpej isa425:
202 1.10 thorpej movl #HP_425,%a0@
203 1.1 thorpej jra ihpibcheck
204 1.3 thorpej isa433:
205 1.10 thorpej movl #HP_433,%a0@
206 1.6 thorpej jra ihpibcheck
207 1.6 thorpej isa385:
208 1.10 thorpej movl #HP_385,%a0@
209 1.3 thorpej jra ihpibcheck
210 1.3 thorpej
211 1.3 thorpej /*
212 1.3 thorpej * End 68040 section
213 1.3 thorpej */
214 1.3 thorpej
215 1.3 thorpej /*
216 1.3 thorpej * 68020 models
217 1.3 thorpej */
218 1.3 thorpej
219 1.1 thorpej is68020:
220 1.10 thorpej movl #HP_330,%a0@ /* consider a 330 for now */
221 1.9 thorpej movl #1,MMUCMD /* a 68020, write HP MMU location */
222 1.10 thorpej movl MMUCMD,%d0 /* read it back */
223 1.10 thorpej btst #0,%d0 /* zero? */
224 1.9 thorpej jeq ihpibcheck /* yes, a 330 */
225 1.10 thorpej movl #HP_320,%a0@ /* no, consider a 320 for now */
226 1.9 thorpej movl #0x80,MMUCMD /* set magic cookie */
227 1.10 thorpej movl MMUCMD,%d0 /* read it back */
228 1.10 thorpej btst #7,%d0 /* cookie still on? */
229 1.9 thorpej jeq ihpibcheck /* no, just a 320 */
230 1.10 thorpej movl #HP_350,%a0@ /* yes, a 350 */
231 1.3 thorpej
232 1.3 thorpej /*
233 1.3 thorpej * End 68020 section
234 1.3 thorpej */
235 1.3 thorpej
236 1.1 thorpej ihpibcheck:
237 1.9 thorpej movl #0,MMUCMD /* make sure MMU is off */
238 1.9 thorpej btst #5,SYSFLAG /* do we have an internal HP-IB? */
239 1.9 thorpej jeq boottype /* yes, continue */
240 1.9 thorpej clrl _C_LABEL(internalhpib) /* no, clear the internal address */
241 1.1 thorpej /*
242 1.1 thorpej * If this is a reboot, extract howto/bootdev stored by kernel
243 1.1 thorpej */
244 1.1 thorpej boottype:
245 1.9 thorpej cmpw #12,BOOTTYPE /* is this a reboot (REQ_REBOOT)? */
246 1.9 thorpej jne notreboot /* no, skip */
247 1.10 thorpej lea MAXADDR,%a0 /* find last page */
248 1.10 thorpej movl %a0@+,%d7 /* and extract howto, bootdev */
249 1.10 thorpej movl %a0@+,%d6 /* from where doboot() left them */
250 1.1 thorpej jra boot1
251 1.1 thorpej /*
252 1.1 thorpej * At this point we do not know which logical device the MSUS select
253 1.1 thorpej * code refers to so we cannot construct bootdev. So we just punt
254 1.1 thorpej * and let configure() construct it.
255 1.1 thorpej */
256 1.1 thorpej notreboot:
257 1.10 thorpej moveq #0,%d6 /* make sure bootdev is invalid */
258 1.9 thorpej cmpw #18,BOOTTYPE /* does the user want to interact? */
259 1.9 thorpej jeq askme /* yes, go to it */
260 1.10 thorpej moveq #0,%d7 /* default to RB_AUTOBOOT */
261 1.1 thorpej jra boot1
262 1.1 thorpej askme:
263 1.10 thorpej moveq #3,%d7 /* default to RB_SINGLE|RB_ASKNAME */
264 1.1 thorpej boot1:
265 1.10 thorpej movl %d6,_C_LABEL(bootdev) /* save bootdev and howto */
266 1.10 thorpej movl %d7,_C_LABEL(howto) /* globally so all can access */
267 1.10 thorpej movl LOWRAM,%d0 /* read lowram value from bootrom */
268 1.2 thorpej /*
269 1.2 thorpej * Must preserve the scratch area for the BOOT ROM.
270 1.2 thorpej * Round up to the next 8k boundary.
271 1.2 thorpej */
272 1.10 thorpej addl #((2*NBPG)-1),%d0
273 1.10 thorpej andl #-(2*NBPG),%d0
274 1.10 thorpej movl %d0,_C_LABEL(lowram) /* stash that value */
275 1.1 thorpej start:
276 1.10 thorpej movl #_C_LABEL(edata),%a2 /* start of BSS */
277 1.10 thorpej movl #_C_LABEL(end),%a3 /* end */
278 1.3 thorpej 1:
279 1.10 thorpej clrb %a2@+ /* clear BSS */
280 1.10 thorpej cmpl %a2,%a3 /* done? */
281 1.9 thorpej bne 1b /* no, keep going */
282 1.9 thorpej jsr _C_LABEL(configure) /* configure critical devices */
283 1.9 thorpej jsr _C_LABEL(main) /* lets go */
284 1.3 thorpej GLOBAL(_rtt)
285 1.9 thorpej movl #3,_C_LABEL(howto) /* restarts get RB_SINGLE|RB_ASKNAME */
286 1.1 thorpej jmp start
287 1.1 thorpej
288 1.1 thorpej /*
289 1.1 thorpej * probe a location and see if it causes a bus error
290 1.1 thorpej */
291 1.3 thorpej ENTRY_NOPROFILE(badaddr)
292 1.9 thorpej movl BUSERR,_C_LABEL(_bsave) /* save ROM bus error handler address */
293 1.10 thorpej movl %sp,_C_LABEL(_ssave) /* and current stack pointer */
294 1.9 thorpej movl #catchbad,BUSERR /* plug in our handler */
295 1.10 thorpej movl %sp@(4),%a0 /* address to probe */
296 1.10 thorpej movw %a0@,%d1 /* do it */
297 1.9 thorpej movl _C_LABEL(_bsave),BUSERR /* if we got here, it did not fault */
298 1.10 thorpej clrl %d0 /* return that this was not a bad */
299 1.9 thorpej /* addr */
300 1.1 thorpej rts
301 1.1 thorpej
302 1.1 thorpej catchbad:
303 1.9 thorpej movl _C_LABEL(_bsave),BUSERR /* got a bus error, so restore */
304 1.9 thorpej /* old handler */
305 1.10 thorpej movl _C_LABEL(_ssave),%sp /* manually restore stack */
306 1.10 thorpej moveq #1,%d0 /* indicate that we got a fault */
307 1.9 thorpej rts /* return to caller of badaddr() */
308 1.1 thorpej
309 1.3 thorpej .data
310 1.3 thorpej GLOBAL(_bsave)
311 1.1 thorpej .long 0
312 1.3 thorpej
313 1.3 thorpej GLOBAL(_ssave)
314 1.1 thorpej .long 0
315 1.1 thorpej
316 1.3 thorpej ASENTRY_NOPROFILE(__trap)
317 1.10 thorpej moveml #0xFFFF,%sp@- /* save registers */
318 1.10 thorpej movl %sp,%sp@- /* push pointer to frame */
319 1.9 thorpej jsr _C_LABEL(trap) /* call C routine to deal with it */
320 1.10 thorpej tstl %d0
321 1.1 thorpej jeq Lstop
322 1.10 thorpej addql #4,%sp
323 1.10 thorpej moveml %sp@+,#0x7FFF
324 1.10 thorpej addql #8,%sp
325 1.1 thorpej rte
326 1.1 thorpej Lstop:
327 1.9 thorpej stop #0x2700 /* stop cold */
328 1.1 thorpej
329 1.8 thorpej #ifdef ITECONSOLE
330 1.3 thorpej ASENTRY_NOPROFILE(nmi)
331 1.9 thorpej movw #18,BOOTTYPE /* mark as system switch */
332 1.9 thorpej jsr _C_LABEL(kbdnmi) /* clear the interrupt, and */
333 1.9 thorpej /* reset the system */
334 1.9 thorpej stop #0 /* SCREEEECH! */
335 1.8 thorpej #endif
336 1.3 thorpej
337 1.3 thorpej ENTRY_NOPROFILE(call_req_reboot)
338 1.9 thorpej jmp 0x1A4 /* call ROM reboot function */
339 1.9 thorpej rts /* XXX: just in case? */
340 1.1 thorpej
341 1.3 thorpej ENTRY_NOPROFILE(romout)
342 1.10 thorpej movl %sp@(4),%d0 /* line number */
343 1.10 thorpej movl %sp@(8),%a0 /* string */
344 1.9 thorpej jsr 0x150 /* do it */
345 1.1 thorpej rts
346 1.11 thorpej
347 1.11 thorpej /*
348 1.11 thorpej * _transfer(entry, howto, opendev, conscode, lowram, esym)
349 1.11 thorpej *
350 1.11 thorpej * Transfer control to the kernel. We also set up registers
351 1.11 thorpej * as older kernels expect.
352 1.11 thorpej */
353 1.11 thorpej ENTRY_NOPROFILE(_transfer)
354 1.11 thorpej movl %sp@(8),%d7 /* howto */
355 1.11 thorpej movl %sp@(12),%d6 /* opendev (compat) */
356 1.11 thorpej movl %sp@(16),%d5 /* conscode (compat) */
357 1.11 thorpej movl %sp@(20),%a5 /* lowram */
358 1.11 thorpej movl %sp@(24),%a4 /* esym (compat) */
359 1.11 thorpej
360 1.11 thorpej movl %sp@(4),%a0 /* load entry point */
361 1.11 thorpej jbsr %a0@ /* GO! */
362