diff options
Diffstat (limited to 'arch/arm/kernel/head.S')
-rw-r--r-- | arch/arm/kernel/head.S | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S index 21e17dc94cb5..38ccbe1d3b2c 100644 --- a/arch/arm/kernel/head.S +++ b/arch/arm/kernel/head.S | |||
@@ -76,7 +76,7 @@ | |||
76 | */ | 76 | */ |
77 | .section ".text.head", "ax" | 77 | .section ".text.head", "ax" |
78 | ENTRY(stext) | 78 | ENTRY(stext) |
79 | msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode | 79 | setmode PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 @ ensure svc mode |
80 | @ and irqs disabled | 80 | @ and irqs disabled |
81 | mrc p15, 0, r9, c0, c0 @ get processor id | 81 | mrc p15, 0, r9, c0, c0 @ get processor id |
82 | bl __lookup_processor_type @ r5=procinfo r9=cpuid | 82 | bl __lookup_processor_type @ r5=procinfo r9=cpuid |
@@ -97,8 +97,10 @@ ENTRY(stext) | |||
97 | */ | 97 | */ |
98 | ldr r13, __switch_data @ address to jump to after | 98 | ldr r13, __switch_data @ address to jump to after |
99 | @ mmu has been enabled | 99 | @ mmu has been enabled |
100 | adr lr, __enable_mmu @ return (PIC) address | 100 | adr lr, BSYM(__enable_mmu) @ return (PIC) address |
101 | add pc, r10, #PROCINFO_INITFUNC | 101 | ARM( add pc, r10, #PROCINFO_INITFUNC ) |
102 | THUMB( add r12, r10, #PROCINFO_INITFUNC ) | ||
103 | THUMB( mov pc, r12 ) | ||
102 | ENDPROC(stext) | 104 | ENDPROC(stext) |
103 | 105 | ||
104 | #if defined(CONFIG_SMP) | 106 | #if defined(CONFIG_SMP) |
@@ -110,7 +112,7 @@ ENTRY(secondary_startup) | |||
110 | * the processor type - there is no need to check the machine type | 112 | * the processor type - there is no need to check the machine type |
111 | * as it has already been validated by the primary processor. | 113 | * as it has already been validated by the primary processor. |
112 | */ | 114 | */ |
113 | msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE | 115 | setmode PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 |
114 | mrc p15, 0, r9, c0, c0 @ get processor id | 116 | mrc p15, 0, r9, c0, c0 @ get processor id |
115 | bl __lookup_processor_type | 117 | bl __lookup_processor_type |
116 | movs r10, r5 @ invalid processor? | 118 | movs r10, r5 @ invalid processor? |
@@ -121,12 +123,15 @@ ENTRY(secondary_startup) | |||
121 | * Use the page tables supplied from __cpu_up. | 123 | * Use the page tables supplied from __cpu_up. |
122 | */ | 124 | */ |
123 | adr r4, __secondary_data | 125 | adr r4, __secondary_data |
124 | ldmia r4, {r5, r7, r13} @ address to jump to after | 126 | ldmia r4, {r5, r7, r12} @ address to jump to after |
125 | sub r4, r4, r5 @ mmu has been enabled | 127 | sub r4, r4, r5 @ mmu has been enabled |
126 | ldr r4, [r7, r4] @ get secondary_data.pgdir | 128 | ldr r4, [r7, r4] @ get secondary_data.pgdir |
127 | adr lr, __enable_mmu @ return address | 129 | adr lr, BSYM(__enable_mmu) @ return address |
128 | add pc, r10, #PROCINFO_INITFUNC @ initialise processor | 130 | mov r13, r12 @ __secondary_switched address |
129 | @ (return control reg) | 131 | ARM( add pc, r10, #PROCINFO_INITFUNC ) @ initialise processor |
132 | @ (return control reg) | ||
133 | THUMB( add r12, r10, #PROCINFO_INITFUNC ) | ||
134 | THUMB( mov pc, r12 ) | ||
130 | ENDPROC(secondary_startup) | 135 | ENDPROC(secondary_startup) |
131 | 136 | ||
132 | /* | 137 | /* |
@@ -193,8 +198,8 @@ __turn_mmu_on: | |||
193 | mcr p15, 0, r0, c1, c0, 0 @ write control reg | 198 | mcr p15, 0, r0, c1, c0, 0 @ write control reg |
194 | mrc p15, 0, r3, c0, c0, 0 @ read id reg | 199 | mrc p15, 0, r3, c0, c0, 0 @ read id reg |
195 | mov r3, r3 | 200 | mov r3, r3 |
196 | mov r3, r3 | 201 | mov r3, r13 |
197 | mov pc, r13 | 202 | mov pc, r3 |
198 | ENDPROC(__turn_mmu_on) | 203 | ENDPROC(__turn_mmu_on) |
199 | 204 | ||
200 | 205 | ||
@@ -235,7 +240,8 @@ __create_page_tables: | |||
235 | * will be removed by paging_init(). We use our current program | 240 | * will be removed by paging_init(). We use our current program |
236 | * counter to determine corresponding section base address. | 241 | * counter to determine corresponding section base address. |
237 | */ | 242 | */ |
238 | mov r6, pc, lsr #20 @ start of kernel section | 243 | mov r6, pc |
244 | mov r6, r6, lsr #20 @ start of kernel section | ||
239 | orr r3, r7, r6, lsl #20 @ flags + kernel base | 245 | orr r3, r7, r6, lsl #20 @ flags + kernel base |
240 | str r3, [r4, r6, lsl #2] @ identity mapping | 246 | str r3, [r4, r6, lsl #2] @ identity mapping |
241 | 247 | ||