xref: /freebsd/sys/powerpc/aim/locore.S (revision b57e802a8521cd90a2f8e3f2612ac107ac9a3591)
1/* $FreeBSD$ */
2/* $NetBSD: locore.S,v 1.24 2000/05/31 05:09:17 thorpej Exp $ */
3
4/*
5 * Copyright (C) 2001 Benno Rice
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 *
17 * THIS SOFTWARE IS PROVIDED BY Benno Rice ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28/*
29 * Copyright (C) 1995, 1996 Wolfgang Solfrank.
30 * Copyright (C) 1995, 1996 TooLs GmbH.
31 * All rights reserved.
32 *
33 * Redistribution and use in source and binary forms, with or without
34 * modification, are permitted provided that the following conditions
35 * are met:
36 * 1. Redistributions of source code must retain the above copyright
37 *    notice, this list of conditions and the following disclaimer.
38 * 2. Redistributions in binary form must reproduce the above copyright
39 *    notice, this list of conditions and the following disclaimer in the
40 *    documentation and/or other materials provided with the distribution.
41 * 3. All advertising materials mentioning features or use of this software
42 *    must display the following acknowledgement:
43 *	This product includes software developed by TooLs GmbH.
44 * 4. The name of TooLs GmbH may not be used to endorse or promote products
45 *    derived from this software without specific prior written permission.
46 *
47 * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
48 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
49 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
50 * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
51 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
52 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
53 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
54 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
55 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
56 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
57 */
58
59#include "opt_ddb.h"
60#include "opt_ipkdb.h"
61#include "assym.s"
62
63#include <sys/syscall.h>
64
65#include <machine/trap.h>
66#include <machine/param.h>
67#include <machine/sr.h>
68#include <machine/spr.h>
69#include <machine/psl.h>
70#include <machine/asm.h>
71
72/*
73 * Some instructions gas doesn't understand (yet?)
74 */
75#define	bdneq	bdnzf 2,
76
77/*
78 * Globals
79 */
80	.data
81GLOBAL(tmpstk)
82	.space	8208
83GLOBAL(esym)
84	.long	0			/* end of symbol table */
85GLOBAL(proc0paddr)
86	.long	0			/* proc0 p_addr */
87GLOBAL(PTmap)
88	.long	0			/* PTmap */
89GLOBAL(decrnest)
90	.long	0
91
92GLOBAL(intrnames)
93	.asciz	"irq0", "irq1", "irq2", "irq3"
94	.asciz	"irq4", "irq5", "irq6", "irq7"
95	.asciz	"irq8", "irq9", "irq10", "irq11"
96	.asciz	"irq12", "irq13", "irq14", "irq15"
97	.asciz	"irq16", "irq17", "irq18", "irq19"
98	.asciz	"irq20", "irq21", "irq22", "irq23"
99	.asciz	"irq24", "irq25", "irq26", "irq27"
100	.asciz	"irq28", "irq29", "irq30", "irq31"
101	.asciz	"irq32", "irq33", "irq34", "irq35"
102	.asciz	"irq36", "irq37", "irq38", "irq39"
103	.asciz	"irq40", "irq41", "irq42", "irq43"
104	.asciz	"irq44", "irq45", "irq46", "irq47"
105	.asciz	"irq48", "irq49", "irq50", "irq51"
106	.asciz	"irq52", "irq53", "irq54", "irq55"
107	.asciz	"irq56", "irq57", "irq58", "irq59"
108	.asciz	"irq60", "irq61", "irq62", "irq63"
109	.asciz	"clock", "softclock", "softnet", "softserial"
110GLOBAL(eintrnames)
111	.align	4
112GLOBAL(intrcnt)
113	.long	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
114	.long	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
115	.long	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
116	.long	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
117	.long	0,0,0,0
118GLOBAL(eintrcnt)
119
120GLOBAL(ofmsr)
121	.long	0			/* msr used in Open Firmware */
122
123GLOBAL(powersave)
124	.long	0
125
126#define	INTSTK		8192		/* 8K interrupt stack */
127#define	SPILLSTK	4096		/* 4K spill stack */
128
129/*
130 * File-scope for locore.S
131 */
132idle_u:
133	.long	0			/* fake uarea during idle after exit */
134openfirmware_entry:
135	.long	0			/* openfirmware entry point */
136srsave:
137	.long	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
138
139/*
140 * This symbol is here for the benefit of kvm_mkdb, and is supposed to
141 * mark the start of kernel text.
142 */
143	.text
144	.globl	kernel_text
145kernel_text:
146
147/*
148 * Startup entry.  Note, this must be the first thing in the text
149 * segment!
150 */
151	.text
152	.globl	__start
153__start:
154#ifdef	FIRMWORKSBUGS
155	mfmsr	0
156	andi.	0,0,PSL_IR|PSL_DR
157	beq	1f
158
159	bl	ofwr_init
1601:
161#endif
162	li	8,0
163	li	9,0x100
164	mtctr	9
1651:
166	dcbf	0,8
167	icbi	0,8
168	addi	8,8,0x20
169	bdnz	1b
170	sync
171	isync
172
173	mtibatu	0,0
174	mtibatu	1,0
175	mtibatu	2,0
176	mtibatu	3,0
177	mtdbatu	0,0
178	mtdbatu	1,0
179	mtdbatu	2,0
180	mtdbatu	3,0
181
182	li	9,0x12
183	mtibatl	0,9
184	mtdbatl	0,9
185	li	9,0x1ffe
186	mtibatu	0,9
187	mtdbatu	0,9
188	isync
189
190	lis	8,openfirmware_entry@ha
191	stw	5,openfirmware_entry@l(8) /* save client interface handler */
192	mr	3,5
193
194	lis	1,tmpstk@ha
195	addi	1,1,tmpstk@l
196	addi	1,1,8192
197
198	mfmsr	0
199	lis	9,ofmsr@ha
200	stw	0,ofmsr@l(9)
201
202	bl	OF_init
203
204	lis	4,end@ha
205	addi	4,4,end@l
206	mr	5,4
207	li	9,PAGE_MASK
208	add	4,4,9
209	andc	4,4,9
210	lis	9,OF_buf@ha
211	stw	4,OF_buf@l(9)
212	addi	4,4,PAGE_SIZE
213	lis	9,proc0paddr@ha
214	stw	4,proc0paddr@l(9)
215	addi	4,4,USPACE-FRAMELEN
216	mr	1,4
217	xor	0,0,0
218	stwu	0,-16(1)
219
220	lis	3,kernel_text@ha
221	addi	3,3,kernel_text@l
222#if 0
223	mr	5,6
224#endif
225
226	bl	powerpc_init
227	bl	mi_startup
228	b	OF_exit
229
230#if 0 /* XXX: We may switch back to this in the future. */
231/*
232 * OpenFirmware entry point
233 */
234ENTRY(openfirmware)
235	mflr	0			/* save return address */
236	stw	0,4(1)
237	stwu	1,-16(1)		/* setup stack frame */
238
239	mfmsr	4			/* save msr */
240	stw	4,8(1)
241
242	lis	4,openfirmware_entry@ha	/* get firmware entry point */
243	lwz	4,openfirmware_entry@l(4)
244	mtlr	4
245
246	li	0,0			/* clear battable translations */
247	mtdbatu	2,0
248	mtdbatu	3,0
249	mtibatu	2,0
250	mtibatu	3,0
251
252	lis	4,ofmsr@ha		/* Open Firmware msr */
253	lwz	4,ofmsr@l(4)
254	mtmsr	4
255	isync
256
257	lis	4,srsave@ha		/* save old SR */
258	addi	4,4,srsave@l
259	li	5,0
2601:	mfsrin	0,5
261	stw	0,0(4)
262	addi	4,4,4
263	addis	5,5,0x10000000@h
264	cmpwi	5,0
265	bne	1b
266
267	lis	4,ofw_pmap@ha		/* load OFW SR */
268	addi	4,4,ofw_pmap@l
269	lwz	0,PM_KERNELSR(4)
270	cmpwi	0,0			/* pm_sr[KERNEL_SR] == 0? */
271	beq	2f			/* then skip (not initialized yet) */
272	li	5,0
2731:	lwz	0,0(4)
274	mtsrin	0,5
275	addi	4,4,4
276	addis	5,5,0x10000000@h
277	cmpwi	5,0
278	bne	1b
2792:
280	blrl				/* call Open Firmware */
281
282	mfmsr	4
283	li	5,PSL_IR|PSL_DR
284	andc 	4,4,5
285	mtmsr	4
286	isync
287
288	lis	4,srsave@ha		/* restore saved SR */
289	addi	4,4,srsave@l
290	li	5,0
2911:	lwz	0,0(4)
292	mtsrin	0,5
293	addi	4,4,4
294	addis	5,5,0x10000000@h
295	cmpwi	5,0
296	bne	1b
297
298	lwz	4,8(1)			/* restore msr */
299	mtmsr	4
300	isync
301
302	lwz	1,0(1)			/* and return */
303	lwz	0,4(1)
304	mtlr	0
305	blr
306#endif
307
308/*
309 * Switch to/from OpenFirmware real mode stack
310 *
311 * Note: has to be called as the very first thing in OpenFirmware interface
312 * routines.
313 * E.g.:
314 * int
315 * OF_xxx(arg1, arg2)
316 * type arg1, arg2;
317 * {
318 *	static struct {
319 *		char *name;
320 *		int nargs;
321 *		int nreturns;
322 *		char *method;
323 *		int arg1;
324 *		int arg2;
325 *		int ret;
326 *	} args = {
327 *		"xxx",
328 *		2,
329 *		1,
330 *	};
331 *
332 *	ofw_stack();
333 *	args.arg1 = arg1;
334 *	args.arg2 = arg2;
335 *	if (openfirmware(&args) < 0)
336 *		return -1;
337 *	return args.ret;
338 * }
339 */
340
341	.local	firmstk
342	.comm	firmstk,PAGE_SIZE,8
343
344ENTRY(ofw_stack)
345	mfmsr	8			/* turn off interrupts */
346	andi.	0,8,~(PSL_EE|PSL_RI)@l
347	mtmsr	0
348	stw	8,4(1)			/* abuse return address slot */
349
350	lwz	5,0(1)			/* get length of stack frame */
351	subf	5,1,5
352
353	lis	7,firmstk+PAGE_SIZE-8@ha
354	addi	7,7,firmstk+PAGE_SIZE-8@l
355	lis	6,ofw_back@ha
356	addi	6,6,ofw_back@l
357	subf	4,5,7			/* make room for stack frame on
358					   new stack */
359	stw	6,-4(7)			/* setup return pointer */
360	stwu	1,-8(7)
361
362	stw	7,-8(4)
363
364	addi	3,1,8
365	addi	1,4,-8
366	subi	5,5,8
367
368	cmpw	3,4
369	beqlr
370
371	mr	0,5
372	addi	5,5,-1
373	cmpwi	0,0
374	beqlr
375
3761:	lwz	0,0(3)
377	stw	0,0(4)
378	addi	3,3,1
379	addi	4,4,1
380	mr	0,5
381	addi	5,5,-1
382	cmpwi	0,0
383	bne	1b
384	blr
385
386ofw_back:
387	lwz	1,0(1)			/* get callers original stack pointer */
388
389	lwz	0,4(1)			/* get saved msr from abused slot */
390	mtmsr	0
391
392	lwz	1,0(1)			/* return */
393	lwz	0,4(1)
394	mtlr	0
395	blr
396
397/*
398 * int setfault()
399 *
400 * Similar to setjmp to setup for handling faults on accesses to user memory.
401 * Any routine using this may only call bcopy, either the form below,
402 * or the (currently used) C code optimized, so it doesn't use any non-volatile
403 * registers.
404 */
405	.globl	setfault
406setfault:
407	mflr	0
408	mfcr	12
409	mfsprg	4,0
410	lwz	4,PC_CURTHREAD(4)
411	lwz	4,TD_PCB(4)
412	stw	3,PCB_ONFAULT(4)
413	stw	0,0(3)
414	stw	1,4(3)
415	stw	2,8(3)
416	stmw	12,12(3)
417	xor	3,3,3
418	blr
419
420#include <powerpc/powerpc/trap_subr.S>
421