xref: /netbsd-src/sys/arch/amiga/stand/bootblock/boot/startit.s (revision de1dfb1250df962f1ff3a011772cf58e605aed11)
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
42ENTRY_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
57start_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
128not040:
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
143nott:
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
193L0:	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
204below:	movl	%sp@+,%a3			| recover destination
205	movl	%sp@+,%a1			| recover source
206
207L1:	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
214above:	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)
221L2:
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 ----
238Lchoff:	btst	#3,%d5
239	jeq	L3c
240	.word	0xf4f8
241L3c:	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
249ckend:
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
276noDraCo:
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
299nullrp:	.long	0x7fff0001
300zero:	.long	0
301
302ENTRY_NOPROFILE(startit_end)
303