aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel/head-common.S
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2010-10-04 11:29:35 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2010-10-08 05:07:33 -0400
commit17bb5e2c1706c7296eec96e97be0d760e59f282c (patch)
treeba473b22b04603843e634a0878c8eb159e56899b /arch/arm/kernel/head-common.S
parenta4ae41341fd39af6e25ec9861a6a4dc0c5c58b16 (diff)
ARM: move __mmap_switched, C-API functions to init section
Move these functions, which are only ever used during boot CPU initialization, to the init section. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/kernel/head-common.S')
-rw-r--r--arch/arm/kernel/head-common.S142
1 files changed, 72 insertions, 70 deletions
diff --git a/arch/arm/kernel/head-common.S b/arch/arm/kernel/head-common.S
index 9f473ef2a64c..24dfa14b0bf9 100644
--- a/arch/arm/kernel/head-common.S
+++ b/arch/arm/kernel/head-common.S
@@ -15,54 +15,6 @@
15#define ATAG_CORE_SIZE ((2*4 + 3*4) >> 2) 15#define ATAG_CORE_SIZE ((2*4 + 3*4) >> 2)
16#define ATAG_CORE_SIZE_EMPTY ((2*4) >> 2) 16#define ATAG_CORE_SIZE_EMPTY ((2*4) >> 2)
17 17
18 .align 2
19 .type __switch_data, %object
20__switch_data:
21 .long __data_loc @ r4
22 .long _data @ r5
23 .long __bss_start @ r6
24 .long _end @ r7
25 .long processor_id @ r4
26 .long __machine_arch_type @ r5
27 .long __atags_pointer @ r6
28 .long cr_alignment @ r7
29 .long init_thread_union + THREAD_START_SP @ sp
30
31/*
32 * The following fragment of code is executed with the MMU on in MMU mode,
33 * and uses absolute addresses; this is not position independent.
34 *
35 * r0 = cp#15 control register
36 * r1 = machine ID
37 * r2 = atags pointer
38 * r9 = processor ID
39 */
40__mmap_switched:
41 adr r3, __switch_data
42
43 ldmia r3!, {r4, r5, r6, r7}
44 cmp r4, r5 @ Copy data segment if needed
451: cmpne r5, r6
46 ldrne fp, [r4], #4
47 strne fp, [r5], #4
48 bne 1b
49
50 mov fp, #0 @ Clear BSS (and zero fp)
511: cmp r6, r7
52 strcc fp, [r6],#4
53 bcc 1b
54
55 ARM( ldmia r3, {r4, r5, r6, r7, sp})
56 THUMB( ldmia r3, {r4, r5, r6, r7} )
57 THUMB( ldr sp, [r3, #16] )
58 str r9, [r4] @ Save processor ID
59 str r1, [r5] @ Save machine type
60 str r2, [r6] @ Save atags pointer
61 bic r4, r0, #CR_A @ Clear 'A' bit
62 stmia r7, {r0, r4} @ Save control register values
63 b start_kernel
64ENDPROC(__mmap_switched)
65
66/* 18/*
67 * Exception handling. Something went wrong and we can't proceed. We 19 * Exception handling. Something went wrong and we can't proceed. We
68 * ought to tell the user, but since we don't have any guarantee that 20 * ought to tell the user, but since we don't have any guarantee that
@@ -144,17 +96,6 @@ ENDPROC(__error)
144 96
145 97
146/* 98/*
147 * This provides a C-API version of __lookup_processor_type
148 */
149ENTRY(lookup_processor_type)
150 stmfd sp!, {r4 - r6, r9, lr}
151 mov r9, r0
152 bl __lookup_processor_type
153 mov r0, r5
154 ldmfd sp!, {r4 - r6, r9, pc}
155ENDPROC(lookup_processor_type)
156
157/*
158 * Look in <asm/procinfo.h> and arch/arm/kernel/arch.[ch] for 99 * Look in <asm/procinfo.h> and arch/arm/kernel/arch.[ch] for
159 * more information about the __proc_info and __arch_info structures. 100 * more information about the __proc_info and __arch_info structures.
160 */ 101 */
@@ -190,17 +131,6 @@ __lookup_machine_type:
1902: mov pc, lr 1312: mov pc, lr
191ENDPROC(__lookup_machine_type) 132ENDPROC(__lookup_machine_type)
192 133
193/*
194 * This provides a C-API version of the above function.
195 */
196ENTRY(lookup_machine_type)
197 stmfd sp!, {r4 - r6, lr}
198 mov r1, r0
199 bl __lookup_machine_type
200 mov r0, r5
201 ldmfd sp!, {r4 - r6, pc}
202ENDPROC(lookup_machine_type)
203
204/* Determine validity of the r2 atags pointer. The heuristic requires 134/* Determine validity of the r2 atags pointer. The heuristic requires
205 * that the pointer be aligned, in the first 16k of physical RAM and 135 * that the pointer be aligned, in the first 16k of physical RAM and
206 * that the ATAG_CORE marker is first and present. Future revisions 136 * that the ATAG_CORE marker is first and present. Future revisions
@@ -233,6 +163,78 @@ __vet_atags:
233ENDPROC(__vet_atags) 163ENDPROC(__vet_atags)
234 164
235/* 165/*
166 * The following fragment of code is executed with the MMU on in MMU mode,
167 * and uses absolute addresses; this is not position independent.
168 *
169 * r0 = cp#15 control register
170 * r1 = machine ID
171 * r2 = atags pointer
172 * r9 = processor ID
173 */
174 __INIT
175__mmap_switched:
176 adr r3, __mmap_switched_data
177
178 ldmia r3!, {r4, r5, r6, r7}
179 cmp r4, r5 @ Copy data segment if needed
1801: cmpne r5, r6
181 ldrne fp, [r4], #4
182 strne fp, [r5], #4
183 bne 1b
184
185 mov fp, #0 @ Clear BSS (and zero fp)
1861: cmp r6, r7
187 strcc fp, [r6],#4
188 bcc 1b
189
190 ARM( ldmia r3, {r4, r5, r6, r7, sp})
191 THUMB( ldmia r3, {r4, r5, r6, r7} )
192 THUMB( ldr sp, [r3, #16] )
193 str r9, [r4] @ Save processor ID
194 str r1, [r5] @ Save machine type
195 str r2, [r6] @ Save atags pointer
196 bic r4, r0, #CR_A @ Clear 'A' bit
197 stmia r7, {r0, r4} @ Save control register values
198 b start_kernel
199ENDPROC(__mmap_switched)
200
201 .align 2
202 .type __mmap_switched_data, %object
203__mmap_switched_data:
204 .long __data_loc @ r4
205 .long _data @ r5
206 .long __bss_start @ r6
207 .long _end @ r7
208 .long processor_id @ r4
209 .long __machine_arch_type @ r5
210 .long __atags_pointer @ r6
211 .long cr_alignment @ r7
212 .long init_thread_union + THREAD_START_SP @ sp
213 .size __mmap_switched_data, . - __mmap_switched_data
214
215/*
216 * This provides a C-API version of __lookup_machine_type
217 */
218ENTRY(lookup_machine_type)
219 stmfd sp!, {r4 - r6, lr}
220 mov r1, r0
221 bl __lookup_machine_type
222 mov r0, r5
223 ldmfd sp!, {r4 - r6, pc}
224ENDPROC(lookup_machine_type)
225
226/*
227 * This provides a C-API version of __lookup_processor_type
228 */
229ENTRY(lookup_processor_type)
230 stmfd sp!, {r4 - r6, r9, lr}
231 mov r9, r0
232 bl __lookup_processor_type
233 mov r0, r5
234 ldmfd sp!, {r4 - r6, r9, pc}
235ENDPROC(lookup_processor_type)
236
237/*
236 * Read processor ID register (CP#15, CR0), and look up in the linker-built 238 * Read processor ID register (CP#15, CR0), and look up in the linker-built
237 * supported processor list. Note that we can't use the absolute addresses 239 * supported processor list. Note that we can't use the absolute addresses
238 * for the __proc_info lists since we aren't running with the MMU on 240 * for the __proc_info lists since we aren't running with the MMU on