mpc85xx_start.S revision 1.1.4.1 1 1.1.4.1 jruoho /* $NetBSD: mpc85xx_start.S,v 1.1.4.1 2011/06/06 09:05:32 jruoho Exp $ */
2 1.1.4.1 jruoho /*-
3 1.1.4.1 jruoho * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
4 1.1.4.1 jruoho * All rights reserved.
5 1.1.4.1 jruoho *
6 1.1.4.1 jruoho * This code is derived from software contributed to The NetBSD Foundation
7 1.1.4.1 jruoho * by Raytheon BBN Technologies Corp and Defense Advanced Research Projects
8 1.1.4.1 jruoho * Agency and which was developed by Matt Thomas of 3am Software Foundry.
9 1.1.4.1 jruoho *
10 1.1.4.1 jruoho * This material is based upon work supported by the Defense Advanced Research
11 1.1.4.1 jruoho * Projects Agency and Space and Naval Warfare Systems Center, Pacific, under
12 1.1.4.1 jruoho * Contract No. N66001-09-C-2073.
13 1.1.4.1 jruoho * Approved for Public Release, Distribution Unlimited
14 1.1.4.1 jruoho *
15 1.1.4.1 jruoho * Redistribution and use in source and binary forms, with or without
16 1.1.4.1 jruoho * modification, are permitted provided that the following conditions
17 1.1.4.1 jruoho * are met:
18 1.1.4.1 jruoho * 1. Redistributions of source code must retain the above copyright
19 1.1.4.1 jruoho * notice, this list of conditions and the following disclaimer.
20 1.1.4.1 jruoho * 2. Redistributions in binary form must reproduce the above copyright
21 1.1.4.1 jruoho * notice, this list of conditions and the following disclaimer in the
22 1.1.4.1 jruoho * documentation and/or other materials provided with the distribution.
23 1.1.4.1 jruoho *
24 1.1.4.1 jruoho * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
25 1.1.4.1 jruoho * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
26 1.1.4.1 jruoho * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
27 1.1.4.1 jruoho * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
28 1.1.4.1 jruoho * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29 1.1.4.1 jruoho * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30 1.1.4.1 jruoho * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31 1.1.4.1 jruoho * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32 1.1.4.1 jruoho * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33 1.1.4.1 jruoho * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34 1.1.4.1 jruoho * POSSIBILITY OF SUCH DAMAGE.
35 1.1.4.1 jruoho */
36 1.1.4.1 jruoho
37 1.1.4.1 jruoho #include <sys/cdefs.h>
38 1.1.4.1 jruoho #include <powerpc/asm.h>
39 1.1.4.1 jruoho
40 1.1.4.1 jruoho RCSID("$NetBSD: mpc85xx_start.S,v 1.1.4.1 2011/06/06 09:05:32 jruoho Exp $")
41 1.1.4.1 jruoho
42 1.1.4.1 jruoho #include "opt_altivec.h"
43 1.1.4.1 jruoho #include "opt_ddb.h"
44 1.1.4.1 jruoho #include "opt_ipkdb.h"
45 1.1.4.1 jruoho #include "opt_lockdebug.h"
46 1.1.4.1 jruoho #include "opt_modular.h"
47 1.1.4.1 jruoho #include "opt_multiprocessor.h"
48 1.1.4.1 jruoho #include "opt_ppcarch.h"
49 1.1.4.1 jruoho #include "opt_ppcparam.h"
50 1.1.4.1 jruoho
51 1.1.4.1 jruoho #include "ksyms.h"
52 1.1.4.1 jruoho
53 1.1.4.1 jruoho #include <sys/param.h>
54 1.1.4.1 jruoho
55 1.1.4.1 jruoho #include <powerpc/spr.h>
56 1.1.4.1 jruoho #include <powerpc/trap.h>
57 1.1.4.1 jruoho #include <powerpc/booke/pte.h>
58 1.1.4.1 jruoho #include <powerpc/booke/spr.h>
59 1.1.4.1 jruoho #define LBC_PRIVATE
60 1.1.4.1 jruoho #include <powerpc/booke/e500reg.h>
61 1.1.4.1 jruoho
62 1.1.4.1 jruoho #include "assym.h"
63 1.1.4.1 jruoho
64 1.1.4.1 jruoho #define INTSTK 0
65 1.1.4.1 jruoho
66 1.1.4.1 jruoho .machine e500
67 1.1.4.1 jruoho /*
68 1.1.4.1 jruoho * This symbol is here for the benefit of kvm_mkdb, and is supposed to
69 1.1.4.1 jruoho * mark the start of kernel text.
70 1.1.4.1 jruoho */
71 1.1.4.1 jruoho .text
72 1.1.4.1 jruoho .globl _C_LABEL(kernel_text)
73 1.1.4.1 jruoho _C_LABEL(kernel_text):
74 1.1.4.1 jruoho .globl __start
75 1.1.4.1 jruoho __start:
76 1.1.4.1 jruoho
77 1.1.4.1 jruoho /*
78 1.1.4.1 jruoho * Startup entry. Note, this must be the first thing in the text segment!
79 1.1.4.1 jruoho */
80 1.1.4.1 jruoho mr %r8,%r6
81 1.1.4.1 jruoho mr %r7,%r5
82 1.1.4.1 jruoho mr %r6,%r4
83 1.1.4.1 jruoho mr %r5,%r3
84 1.1.4.1 jruoho #ifdef DEBUG
85 1.1.4.1 jruoho /*
86 1.1.4.1 jruoho * Set all the registers we don't care about to a known junk value.
87 1.1.4.1 jruoho */
88 1.1.4.1 jruoho lis %r2,0xdeadbeef@ha
89 1.1.4.1 jruoho addi %r2,%r2,0xdeadbeef@l
90 1.1.4.1 jruoho mr %r9,%r2
91 1.1.4.1 jruoho mr %r10,%r9
92 1.1.4.1 jruoho mr %r11,%r9
93 1.1.4.1 jruoho mr %r12,%r9
94 1.1.4.1 jruoho mr %r13,%r9
95 1.1.4.1 jruoho mr %r14,%r9
96 1.1.4.1 jruoho mr %r15,%r9
97 1.1.4.1 jruoho mr %r16,%r9
98 1.1.4.1 jruoho mr %r17,%r9
99 1.1.4.1 jruoho mr %r18,%r9
100 1.1.4.1 jruoho mr %r19,%r9
101 1.1.4.1 jruoho mr %r20,%r9
102 1.1.4.1 jruoho mr %r21,%r9
103 1.1.4.1 jruoho mr %r22,%r9
104 1.1.4.1 jruoho mr %r23,%r9
105 1.1.4.1 jruoho mr %r24,%r9
106 1.1.4.1 jruoho mr %r25,%r9
107 1.1.4.1 jruoho mr %r26,%r9
108 1.1.4.1 jruoho mr %r27,%r9
109 1.1.4.1 jruoho mr %r28,%r9
110 1.1.4.1 jruoho mr %r29,%r9
111 1.1.4.1 jruoho mr %r30,%r9
112 1.1.4.1 jruoho mr %r31,%r9
113 1.1.4.1 jruoho #endif /* DEBUG */
114 1.1.4.1 jruoho
115 1.1.4.1 jruoho li %r0,0
116 1.1.4.1 jruoho mtmsr %r0 /* Disable FPU/MMU/exceptions */
117 1.1.4.1 jruoho isync
118 1.1.4.1 jruoho
119 1.1.4.1 jruoho /* get start of bss */
120 1.1.4.1 jruoho lis %r15,_C_LABEL(_edata)-4@ha
121 1.1.4.1 jruoho addi %r15,%r15,_C_LABEL(_edata)-4@l
122 1.1.4.1 jruoho /* get end of kernel memory */
123 1.1.4.1 jruoho lis %r16,_C_LABEL(end)@ha
124 1.1.4.1 jruoho addi %r16,%r16,_C_LABEL(end)@l
125 1.1.4.1 jruoho /* zero bss */
126 1.1.4.1 jruoho sub %r17,%r16,%r15
127 1.1.4.1 jruoho addi %r17,%r17,3+USPACE
128 1.1.4.1 jruoho rlwinm %r3,%r17,32-2,2,31 /* srwl %r0,%r0,2 */
129 1.1.4.1 jruoho mtctr %r3
130 1.1.4.1 jruoho li %r0,0
131 1.1.4.1 jruoho 2: stwu %r0,4(%r15)
132 1.1.4.1 jruoho bdnz 2b
133 1.1.4.1 jruoho
134 1.1.4.1 jruoho #if NKSYMS || defined(DDB) || defined(MODULAR)
135 1.1.4.1 jruoho /* If we had symbol table location we'd store it here and would've adjusted r8 here */
136 1.1.4.1 jruoho lis %r7,_C_LABEL(startsym)@ha
137 1.1.4.1 jruoho addi %r7,%r7,_C_LABEL(startsym)@l
138 1.1.4.1 jruoho stw %r8,0(%r7)
139 1.1.4.1 jruoho lis %r7,_C_LABEL(endsym)@ha
140 1.1.4.1 jruoho addi %r7,%r7,_C_LABEL(endsym)@l
141 1.1.4.1 jruoho stw %r8,0(%r7)
142 1.1.4.1 jruoho #endif
143 1.1.4.1 jruoho
144 1.1.4.1 jruoho /* Set kernel MMU context. */
145 1.1.4.1 jruoho li %r0,KERNEL_PID
146 1.1.4.1 jruoho mtpid %r0
147 1.1.4.1 jruoho isync
148 1.1.4.1 jruoho
149 1.1.4.1 jruoho INIT_CPUINFO(16,1,9,20)
150 1.1.4.1 jruoho mr %r4,%r16
151 1.1.4.1 jruoho mfsprg0 %r21
152 1.1.4.1 jruoho lwz %r20,CI_CURLWP(%r21)
153 1.1.4.1 jruoho mtsprg2 %r20
154 1.1.4.1 jruoho stw %r21,L_CPU(%r20)
155 1.1.4.1 jruoho addi %r21,%r21,CI_SAVELIFO
156 1.1.4.1 jruoho mtsprg3 %r21
157 1.1.4.1 jruoho mr %r20,%r31 /* make deadbeef again */
158 1.1.4.1 jruoho mr %r21,%r31 /* make deadbeef again */
159 1.1.4.1 jruoho
160 1.1.4.1 jruoho #if defined(GXEMUL)
161 1.1.4.1 jruoho /*
162 1.1.4.1 jruoho * This is used to step through the external interrupt vector
163 1.1.4.1 jruoho * to validate it.
164 1.1.4.1 jruoho */
165 1.1.4.1 jruoho lis %r29,3f@ha
166 1.1.4.1 jruoho addi %r29,%r29,3f@l
167 1.1.4.1 jruoho mtsrr0 %r29
168 1.1.4.1 jruoho mfmsr %r0
169 1.1.4.1 jruoho mtsrr1 %r0
170 1.1.4.1 jruoho lis %r31,0xdeadf231@ha
171 1.1.4.1 jruoho addi %r31,%r31,0xdeadf231@l
172 1.1.4.1 jruoho mtlr %r31
173 1.1.4.1 jruoho addi %r31,%r31,-0x10
174 1.1.4.1 jruoho mtcr %r31
175 1.1.4.1 jruoho addi %r31,%r31,-0x10
176 1.1.4.1 jruoho mtctr %r31
177 1.1.4.1 jruoho addi %r31,%r31,-0x10
178 1.1.4.1 jruoho mtxer %r31
179 1.1.4.1 jruoho addi %r31,%r31,-0x10
180 1.1.4.1 jruoho addi %r30,%r31,-0x10
181 1.1.4.1 jruoho addi %r29,%r30,-0x10
182 1.1.4.1 jruoho addi %r28,%r29,-0x10
183 1.1.4.1 jruoho addi %r27,%r28,-0x10
184 1.1.4.1 jruoho addi %r26,%r27,-0x10
185 1.1.4.1 jruoho addi %r25,%r26,-0x10
186 1.1.4.1 jruoho addi %r24,%r25,-0x10
187 1.1.4.1 jruoho addi %r23,%r24,-0x10
188 1.1.4.1 jruoho addi %r22,%r23,-0x10
189 1.1.4.1 jruoho addi %r21,%r22,-0x10
190 1.1.4.1 jruoho addi %r20,%r21,-0x10
191 1.1.4.1 jruoho addi %r19,%r20,-0x10
192 1.1.4.1 jruoho addi %r18,%r19,-0x10
193 1.1.4.1 jruoho addi %r17,%r18,-0x10
194 1.1.4.1 jruoho addi %r16,%r17,-0x10
195 1.1.4.1 jruoho addi %r15,%r16,-0x10
196 1.1.4.1 jruoho addi %r14,%r15,-0x10
197 1.1.4.1 jruoho addi %r13,%r14,-0x10
198 1.1.4.1 jruoho addi %r12,%r13,-0x10
199 1.1.4.1 jruoho addi %r11,%r12,-0x10
200 1.1.4.1 jruoho addi %r10,%r11,-0x10
201 1.1.4.1 jruoho addi %r9,%r10,-0x10
202 1.1.4.1 jruoho addi %r8,%r9,-0x10
203 1.1.4.1 jruoho addi %r7,%r8,-0x10
204 1.1.4.1 jruoho addi %r6,%r7,-0x10
205 1.1.4.1 jruoho addi %r5,%r6,-0x10
206 1.1.4.1 jruoho addi %r4,%r5,-0x10
207 1.1.4.1 jruoho addi %r3,%r4,-0x10
208 1.1.4.1 jruoho addi %r2,%r3,-0x10
209 1.1.4.1 jruoho /* leave r1 alone */
210 1.1.4.1 jruoho addi %r0,%r2,-0x20
211 1.1.4.1 jruoho b _C_LABEL(instruction_tlb_error_vector)
212 1.1.4.1 jruoho //b _C_LABEL(program_vector)
213 1.1.4.1 jruoho //b _C_LABEL(external_input_vector)
214 1.1.4.1 jruoho 3:
215 1.1.4.1 jruoho #endif
216 1.1.4.1 jruoho
217 1.1.4.1 jruoho /*
218 1.1.4.1 jruoho * TB is 50Mhz, watchdog should be ~10 seconds which makes that
219 1.1.4.1 jruoho * 500 million or 0x20000000. Since it takes 3 bit transitions
220 1.1.4.1 jruoho * we really want 0x10000000. That's bit 63-28 or 35. This
221 1.1.4.1 jruoho * means we want WPEXT,WP to be 0b10_0011.
222 1.1.4.1 jruoho */
223 1.1.4.1 jruoho lis %r3,(TCR_WRC_RESET|TCR_WP_2_N(0x23))@ha
224 1.1.4.1 jruoho addi %r3,%r3,(TCR_WRC_RESET|TCR_WP_2_N(0x23))@l
225 1.1.4.1 jruoho mtspr SPR_TCR, %r3
226 1.1.4.1 jruoho li %r0, 0
227 1.1.4.1 jruoho mtspr SPR_TBL, %r0
228 1.1.4.1 jruoho mtspr SPR_TBU, %r0
229 1.1.4.1 jruoho mtspr SPR_DBCR0, %r0
230 1.1.4.1 jruoho
231 1.1.4.1 jruoho #if 0
232 1.1.4.1 jruoho /*
233 1.1.4.1 jruoho * Force all dirty lines in the kernel area to memory.
234 1.1.4.1 jruoho */
235 1.1.4.1 jruoho lis %r8,kernel_text@ha
236 1.1.4.1 jruoho addi %r8,%r8,kernel_text@l
237 1.1.4.1 jruoho 4: dcbst %r0,%r8
238 1.1.4.1 jruoho addi %r8,%r8,32
239 1.1.4.1 jruoho cmplw %r8,%r4
240 1.1.4.1 jruoho blt %cr0,4b
241 1.1.4.1 jruoho mbar 1
242 1.1.4.1 jruoho msync
243 1.1.4.1 jruoho
244 1.1.4.1 jruoho /*
245 1.1.4.1 jruoho * Turn off the data cache, and then invalidate it.
246 1.1.4.1 jruoho */
247 1.1.4.1 jruoho li %r3, 0
248 1.1.4.1 jruoho mtspr SPR_L1CSR0, %r3
249 1.1.4.1 jruoho li %r3, L1CSR_CFI
250 1.1.4.1 jruoho mtspr SPR_L1CSR0, %r3
251 1.1.4.1 jruoho #endif
252 1.1.4.1 jruoho
253 1.1.4.1 jruoho #if 1
254 1.1.4.1 jruoho /*
255 1.1.4.1 jruoho * Clear any locks from the data or instruction caches.
256 1.1.4.1 jruoho */
257 1.1.4.1 jruoho mfspr %r3, SPR_L1CSR0
258 1.1.4.1 jruoho ori %r3, %r3, L1CSR_CLFR
259 1.1.4.1 jruoho mtspr SPR_L1CSR0, %r3
260 1.1.4.1 jruoho mfspr %r3, SPR_L1CSR1
261 1.1.4.1 jruoho ori %r3, %r3, L1CSR_CLFR
262 1.1.4.1 jruoho mtspr SPR_L1CSR1, %r3
263 1.1.4.1 jruoho #endif
264 1.1.4.1 jruoho
265 1.1.4.1 jruoho lis %r3,__start@ha
266 1.1.4.1 jruoho addi %r3,%r3,__start@l
267 1.1.4.1 jruoho
268 1.1.4.1 jruoho bl _C_LABEL(initppc)
269 1.1.4.1 jruoho bl _C_LABEL(main)
270 1.1.4.1 jruoho
271 1.1.4.1 jruoho loop: b loop /* XXX not reached */
272 1.1.4.1 jruoho
273 1.1.4.1 jruoho #include <powerpc/booke/trap_subr.S>
274 1.1.4.1 jruoho #include <powerpc/powerpc/locore_subr.S>
275 1.1.4.1 jruoho #include <powerpc/powerpc/pio_subr.S>
276 1.1.4.1 jruoho #ifdef PPC_HAVE_SPE
277 1.1.4.1 jruoho #include <powerpc/booke/spe_subr.S>
278 1.1.4.1 jruoho #endif
279 1.1.4.1 jruoho #if defined(MULTIPROCESSOR)
280 1.1.4.1 jruoho #include <powerpc/booke/e500_mpsubr.S>
281 1.1.4.1 jruoho #endif
282 1.1.4.1 jruoho
283 1.1.4.1 jruoho #if 0
284 1.1.4.1 jruoho .p2align 5
285 1.1.4.1 jruoho ENTRY(tlbwe)
286 1.1.4.1 jruoho isync
287 1.1.4.1 jruoho tlbwe
288 1.1.4.1 jruoho isync
289 1.1.4.1 jruoho blr
290 1.1.4.1 jruoho #endif
291