summaryrefslogtreecommitdiff
path: root/sys/arch/amiga/stand/bootblock/boot/startit.s
blob: ffb7840ecac462d189c802c3bd0844fb88ce0d8a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
/*	$NetBSD: startit.s,v 1.9 2009/11/15 20:38:36 snj Exp $	*/

/*
 * Copyright (c) 1996 Ignatios Souvatzis
 * Copyright (c) 1994 Michael L. Hitch
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 * From: $NetBSD: startit.s,v 1.9 2009/11/15 20:38:36 snj Exp $
 */
#include <machine/asm.h>

	.set	ABSEXECBASE,4

	.text

ENTRY_NOPROFILE(startit)
#if TESTONAMIGA
	movew	#0x999,0xdff180		| gray
#endif
#if TESTONDRACO
	moveb	#0,0x200003c8
	moveb	#31,0x200003c9
	moveb	#31,0x200003c9
	moveb	#31,0x200003c9
#endif
	movel	%sp,%a3
	movel	4:w,%a6
	lea	%pc@(start_super:w),%a5
	jmp	%a6@(-0x1e)		| supervisor-call

start_super:
#if TESTONAMIGA
	movew	#0x900,0xdff180		| dark red
#endif
	movew	#0x2700,%sr

	| the BSD kernel wants values into the following registers:
	| %a0:  fastmem-start
	| %d0:  fastmem-size
	| %d1:  chipmem-size
	| %d3:  Amiga specific flags
	| %d4:  E clock frequency
	| %d5:  AttnFlags (cpuid)
	| %d6:  boot partition offset
	| %d7:  boothowto
	| %a4:  esym location
	| %a2:  Inhibit sync flags
	| All other registers zeroed for possible future requirements.

	lea	%pc@(_C_LABEL(startit):w),%sp	| make sure we have a good stack ***

	movel	%a3@(4),%a1		| loaded kernel
	movel	%a3@(8),%d2		| length of loaded kernel
|	movel	%a3@(12),%sp		| entry point in stack pointer
	movel	%a3@(12),%a6		| entry point		***
	movel	%a3@(16),%a0		| fastmem-start
	movel	%a3@(20),%d0		| fastmem-size
	movel	%a3@(24),%d1		| chipmem-size
	movel	%a3@(28),%d7		| boothowto
	movel	%a3@(32),%a4		| esym
	movel	%a3@(36),%d5		| cpuid
	movel	%a3@(40),%d4		| E clock frequency
	movel	%a3@(44),%d3		| Amiga flags
	movel	%a3@(48),%a2		| Inhibit sync flags
	movel	%a3@(52),%d6		| boot partition offset

	cmpb	#0x7D,%a3@(36)		| is it DraCo?
	movel	%a3@(56),%a3		| Load to fastmem flag
	jeq	nott			| yes, switch off MMU later

					| no, it is an Amiga:

#if TESTONAMIGA
	movew	#0xf00,0xdff180		|red
#endif
#if TESTONDRACO
	moveb	#0,0x200003c8
	moveb	#63,0x200003c9
	moveb	#0,0x200003c9
	moveb	#0,0x200003c9
#endif

	movew	#(1<<9),0xdff096	| disable DMA on Amigas.

| ------ mmu off start -----

	btst	#3,%d5			| AFB_68040,SysBase->AttnFlags
	jeq	not040

| Turn off 68040/060 MMU

	subl	%a5,%a5
	.word 0x4e7b,0xd003		| movec %a5,tc
	.word 0x4e7b,0xd806		| movec %a5,urp
	.word 0x4e7b,0xd807		| movec %a5,srp
	.word 0x4e7b,0xd004		| movec %a5,itt0
	.word 0x4e7b,0xd005		| movec %a5,itt1
	.word 0x4e7b,0xd006		| movec %a5,dtt0
	.word 0x4e7b,0xd007		| movec %a5,dtt1
	jra	nott

not040:
	lea	%pc@(zero:w),%a5
	pmove	%a5@,%tc		| Turn off MMU
	lea	%pc@(nullrp:w),%a5
	pmove	%a5@,%crp		| Turn off MMU some more
	pmove	%a5@,%srp		| Really, really, turn off MMU

| Turn off 68030 TT registers

	btst	#2,%d5			| AFB_68030,SysBase->AttnFlags
	jeq	nott			| Skip TT registers if not 68030
	lea	%pc@(zero:w),%a5
	.word 0xf015,0x0800		| pmove %a5@,tt0 (gas only knows about 68851 ops..)
	.word 0xf015,0x0c00		| pmove %a5@,tt1 (gas only knows about 68851 ops..)

nott:
| ---- mmu off end ----
#if TESTONAMIGA
	movew	#0xf60,0xdff180		| orange
