locore.S revision 1.14 1 1.14 uwe /* $NetBSD: locore.S,v 1.14 2020/07/28 20:36:43 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.14 uwe #if defined(SH3) && defined(SH4)
80 1.14 uwe #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.13 uwe #include <sh3/psl.h>
85 1.4 uch #include <sh3/exception.h>
86 1.2 uch #include <sh3/locore.h>
87 1.2 uch #include <sh3/mmu_sh3.h>
88 1.2 uch #include <sh3/mmu_sh4.h>
89 1.2 uch #include <sh3/cache_sh3.h>
90 1.2 uch #include <sh3/cache_sh4.h>
91 1.1 uch
92 1.5 uch #define INIT_STACK \
93 1.5 uch ((IOM_RAM_BEGIN + IOM_RAM_SIZE - 0x00001000) | 0x80000000)
94 1.1 uch
95 1.1 uch NENTRY(start)
96 1.11 tsutsui ALTENTRY(kernel_text)
97 1.1 uch /* Set SP to initial position */
98 1.1 uch mov.l XLtmpstk, r15
99 1.1 uch
100 1.2 uch /* Mask all interrupt */
101 1.2 uch __INTR_MASK(r0, r1)
102 1.1 uch
103 1.1 uch /* Set Register Bank to Bank 0 */
104 1.1 uch mov.l SR_init, r0
105 1.1 uch ldc r0, sr
106 1.1 uch
107 1.2 uch /* MMU off */
108 1.1 uch xor r0, r0
109 1.2 uch MOV (MMUCR, r2)
110 1.2 uch mov.l r0, @r2
111 1.1 uch
112 1.1 uch bra start1
113 1.1 uch nop
114 1.1 uch .align 2
115 1.13 uwe SR_init: .long PSL_MD | PSL_BL | PSL_IMASK
116 1.2 uch REG_SYMBOL(MMUCR)
117 1.1 uch start1:
118 1.1 uch
119 1.1 uch #ifdef ROMIMAGE
120 1.1 uch /* Initialize BUS State Control Regs. */
121 1.1 uch mov.l _ROM_START, r3
122 1.1 uch mov.l XL_ram_start, r4
123 1.1 uch mov.l @r4, r4
124 1.1 uch sub r3, r4
125 1.7 wiz /* Set Bus State Controller */
126 1.1 uch mov.l XLInitializeBsc, r0
127 1.1 uch sub r4, r0
128 1.1 uch jsr @r0
129 1.1 uch nop
130 1.1 uch
131 1.1 uch /* Move kernel image from ROM area to RAM area */
132 1.1 uch mov.l ___end, r0
133 1.1 uch mov.l ___start, r1
134 1.1 uch mov.l _KERNBASE, r2
135 1.1 uch sub r2, r0
136 1.1 uch sub r2, r1
137 1.1 uch sub r1, r0
138 1.1 uch add #4, r0 /* size of bytes to be copied */
139 1.1 uch shlr2 r0 /* number of long word */
140 1.1 uch mov.l _ROM_START, r3
141 1.1 uch add r3, r1 /* src address */
142 1.1 uch mov.l ___start, r3
143 1.1 uch sub r2, r3
144 1.1 uch mov.l XL_ram_start, r4
145 1.14 uwe mov.l @r4, r4
146 1.1 uch add r4, r3 /* dest address */
147 1.1 uch 1:
148 1.1 uch mov.l @r1+, r4
149 1.1 uch mov.l r4, @r3
150 1.1 uch add #4, r3
151 1.1 uch dt r0 /* decrement and Test */
152 1.1 uch bf 1b
153 1.1 uch /* kernel image copy end */
154 1.1 uch
155 1.1 uch mov.l LXstart_in_RAM, r0
156 1.1 uch jmp @r0 /* jump to RAM area */
157 1.1 uch nop
158 1.1 uch
159 1.1 uch .align 2
160 1.1 uch LXstart_in_RAM:
161 1.1 uch .long start_in_RAM
162 1.14 uwe XL_ram_start:
163 1.1 uch .long _C_LABEL(ram_start)
164 1.2 uch #else /* ROMIMAGE */
165 1.1 uch #ifndef DONT_INIT_BSC
166 1.7 wiz /* Set Bus State Controller */
167 1.1 uch mov.l XLInitializeBsc, r0
168 1.1 uch jsr @r0
169 1.1 uch nop
170 1.2 uch #endif /* !DONT_INIT_BSC */
171 1.2 uch #endif /* ROMIMAGE */
172 1.1 uch
173 1.1 uch start_in_RAM:
174 1.1 uch mova 1f, r0
175 1.1 uch mov r0, r4
176 1.1 uch mov.l XLinitSH3, r0
177 1.1 uch jsr @r0 /* call initSH3() */
178 1.1 uch nop
179 1.1 uch
180 1.1 uch .align 2
181 1.1 uch 1:
182 1.1 uch
183 1.1 uch #ifdef SH4
184 1.1 uch /* CCR must be accessed from P2 area */
185 1.1 uch mova cache_on, r0
186 1.1 uch mov r0, r5
187 1.1 uch mov.l XLtoP2, r1
188 1.1 uch add r1, r5
189 1.1 uch mova main_label, r0
190 1.1 uch mov r0, r2
191 1.2 uch MOV (CCR, r3)
192 1.1 uch mov.l XL_CCRVAL, r4
193 1.1 uch jmp @r5
194 1.1 uch nop
195 1.1 uch
196 1.1 uch .align 2
197 1.1 uch cache_on:
198 1.1 uch mov.l r4, @r3 /* Write to CCR */
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 nop
207 1.1 uch jmp @r2
208 1.1 uch nop
209 1.14 uwe
210 1.1 uch .align 2
211 1.1 uch main_label:
212 1.2 uch #endif /* SH4 */
213 1.1 uch mov.l XLmain, r0
214 1.1 uch jsr @r0 /* call main() */
215 1.1 uch nop
216 1.1 uch
217 1.1 uch .align 2
218 1.1 uch
219 1.1 uch #ifndef DONT_INIT_BSC
220 1.1 uch XLInitializeBsc:.long _C_LABEL(InitializeBsc)
221 1.2 uch #endif /* DONT_INIT_BSC */
222 1.1 uch ___start: .long start
223 1.10 uebayasi ___etext: .long _C_LABEL(etext)
224 1.10 uebayasi ___end: .long _C_LABEL(end)
225 1.1 uch XLtmpstk: .long INIT_STACK
226 1.2 uch _KERNBASE: .long 0x8c000000
227 1.12 uwe #ifdef ROMIMAGE
228 1.1 uch _ROM_START: .long IOM_ROM_BEGIN
229 1.12 uwe #endif
230 1.1 uch XLinitSH3: .long _C_LABEL(initSH3)
231 1.1 uch XLmain: .long _C_LABEL(main)
232 1.1 uch XLtoP2: .long 0x20000000
233 1.2 uch REG_SYMBOL(CCR)
234 1.13 uwe #ifdef SH4 /* invalidate and enable instruction and operand caches */
235 1.13 uwe XL_CCRVAL: .long SH4_CCR_ICI | SH4_CCR_ICE | SH4_CCR_OCI | SH4_CCR_OCE
236 1.2 uch #endif /* SH4 */
237 1.1 uch
238 1.1 uch load_and_reset:
239 1.1 uch mov.l XL_start_address, r0
240 1.1 uch mov r0, r8
241 1.1 uch mov.l @r4+, r1 /* r1 = osimage size */
242 1.1 uch mov.l @r4+, r2 /* r2 = check sum */
243 1.1 uch shlr2 r1 /* r1 = osimage size in dword */
244 1.1 uch 1:
245 1.1 uch mov.l @r4+, r3
246 1.1 uch mov.l r3, @r0
247 1.1 uch add #4, r0
248 1.1 uch dt r1
249 1.1 uch bf 1b
250 1.1 uch
251 1.1 uch jmp @r8 /* jump to start address */
252 1.1 uch nop
253 1.1 uch
254 1.1 uch .align 2
255 1.1 uch XL_start_address:
256 1.1 uch .long IOM_RAM_BEGIN + 0x00010000
257 1.1 uch load_and_reset_end:
258 1.1 uch
259 1.1 uch ENTRY(XLoadAndReset)
260 1.2 uch __INTR_MASK(r0, r1)
261 1.1 uch /* copy trampoline code to RAM area top */
262 1.1 uch mov.l XL_load_and_reset, r0
263 1.1 uch mov.l XL_load_and_reset_end, r1
264 1.1 uch mov.l XL_load_trampoline_addr, r2
265 1.1 uch mov r2, r8
266 1.1 uch sub r0, r1 /* r1 = bytes to be copied */
267 1.1 uch 1: mov.b @r0+, r3
268 1.1 uch mov.b r3, @r2
269 1.1 uch add #1, r2
270 1.1 uch dt r1
271 1.1 uch bf 1b
272 1.1 uch
273 1.1 uch jmp @r8 /* jump to trampoline code */
274 1.1 uch nop
275 1.1 uch
276 1.1 uch .align 2
277 1.1 uch XL_load_trampoline_addr:
278 1.1 uch .long IOM_RAM_BEGIN + 0x00008000
279 1.1 uch XL_load_and_reset:
280 1.1 uch .long load_and_reset
281 1.1 uch XL_load_and_reset_end:
282 1.1 uch .long load_and_reset_end
283