locore.S revision 1.5 1 1.5 uch /* $NetBSD: locore.S,v 1.5 2002/05/09 12:34:21 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.5 uch #include "opt_cputype.h"
44 1.2 uch #include "opt_memsize.h"
45 1.1 uch #include "assym.h"
46 1.1 uch
47 1.2 uch #if defined(SH3) && defined(SH4)
48 1.2 uch #error "evbsh3 port don't support SH3,SH4 common kernel."
49 1.2 uch #endif
50 1.1 uch
51 1.2 uch #include <sh3/asm.h>
52 1.4 uch #include <sh3/exception.h>
53 1.2 uch #include <sh3/locore.h>
54 1.2 uch #include <sh3/mmu_sh3.h>
55 1.2 uch #include <sh3/mmu_sh4.h>
56 1.2 uch #include <sh3/cache_sh3.h>
57 1.2 uch #include <sh3/cache_sh4.h>
58 1.1 uch
59 1.5 uch #define INIT_STACK \
60 1.5 uch ((IOM_RAM_BEGIN + IOM_RAM_SIZE - 0x00001000) | 0x80000000)
61 1.1 uch
62 1.1 uch NENTRY(start)
63 1.1 uch /* Set SP to initial position */
64 1.1 uch mov.l XLtmpstk, r15
65 1.1 uch
66 1.2 uch /* Mask all interrupt */
67 1.2 uch __INTR_MASK(r0, r1)
68 1.1 uch
69 1.1 uch /* Set Register Bank to Bank 0 */
70 1.1 uch mov.l SR_init, r0
71 1.1 uch ldc r0, sr
72 1.1 uch
73 1.2 uch /* MMU off */
74 1.1 uch xor r0, r0
75 1.2 uch MOV (MMUCR, r2)
76 1.2 uch mov.l r0, @r2
77 1.1 uch
78 1.1 uch bra start1
79 1.1 uch nop
80 1.1 uch .align 2
81 1.1 uch SR_init: .long 0x500000F0
82 1.2 uch REG_SYMBOL(MMUCR)
83 1.1 uch start1:
84 1.1 uch
85 1.1 uch #ifdef ROMIMAGE
86 1.1 uch /* Initialize BUS State Control Regs. */
87 1.1 uch mov.l _ROM_START, r3
88 1.1 uch mov.l XL_ram_start, r4
89 1.1 uch mov.l @r4, r4
90 1.1 uch sub r3, r4
91 1.1 uch /* Set Bus State Controler */
92 1.1 uch mov.l XLInitializeBsc, r0
93 1.1 uch sub r4, r0
94 1.1 uch jsr @r0
95 1.1 uch nop
96 1.1 uch
97 1.1 uch /* Move kernel image from ROM area to RAM area */
98 1.1 uch mov.l ___end, r0
99 1.1 uch mov.l ___start, r1
100 1.1 uch mov.l _KERNBASE, r2
101 1.1 uch sub r2, r0
102 1.1 uch sub r2, r1
103 1.1 uch sub r1, r0
104 1.1 uch add #4, r0 /* size of bytes to be copied */
105 1.1 uch shlr2 r0 /* number of long word */
106 1.1 uch mov.l _ROM_START, r3
107 1.1 uch add r3, r1 /* src address */
108 1.1 uch mov.l ___start, r3
109 1.1 uch sub r2, r3
110 1.1 uch mov.l XL_ram_start, r4
111 1.1 uch mov.l @r4, r4
112 1.1 uch add r4, r3 /* dest address */
113 1.1 uch 1:
114 1.1 uch mov.l @r1+, r4
115 1.1 uch mov.l r4, @r3
116 1.1 uch add #4, r3
117 1.1 uch dt r0 /* decrement and Test */
118 1.1 uch bf 1b
119 1.1 uch /* kernel image copy end */
120 1.1 uch
121 1.1 uch mov.l LXstart_in_RAM, r0
122 1.1 uch jmp @r0 /* jump to RAM area */
123 1.1 uch nop
124 1.1 uch
125 1.1 uch .align 2
126 1.1 uch LXstart_in_RAM:
127 1.1 uch .long start_in_RAM
128 1.1 uch XL_ram_start:
129 1.1 uch .long _C_LABEL(ram_start)
130 1.2 uch #else /* ROMIMAGE */
131 1.1 uch #ifndef DONT_INIT_BSC
132 1.1 uch /* Set Bus State Controler */
133 1.1 uch mov.l XLInitializeBsc, r0
134 1.1 uch jsr @r0
135 1.1 uch nop
136 1.2 uch #endif /* !DONT_INIT_BSC */
137 1.2 uch #endif /* ROMIMAGE */
138 1.1 uch
139 1.1 uch start_in_RAM:
140 1.1 uch mova 1f, r0
141 1.1 uch mov r0, r4
142 1.1 uch mov.l XLinitSH3, r0
143 1.1 uch jsr @r0 /* call initSH3() */
144 1.1 uch nop
145 1.1 uch
146 1.1 uch .align 2
147 1.1 uch 1:
148 1.1 uch
149 1.1 uch #ifdef SH4
150 1.1 uch /* CCR must be accessed from P2 area */
151 1.1 uch mova cache_on, r0
152 1.1 uch mov r0, r5
153 1.1 uch mov.l XLtoP2, r1
154 1.1 uch add r1, r5
155 1.1 uch mova main_label, r0
156 1.1 uch mov r0, r2
157 1.2 uch MOV (CCR, r3)
158 1.1 uch mov.l XL_CCRVAL, r4
159 1.1 uch jmp @r5
160 1.1 uch nop
161 1.1 uch
162 1.1 uch .align 2
163 1.1 uch cache_on:
164 1.1 uch mov.l r4, @r3 /* Write to CCR */
165 1.1 uch nop
166 1.1 uch nop
167 1.1 uch nop
168 1.1 uch nop
169 1.1 uch nop
170 1.1 uch nop
171 1.1 uch nop
172 1.1 uch nop
173 1.1 uch jmp @r2
174 1.1 uch nop
175 1.1 uch
176 1.1 uch .align 2
177 1.1 uch main_label:
178 1.2 uch #endif /* SH4 */
179 1.1 uch mov.l XLmain, r0
180 1.1 uch jsr @r0 /* call main() */
181 1.1 uch nop
182 1.1 uch
183 1.1 uch .align 2
184 1.1 uch
185 1.1 uch #ifndef DONT_INIT_BSC
186 1.1 uch XLInitializeBsc:.long _C_LABEL(InitializeBsc)
187 1.2 uch #endif /* DONT_INIT_BSC */
188 1.1 uch ___start: .long start
189 1.1 uch ___etext: .long _etext
190 1.1 uch ___end: .long _end
191 1.1 uch XLtmpstk: .long INIT_STACK
192 1.2 uch _KERNBASE: .long 0x8c000000
193 1.1 uch _ROM_START: .long IOM_ROM_BEGIN
194 1.1 uch XLinitSH3: .long _C_LABEL(initSH3)
195 1.1 uch XLmain: .long _C_LABEL(main)
196 1.1 uch XLtoP2: .long 0x20000000
197 1.2 uch REG_SYMBOL(CCR)
198 1.1 uch #ifdef SH4
199 1.1 uch XL_CCRVAL: .long 0x0909 /* Operand cache ON */
200 1.2 uch #endif /* SH4 */
201 1.1 uch
202 1.1 uch load_and_reset:
203 1.1 uch mov.l XL_start_address, r0
204 1.1 uch mov r0, r8
205 1.1 uch mov.l @r4+, r1 /* r1 = osimage size */
206 1.1 uch mov.l @r4+, r2 /* r2 = check sum */
207 1.1 uch shlr2 r1 /* r1 = osimage size in dword */
208 1.1 uch 1:
209 1.1 uch mov.l @r4+, r3
210 1.1 uch mov.l r3, @r0
211 1.1 uch add #4, r0
212 1.1 uch dt r1
213 1.1 uch bf 1b
214 1.1 uch
215 1.1 uch jmp @r8 /* jump to start address */
216 1.1 uch nop
217 1.1 uch
218 1.1 uch .align 2
219 1.1 uch XL_start_address:
220 1.1 uch .long IOM_RAM_BEGIN + 0x00010000
221 1.1 uch load_and_reset_end:
222 1.1 uch
223 1.1 uch ENTRY(XLoadAndReset)
224 1.2 uch __INTR_MASK(r0, r1)
225 1.1 uch /* copy trampoline code to RAM area top */
226 1.1 uch mov.l XL_load_and_reset, r0
227 1.1 uch mov.l XL_load_and_reset_end, r1
228 1.1 uch mov.l XL_load_trampoline_addr, r2
229 1.1 uch mov r2, r8
230 1.1 uch sub r0, r1 /* r1 = bytes to be copied */
231 1.1 uch 1: mov.b @r0+, r3
232 1.1 uch mov.b r3, @r2
233 1.1 uch add #1, r2
234 1.1 uch dt r1
235 1.1 uch bf 1b
236 1.1 uch
237 1.1 uch jmp @r8 /* jump to trampoline code */
238 1.1 uch nop
239 1.1 uch
240 1.1 uch .align 2
241 1.1 uch XL_load_trampoline_addr:
242 1.1 uch .long IOM_RAM_BEGIN + 0x00008000
243 1.1 uch XL_load_and_reset:
244 1.1 uch .long load_and_reset
245 1.1 uch XL_load_and_reset_end:
246 1.1 uch .long load_and_reset_end
247 1.1 uch .data
248 1.1 uch .align 2
249 1.1 uch .globl _C_LABEL(intrcnt), _C_LABEL(eintrcnt)
250 1.1 uch .globl _C_LABEL(intrnames), _C_LABEL(eintrnames)
251 1.1 uch _C_LABEL(intrcnt):
252 1.1 uch _C_LABEL(eintrcnt):
253 1.1 uch _C_LABEL(intrnames):
254 1.1 uch _C_LABEL(eintrnames):
255