diff options
Diffstat (limited to 'arch/mn10300/kernel/head.S')
-rw-r--r-- | arch/mn10300/kernel/head.S | 255 |
1 files changed, 255 insertions, 0 deletions
diff --git a/arch/mn10300/kernel/head.S b/arch/mn10300/kernel/head.S new file mode 100644 index 000000000000..606bd8c6758d --- /dev/null +++ b/arch/mn10300/kernel/head.S | |||
@@ -0,0 +1,255 @@ | |||
1 | /* Boot entry point for MN10300 kernel | ||
2 | * | ||
3 | * Copyright (C) 2005 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public Licence | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the Licence, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #include <linux/threads.h> | ||
13 | #include <linux/linkage.h> | ||
14 | #include <linux/serial_reg.h> | ||
15 | #include <asm/thread_info.h> | ||
16 | #include <asm/page.h> | ||
17 | #include <asm/pgtable.h> | ||
18 | #include <asm/frame.inc> | ||
19 | #include <asm/param.h> | ||
20 | #include <asm/unit/serial.h> | ||
21 | |||
22 | .section .text.head,"ax" | ||
23 | |||
24 | ############################################################################### | ||
25 | # | ||
26 | # bootloader entry point | ||
27 | # | ||
28 | ############################################################################### | ||
29 | .globl _start | ||
30 | .type _start,@function | ||
31 | _start: | ||
32 | # save commandline pointer | ||
33 | mov d0,a3 | ||
34 | |||
35 | # preload the PGD pointer register | ||
36 | mov swapper_pg_dir,d0 | ||
37 | mov d0,(PTBR) | ||
38 | |||
39 | # turn on the TLBs | ||
40 | mov MMUCTR_IIV|MMUCTR_DIV,d0 | ||
41 | mov d0,(MMUCTR) | ||
42 | mov MMUCTR_ITE|MMUCTR_DTE|MMUCTR_CE,d0 | ||
43 | mov d0,(MMUCTR) | ||
44 | |||
45 | # turn on AM33v2 exception handling mode and set the trap table base | ||
46 | movhu (CPUP),d0 | ||
47 | or CPUP_EXM_AM33V2,d0 | ||
48 | movhu d0,(CPUP) | ||
49 | mov CONFIG_INTERRUPT_VECTOR_BASE,d0 | ||
50 | mov d0,(TBR) | ||
51 | |||
52 | # invalidate and enable both of the caches | ||
53 | mov CHCTR,a0 | ||
54 | clr d0 | ||
55 | movhu d0,(a0) # turn off first | ||
56 | mov CHCTR_ICINV|CHCTR_DCINV,d0 | ||
57 | movhu d0,(a0) | ||
58 | setlb | ||
59 | mov (a0),d0 | ||
60 | btst CHCTR_ICBUSY|CHCTR_DCBUSY,d0 # wait till not busy | ||
61 | lne | ||
62 | |||
63 | #ifndef CONFIG_MN10300_CACHE_DISABLED | ||
64 | #ifdef CONFIG_MN10300_CACHE_WBACK | ||
65 | #ifndef CONFIG_MN10300_CACHE_WBACK_NOWRALLOC | ||
66 | mov CHCTR_ICEN|CHCTR_DCEN|CHCTR_DCWTMD_WRBACK,d0 | ||
67 | #else | ||
68 | mov CHCTR_ICEN|CHCTR_DCEN|CHCTR_DCWTMD_WRBACK|CHCTR_DCALMD,d0 | ||
69 | #endif /* CACHE_DISABLED */ | ||
70 | #else | ||
71 | mov CHCTR_ICEN|CHCTR_DCEN|CHCTR_DCWTMD_WRTHROUGH,d0 | ||
72 | #endif /* WBACK */ | ||
73 | movhu d0,(a0) # enable | ||
74 | #endif /* NOWRALLOC */ | ||
75 | |||
76 | # turn on RTS on the debug serial port if applicable | ||
77 | #ifdef CONFIG_MN10300_UNIT_ASB2305 | ||
78 | bset UART_MCR_RTS,(ASB2305_DEBUG_MCR) | ||
79 | #endif | ||
80 | |||
81 | # clear the BSS area | ||
82 | mov __bss_start,a0 | ||
83 | mov __bss_stop,a1 | ||
84 | clr d0 | ||
85 | bssclear: | ||
86 | cmp a1,a0 | ||
87 | bge bssclear_end | ||
88 | mov d0,(a0) | ||
89 | inc4 a0 | ||
90 | bra bssclear | ||
91 | bssclear_end: | ||
92 | |||
93 | # retrieve the parameters (including command line) before we overwrite | ||
94 | # them | ||
95 | cmp 0xabadcafe,d1 | ||
96 | bne __no_parameters | ||
97 | |||
98 | __copy_parameters: | ||
99 | mov redboot_command_line,a0 | ||
100 | mov a0,a1 | ||
101 | add COMMAND_LINE_SIZE,a1 | ||
102 | 1: | ||
103 | movbu (a3),d0 | ||
104 | inc a3 | ||
105 | movbu d0,(a0) | ||
106 | inc a0 | ||
107 | cmp a1,a0 | ||
108 | blt 1b | ||
109 | |||
110 | mov redboot_platform_name,a0 | ||
111 | mov a0,a1 | ||
112 | add COMMAND_LINE_SIZE,a1 | ||
113 | mov d2,a3 | ||
114 | 1: | ||
115 | movbu (a3),d0 | ||
116 | inc a3 | ||
117 | movbu d0,(a0) | ||
118 | inc a0 | ||
119 | cmp a1,a0 | ||
120 | blt 1b | ||
121 | |||
122 | __no_parameters: | ||
123 | |||
124 | # set up the registers with recognisable rubbish in them | ||
125 | mov init_thread_union+THREAD_SIZE-12,sp | ||
126 | |||
127 | mov 0xea01eaea,d0 | ||
128 | mov d0,(4,sp) # EPSW save area | ||
129 | mov 0xea02eaea,d0 | ||
130 | mov d0,(8,sp) # PC save area | ||
131 | |||
132 | mov 0xeb0060ed,d0 | ||
133 | mov d0,mdr | ||
134 | mov 0xeb0061ed,d0 | ||
135 | mov d0,mdrq | ||
136 | mov 0xeb0062ed,d0 | ||
137 | mov d0,mcrh | ||
138 | mov 0xeb0063ed,d0 | ||
139 | mov d0,mcrl | ||
140 | mov 0xeb0064ed,d0 | ||
141 | mov d0,mcvf | ||
142 | mov 0xed0065ed,a3 | ||
143 | mov a3,usp | ||
144 | |||
145 | mov 0xed00e0ed,e0 | ||
146 | mov 0xed00e1ed,e1 | ||
147 | mov 0xed00e2ed,e2 | ||
148 | mov 0xed00e3ed,e3 | ||
149 | mov 0xed00e4ed,e4 | ||
150 | mov 0xed00e5ed,e5 | ||
151 | mov 0xed00e6ed,e6 | ||
152 | mov 0xed00e7ed,e7 | ||
153 | |||
154 | mov 0xed00d0ed,d0 | ||
155 | mov 0xed00d1ed,d1 | ||
156 | mov 0xed00d2ed,d2 | ||
157 | mov 0xed00d3ed,d3 | ||
158 | mov 0xed00a0ed,a0 | ||
159 | mov 0xed00a1ed,a1 | ||
160 | mov 0xed00a2ed,a2 | ||
161 | mov 0,a3 | ||
162 | |||
163 | # set up the initial kernel stack | ||
164 | SAVE_ALL | ||
165 | mov 0xffffffff,d0 | ||
166 | mov d0,(REG_ORIG_D0,fp) | ||
167 | |||
168 | # put different recognisable rubbish in the regs | ||
169 | mov 0xfb0060ed,d0 | ||
170 | mov d0,mdr | ||
171 | mov 0xfb0061ed,d0 | ||
172 | mov d0,mdrq | ||
173 | mov 0xfb0062ed,d0 | ||
174 | mov d0,mcrh | ||
175 | mov 0xfb0063ed,d0 | ||
176 | mov d0,mcrl | ||
177 | mov 0xfb0064ed,d0 | ||
178 | mov d0,mcvf | ||
179 | mov 0xfd0065ed,a0 | ||
180 | mov a0,usp | ||
181 | |||
182 | mov 0xfd00e0ed,e0 | ||
183 | mov 0xfd00e1ed,e1 | ||
184 | mov 0xfd00e2ed,e2 | ||
185 | mov 0xfd00e3ed,e3 | ||
186 | mov 0xfd00e4ed,e4 | ||
187 | mov 0xfd00e5ed,e5 | ||
188 | mov 0xfd00e6ed,e6 | ||
189 | mov 0xfd00e7ed,e7 | ||
190 | |||
191 | mov 0xfd00d0ed,d0 | ||
192 | mov 0xfd00d1ed,d1 | ||
193 | mov 0xfd00d2ed,d2 | ||
194 | mov 0xfd00d3ed,d3 | ||
195 | mov 0xfd00a0ed,a0 | ||
196 | mov 0xfd00a1ed,a1 | ||
197 | mov 0xfd00a2ed,a2 | ||
198 | |||
199 | # we may be holding current in E2 | ||
200 | #ifdef CONFIG_MN10300_CURRENT_IN_E2 | ||
201 | mov init_task,e2 | ||
202 | #endif | ||
203 | |||
204 | # initialise the processor and the unit | ||
205 | call processor_init[],0 | ||
206 | call unit_init[],0 | ||
207 | |||
208 | #ifdef CONFIG_GDBSTUB | ||
209 | call gdbstub_init[],0 | ||
210 | |||
211 | #ifdef CONFIG_GDBSTUB_IMMEDIATE | ||
212 | .globl __gdbstub_pause | ||
213 | __gdbstub_pause: | ||
214 | bra __gdbstub_pause | ||
215 | #endif | ||
216 | #endif | ||
217 | |||
218 | jmp start_kernel | ||
219 | .size _start, _start-. | ||
220 | ENTRY(__head_end) | ||
221 | |||
222 | /* | ||
223 | * This is initialized to disallow all access to the low 2G region | ||
224 | * - the high 2G region is managed directly by the MMU | ||
225 | * - range 0x70000000-0x7C000000 are initialised for use by VMALLOC | ||
226 | */ | ||
227 | .section .bss | ||
228 | .balign PAGE_SIZE | ||
229 | ENTRY(swapper_pg_dir) | ||
230 | .space PTRS_PER_PGD*4 | ||
231 | |||
232 | /* | ||
233 | * The page tables are initialized to only 8MB here - the final page | ||
234 | * tables are set up later depending on memory size. | ||
235 | */ | ||
236 | |||
237 | .balign PAGE_SIZE | ||
238 | ENTRY(empty_zero_page) | ||
239 | .space PAGE_SIZE | ||
240 | |||
241 | .balign PAGE_SIZE | ||
242 | ENTRY(empty_bad_page) | ||
243 | .space PAGE_SIZE | ||
244 | |||
245 | .balign PAGE_SIZE | ||
246 | ENTRY(empty_bad_pte_table) | ||
247 | .space PAGE_SIZE | ||
248 | |||
249 | .balign PAGE_SIZE | ||
250 | ENTRY(large_page_table) | ||
251 | .space PAGE_SIZE | ||
252 | |||
253 | .balign PAGE_SIZE | ||
254 | ENTRY(kernel_vmalloc_ptes) | ||
255 | .space ((VMALLOC_END-VMALLOC_START)/PAGE_SIZE)*4 | ||