#endif
#if TESTONDRACO
	moveb	#0,0x200003c8
	moveb	#63,0x200003c9
	moveb	#24,0x200003c9
	moveb	#0,0x200003c9
#endif


| ---- copy kernel start ----

| removed Z flag
|	tstl	%a3			| Can we load to fastmem?
|	jeq	L0			| No, leave destination at 0
	movl	%a0,%a3			| Move to start of fastmem chunk
	addl	%a0,%a6			| relocate kernel entry point

	addl	#3,%d2
	andl	#0xfffffffc,%d2		| round up.

	| determine if the kernel need be copied upwards or downwards

	cmpl	%a1,%a3			| %a3-a1
	bcs	above			| source is above

	movl	%a0,%sp
	addl	%d0,%sp			| move the stack to the end of segment

	| copy from below upwards requires copying from end to start.

	addl	%d2,%a3			| one long word past
	addl	%d2,%a1			| one long word past

	subl	#4,%sp			| alloc space
	movl	%a1,%sp@-			| save source
	movl	%a3,%sp@-			| save destination

	| copy copier to end of segment

	movl	%sp,%a3
	subl	#256,%a3			| end of segment save our stack

	lea	%pc@(_C_LABEL(startit_end):w),%a1
	movl	%a0,%sp@-			| save segment start
	lea	%pc@(below:w),%a0

L0:	movw	%a1@-,%a3@-
	cmpl	%a0,%a1
	bne	L0
	movl	%sp@,%a0			| restore segment start
	movl	%a3,%sp@			| address of relocated below
	addl	#(ckend - below),%a3
	movl	%a3,%sp@(12)		| address of ckend for later
| ---- switch off cache ----
	bra	Lchoff			| and to relocated below


below:	movl	%sp@+,%a3			| recover destination
	movl	%sp@+,%a1			| recover source

L1:	movl	%a1@-,%a3@-		| copy kernel
	subl	#4,%d2
	bne	L1

| ---- switch off cache ----
	bra	Lchoff			| and to relocated ckend

above:	movl	%a1@+,%a3@+
	subl	#4,%d2
	bne	above

	lea	%pc@(ckend:w),%a1
	movl	%a3,%sp@-
	pea	%pc@(_C_LABEL(startit_end):w)
L2:
	movl	%a1@+,%a3@+
	cmpl	%sp@,%a1
	bcs	L2
	addql	#4,%sp

#if TESTONAMIGA
	movew	#0xFF0,0xdff180		| yellow
#endif
#if TESTONDRACO
	moveb	#0,0x200003c8
	moveb	#63,0x200003c9
	moveb	#63,0x200003c9
	moveb	#0,0x200003c9
#endif

| ---- switch off cache ----
Lchoff:	btst	#3,%d5
	jeq	L3c
	.word	0xf4f8
L3c:	movl	%d2,%sp@-			| save %d2
	movql	#0,%d2			| switch off cache to ensure we use
	movec	%d2,%cacr			| valid kernel data
	movl	%sp@+,%d2			| restore %d2
	rts

| ---- copy kernel end ----

ckend:
#if TESTONAMIGA
	movew	#0x0ff,0xdff180		| petrol
#endif
#if TESTONDRACO
	moveb	#0,0x200003c8
	moveb	#0,0x200003c9
	moveb	#63,0x200003c9
	moveb	#63,0x200003c9
#endif

	movl	%d5,%d2
	roll	#8,%d2
	cmpb	#0x7D,%d2
	jne	noDraCo

| DraCo: switch off MMU now:

	subl	%a5,%a5
	.word 0x4e7b,0xd003		| movec %a5,tc
	.word 0x4e7b,0xd806		| movec %a5,urp
	.word 0x4e7b,0xd807		| movec %a5,srp
	.word 0x4e7b,0xd004		| movec %a5,itt0
	.word 0x4e7b,0xd005		| movec %a5,itt1
	.word 0x4e7b,0xd006		| movec %a5,dtt0
	.word 0x4e7b,0xd007		| movec %a5,dtt1
	
noDraCo:
	moveq	#0,%d2			| zero out unused registers
	movel	%d2,%a1			| (might make future compatibility
	movel	%d2,%a3			|  would have known contents)
	movel	%d2,%a5
	movel	%a6,%sp			| entry point into stack pointer
	movel	%d2,%a6

#if TESTONAMIGA
	movew	#0x0F0,0xdff180		| green
#endif
#if TESTONDRACO
	moveb	#0,0x200003c8
	moveb	#0,0x200003c9
	moveb	#63,0x200003c9
	moveb	#0,0x200003c9
#endif

	jmp	%sp@			| jump to kernel entry point


| A do-nothing MMU root pointer (includes the following long as well)

nullrp:	.long	0x7fff0001
zero:	.long	0

ENTRY_NOPROFILE(startit_end)