srt0.S revision 1.8 1 1.8 thorpej /* $NetBSD: srt0.S,v 1.8 1999/07/31 21:49:03 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.8 thorpej #ifdef ITECONSOLE
93 1.3 thorpej movl #NMIRESET,a0 | NMI keyboard reset addr
94 1.3 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.3 thorpej lea _C_LABEL(machineid),a0
107 1.1 thorpej movl #0x808,d0
108 1.3 thorpej movc d0,cacr | clear and disable on-chip cache(s)
109 1.3 thorpej movl #0x200,d0 | data freeze bit
110 1.3 thorpej movc d0,cacr | only exists on 68030
111 1.3 thorpej movc cacr,d0 | read it back
112 1.3 thorpej tstl d0 | zero?
113 1.3 thorpej jeq not68030 | yes, we have 68020/68040
114 1.3 thorpej
115 1.1 thorpej movl #0x808,d0
116 1.3 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.3 thorpej movl #0x80,MMUCMD | set magic cookie
123 1.3 thorpej movl MMUCMD,d0 | read it back
124 1.3 thorpej btst #7,d0 | cookie still on?
125 1.3 thorpej jeq not370 | no, 360 or 375
126 1.3 thorpej movl #HP_370,a0@ | consider a 370 for now
127 1.3 thorpej movl #0,MMUCMD | clear magic cookie
128 1.3 thorpej movl MMUCMD,d0 | read it back
129 1.3 thorpej btst #7,d0 | still on?
130 1.3 thorpej jeq ihpibcheck | no, a 370
131 1.3 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.3 thorpej movl #HP_360,a0@ | type is at least a 360
136 1.3 thorpej movl #0,MMUCMD | clear magic cookie2
137 1.3 thorpej movl MMUCMD,d0 | read it back
138 1.3 thorpej btst #16,d0 | still on?
139 1.3 thorpej jeq ihpibcheck | no, a 360
140 1.7 thorpej lea _C_LABEL(mmuid),a0
141 1.3 thorpej lsrl #MMUID_SHIFT,d0 | save MMU ID
142 1.3 thorpej andl #MMUID_MASK,d0
143 1.7 thorpej movl d0,a0@
144 1.7 thorpej lea _C_LABEL(machineid),a0
145 1.3 thorpej cmpb #MMUID_345,d0 | are we a 345?
146 1.3 thorpej jeq isa345
147 1.3 thorpej cmpb #MMUID_375,d0 | how about a 375?
148 1.3 thorpej jeq isa375
149 1.3 thorpej movl #HP_400,a0@ | must be a 400
150 1.3 thorpej jra ihpibcheck
151 1.3 thorpej isa345:
152 1.3 thorpej movl #HP_345,a0@
153 1.1 thorpej jra ihpibcheck
154 1.3 thorpej isa375:
155 1.3 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.3 thorpej bset #31,d0 | data cache enable bit
164 1.3 thorpej movc d0,cacr | only exists on 68040
165 1.3 thorpej movc cacr,d0 | read it back
166 1.3 thorpej tstl d0 | zero?
167 1.3 thorpej beq is68020 | yes, we have 68020
168 1.3 thorpej moveq #0,d0 | now turn it back off
169 1.3 thorpej movec d0,cacr | before we access any data
170 1.3 thorpej
171 1.3 thorpej .long 0x4e7b0004 | movc d0,itt0
172 1.3 thorpej .long 0x4e7b0005 | movc d0,itt1
173 1.3 thorpej .long 0x4e7b0006 | movc d0,dtt0
174 1.3 thorpej .long 0x4e7b0007 | movc d0,dtt1
175 1.3 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.7 thorpej lea _C_LABEL(mmuid),a0
182 1.3 thorpej movl MMUCMD,d0 | get MMU ID
183 1.3 thorpej lsrl #MMUID_SHIFT,d0
184 1.3 thorpej andl #MMUID_MASK,d0
185 1.7 thorpej movl d0,a0@ | save it
186 1.7 thorpej lea _C_LABEL(machineid),a0
187 1.3 thorpej cmpb #MMUID_425_T,d0 | are we a 425t?
188 1.3 thorpej jeq isa425
189 1.3 thorpej cmpb #MMUID_425_S,d0 | how about 425s?
190 1.3 thorpej jeq isa425
191 1.6 thorpej cmpb #MMUID_425_E,d0 | or maybe a 425e?
192 1.6 thorpej jeq isa425
193 1.3 thorpej cmpb #MMUID_433_T,d0 | or a 433t?
194 1.3 thorpej jeq isa433
195 1.6 thorpej cmpb #MMUID_433_S,d0 | or a 433s?
196 1.3 thorpej jeq isa433
197 1.6 thorpej cmpb #MMUID_385,d0 | or a 385?
198 1.6 thorpej jeq isa385
199 1.5 he movl #HP_380,a0@ | guess we are a 380
200 1.1 thorpej jra ihpibcheck
201 1.3 thorpej isa425:
202 1.3 thorpej movl #HP_425,a0@
203 1.1 thorpej jra ihpibcheck
204 1.3 thorpej isa433:
205 1.3 thorpej movl #HP_433,a0@
206 1.6 thorpej jra ihpibcheck
207 1.6 thorpej isa385:
208 1.6 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.3 thorpej movl #HP_330,a0@ | consider a 330 for now
221 1.3 thorpej movl #1,MMUCMD | a 68020, write HP MMU location
222 1.3 thorpej movl MMUCMD,d0 | read it back
223 1.3 thorpej btst #0,d0 | zero?
224 1.3 thorpej jeq ihpibcheck | yes, a 330
225 1.3 thorpej movl #HP_320,a0@ | no, consider a 320 for now
226 1.3 thorpej movl #0x80,MMUCMD | set magic cookie
227 1.3 thorpej movl MMUCMD,d0 | read it back
228 1.3 thorpej btst #7,d0 | cookie still on?
229 1.3 thorpej jeq ihpibcheck | no, just a 320
230 1.3 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.3 thorpej movl #0,MMUCMD | make sure MMU is off
238 1.3 thorpej btst #5,SYSFLAG | do we have an internal HP-IB?
239 1.3 thorpej jeq boottype | yes, continue
240 1.3 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.3 thorpej cmpw #12,BOOTTYPE | is this a reboot (REQ_REBOOT)?
246 1.3 thorpej jne notreboot | no, skip
247 1.3 thorpej lea MAXADDR,a0 | find last page
248 1.3 thorpej movl a0@+,d7 | and extract howto, bootdev
249 1.3 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.3 thorpej moveq #0,d6 | make sure bootdev is invalid
258 1.3 thorpej cmpw #18,BOOTTYPE | does the user want to interact?
259 1.3 thorpej jeq askme | yes, go to it
260 1.3 thorpej moveq #0,d7 | default to RB_AUTOBOOT
261 1.1 thorpej jra boot1
262 1.1 thorpej askme:
263 1.3 thorpej moveq #3,d7 | default to RB_SINGLE|RB_ASKNAME
264 1.1 thorpej boot1:
265 1.3 thorpej movl d6,_C_LABEL(bootdev) | save bootdev and howto
266 1.3 thorpej movl d7,_C_LABEL(howto) | globally so all can access
267 1.3 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.2 thorpej addl #((2*NBPG)-1),d0
273 1.2 thorpej andl #-(2*NBPG),d0
274 1.3 thorpej movl d0,_C_LABEL(lowram) | stash that value
275 1.1 thorpej start:
276 1.3 thorpej movl #_C_LABEL(edata),a2 | start of BSS
277 1.3 thorpej movl #_C_LABEL(end),a3 | end
278 1.3 thorpej 1:
279 1.3 thorpej clrb a2@+ | clear BSS
280 1.3 thorpej cmpl a2,a3 | done?
281 1.3 thorpej bne 1b | no, keep going
282 1.3 thorpej jsr _C_LABEL(configure) | configure critical devices
283 1.3 thorpej jsr _C_LABEL(main) | lets go
284 1.3 thorpej GLOBAL(_rtt)
285 1.3 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.3 thorpej movl BUSERR,_C_LABEL(_bsave) | save ROM bus error handler address
293 1.3 thorpej movl sp,_C_LABEL(_ssave) | and current stack pointer
294 1.3 thorpej movl #catchbad,BUSERR | plug in our handler
295 1.3 thorpej movl sp@(4),a0 | address to probe
296 1.3 thorpej movw a0@,d1 | do it
297 1.3 thorpej movl _C_LABEL(_bsave),BUSERR | if we got here, it did not fault
298 1.3 thorpej clrl d0 | return that this was not a bad addr
299 1.1 thorpej rts
300 1.1 thorpej
301 1.1 thorpej catchbad:
302 1.3 thorpej movl _C_LABEL(_bsave),BUSERR | got a bus error, so restore
303 1.3 thorpej | old handler
304 1.3 thorpej movl _C_LABEL(_ssave),sp | manually restore stack
305 1.3 thorpej moveq #1,d0 | indicate that we got a fault
306 1.3 thorpej rts | return to caller of badaddr()
307 1.1 thorpej
308 1.3 thorpej .data
309 1.3 thorpej GLOBAL(_bsave)
310 1.1 thorpej .long 0
311 1.3 thorpej
312 1.3 thorpej GLOBAL(_ssave)
313 1.1 thorpej .long 0
314 1.1 thorpej
315 1.3 thorpej ASENTRY_NOPROFILE(__trap)
316 1.3 thorpej moveml #0xFFFF,sp@- | save registers
317 1.3 thorpej movl sp,sp@- | push pointer to frame
318 1.3 thorpej jsr _C_LABEL(trap) | call C routine to deal with it
319 1.1 thorpej tstl d0
320 1.1 thorpej jeq Lstop
321 1.1 thorpej addql #4,sp
322 1.1 thorpej moveml sp@+,#0x7FFF
323 1.1 thorpej addql #8,sp
324 1.1 thorpej rte
325 1.1 thorpej Lstop:
326 1.3 thorpej stop #0x2700 | stop cold
327 1.1 thorpej
328 1.8 thorpej #ifdef ITECONSOLE
329 1.3 thorpej ASENTRY_NOPROFILE(nmi)
330 1.3 thorpej movw #18,BOOTTYPE | mark as system switch
331 1.4 thorpej jsr _C_LABEL(kbdnmi) | clear the interrupt, and
332 1.4 thorpej | reset the system
333 1.4 thorpej stop #0 | SCREEEECH!
334 1.8 thorpej #endif
335 1.3 thorpej
336 1.3 thorpej ENTRY_NOPROFILE(call_req_reboot)
337 1.3 thorpej jmp 0x1A4 | call ROM reboot function
338 1.3 thorpej rts | XXX: just in case?
339 1.1 thorpej
340 1.3 thorpej ENTRY_NOPROFILE(romout)
341 1.3 thorpej movl sp@(4),d0 | line number
342 1.3 thorpej movl sp@(8),a0 | string
343 1.3 thorpej jsr 0x150 | do it
344 1.1 thorpej rts
345