locore.S revision 1.1 1 1.1 uch /* $NetBSD: locore.S,v 1.1 2002/02/24 18:19:41 uch Exp $ */
2 1.1 uch
3 1.1 uch /*-
4 1.1 uch * Copyright (c) 1993, 1994, 1995, 1997
5 1.1 uch * Charles M. Hannum. All rights reserved.
6 1.1 uch * Copyright (c) 1990 The Regents of the University of California.
7 1.1 uch * All rights reserved.
8 1.1 uch *
9 1.1 uch * This code is derived from software contributed to Berkeley by
10 1.1 uch * William Jolitz.
11 1.1 uch *
12 1.1 uch * Redistribution and use in source and binary forms, with or without
13 1.1 uch * modification, are permitted provided that the following conditions
14 1.1 uch * are met:
15 1.1 uch * 1. Redistributions of source code must retain the above copyright
16 1.1 uch * notice, this list of conditions and the following disclaimer.
17 1.1 uch * 2. Redistributions in binary form must reproduce the above copyright
18 1.1 uch * notice, this list of conditions and the following disclaimer in the
19 1.1 uch * documentation and/or other materials provided with the distribution.
20 1.1 uch * 3. All advertising materials mentioning features or use of this software
21 1.1 uch * must display the following acknowledgement:
22 1.1 uch * This product includes software developed by the University of
23 1.1 uch * California, Berkeley and its contributors.
24 1.1 uch * 4. Neither the name of the University nor the names of its contributors
25 1.1 uch * may be used to endorse or promote products derived from this software
26 1.1 uch * without specific prior written permission.
27 1.1 uch *
28 1.1 uch * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
29 1.1 uch * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
30 1.1 uch * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
31 1.1 uch * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
32 1.1 uch * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33 1.1 uch * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
34 1.1 uch * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
35 1.1 uch * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
36 1.1 uch * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
37 1.1 uch * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
38 1.1 uch * SUCH DAMAGE.
39 1.1 uch *
40 1.1 uch * @(#)locore.s 7.3 (Berkeley) 5/13/91
41 1.1 uch */
42 1.1 uch
43 1.1 uch #include "opt_ddb.h"
44 1.1 uch #include "opt_lockdebug.h"
45 1.1 uch #include "opt_memsize.h"
46 1.1 uch
47 1.1 uch #include "assym.h"
48 1.1 uch
49 1.1 uch #include <sys/errno.h>
50 1.1 uch #include <sys/syscall.h>
51 1.1 uch
52 1.1 uch #include <sh3/locore.h>
53 1.1 uch #include <machine/asm.h>
54 1.1 uch #include <machine/cputypes.h>
55 1.1 uch #include <machine/param.h>
56 1.1 uch #include <machine/pte.h>
57 1.1 uch #include <machine/trap.h>
58 1.1 uch
59 1.1 uch #define INIT_STACK IOM_RAM_BEGIN + IOM_RAM_SIZE - 0x00001000
60 1.1 uch
61 1.1 uch #ifdef SH4
62 1.1 uch #define SHREG_BBRA 0xff200008
63 1.1 uch #define SHREG_CCR 0xff00001c
64 1.1 uch #define SHREG_EXPEVT 0xff000024
65 1.1 uch #define SHREG_INTEVT 0xff000028
66 1.1 uch #define SHREG_MMUCR 0xff000010
67 1.1 uch #define SHREG_TTB 0xff000008
68 1.1 uch #else
69 1.1 uch #define SHREG_BBRA 0xffffffb8
70 1.1 uch #define SHREG_CCR 0xffffffec
71 1.1 uch #define SHREG_EXPEVT 0xffffffd4
72 1.1 uch #define SHREG_INTEVT 0xffffffd8
73 1.1 uch #define SHREG_MMUCR 0xffffffe0
74 1.1 uch #define SHREG_TTB 0xfffffff8
75 1.1 uch #endif
76 1.1 uch
77 1.1 uch NENTRY(start)
78 1.1 uch /* Set SP to initial position */
79 1.1 uch mov.l XLtmpstk, r15
80 1.1 uch
81 1.1 uch __INTR_MASK_r0_r1
82 1.1 uch
83 1.1 uch /* Set Register Bank to Bank 0 */
84 1.1 uch mov.l SR_init, r0
85 1.1 uch ldc r0, sr
86 1.1 uch
87 1.1 uch xor r0, r0
88 1.1 uch mov.l XL_SHREG_MMUCR, r2
89 1.1 uch mov.l r0, @r2 /* MMU OFF */
90 1.1 uch
91 1.1 uch bra start1
92 1.1 uch nop
93 1.1 uch .align 2
94 1.1 uch SR_init: .long 0x500000F0
95 1.1 uch XL_SHREG_MMUCR: .long SHREG_MMUCR
96 1.1 uch start1:
97 1.1 uch
98 1.1 uch #ifdef ROMIMAGE
99 1.1 uch /* Initialize BUS State Control Regs. */
100 1.1 uch mov.l _ROM_START, r3
101 1.1 uch mov.l XL_ram_start, r4
102 1.1 uch mov.l @r4, r4
103 1.1 uch sub r3, r4
104 1.1 uch /* Set Bus State Controler */
105 1.1 uch mov.l XLInitializeBsc, r0
106 1.1 uch sub r4, r0
107 1.1 uch jsr @r0
108 1.1 uch nop
109 1.1 uch
110 1.1 uch /* Move kernel image from ROM area to RAM area */
111 1.1 uch mov.l ___end, r0
112 1.1 uch mov.l ___start, r1
113 1.1 uch mov.l _KERNBASE, r2
114 1.1 uch sub r2, r0
115 1.1 uch sub r2, r1
116 1.1 uch sub r1, r0
117 1.1 uch add #4, r0 /* size of bytes to be copied */
118 1.1 uch shlr2 r0 /* number of long word */
119 1.1 uch mov.l _ROM_START, r3
120 1.1 uch add r3, r1 /* src address */
121 1.1 uch mov.l ___start, r3
122 1.1 uch sub r2, r3
123 1.1 uch mov.l XL_ram_start, r4
124 1.1 uch mov.l @r4, r4
125 1.1 uch add r4, r3 /* dest address */
126 1.1 uch 1:
127 1.1 uch mov.l @r1+, r4
128 1.1 uch mov.l r4, @r3
129 1.1 uch add #4, r3
130 1.1 uch dt r0 /* decrement and Test */
131 1.1 uch bf 1b
132 1.1 uch /* kernel image copy end */
133 1.1 uch
134 1.1 uch mov.l LXstart_in_RAM, r0
135 1.1 uch jmp @r0 /* jump to RAM area */
136 1.1 uch nop
137 1.1 uch
138 1.1 uch .align 2
139 1.1 uch LXstart_in_RAM:
140 1.1 uch .long start_in_RAM
141 1.1 uch XL_ram_start:
142 1.1 uch .long _C_LABEL(ram_start)
143 1.1 uch #else
144 1.1 uch #ifndef DONT_INIT_BSC
145 1.1 uch /* Set Bus State Controler */
146 1.1 uch mov.l XLInitializeBsc, r0
147 1.1 uch jsr @r0
148 1.1 uch nop
149 1.1 uch #endif
150 1.1 uch #endif
151 1.1 uch
152 1.1 uch start_in_RAM:
153 1.1 uch mova 1f, r0
154 1.1 uch mov r0, r4
155 1.1 uch mov.l XLinitSH3, r0
156 1.1 uch jsr @r0 /* call initSH3() */
157 1.1 uch nop
158 1.1 uch
159 1.1 uch .align 2
160 1.1 uch 1:
161 1.1 uch
162 1.1 uch #ifdef SH4
163 1.1 uch /* CCR must be accessed from P2 area */
164 1.1 uch mova cache_on, r0
165 1.1 uch mov r0, r5
166 1.1 uch mov.l XLtoP2, r1
167 1.1 uch add r1, r5
168 1.1 uch mova main_label, r0
169 1.1 uch mov r0, r2
170 1.1 uch mov.l XL_SHREG_CCR, r3
171 1.1 uch mov.l XL_CCRVAL, r4
172 1.1 uch jmp @r5
173 1.1 uch nop
174 1.1 uch
175 1.1 uch .align 2
176 1.1 uch cache_on:
177 1.1 uch mov.l r4, @r3 /* Write to CCR */
178 1.1 uch nop
179 1.1 uch nop
180 1.1 uch nop
181 1.1 uch nop
182 1.1 uch nop
183 1.1 uch nop
184 1.1 uch nop
185 1.1 uch nop
186 1.1 uch jmp @r2
187 1.1 uch nop
188 1.1 uch
189 1.1 uch .align 2
190 1.1 uch main_label:
191 1.1 uch #endif
192 1.1 uch mov.l XLmain, r0
193 1.1 uch jsr @r0 /* call main() */
194 1.1 uch nop
195 1.1 uch
196 1.1 uch .align 2
197 1.1 uch
198 1.1 uch #ifndef DONT_INIT_BSC
199 1.1 uch XLInitializeBsc:.long _C_LABEL(InitializeBsc)
200 1.1 uch #endif
201 1.1 uch ___start: .long start
202 1.1 uch ___etext: .long _etext
203 1.1 uch ___end: .long _end
204 1.1 uch XLtmpstk: .long INIT_STACK
205 1.1 uch _KERNBASE: .long KERNBASE
206 1.1 uch _ROM_START: .long IOM_ROM_BEGIN
207 1.1 uch XLinitSH3: .long _C_LABEL(initSH3)
208 1.1 uch XLmain: .long _C_LABEL(main)
209 1.1 uch XLtoP2: .long 0x20000000
210 1.1 uch XL_SHREG_CCR: .long SHREG_CCR
211 1.1 uch #ifdef SH4
212 1.1 uch #if 1
213 1.1 uch XL_CCRVAL: .long 0x0909 /* Operand cache ON */
214 1.1 uch #else
215 1.1 uch XL_CCRVAL: .long 0x0000 /* cache OFF */
216 1.1 uch #endif
217 1.1 uch #endif
218 1.1 uch
219 1.1 uch load_and_reset:
220 1.1 uch mov.l XL_start_address, r0
221 1.1 uch mov r0, r8
222 1.1 uch mov.l @r4+, r1 /* r1 = osimage size */
223 1.1 uch mov.l @r4+, r2 /* r2 = check sum */
224 1.1 uch shlr2 r1 /* r1 = osimage size in dword */
225 1.1 uch 1:
226 1.1 uch mov.l @r4+, r3
227 1.1 uch mov.l r3, @r0
228 1.1 uch add #4, r0
229 1.1 uch dt r1
230 1.1 uch bf 1b
231 1.1 uch
232 1.1 uch jmp @r8 /* jump to start address */
233 1.1 uch nop
234 1.1 uch
235 1.1 uch .align 2
236 1.1 uch XL_start_address:
237 1.1 uch .long IOM_RAM_BEGIN + 0x00010000
238 1.1 uch load_and_reset_end:
239 1.1 uch
240 1.1 uch ENTRY(XLoadAndReset)
241 1.1 uch __INTR_MASK_r0_r1
242 1.1 uch /* copy trampoline code to RAM area top */
243 1.1 uch mov.l XL_load_and_reset, r0
244 1.1 uch mov.l XL_load_and_reset_end, r1
245 1.1 uch mov.l XL_load_trampoline_addr, r2
246 1.1 uch mov r2, r8
247 1.1 uch sub r0, r1 /* r1 = bytes to be copied */
248 1.1 uch 1: mov.b @r0+, r3
249 1.1 uch mov.b r3, @r2
250 1.1 uch add #1, r2
251 1.1 uch dt r1
252 1.1 uch bf 1b
253 1.1 uch
254 1.1 uch jmp @r8 /* jump to trampoline code */
255 1.1 uch nop
256 1.1 uch
257 1.1 uch .align 2
258 1.1 uch XL_load_trampoline_addr:
259 1.1 uch .long IOM_RAM_BEGIN + 0x00008000
260 1.1 uch XL_load_and_reset:
261 1.1 uch .long load_and_reset
262 1.1 uch XL_load_and_reset_end:
263 1.1 uch .long load_and_reset_end
264 1.1 uch
265 1.1 uch ENTRY(Sh3Reset)
266 1.1 uch mov.l XL_reset_vector, r8
267 1.1 uch jmp @r8
268 1.1 uch nop
269 1.1 uch
270 1.1 uch .align 2
271 1.1 uch XL_reset_vector:
272 1.1 uch .long 0xa0000000
273 1.1 uch
274 1.1 uch /*
275 1.1 uch * void interrupt_exp(int, int, int, int, stuct trapframe)
276 1.1 uch * __attribute__((__noreturn__)):
277 1.1 uch * on entry, SR.BL = 1, SR_RB = 0, all regsiters are saved,
278 1.1 uch * stack is already setuped.
279 1.1 uch */
280 1.1 uch .align 2
281 1.1 uch recurse:
282 1.1 uch stc sr, r4
283 1.1 uch ldc r5, spc
284 1.1 uch ldc r4, ssr
285 1.1 uch RECURSEENTRY
286 1.1 uch bra 1f
287 1.1 uch nop
288 1.1 uch NENTRY(interrupt_exp)
289 1.1 uch 1:
290 1.1 uch MOV (INTEVT, r0)
291 1.1 uch mov.l @r0, r0
292 1.1 uch mov.l r0, @(TF_TRAPNO, r15) /* trapframe->tf_trapno = INTEVT */
293 1.1 uch __INTR_MASK_r0_r1 /* mask all interrupt */
294 1.1 uch __EXCEPTION_UNBLOCK_r0_r1 /* enable exception for TLB handling */
295 1.1 uch mov.l _L.intrhandler, r0
296 1.1 uch jsr @r0
297 1.1 uch nop
298 1.1 uch tst r0, r0 /* intrhandler() == 0, fast intr return */
299 1.1 uch bt 2f
300 1.1 uch
301 1.1 uch mov.l _L.check_ipending, r0
302 1.1 uch jsr @r0
303 1.1 uch nop
304 1.1 uch tst r0, r0
305 1.1 uch bf 1b /* handle pending interrupt. */
306 1.1 uch
307 1.1 uch /* Check for ASTs on exit to user mode. */
308 1.1 uch mov.l _L.ast, r0
309 1.1 uch jsr @r0
310 1.1 uch mov r15, r4
311 1.1 uch 2:
312 1.1 uch EXCEPTION_RETURN
313 1.1 uch /* NOTREACHED */
314 1.1 uch .align 2
315 1.1 uch REG_SYMBOL(INTEVT)
316 1.1 uch _L.intrhandler: .long _C_LABEL(intrhandler)
317 1.1 uch _L.ast: .long _C_LABEL(ast)
318 1.1 uch
319 1.1 uch NENTRY(Xspllower)
320 1.1 uch sts.l pr, @-r15
321 1.1 uch
322 1.1 uch restart:
323 1.1 uch __INTR_MASK_r0_r1
324 1.1 uch __EXCEPTION_UNBLOCK_r0_r1
325 1.1 uch mov.l _L.check_ipending, r0
326 1.1 uch jsr @r0
327 1.1 uch nop
328 1.1 uch tst r0, r0
329 1.1 uch bt 1f
330 1.1 uch
331 1.1 uch mov.l _L.restart, r5
332 1.1 uch mov.l _L.recurse, r0
333 1.1 uch jmp @r0
334 1.1 uch nop
335 1.1 uch
336 1.1 uch 1:
337 1.1 uch __INTR_UNMASK_r0_r1
338 1.1 uch lds.l @r15+, pr
339 1.1 uch rts
340 1.1 uch nop
341 1.1 uch
342 1.1 uch .align 2
343 1.1 uch _L.check_ipending: .long _C_LABEL(check_ipending)
344 1.1 uch _L.recurse: .long recurse
345 1.1 uch _L.restart: .long restart
346 1.1 uch
347 1.1 uch .data
348 1.1 uch .align 2
349 1.1 uch .globl _C_LABEL(intrcnt), _C_LABEL(eintrcnt)
350 1.1 uch .globl _C_LABEL(intrnames), _C_LABEL(eintrnames)
351 1.1 uch _C_LABEL(intrcnt):
352 1.1 uch _C_LABEL(eintrcnt):
353 1.1 uch _C_LABEL(intrnames):
354 1.1 uch _C_LABEL(eintrnames):
355