startit.s revision 1.8 1 /* $NetBSD: startit.s,v 1.8 2001/03/02 16:43:26 mhitch Exp $ */
2
3 /*
4 * Copyright (c) 1996 Ignatios Souvatzis
5 * Copyright (c) 1994 Michael L. Hitch
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgement:
18 * This product includes software developed by Michael L. Hitch.
19 * 4. The name of the author may not be used to endorse or promote products
20 * derived from this software without specific prior written permission
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 *
33 *
34 * From: $NetBSD: startit.s,v 1.8 2001/03/02 16:43:26 mhitch Exp $
35 */
36 #include <machine/asm.h>
37
38 .set ABSEXECBASE,4
39
40 .text
41
42 ENTRY_NOPROFILE(startit)
43 #if TESTONAMIGA
44 movew #0x999,0xdff180 | gray
45 #endif
46 #if TESTONDRACO
47 moveb #0,0x200003c8
48 moveb #31,0x200003c9
49 moveb #31,0x200003c9
50 moveb #31,0x200003c9
51 #endif
52 movel %sp,%a3
53 movel 4:w,%a6
54 lea %pc@(start_super:w),%a5
55 jmp %a6@(-0x1e) | supervisor-call
56
57 start_super:
58 #if TESTONAMIGA
59 movew #0x900,0xdff180 | dark red
60 #endif
61 movew #0x2700,%sr
62
63 | the BSD kernel wants values into the following registers:
64 | %a0: fastmem-start
65 | %d0: fastmem-size
66 | %d1: chipmem-size
67 | %d3: Amiga specific flags
68 | %d4: E clock frequency
69 | %d5: AttnFlags (cpuid)
70 | %d6: boot partition offset
71 | %d7: boothowto
72 | %a4: esym location
73 | %a2: Inhibit sync flags
74 | All other registers zeroed for possible future requirements.
75
76 lea %pc@(_C_LABEL(startit):w),%sp | make sure we have a good stack ***
77
78 movel %a3@(4),%a1 | loaded kernel
79 movel %a3@(8),%d2 | length of loaded kernel
80 | movel %a3@(12),%sp | entry point in stack pointer
81 movel %a3@(12),%a6 | entry point ***
82 movel %a3@(16),%a0 | fastmem-start
83 movel %a3@(20),%d0 | fastmem-size
84 movel %a3@(24),%d1 | chipmem-size
85 movel %a3@(28),%d7 | boothowto
86 movel %a3@(32),%a4 | esym
87 movel %a3@(36),%d5 | cpuid
88 movel %a3@(40),%d4 | E clock frequency
89 movel %a3@(44),%d3 | Amiga flags
90 movel %a3@(48),%a2 | Inhibit sync flags
91 movel %a3@(52),%d6 | boot partition offset
92
93 cmpb #0x7D,%a3@(36) | is it DraCo?
94 movel %a3@(56),%a3 | Load to fastmem flag
95 jeq nott | yes, switch off MMU later
96
97 | no, it is an Amiga:
98
99 #if TESTONAMIGA
100 movew #0xf00,0xdff180 |red
101 #endif
102 #if TESTONDRACO
103 moveb #0,0x200003c8
104 moveb #63,0x200003c9
105 moveb #0,0x200003c9
106 moveb #0,0x200003c9
107 #endif
108
109 movew #(1<<9),0xdff096 | disable DMA on Amigas.
110
111 | ------ mmu off start -----
112
113 btst #3,%d5 | AFB_68040,SysBase->AttnFlags
114 jeq not040
115
116 | Turn off 68040/060 MMU
117
118 subl %a5,%a5
119 .word 0x4e7b,0xd003 | movec %a5,tc
120 .word 0x4e7b,0xd806 | movec %a5,urp
121 .word 0x4e7b,0xd807 | movec %a5,srp
122 .word 0x4e7b,0xd004 | movec %a5,itt0
123 .word 0x4e7b,0xd005 | movec %a5,itt1
124 .word 0x4e7b,0xd006 | movec %a5,dtt0
125 .word 0x4e7b,0xd007 | movec %a5,dtt1
126 jra nott
127
128 not040:
129 lea %pc@(zero:w),%a5
130 pmove %a5@,%tc | Turn off MMU
131 lea %pc@(nullrp:w),%a5
132 pmove %a5@,%crp | Turn off MMU some more
133 pmove %a5@,%srp | Really, really, turn off MMU
134
135 | Turn off 68030 TT registers
136
137 btst #2,%d5 | AFB_68030,SysBase->AttnFlags
138 jeq nott | Skip TT registers if not 68030
139 lea %pc@(zero:w),%a5
140 .word 0xf015,0x0800 | pmove %a5@,tt0 (gas only knows about 68851 ops..)
141 .word 0xf015,0x0c00 | pmove %a5@,tt1 (gas only knows about 68851 ops..)
142
143 nott:
144 | ---- mmu off end ----
145 #if TESTONAMIGA
146 movew #0xf60,0xdff180 | orange
147 #endif
148 #if TESTONDRACO
149 moveb #0,0x200003c8
150 moveb #63,0x200003c9
151 moveb #24,0x200003c9
152 moveb #0,0x200003c9
153 #endif
154
155
156 | ---- copy kernel start ----
157
158 | removed Z flag
159 | tstl %a3 | Can we load to fastmem?
160 | jeq L0 | No, leave destination at 0
161 movl %a0,%a3 | Move to start of fastmem chunk
162 addl %a0,%a6 | relocate kernel entry point
163
164 addl #3,%d2
165 andl #0xfffffffc,%d2 | round up.
166
167 | determine if the kernel need be copied upwards or downwards
168
169 cmpl %a1,%a3 | %a3-a1
170 bcs above | source is above
171
172 movl %a0,%sp
173 addl %d0,%sp | move the stack to the end of segment
174
175 | copy from below upwards requires copying from end to start.
176
177 addl %d2,%a3 | one long word past
178 addl %d2,%a1 | one long word past
179
180 subl #4,%sp | alloc space
181 movl %a1,%sp@- | save source
182 movl %a3,%sp@- | save destination
183
184 | copy copier to end of segment
185
186 movl %sp,%a3
187 subl #256,%a3 | end of segment save our stack
188
189 lea %pc@(_C_LABEL(startit_end):w),%a1
190 movl %a0,%sp@- | save segment start
191 lea %pc@(below:w),%a0
192
193 L0: movw %a1@-,%a3@-
194 cmpl %a0,%a1
195 bne L0
196 movl %sp@,%a0 | restore segment start
197 movl %a3,%sp@ | address of relocated below
198 addl #(ckend - below),%a3
199 movl %a3,%sp@(12) | address of ckend for later
200 | ---- switch off cache ----
201 bra Lchoff | and to relocated below
202
203
204 below: movl %sp@+,%a3 | recover destination
205 movl %sp@+,%a1 | recover source
206
207 L1: movl %a1@-,%a3@- | copy kernel
208 subl #4,%d2
209 bne L1
210
211 | ---- switch off cache ----
212 bra Lchoff | and to relocated ckend
213
214 above: movl %a1@+,%a3@+
215 subl #4,%d2
216 bne above
217
218 lea %pc@(ckend:w),%a1
219 movl %a3,%sp@-
220 pea %pc@(_C_LABEL(startit_end):w)
221 L2:
222 movl %a1@+,%a3@+
223 cmpl %sp@,%a1
224 bcs L2
225 addql #4,%sp
226
227 #if TESTONAMIGA
228 movew #0xFF0,0xdff180 | yellow
229 #endif
230 #if TESTONDRACO
231 moveb #0,0x200003c8
232 moveb #63,0x200003c9
233 moveb #63,0x200003c9
234 moveb #0,0x200003c9
235 #endif
236
237 | ---- switch off cache ----
238 Lchoff: btst #3,%d5
239 jeq L3c
240 .word 0xf4f8
241 L3c: movl %d2,%sp@- | save %d2
242 movql #0,%d2 | switch off cache to ensure we use
243 movec %d2,%cacr | valid kernel data
244 movl %sp@+,%d2 | restore %d2
245 rts
246
247 | ---- copy kernel end ----
248
249 ckend:
250 #if TESTONAMIGA
251 movew #0x0ff,0xdff180 | petrol
252 #endif
253 #if TESTONDRACO
254 moveb #0,0x200003c8
255 moveb #0,0x200003c9
256 moveb #63,0x200003c9
257 moveb #63,0x200003c9
258 #endif
259
260 movl %d5,%d2
261 roll #8,%d2
262 cmpb #0x7D,%d2
263 jne noDraCo
264
265 | DraCo: switch off MMU now:
266
267 subl %a5,%a5
268 .word 0x4e7b,0xd003 | movec %a5,tc
269 .word 0x4e7b,0xd806 | movec %a5,urp
270 .word 0x4e7b,0xd807 | movec %a5,srp
271 .word 0x4e7b,0xd004 | movec %a5,itt0
272 .word 0x4e7b,0xd005 | movec %a5,itt1
273 .word 0x4e7b,0xd006 | movec %a5,dtt0
274 .word 0x4e7b,0xd007 | movec %a5,dtt1
275
276 noDraCo:
277 moveq #0,%d2 | zero out unused registers
278 movel %d2,%a1 | (might make future compatibility
279 movel %d2,%a3 | would have known contents)
280 movel %d2,%a5
281 movel %a6,%sp | entry point into stack pointer
282 movel %d2,%a6
283
284 #if TESTONAMIGA
285 movew #0x0F0,0xdff180 | green
286 #endif
287 #if TESTONDRACO
288 moveb #0,0x200003c8
289 moveb #0,0x200003c9
290 moveb #63,0x200003c9
291 moveb #0,0x200003c9
292 #endif
293
294 jmp %sp@ | jump to kernel entry point
295
296
297 | A do-nothing MMU root pointer (includes the following long as well)
298
299 nullrp: .long 0x7fff0001
300 zero: .long 0
301
302 ENTRY_NOPROFILE(startit_end)
303