locore.S revision 1.12 1 1.12 uwe /* $NetBSD: locore.S,v 1.12 2020/07/12 01:52:22 uwe Exp $ */
2 1.6 agc
3 1.6 agc /*-
4 1.6 agc * Copyright (c) 1990 The Regents of the University of California.
5 1.6 agc * All rights reserved.
6 1.6 agc *
7 1.6 agc * This code is derived from software contributed to Berkeley by
8 1.6 agc * William Jolitz.
9 1.6 agc *
10 1.6 agc * Redistribution and use in source and binary forms, with or without
11 1.6 agc * modification, are permitted provided that the following conditions
12 1.6 agc * are met:
13 1.6 agc * 1. Redistributions of source code must retain the above copyright
14 1.6 agc * notice, this list of conditions and the following disclaimer.
15 1.6 agc * 2. Redistributions in binary form must reproduce the above copyright
16 1.6 agc * notice, this list of conditions and the following disclaimer in the
17 1.6 agc * documentation and/or other materials provided with the distribution.
18 1.6 agc * 3. Neither the name of the University nor the names of its contributors
19 1.6 agc * may be used to endorse or promote products derived from this software
20 1.6 agc * without specific prior written permission.
21 1.6 agc *
22 1.6 agc * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 1.6 agc * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 1.6 agc * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 1.6 agc * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 1.6 agc * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 1.6 agc * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 1.6 agc * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 1.6 agc * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 1.6 agc * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 1.6 agc * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 1.6 agc * SUCH DAMAGE.
33 1.6 agc *
34 1.6 agc * @(#)locore.s 7.3 (Berkeley) 5/13/91
35 1.6 agc */
36 1.1 uch
37 1.1 uch /*-
38 1.1 uch * Copyright (c) 1993, 1994, 1995, 1997
39 1.1 uch * Charles M. Hannum. All rights reserved.
40 1.1 uch *
41 1.1 uch * This code is derived from software contributed to Berkeley by
42 1.1 uch * William Jolitz.
43 1.1 uch *
44 1.1 uch * Redistribution and use in source and binary forms, with or without
45 1.1 uch * modification, are permitted provided that the following conditions
46 1.1 uch * are met:
47 1.1 uch * 1. Redistributions of source code must retain the above copyright
48 1.1 uch * notice, this list of conditions and the following disclaimer.
49 1.1 uch * 2. Redistributions in binary form must reproduce the above copyright
50 1.1 uch * notice, this list of conditions and the following disclaimer in the
51 1.1 uch * documentation and/or other materials provided with the distribution.
52 1.1 uch * 3. All advertising materials mentioning features or use of this software
53 1.1 uch * must display the following acknowledgement:
54 1.1 uch * This product includes software developed by the University of
55 1.1 uch * California, Berkeley and its contributors.
56 1.1 uch * 4. Neither the name of the University nor the names of its contributors
57 1.1 uch * may be used to endorse or promote products derived from this software
58 1.1 uch * without specific prior written permission.
59 1.1 uch *
60 1.1 uch * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
61 1.1 uch * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
62 1.1 uch * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
63 1.1 uch * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
64 1.1 uch * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
65 1.1 uch * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
66 1.1 uch * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
67 1.1 uch * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
68 1.1 uch * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
69 1.1 uch * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
70 1.1 uch * SUCH DAMAGE.
71 1.1 uch *
72 1.1 uch * @(#)locore.s 7.3 (Berkeley) 5/13/91
73 1.1 uch */
74 1.1 uch
75 1.5 uch #include "opt_cputype.h"
76 1.2 uch #include "opt_memsize.h"
77 1.1 uch #include "assym.h"
78 1.1 uch
79 1.2 uch #if defined(SH3) && defined(SH4)
80 1.2 uch #error "evbsh3 port don't support SH3,SH4 common kernel."
81 1.2 uch #endif
82 1.1 uch
83 1.2 uch #include <sh3/asm.h>
84 1.4 uch #include <sh3/exception.h>
85 1.2 uch #include <sh3/locore.h>
86 1.2 uch #include <sh3/mmu_sh3.h>
87 1.2 uch #include <sh3/mmu_sh4.h>
88 1.2 uch #include <sh3/cache_sh3.h>
89 1.2 uch #include <sh3/cache_sh4.h>
90 1.1 uch
91 1.5 uch #define INIT_STACK \
92 1.5 uch ((IOM_RAM_BEGIN + IOM_RAM_SIZE - 0x00001000) | 0x80000000)
93 1.1 uch
94 1.1 uch NENTRY(start)
95 1.11 tsutsui ALTENTRY(kernel_text)
96 1.1 uch /* Set SP to initial position */
97 1.1 uch mov.l XLtmpstk, r15
98 1.1 uch
99 1.2 uch /* Mask all interrupt */
100 1.2 uch __INTR_MASK(r0, r1)
101 1.1 uch
102 1.1 uch /* Set Register Bank to Bank 0 */
103 1.1 uch mov.l SR_init, r0
104 1.1 uch ldc r0, sr
105 1.1 uch
106 1.2 uch /* MMU off */
107 1.1 uch xor r0, r0
108 1.2 uch MOV (MMUCR, r2)
109 1.2 uch mov.l r0, @r2
110 1.1 uch
111 1.1 uch bra start1
112 1.1 uch nop
113 1.1 uch .align 2
114 1.1 uch SR_init: .long 0x500000F0
115 1.2 uch REG_SYMBOL(MMUCR)
116 1.1 uch start1:
117 1.1 uch
118 1.1 uch #ifdef ROMIMAGE
119 1.1 uch /* Initialize BUS State Control Regs. */
120 1.1 uch mov.l _ROM_START, r3
121 1.1 uch mov.l XL_ram_start, r4
122 1.1 uch mov.l @r4, r4
123 1.1 uch sub r3, r4
124 1.7 wiz /* Set Bus State Controller */
125 1.1 uch mov.l XLInitializeBsc, r0
126 1.1 uch sub r4, r0
127 1.1 uch jsr @r0
128 1.1 uch nop
129 1.1 uch
130 1.1 uch /* Move kernel image from ROM area to RAM area */
131 1.1 uch mov.l ___end, r0
132 1.1 uch mov.l ___start, r1
133 1.1 uch mov.l _KERNBASE, r2
134 1.1 uch sub r2, r0
135 1.1 uch sub r2, r1
136 1.1 uch sub r1, r0
137 1.1 uch add #4, r0 /* size of bytes to be copied */
138 1.1 uch shlr2 r0 /* number of long word */
139 1.1 uch mov.l _ROM_START, r3
140 1.1 uch add r3, r1 /* src address */
141 1.1 uch mov.l ___start, r3
142 1.1 uch sub r2, r3
143 1.1 uch mov.l XL_ram_start, r4
144 1.1 uch mov.l @r4, r4
145 1.1 uch add r4, r3 /* dest address */
146 1.1 uch 1:
147 1.1 uch mov.l @r1+, r4
148 1.1 uch mov.l r4, @r3
149 1.1 uch add #4, r3
150 1.1 uch dt r0 /* decrement and Test */
151 1.1 uch bf 1b
152 1.1 uch /* kernel image copy end */
153 1.1 uch
154 1.1 uch mov.l LXstart_in_RAM, r0
155 1.1 uch jmp @r0 /* jump to RAM area */
156 1.1 uch nop
157 1.1 uch
158 1.1 uch .align 2
159 1.1 uch LXstart_in_RAM:
160 1.1 uch .long start_in_RAM
161 1.1 uch XL_ram_start:
162 1.1 uch .long _C_LABEL(ram_start)
163 1.2 uch #else /* ROMIMAGE */
164 1.1 uch #ifndef DONT_INIT_BSC
165 1.7 wiz /* Set Bus State Controller */
166 1.1 uch mov.l XLInitializeBsc, r0
167 1.1 uch jsr @r0
168 1.1 uch nop
169 1.2 uch #endif /* !DONT_INIT_BSC */
170 1.2 uch #endif /* ROMIMAGE */
171 1.1 uch
172 1.1 uch start_in_RAM:
173 1.1 uch mova 1f, r0
174 1.1 uch mov r0, r4
175 1.1 uch mov.l XLinitSH3, r0
176 1.1 uch jsr @r0 /* call initSH3() */
177 1.1 uch nop
178 1.1 uch
179 1.1 uch .align 2
180 1.1 uch 1:
181 1.1 uch
182 1.1 uch #ifdef SH4
183 1.1 uch /* CCR must be accessed from P2 area */
184 1.1 uch mova cache_on, r0
185 1.1 uch mov r0, r5
186 1.1 uch mov.l XLtoP2, r1
187 1.1 uch add r1, r5
188 1.1 uch mova main_label, r0
189 1.1 uch mov r0, r2
190 1.2 uch MOV (CCR, r3)
191 1.1 uch mov.l XL_CCRVAL, r4
192 1.1 uch jmp @r5
193 1.1 uch nop
194 1.1 uch
195 1.1 uch .align 2
196 1.1 uch cache_on:
197 1.1 uch mov.l r4, @r3 /* Write to CCR */
198 1.1 uch nop
199 1.1 uch nop
200 1.1 uch nop
201 1.1 uch nop
202 1.1 uch nop
203 1.1 uch nop
204 1.1 uch nop
205 1.1 uch nop
206 1.1 uch jmp @r2
207 1.1 uch nop
208 1.1 uch
209 1.1 uch .align 2
210 1.1 uch main_label:
211 1.2 uch #endif /* SH4 */
212 1.1 uch mov.l XLmain, r0
213 1.1 uch jsr @r0 /* call main() */
214 1.1 uch nop
215 1.1 uch
216 1.1 uch .align 2
217 1.1 uch
218 1.1 uch #ifndef DONT_INIT_BSC
219 1.1 uch XLInitializeBsc:.long _C_LABEL(InitializeBsc)
220 1.2 uch #endif /* DONT_INIT_BSC */
221 1.1 uch ___start: .long start
222 1.10 uebayasi ___etext: .long _C_LABEL(etext)
223 1.10 uebayasi ___end: .long _C_LABEL(end)
224 1.1 uch XLtmpstk: .long INIT_STACK
225 1.2 uch _KERNBASE: .long 0x8c000000
226 1.12 uwe #ifdef ROMIMAGE
227 1.1 uch _ROM_START: .long IOM_ROM_BEGIN
228 1.12 uwe #endif
229 1.1 uch XLinitSH3: .long _C_LABEL(initSH3)
230 1.1 uch XLmain: .long _C_LABEL(main)
231 1.1 uch XLtoP2: .long 0x20000000
232 1.2 uch REG_SYMBOL(CCR)
233 1.1 uch #ifdef SH4
234 1.1 uch XL_CCRVAL: .long 0x0909 /* Operand cache ON */
235 1.2 uch #endif /* SH4 */
236 1.1 uch
237 1.1 uch load_and_reset:
238 1.1 uch mov.l XL_start_address, r0
239 1.1 uch mov r0, r8
240 1.1 uch mov.l @r4+, r1 /* r1 = osimage size */
241 1.1 uch mov.l @r4+, r2 /* r2 = check sum */
242 1.1 uch shlr2 r1 /* r1 = osimage size in dword */
243 1.1 uch 1:
244 1.1 uch mov.l @r4+, r3
245 1.1 uch mov.l r3, @r0
246 1.1 uch add #4, r0
247 1.1 uch dt r1
248 1.1 uch bf 1b
249 1.1 uch
250 1.1 uch jmp @r8 /* jump to start address */
251 1.1 uch nop
252 1.1 uch
253 1.1 uch .align 2
254 1.1 uch XL_start_address:
255 1.1 uch .long IOM_RAM_BEGIN + 0x00010000
256 1.1 uch load_and_reset_end:
257 1.1 uch
258 1.1 uch ENTRY(XLoadAndReset)
259 1.2 uch __INTR_MASK(r0, r1)
260 1.1 uch /* copy trampoline code to RAM area top */
261 1.1 uch mov.l XL_load_and_reset, r0
262 1.1 uch mov.l XL_load_and_reset_end, r1
263 1.1 uch mov.l XL_load_trampoline_addr, r2
264 1.1 uch mov r2, r8
265 1.1 uch sub r0, r1 /* r1 = bytes to be copied */
266 1.1 uch 1: mov.b @r0+, r3
267 1.1 uch mov.b r3, @r2
268 1.1 uch add #1, r2
269 1.1 uch dt r1
270 1.1 uch bf 1b
271 1.1 uch
272 1.1 uch jmp @r8 /* jump to trampoline code */
273 1.1 uch nop
274 1.1 uch
275 1.1 uch .align 2
276 1.1 uch XL_load_trampoline_addr:
277 1.1 uch .long IOM_RAM_BEGIN + 0x00008000
278 1.1 uch XL_load_and_reset:
279 1.1 uch .long load_and_reset
280 1.1 uch XL_load_and_reset_end:
281 1.1 uch .long load_and_reset_end
282