locore.S revision 1.5
1/*	$NetBSD: locore.S,v 1.5 2009/02/13 22:41:03 apb Exp $	*/
2/*	$OpenBSD: locore.S,v 1.4 1997/01/26 09:06:38 rahnds Exp $	*/
3
4/*
5 * Copyright 2001 Wasabi Systems, Inc.
6 * All rights reserved.
7 *
8 * Written by Eduardo Horvath and Simon Burge for Wasabi Systems, Inc.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 * 3. All advertising materials mentioning features or use of this software
19 *    must display the following acknowledgement:
20 *      This product includes software developed for the NetBSD Project by
21 *      Wasabi Systems, Inc.
22 * 4. The name of Wasabi Systems, Inc. may not be used to endorse
23 *    or promote products derived from this software without specific prior
24 *    written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
30 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 * POSSIBILITY OF SUCH DAMAGE.
37 */
38
39/*
40 * Copyright (C) 1995, 1996 Wolfgang Solfrank.
41 * Copyright (C) 1995, 1996 TooLs GmbH.
42 * All rights reserved.
43 *
44 * Redistribution and use in source and binary forms, with or without
45 * modification, are permitted provided that the following conditions
46 * are met:
47 * 1. Redistributions of source code must retain the above copyright
48 *    notice, this list of conditions and the following disclaimer.
49 * 2. Redistributions in binary form must reproduce the above copyright
50 *    notice, this list of conditions and the following disclaimer in the
51 *    documentation and/or other materials provided with the distribution.
52 * 3. All advertising materials mentioning features or use of this software
53 *    must display the following acknowledgement:
54 *	This product includes software developed by TooLs GmbH.
55 * 4. The name of TooLs GmbH may not be used to endorse or promote products
56 *    derived from this software without specific prior written permission.
57 *
58 * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
59 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
60 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
61 * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
62 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
63 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
64 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
65 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
66 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
67 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
68 */
69
70#undef PPC_4XX_NOCACHE
71#define _NOREGNAMES
72
73#include "opt_ddb.h"
74#include "opt_ipkdb.h"
75#include "opt_lockdebug.h"
76#include "opt_modular.h"
77#include "opt_multiprocessor.h"
78#include "opt_ppcarch.h"
79#include "opt_ppcparam.h"
80#include "assym.h"
81#include "ksyms.h"
82
83#include <sys/syscall.h>
84
85#include <machine/param.h>
86#include <machine/psl.h>
87#include <machine/trap.h>
88#include <machine/asm.h>
89
90#include <powerpc/spr.h>
91#include <powerpc/ibm4xx/dcr405gp.h>
92#include <powerpc/ibm4xx/pmap.h>
93
94/* Function pointer for requesting board_config_data from openbios*/
95#define BOARD_CFG_FP       0xFFFE0B50
96
97/*
98 * Some instructions gas doesn't understand (yet?)
99 */
100#define	bdneq	bdnzf 2,
101
102/*
103 * Globals
104 */
105GLOBAL(proc0paddr)
106	.long	0			/* proc0 p_addr */
107
108GLOBAL(intrnames)
109	.asciz	"clock", "irq1", "irq2", "irq3"
110	.asciz	"irq4", "irq5", "irq6", "irq7"
111	.asciz	"irq8", "irq9", "irq10", "irq11"
112	.asciz	"irq12", "irq13", "irq14", "irq15"
113	.asciz	"irq16", "irq17", "irq18", "irq19"
114	.asciz	"irq20", "irq21", "irq22", "irq23"
115	.asciz	"irq24", "irq25", "irq26", "irq27"
116	.asciz	"irq28", "softnet", "softclock", "softserial"
117	.asciz  "statclock"
118GLOBAL(eintrnames)
119	.align	4
120GLOBAL(intrcnt)
121	.long	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
122	.long	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
123	.long	0
124GLOBAL(eintrcnt)
125
126/*
127 * This symbol is here for the benefit of kvm_mkdb, and is supposed to
128 * mark the start of kernel text.
129 */
130	.text
131	.globl	_C_LABEL(kernel_text)
132_C_LABEL(kernel_text):
133
134/*
135 * Startup entry.  Note, this must be the first thing in the text
136 * segment!
137 */
138	.text
139	.globl	__start
140__start:
141	b	1f
142	/* Reserve some space for info_block required for IBM eval board bootloader */
143	nop
144	nop
145	nop
146	nop
147	nop
148	nop
149	nop
150	nop
151	nop
152	nop
153
1541:
155	/* Get the board_config_data from openbios */
156	lis	%r3,BOARD_CFG_FP@h
157	ori	%r3,%r3,BOARD_CFG_FP@l
158	lwz     %r0,0x0(%r3)
159	mtctr   %r0
160	bctrl				/* call the xcoff function */
161	mr	%r31,%r3		/* Save value in r31 */
162
163	li	%r0,0
164	mtmsr	%r0			/* Disable FPU/MMU/exceptions */
165	isync
166
167	/* PPC405GP errata, item #58.
168	 * Load string instructions may write incorrect data into the last GPR
169	 * targeted in the operation.
170	 * Workaround: set OCM0_DSCNTL[DSEN]=0 and OCM0_DSCNTL[DOF]=0 */
171	mtdcr	DCR_OCM0_DSCNTL, %r0  	/* Disable Data access to OCM */
172	mtdcr	DCR_OCM0_ISCNTL, %r0  	/* Disable Instruction access to OCM. Just in case */
173/*
174 * Cpu detect.
175 *
176 */
177__start_cpu0:
178#ifdef PPC_4XX_NOCACHE
179	/* Disable all caches for physical addresses */
180	li	%r0,0
181#else
182	/* Allow cacheing for only the first 2GB of RAM */
183	lis	%r0,0xffff
184#endif
185	mtdccr	%r0
186	mticcr	%r0
187
188	/* Invalidate all TLB entries */
189	tlbia
190	sync
191	isync
192/* get start of bss */
193	lis	%r3,_C_LABEL(_edata)-4@ha
194	addi	%r3,%r3,_C_LABEL(_edata)-4@l
195/* get end of kernel memory */
196	lis	%r8,_C_LABEL(end)@ha
197	addi	%r8,%r8,_C_LABEL(end)@l
198/* zero bss */
199	li	%r4,0
2002:	stwu	%r4,%r4(3)
201	cmpw	%r3,%r8
202	bne+	2b
203
204#if NKSYMS || defined(DDB) || defined(MODULAR)
205	/* If we had symbol table location we'd store it here and would've adjusted r8 here */
206	lis	%r7,_C_LABEL(startsym)@ha
207	addi	%r7,%r7,_C_LABEL(startsym)@l
208	stw	%r8,0(%r7)
209	lis	%r7,_C_LABEL(endsym)@ha
210	addi	%r7,%r7,_C_LABEL(endsym)@l
211	stw	%r8,0(%r7)
212#endif
213
214	/* Set kernel MMU context. */
215	li	%r0,KERNEL_PID
216	mtpid	%r0
217	sync
218
219	INIT_CPUINFO(8,1,9,0)
220	mr	%r4,%r8
221
222	lis	%r3,__start@ha
223	addi	%r3,%r3,__start@l
224
225	mr	%r6,%r31		/* info_block address */
226	bl	_C_LABEL(initppc)
227	bl	_C_LABEL(main)
228
229loop:	b	loop			/* XXX not reached */
230
231#include <powerpc/ibm4xx/4xx_locore.S>
232