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