diff options
29 files changed, 403 insertions, 300 deletions
diff --git a/arch/arm/kernel/head-common.S b/arch/arm/kernel/head-common.S index 58a3e632b6d5..bbecaac1e013 100644 --- a/arch/arm/kernel/head-common.S +++ b/arch/arm/kernel/head-common.S | |||
| @@ -15,55 +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 __mmap_switched | ||
| 22 | .long __data_loc @ r4 | ||
| 23 | .long _sdata @ r5 | ||
| 24 | .long __bss_start @ r6 | ||
| 25 | .long _end @ r7 | ||
| 26 | .long processor_id @ r4 | ||
| 27 | .long __machine_arch_type @ r5 | ||
| 28 | .long __atags_pointer @ r6 | ||
| 29 | .long cr_alignment @ r7 | ||
| 30 | .long init_thread_union + THREAD_START_SP @ sp | ||
| 31 | |||
| 32 | /* | ||
| 33 | * The following fragment of code is executed with the MMU on in MMU mode, | ||
| 34 | * and uses absolute addresses; this is not position independent. | ||
| 35 | * | ||
| 36 | * r0 = cp#15 control register | ||
| 37 | * r1 = machine ID | ||
| 38 | * r2 = atags pointer | ||
| 39 | * r9 = processor ID | ||
| 40 | */ | ||
| 41 | __mmap_switched: | ||
| 42 | adr r3, __switch_data + 4 | ||
| 43 | |||
| 44 | ldmia r3!, {r4, r5, r6, r7} | ||
| 45 | cmp r4, r5 @ Copy data segment if needed | ||
| 46 | 1: cmpne r5, r6 | ||
| 47 | ldrne fp, [r4], #4 | ||
| 48 | strne fp, [r5], #4 | ||
| 49 | bne 1b | ||
| 50 | |||
| 51 | mov fp, #0 @ Clear BSS (and zero fp) | ||
| 52 | 1: cmp r6, r7 | ||
| 53 | strcc fp, [r6],#4 | ||
| 54 | bcc 1b | ||
| 55 | |||
| 56 | ARM( ldmia r3, {r4, r5, r6, r7, sp}) | ||
| 57 | THUMB( ldmia r3, {r4, r5, r6, r7} ) | ||
| 58 | THUMB( ldr sp, [r3, #16] ) | ||
| 59 | str r9, [r4] @ Save processor ID | ||
| 60 | str r1, [r5] @ Save machine type | ||
| 61 | str r2, [r6] @ Save atags pointer | ||
| 62 | bic r4, r0, #CR_A @ Clear 'A' bit | ||
| 63 | stmia r7, {r0, r4} @ Save control register values | ||
| 64 | b start_kernel | ||
| 65 | ENDPROC(__mmap_switched) | ||
| 66 | |||
| 67 | /* | 18 | /* |
| 68 | * Exception handling. Something went wrong and we can't proceed. We | 19 | * Exception handling. Something went wrong and we can't proceed. We |
| 69 | * 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 |
| @@ -73,21 +24,7 @@ ENDPROC(__mmap_switched) | |||
| 73 | * and hope for the best (useful if bootloader fails to pass a proper | 24 | * and hope for the best (useful if bootloader fails to pass a proper |
| 74 | * machine ID for example). | 25 | * machine ID for example). |
| 75 | */ | 26 | */ |
| 76 | __error_p: | 27 | __HEAD |
| 77 | #ifdef CONFIG_DEBUG_LL | ||
| 78 | adr r0, str_p1 | ||
| 79 | bl printascii | ||
| 80 | mov r0, r9 | ||
| 81 | bl printhex8 | ||
| 82 | adr r0, str_p2 | ||
| 83 | bl printascii | ||
| 84 | b __error | ||
| 85 | str_p1: .asciz "\nError: unrecognized/unsupported processor variant (0x" | ||
| 86 | str_p2: .asciz ").\n" | ||
| 87 | .align | ||
| 88 | #endif | ||
| 89 | ENDPROC(__error_p) | ||
| 90 | |||
| 91 | __error_a: | 28 | __error_a: |
| 92 | #ifdef CONFIG_DEBUG_LL | 29 | #ifdef CONFIG_DEBUG_LL |
| 93 | mov r4, r1 @ preserve machine ID | 30 | mov r4, r1 @ preserve machine ID |
| @@ -97,7 +34,7 @@ __error_a: | |||
| 97 | bl printhex8 | 34 | bl printhex8 |
| 98 | adr r0, str_a2 | 35 | adr r0, str_a2 |
| 99 | bl printascii | 36 | bl printascii |
| 100 | adr r3, 4f | 37 | adr r3, __lookup_machine_type_data |
| 101 | ldmia r3, {r4, r5, r6} @ get machine desc list | 38 | ldmia r3, {r4, r5, r6} @ get machine desc list |
| 102 | sub r4, r3, r4 @ get offset between virt&phys | 39 | sub r4, r3, r4 @ get offset between virt&phys |
| 103 | add r5, r5, r4 @ convert virt addresses to | 40 | add r5, r5, r4 @ convert virt addresses to |
| @@ -125,78 +62,6 @@ str_a3: .asciz "\nPlease check your kernel config and/or bootloader.\n" | |||
| 125 | .align | 62 | .align |
| 126 | #endif | 63 | #endif |
| 127 | 64 | ||
| 128 | __error: | ||
| 129 | #ifdef CONFIG_ARCH_RPC | ||
| 130 | /* | ||
| 131 | * Turn the screen red on a error - RiscPC only. | ||
| 132 | */ | ||
| 133 | mov r0, #0x02000000 | ||
| 134 | mov r3, #0x11 | ||
| 135 | orr r3, r3, r3, lsl #8 | ||
| 136 | orr r3, r3, r3, lsl #16 | ||
| 137 | str r3, [r0], #4 | ||
| 138 | str r3, [r0], #4 | ||
| 139 | str r3, [r0], #4 | ||
| 140 | str r3, [r0], #4 | ||
| 141 | #endif | ||
| 142 | 1: mov r0, r0 | ||
| 143 | b 1b | ||
| 144 | ENDPROC(__error) | ||
| 145 | |||
| 146 | |||
| 147 | /* | ||
| 148 | * Read processor ID register (CP#15, CR0), and look up in the linker-built | ||
| 149 | * supported processor list. Note that we can't use the absolute addresses | ||
| 150 | * for the __proc_info lists since we aren't running with the MMU on | ||
| 151 | * (and therefore, we are not in the correct address space). We have to | ||
| 152 | * calculate the offset. | ||
| 153 | * | ||
| 154 | * r9 = cpuid | ||
| 155 | * Returns: | ||
| 156 | * r3, r4, r6 corrupted | ||
| 157 | * r5 = proc_info pointer in physical address space | ||
| 158 | * r9 = cpuid (preserved) | ||
| 159 | */ | ||
| 160 | __lookup_processor_type: | ||
| 161 | adr r3, 3f | ||
| 162 | ldmia r3, {r5 - r7} | ||
| 163 | add r3, r3, #8 | ||
| 164 | sub r3, r3, r7 @ get offset between virt&phys | ||
| 165 | add r5, r5, r3 @ convert virt addresses to | ||
| 166 | add r6, r6, r3 @ physical address space | ||
| 167 | 1: ldmia r5, {r3, r4} @ value, mask | ||
| 168 | and r4, r4, r9 @ mask wanted bits | ||
| 169 | teq r3, r4 | ||
| 170 | beq 2f | ||
| 171 | add r5, r5, #PROC_INFO_SZ @ sizeof(proc_info_list) | ||
| 172 | cmp r5, r6 | ||
| 173 | blo 1b | ||
| 174 | mov r5, #0 @ unknown processor | ||
| 175 | 2: mov pc, lr | ||
| 176 | ENDPROC(__lookup_processor_type) | ||
| 177 | |||
| 178 | /* | ||
| 179 | * This provides a C-API version of the above function. | ||
| 180 | */ | ||
| 181 | ENTRY(lookup_processor_type) | ||
| 182 | stmfd sp!, {r4 - r7, r9, lr} | ||
| 183 | mov r9, r0 | ||
| 184 | bl __lookup_processor_type | ||
| 185 | mov r0, r5 | ||
| 186 | ldmfd sp!, {r4 - r7, r9, pc} | ||
| 187 | ENDPROC(lookup_processor_type) | ||
| 188 | |||
| 189 | /* | ||
| 190 | * Look in <asm/procinfo.h> and arch/arm/kernel/arch.[ch] for | ||
| 191 | * more information about the __proc_info and __arch_info structures. | ||
| 192 | */ | ||
| 193 | .align 2 | ||
| 194 | 3: .long __proc_info_begin | ||
| 195 | .long __proc_info_end | ||
| 196 | 4: .long . | ||
| 197 | .long __arch_info_begin | ||
| 198 | .long __arch_info_end | ||
| 199 | |||
| 200 | /* | 65 | /* |
| 201 | * Lookup machine architecture in the linker-build list of architectures. | 66 | * Lookup machine architecture in the linker-build list of architectures. |
| 202 | * Note that we can't use the absolute addresses for the __arch_info | 67 | * Note that we can't use the absolute addresses for the __arch_info |
| @@ -209,7 +74,7 @@ ENDPROC(lookup_processor_type) | |||
| 209 | * r5 = mach_info pointer in physical address space | 74 | * r5 = mach_info pointer in physical address space |
| 210 | */ | 75 | */ |
| 211 | __lookup_machine_type: | 76 | __lookup_machine_type: |
| 212 | adr r3, 4b | 77 | adr r3, __lookup_machine_type_data |
| 213 | ldmia r3, {r4, r5, r6} | 78 | ldmia r3, {r4, r5, r6} |
| 214 | sub r3, r3, r4 @ get offset between virt&phys | 79 | sub r3, r3, r4 @ get offset between virt&phys |
| 215 | add r5, r5, r3 @ convert virt addresses to | 80 | add r5, r5, r3 @ convert virt addresses to |
| @@ -225,15 +90,16 @@ __lookup_machine_type: | |||
| 225 | ENDPROC(__lookup_machine_type) | 90 | ENDPROC(__lookup_machine_type) |
| 226 | 91 | ||
| 227 | /* | 92 | /* |
| 228 | * This provides a C-API version of the above function. | 93 | * Look in arch/arm/kernel/arch.[ch] for information about the |
| 94 | * __arch_info structures. | ||
| 229 | */ | 95 | */ |
| 230 | ENTRY(lookup_machine_type) | 96 | .align 2 |
| 231 | stmfd sp!, {r4 - r6, lr} | 97 | .type __lookup_machine_type_data, %object |
| 232 | mov r1, r0 | 98 | __lookup_machine_type_data: |
| 233 | bl __lookup_machine_type | 99 | .long . |
| 234 | mov r0, r5 | 100 | .long __arch_info_begin |
| 235 | ldmfd sp!, {r4 - r6, pc} | 101 | .long __arch_info_end |
| 236 | ENDPROC(lookup_machine_type) | 102 | .size __lookup_machine_type_data, . - __lookup_machine_type_data |
| 237 | 103 | ||
| 238 | /* Determine validity of the r2 atags pointer. The heuristic requires | 104 | /* Determine validity of the r2 atags pointer. The heuristic requires |
| 239 | * that the pointer be aligned, in the first 16k of physical RAM and | 105 | * that the pointer be aligned, in the first 16k of physical RAM and |
| @@ -265,3 +131,150 @@ __vet_atags: | |||
| 265 | 1: mov r2, #0 | 131 | 1: mov r2, #0 |
| 266 | mov pc, lr | 132 | mov pc, lr |
| 267 | ENDPROC(__vet_atags) | 133 | ENDPROC(__vet_atags) |
| 134 | |||
| 135 | /* | ||
| 136 | * The following fragment of code is executed with the MMU on in MMU mode, | ||
| 137 | * and uses absolute addresses; this is not position independent. | ||
| 138 | * | ||
| 139 | * r0 = cp#15 control register | ||
| 140 | * r1 = machine ID | ||
| 141 | * r2 = atags pointer | ||
| 142 | * r9 = processor ID | ||
| 143 | */ | ||
| 144 | __INIT | ||
| 145 | __mmap_switched: | ||
| 146 | adr r3, __mmap_switched_data | ||
| 147 | |||
| 148 | ldmia r3!, {r4, r5, r6, r7} | ||
| 149 | cmp r4, r5 @ Copy data segment if needed | ||
| 150 | 1: cmpne r5, r6 | ||
| 151 | ldrne fp, [r4], #4 | ||
| 152 | strne fp, [r5], #4 | ||
| 153 | bne 1b | ||
| 154 | |||
| 155 | mov fp, #0 @ Clear BSS (and zero fp) | ||
| 156 | 1: cmp r6, r7 | ||
| 157 | strcc fp, [r6],#4 | ||
| 158 | bcc 1b | ||
| 159 | |||
| 160 | ARM( ldmia r3, {r4, r5, r6, r7, sp}) | ||
| 161 | THUMB( ldmia r3, {r4, r5, r6, r7} ) | ||
| 162 | THUMB( ldr sp, [r3, #16] ) | ||
| 163 | str r9, [r4] @ Save processor ID | ||
| 164 | str r1, [r5] @ Save machine type | ||
| 165 | str r2, [r6] @ Save atags pointer | ||
| 166 | bic r4, r0, #CR_A @ Clear 'A' bit | ||
| 167 | stmia r7, {r0, r4} @ Save control register values | ||
| 168 | b start_kernel | ||
| 169 | ENDPROC(__mmap_switched) | ||
| 170 | |||
| 171 | .align 2 | ||
| 172 | .type __mmap_switched_data, %object | ||
| 173 | __mmap_switched_data: | ||
| 174 | .long __data_loc @ r4 | ||
| 175 | .long _sdata @ r5 | ||
| 176 | .long __bss_start @ r6 | ||
| 177 | .long _end @ r7 | ||
| 178 | .long processor_id @ r4 | ||
| 179 | .long __machine_arch_type @ r5 | ||
| 180 | .long __atags_pointer @ r6 | ||
| 181 | .long cr_alignment @ r7 | ||
| 182 | .long init_thread_union + THREAD_START_SP @ sp | ||
| 183 | .size __mmap_switched_data, . - __mmap_switched_data | ||
| 184 | |||
| 185 | /* | ||
| 186 | * This provides a C-API version of __lookup_machine_type | ||
| 187 | */ | ||
| 188 | ENTRY(lookup_machine_type) | ||
| 189 | stmfd sp!, {r4 - r6, lr} | ||
| 190 | mov r1, r0 | ||
| 191 | bl __lookup_machine_type | ||
| 192 | mov r0, r5 | ||
| 193 | ldmfd sp!, {r4 - r6, pc} | ||
| 194 | ENDPROC(lookup_machine_type) | ||
| 195 | |||
| 196 | /* | ||
| 197 | * This provides a C-API version of __lookup_processor_type | ||
| 198 | */ | ||
| 199 | ENTRY(lookup_processor_type) | ||
| 200 | stmfd sp!, {r4 - r6, r9, lr} | ||
| 201 | mov r9, r0 | ||
| 202 | bl __lookup_processor_type | ||
| 203 | mov r0, r5 | ||
| 204 | ldmfd sp!, {r4 - r6, r9, pc} | ||
| 205 | ENDPROC(lookup_processor_type) | ||
| 206 | |||
| 207 | /* | ||
| 208 | * Read processor ID register (CP#15, CR0), and look up in the linker-built | ||
| 209 | * supported processor list. Note that we can't use the absolute addresses | ||
| 210 | * for the __proc_info lists since we aren't running with the MMU on | ||
| 211 | * (and therefore, we are not in the correct address space). We have to | ||
| 212 | * calculate the offset. | ||
| 213 | * | ||
| 214 | * r9 = cpuid | ||
| 215 | * Returns: | ||
| 216 | * r3, r4, r6 corrupted | ||
| 217 | * r5 = proc_info pointer in physical address space | ||
| 218 | * r9 = cpuid (preserved) | ||
| 219 | */ | ||
| 220 | __CPUINIT | ||
| 221 | __lookup_processor_type: | ||
| 222 | adr r3, __lookup_processor_type_data | ||
| 223 | ldmia r3, {r4 - r6} | ||
| 224 | sub r3, r3, r4 @ get offset between virt&phys | ||
| 225 | add r5, r5, r3 @ convert virt addresses to | ||
| 226 | add r6, r6, r3 @ physical address space | ||
| 227 | 1: ldmia r5, {r3, r4} @ value, mask | ||
| 228 | and r4, r4, r9 @ mask wanted bits | ||
| 229 | teq r3, r4 | ||
| 230 | beq 2f | ||
| 231 | add r5, r5, #PROC_INFO_SZ @ sizeof(proc_info_list) | ||
| 232 | cmp r5, r6 | ||
| 233 | blo 1b | ||
| 234 | mov r5, #0 @ unknown processor | ||
| 235 | 2: mov pc, lr | ||
| 236 | ENDPROC(__lookup_processor_type) | ||
| 237 | |||
| 238 | /* | ||
| 239 | * Look in <asm/procinfo.h> for information about the __proc_info structure. | ||
| 240 | */ | ||
| 241 | .align 2 | ||
| 242 | .type __lookup_processor_type_data, %object | ||
| 243 | __lookup_processor_type_data: | ||
| 244 | .long . | ||
| 245 | .long __proc_info_begin | ||
| 246 | .long __proc_info_end | ||
| 247 | .size __lookup_processor_type_data, . - __lookup_processor_type_data | ||
| 248 | |||
| 249 | __error_p: | ||
| 250 | #ifdef CONFIG_DEBUG_LL | ||
| 251 | adr r0, str_p1 | ||
| 252 | bl printascii | ||
| 253 | mov r0, r9 | ||
| 254 | bl printhex8 | ||
| 255 | adr r0, str_p2 | ||
| 256 | bl printascii | ||
| 257 | b __error | ||
| 258 | str_p1: .asciz "\nError: unrecognized/unsupported processor variant (0x" | ||
| 259 | str_p2: .asciz ").\n" | ||
| 260 | .align | ||
| 261 | #endif | ||
| 262 | ENDPROC(__error_p) | ||
| 263 | |||
| 264 | __error: | ||
| 265 | #ifdef CONFIG_ARCH_RPC | ||
| 266 | /* | ||
| 267 | * Turn the screen red on a error - RiscPC only. | ||
| 268 | */ | ||
| 269 | mov r0, #0x02000000 | ||
| 270 | mov r3, #0x11 | ||
| 271 | orr r3, r3, r3, lsl #8 | ||
| 272 | orr r3, r3, r3, lsl #16 | ||
| 273 | str r3, [r0], #4 | ||
| 274 | str r3, [r0], #4 | ||
| 275 | str r3, [r0], #4 | ||
| 276 | str r3, [r0], #4 | ||
| 277 | #endif | ||
| 278 | 1: mov r0, r0 | ||
| 279 | b 1b | ||
| 280 | ENDPROC(__error) | ||
diff --git a/arch/arm/kernel/head-nommu.S b/arch/arm/kernel/head-nommu.S index 573b803dc6bf..814ce1a73270 100644 --- a/arch/arm/kernel/head-nommu.S +++ b/arch/arm/kernel/head-nommu.S | |||
| @@ -48,8 +48,6 @@ ENTRY(stext) | |||
| 48 | movs r8, r5 @ invalid machine (r5=0)? | 48 | movs r8, r5 @ invalid machine (r5=0)? |
| 49 | beq __error_a @ yes, error 'a' | 49 | beq __error_a @ yes, error 'a' |
| 50 | 50 | ||
| 51 | ldr r13, __switch_data @ address to jump to after | ||
| 52 | @ the initialization is done | ||
| 53 | adr lr, BSYM(__after_proc_init) @ return (PIC) address | 51 | adr lr, BSYM(__after_proc_init) @ return (PIC) address |
| 54 | ARM( add pc, r10, #PROCINFO_INITFUNC ) | 52 | ARM( add pc, r10, #PROCINFO_INITFUNC ) |
| 55 | THUMB( add r12, r10, #PROCINFO_INITFUNC ) | 53 | THUMB( add r12, r10, #PROCINFO_INITFUNC ) |
| @@ -87,8 +85,7 @@ __after_proc_init: | |||
| 87 | mcr p15, 0, r0, c1, c0, 0 @ write control reg | 85 | mcr p15, 0, r0, c1, c0, 0 @ write control reg |
| 88 | #endif /* CONFIG_CPU_CP15 */ | 86 | #endif /* CONFIG_CPU_CP15 */ |
| 89 | 87 | ||
| 90 | mov r3, r13 | 88 | b __mmap_switched @ clear the BSS and jump |
| 91 | mov pc, r3 @ clear the BSS and jump | ||
| 92 | @ to start_kernel | 89 | @ to start_kernel |
| 93 | ENDPROC(__after_proc_init) | 90 | ENDPROC(__after_proc_init) |
| 94 | .ltorg | 91 | .ltorg |
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S index b44d21e1e344..767390449e0a 100644 --- a/arch/arm/kernel/head.S +++ b/arch/arm/kernel/head.S | |||
| @@ -98,113 +98,15 @@ ENTRY(stext) | |||
| 98 | * above. On return, the CPU will be ready for the MMU to be | 98 | * above. On return, the CPU will be ready for the MMU to be |
| 99 | * turned on, and r0 will hold the CPU control register value. | 99 | * turned on, and r0 will hold the CPU control register value. |
| 100 | */ | 100 | */ |
| 101 | ldr r13, __switch_data @ address to jump to after | 101 | ldr r13, =__mmap_switched @ address to jump to after |
| 102 | @ mmu has been enabled | 102 | @ mmu has been enabled |
| 103 | adr lr, BSYM(__enable_mmu) @ return (PIC) address | 103 | adr lr, BSYM(1f) @ return (PIC) address |
| 104 | ARM( add pc, r10, #PROCINFO_INITFUNC ) | 104 | ARM( add pc, r10, #PROCINFO_INITFUNC ) |
| 105 | THUMB( add r12, r10, #PROCINFO_INITFUNC ) | 105 | THUMB( add r12, r10, #PROCINFO_INITFUNC ) |
| 106 | THUMB( mov pc, r12 ) | 106 | THUMB( mov pc, r12 ) |
| 107 | 1: b __enable_mmu | ||
| 107 | ENDPROC(stext) | 108 | ENDPROC(stext) |
| 108 | 109 | .ltorg | |
| 109 | #if defined(CONFIG_SMP) | ||
| 110 | ENTRY(secondary_startup) | ||
| 111 | /* | ||
| 112 | * Common entry point for secondary CPUs. | ||
| 113 | * | ||
| 114 | * Ensure that we're in SVC mode, and IRQs are disabled. Lookup | ||
| 115 | * the processor type - there is no need to check the machine type | ||
| 116 | * as it has already been validated by the primary processor. | ||
| 117 | */ | ||
| 118 | setmode PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 | ||
| 119 | mrc p15, 0, r9, c0, c0 @ get processor id | ||
| 120 | bl __lookup_processor_type | ||
| 121 | movs r10, r5 @ invalid processor? | ||
| 122 | moveq r0, #'p' @ yes, error 'p' | ||
| 123 | beq __error | ||
| 124 | |||
| 125 | /* | ||
| 126 | * Use the page tables supplied from __cpu_up. | ||
| 127 | */ | ||
| 128 | adr r4, __secondary_data | ||
| 129 | ldmia r4, {r5, r7, r12} @ address to jump to after | ||
| 130 | sub r4, r4, r5 @ mmu has been enabled | ||
| 131 | ldr r4, [r7, r4] @ get secondary_data.pgdir | ||
| 132 | adr lr, BSYM(__enable_mmu) @ return address | ||
| 133 | mov r13, r12 @ __secondary_switched address | ||
| 134 | ARM( add pc, r10, #PROCINFO_INITFUNC ) @ initialise processor | ||
| 135 | @ (return control reg) | ||
| 136 | THUMB( add r12, r10, #PROCINFO_INITFUNC ) | ||
| 137 | THUMB( mov pc, r12 ) | ||
| 138 | ENDPROC(secondary_startup) | ||
| 139 | |||
| 140 | /* | ||
| 141 | * r6 = &secondary_data | ||
| 142 | */ | ||
| 143 | ENTRY(__secondary_switched) | ||
| 144 | ldr sp, [r7, #4] @ get secondary_data.stack | ||
| 145 | mov fp, #0 | ||
| 146 | b secondary_start_kernel | ||
| 147 | ENDPROC(__secondary_switched) | ||
| 148 | |||
| 149 | .type __secondary_data, %object | ||
| 150 | __secondary_data: | ||
| 151 | .long . | ||
| 152 | .long secondary_data | ||
| 153 | .long __secondary_switched | ||
| 154 | #endif /* defined(CONFIG_SMP) */ | ||
| 155 | |||
| 156 | |||
| 157 | |||
| 158 | /* | ||
| 159 | * Setup common bits before finally enabling the MMU. Essentially | ||
| 160 | * this is just loading the page table pointer and domain access | ||
| 161 | * registers. | ||
| 162 | */ | ||
| 163 | __enable_mmu: | ||
| 164 | #ifdef CONFIG_ALIGNMENT_TRAP | ||
| 165 | orr r0, r0, #CR_A | ||
| 166 | #else | ||
| 167 | bic r0, r0, #CR_A | ||
| 168 | #endif | ||
| 169 | #ifdef CONFIG_CPU_DCACHE_DISABLE | ||
| 170 | bic r0, r0, #CR_C | ||
| 171 | #endif | ||
| 172 | #ifdef CONFIG_CPU_BPREDICT_DISABLE | ||
| 173 | bic r0, r0, #CR_Z | ||
| 174 | #endif | ||
| 175 | #ifdef CONFIG_CPU_ICACHE_DISABLE | ||
| 176 | bic r0, r0, #CR_I | ||
| 177 | #endif | ||
| 178 | mov r5, #(domain_val(DOMAIN_USER, DOMAIN_MANAGER) | \ | ||
| 179 | domain_val(DOMAIN_KERNEL, DOMAIN_MANAGER) | \ | ||
| 180 | domain_val(DOMAIN_TABLE, DOMAIN_MANAGER) | \ | ||
| 181 | domain_val(DOMAIN_IO, DOMAIN_CLIENT)) | ||
| 182 | mcr p15, 0, r5, c3, c0, 0 @ load domain access register | ||
| 183 | mcr p15, 0, r4, c2, c0, 0 @ load page table pointer | ||
| 184 | b __turn_mmu_on | ||
| 185 | ENDPROC(__enable_mmu) | ||
| 186 | |||
| 187 | /* | ||
| 188 | * Enable the MMU. This completely changes the structure of the visible | ||
| 189 | * memory space. You will not be able to trace execution through this. | ||
| 190 | * If you have an enquiry about this, *please* check the linux-arm-kernel | ||
| 191 | * mailing list archives BEFORE sending another post to the list. | ||
| 192 | * | ||
| 193 | * r0 = cp#15 control register | ||
| 194 | * r13 = *virtual* address to jump to upon completion | ||
| 195 | * | ||
| 196 | * other registers depend on the function called upon completion | ||
| 197 | */ | ||
| 198 | .align 5 | ||
| 199 | __turn_mmu_on: | ||
| 200 | mov r0, r0 | ||
| 201 | mcr p15, 0, r0, c1, c0, 0 @ write control reg | ||
| 202 | mrc p15, 0, r3, c0, c0, 0 @ read id reg | ||
| 203 | mov r3, r3 | ||
| 204 | mov r3, r13 | ||
| 205 | mov pc, r3 | ||
| 206 | ENDPROC(__turn_mmu_on) | ||
| 207 | |||
| 208 | 110 | ||
| 209 | /* | 111 | /* |
| 210 | * Setup the initial page tables. We only setup the barest | 112 | * Setup the initial page tables. We only setup the barest |
| @@ -216,7 +118,7 @@ ENDPROC(__turn_mmu_on) | |||
| 216 | * r10 = procinfo | 118 | * r10 = procinfo |
| 217 | * | 119 | * |
| 218 | * Returns: | 120 | * Returns: |
| 219 | * r0, r3, r6, r7 corrupted | 121 | * r0, r3, r5-r7 corrupted |
| 220 | * r4 = physical page table address | 122 | * r4 = physical page table address |
| 221 | */ | 123 | */ |
| 222 | __create_page_tables: | 124 | __create_page_tables: |
| @@ -238,20 +140,30 @@ __create_page_tables: | |||
| 238 | ldr r7, [r10, #PROCINFO_MM_MMUFLAGS] @ mm_mmuflags | 140 | ldr r7, [r10, #PROCINFO_MM_MMUFLAGS] @ mm_mmuflags |
| 239 | 141 | ||
| 240 | /* | 142 | /* |
| 241 | * Create identity mapping for first MB of kernel to | 143 | * Create identity mapping to cater for __enable_mmu. |
| 242 | * cater for the MMU enable. This identity mapping | 144 | * This identity mapping will be removed by paging_init(). |
| 243 | * will be removed by paging_init(). We use our current program | ||
| 244 | * counter to determine corresponding section base address. | ||
| 245 | */ | 145 | */ |
| 246 | mov r6, pc | 146 | adr r0, __enable_mmu_loc |
| 247 | mov r6, r6, lsr #20 @ start of kernel section | 147 | ldmia r0, {r3, r5, r6} |
| 248 | orr r3, r7, r6, lsl #20 @ flags + kernel base | 148 | sub r0, r0, r3 @ virt->phys offset |
| 249 | str r3, [r4, r6, lsl #2] @ identity mapping | 149 | add r5, r5, r0 @ phys __enable_mmu |
| 150 | add r6, r6, r0 @ phys __enable_mmu_end | ||
| 151 | mov r5, r5, lsr #20 | ||
| 152 | mov r6, r6, lsr #20 | ||
| 153 | |||
| 154 | 1: orr r3, r7, r5, lsl #20 @ flags + kernel base | ||
| 155 | str r3, [r4, r5, lsl #2] @ identity mapping | ||
| 156 | teq r5, r6 | ||
| 157 | addne r5, r5, #1 @ next section | ||
| 158 | bne 1b | ||
| 250 | 159 | ||
| 251 | /* | 160 | /* |
| 252 | * Now setup the pagetables for our kernel direct | 161 | * Now setup the pagetables for our kernel direct |
| 253 | * mapped region. | 162 | * mapped region. |
| 254 | */ | 163 | */ |
| 164 | mov r3, pc | ||
| 165 | mov r3, r3, lsr #20 | ||
| 166 | orr r3, r7, r3, lsl #20 | ||
| 255 | add r0, r4, #(KERNEL_START & 0xff000000) >> 18 | 167 | add r0, r4, #(KERNEL_START & 0xff000000) >> 18 |
| 256 | str r3, [r0, #(KERNEL_START & 0x00f00000) >> 18]! | 168 | str r3, [r0, #(KERNEL_START & 0x00f00000) >> 18]! |
| 257 | ldr r6, =(KERNEL_END - 1) | 169 | ldr r6, =(KERNEL_END - 1) |
| @@ -335,6 +247,122 @@ __create_page_tables: | |||
| 335 | mov pc, lr | 247 | mov pc, lr |
| 336 | ENDPROC(__create_page_tables) | 248 | ENDPROC(__create_page_tables) |
| 337 | .ltorg | 249 | .ltorg |
| 250 | __enable_mmu_loc: | ||
| 251 | .long . | ||
| 252 | .long __enable_mmu | ||
| 253 | .long __enable_mmu_end | ||
| 254 | |||
| 255 | #if defined(CONFIG_SMP) | ||
| 256 | __CPUINIT | ||
| 257 | ENTRY(secondary_startup) | ||
| 258 | /* | ||
| 259 | * Common entry point for secondary CPUs. | ||
| 260 | * | ||
| 261 | * Ensure that we're in SVC mode, and IRQs are disabled. Lookup | ||
| 262 | * the processor type - there is no need to check the machine type | ||
| 263 | * as it has already been validated by the primary processor. | ||
| 264 | */ | ||
| 265 | setmode PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 | ||
| 266 | mrc p15, 0, r9, c0, c0 @ get processor id | ||
| 267 | bl __lookup_processor_type | ||
| 268 | movs r10, r5 @ invalid processor? | ||
| 269 | moveq r0, #'p' @ yes, error 'p' | ||
| 270 | beq __error_p | ||
| 271 | |||
| 272 | /* | ||
| 273 | * Use the page tables supplied from __cpu_up. | ||
| 274 | */ | ||
| 275 | adr r4, __secondary_data | ||
| 276 | ldmia r4, {r5, r7, r12} @ address to jump to after | ||
| 277 | sub r4, r4, r5 @ mmu has been enabled | ||
| 278 | ldr r4, [r7, r4] @ get secondary_data.pgdir | ||
| 279 | adr lr, BSYM(__enable_mmu) @ return address | ||
| 280 | mov r13, r12 @ __secondary_switched address | ||
| 281 | ARM( add pc, r10, #PROCINFO_INITFUNC ) @ initialise processor | ||
| 282 | @ (return control reg) | ||
| 283 | THUMB( add r12, r10, #PROCINFO_INITFUNC ) | ||
| 284 | THUMB( mov pc, r12 ) | ||
| 285 | ENDPROC(secondary_startup) | ||
| 286 | |||
| 287 | /* | ||
| 288 | * r6 = &secondary_data | ||
| 289 | */ | ||
| 290 | ENTRY(__secondary_switched) | ||
| 291 | ldr sp, [r7, #4] @ get secondary_data.stack | ||
| 292 | mov fp, #0 | ||
| 293 | b secondary_start_kernel | ||
| 294 | ENDPROC(__secondary_switched) | ||
| 295 | |||
| 296 | .type __secondary_data, %object | ||
| 297 | __secondary_data: | ||
| 298 | .long . | ||
| 299 | .long secondary_data | ||
| 300 | .long __secondary_switched | ||
| 301 | #endif /* defined(CONFIG_SMP) */ | ||
| 302 | |||
| 303 | |||
| 304 | |||
| 305 | /* | ||
| 306 | * Setup common bits before finally enabling the MMU. Essentially | ||
| 307 | * this is just loading the page table pointer and domain access | ||
| 308 | * registers. | ||
| 309 | * | ||
| 310 | * r0 = cp#15 control register | ||
| 311 | * r1 = machine ID | ||
| 312 | * r2 = atags pointer | ||
| 313 | * r4 = page table pointer | ||
| 314 | * r9 = processor ID | ||
| 315 | * r13 = *virtual* address to jump to upon completion | ||
| 316 | */ | ||
| 317 | __enable_mmu: | ||
| 318 | #ifdef CONFIG_ALIGNMENT_TRAP | ||
| 319 | orr r0, r0, #CR_A | ||
| 320 | #else | ||
| 321 | bic r0, r0, #CR_A | ||
| 322 | #endif | ||
| 323 | #ifdef CONFIG_CPU_DCACHE_DISABLE | ||
| 324 | bic r0, r0, #CR_C | ||
| 325 | #endif | ||
| 326 | #ifdef CONFIG_CPU_BPREDICT_DISABLE | ||
| 327 | bic r0, r0, #CR_Z | ||
| 328 | #endif | ||
| 329 | #ifdef CONFIG_CPU_ICACHE_DISABLE | ||
| 330 | bic r0, r0, #CR_I | ||
| 331 | #endif | ||
| 332 | mov r5, #(domain_val(DOMAIN_USER, DOMAIN_MANAGER) | \ | ||
| 333 | domain_val(DOMAIN_KERNEL, DOMAIN_MANAGER) | \ | ||
| 334 | domain_val(DOMAIN_TABLE, DOMAIN_MANAGER) | \ | ||
| 335 | domain_val(DOMAIN_IO, DOMAIN_CLIENT)) | ||
| 336 | mcr p15, 0, r5, c3, c0, 0 @ load domain access register | ||
| 337 | mcr p15, 0, r4, c2, c0, 0 @ load page table pointer | ||
| 338 | b __turn_mmu_on | ||
| 339 | ENDPROC(__enable_mmu) | ||
| 340 | |||
| 341 | /* | ||
| 342 | * Enable the MMU. This completely changes the structure of the visible | ||
| 343 | * memory space. You will not be able to trace execution through this. | ||
| 344 | * If you have an enquiry about this, *please* check the linux-arm-kernel | ||
| 345 | * mailing list archives BEFORE sending another post to the list. | ||
| 346 | * | ||
| 347 | * r0 = cp#15 control register | ||
| 348 | * r1 = machine ID | ||
| 349 | * r2 = atags pointer | ||
| 350 | * r9 = processor ID | ||
| 351 | * r13 = *virtual* address to jump to upon completion | ||
| 352 | * | ||
| 353 | * other registers depend on the function called upon completion | ||
| 354 | */ | ||
| 355 | .align 5 | ||
| 356 | __turn_mmu_on: | ||
| 357 | mov r0, r0 | ||
| 358 | mcr p15, 0, r0, c1, c0, 0 @ write control reg | ||
| 359 | mrc p15, 0, r3, c0, c0, 0 @ read id reg | ||
| 360 | mov r3, r3 | ||
| 361 | mov r3, r13 | ||
| 362 | mov pc, r3 | ||
| 363 | __enable_mmu_end: | ||
| 364 | ENDPROC(__turn_mmu_on) | ||
| 365 | |||
| 338 | 366 | ||
| 339 | #ifdef CONFIG_SMP_ON_UP | 367 | #ifdef CONFIG_SMP_ON_UP |
| 340 | __fixup_smp: | 368 | __fixup_smp: |
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 32e16da5cbce..8c1959590252 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c | |||
| @@ -33,6 +33,7 @@ | |||
| 33 | #include <asm/pgtable.h> | 33 | #include <asm/pgtable.h> |
| 34 | #include <asm/pgalloc.h> | 34 | #include <asm/pgalloc.h> |
| 35 | #include <asm/processor.h> | 35 | #include <asm/processor.h> |
| 36 | #include <asm/sections.h> | ||
| 36 | #include <asm/tlbflush.h> | 37 | #include <asm/tlbflush.h> |
| 37 | #include <asm/ptrace.h> | 38 | #include <asm/ptrace.h> |
| 38 | #include <asm/localtimer.h> | 39 | #include <asm/localtimer.h> |
| @@ -67,12 +68,47 @@ enum ipi_msg_type { | |||
| 67 | IPI_CPU_STOP, | 68 | IPI_CPU_STOP, |
| 68 | }; | 69 | }; |
| 69 | 70 | ||
| 71 | static inline void identity_mapping_add(pgd_t *pgd, unsigned long start, | ||
| 72 | unsigned long end) | ||
| 73 | { | ||
| 74 | unsigned long addr, prot; | ||
| 75 | pmd_t *pmd; | ||
| 76 | |||
| 77 | prot = PMD_TYPE_SECT | PMD_SECT_AP_WRITE; | ||
| 78 | if (cpu_architecture() <= CPU_ARCH_ARMv5TEJ && !cpu_is_xscale()) | ||
| 79 | prot |= PMD_BIT4; | ||
| 80 | |||
| 81 | for (addr = start & PGDIR_MASK; addr < end;) { | ||
| 82 | pmd = pmd_offset(pgd + pgd_index(addr), addr); | ||
| 83 | pmd[0] = __pmd(addr | prot); | ||
| 84 | addr += SECTION_SIZE; | ||
| 85 | pmd[1] = __pmd(addr | prot); | ||
| 86 | addr += SECTION_SIZE; | ||
| 87 | flush_pmd_entry(pmd); | ||
| 88 | outer_clean_range(__pa(pmd), __pa(pmd + 1)); | ||
| 89 | } | ||
| 90 | } | ||
| 91 | |||
| 92 | static inline void identity_mapping_del(pgd_t *pgd, unsigned long start, | ||
| 93 | unsigned long end) | ||
| 94 | { | ||
| 95 | unsigned long addr; | ||
| 96 | pmd_t *pmd; | ||
| 97 | |||
| 98 | for (addr = start & PGDIR_MASK; addr < end; addr += PGDIR_SIZE) { | ||
| 99 | pmd = pmd_offset(pgd + pgd_index(addr), addr); | ||
| 100 | pmd[0] = __pmd(0); | ||
| 101 | pmd[1] = __pmd(0); | ||
| 102 | clean_pmd_entry(pmd); | ||
| 103 | outer_clean_range(__pa(pmd), __pa(pmd + 1)); | ||
| 104 | } | ||
| 105 | } | ||
| 106 | |||
| 70 | int __cpuinit __cpu_up(unsigned int cpu) | 107 | int __cpuinit __cpu_up(unsigned int cpu) |
| 71 | { | 108 | { |
| 72 | struct cpuinfo_arm *ci = &per_cpu(cpu_data, cpu); | 109 | struct cpuinfo_arm *ci = &per_cpu(cpu_data, cpu); |
| 73 | struct task_struct *idle = ci->idle; | 110 | struct task_struct *idle = ci->idle; |
| 74 | pgd_t *pgd; | 111 | pgd_t *pgd; |
| 75 | pmd_t *pmd; | ||
| 76 | int ret; | 112 | int ret; |
| 77 | 113 | ||
| 78 | /* | 114 | /* |
| @@ -101,11 +137,16 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
| 101 | * a 1:1 mapping for the physical address of the kernel. | 137 | * a 1:1 mapping for the physical address of the kernel. |
| 102 | */ | 138 | */ |
| 103 | pgd = pgd_alloc(&init_mm); | 139 | pgd = pgd_alloc(&init_mm); |
| 104 | pmd = pmd_offset(pgd + pgd_index(PHYS_OFFSET), PHYS_OFFSET); | 140 | if (!pgd) |
| 105 | *pmd = __pmd((PHYS_OFFSET & PGDIR_MASK) | | 141 | return -ENOMEM; |
| 106 | PMD_TYPE_SECT | PMD_SECT_AP_WRITE); | 142 | |
| 107 | flush_pmd_entry(pmd); | 143 | if (PHYS_OFFSET != PAGE_OFFSET) { |
| 108 | outer_clean_range(__pa(pmd), __pa(pmd + 1)); | 144 | #ifndef CONFIG_HOTPLUG_CPU |
| 145 | identity_mapping_add(pgd, __pa(__init_begin), __pa(__init_end)); | ||
| 146 | #endif | ||
| 147 | identity_mapping_add(pgd, __pa(_stext), __pa(_etext)); | ||
| 148 | identity_mapping_add(pgd, __pa(_sdata), __pa(_edata)); | ||
| 149 | } | ||
| 109 | 150 | ||
| 110 | /* | 151 | /* |
| 111 | * We need to tell the secondary core where to find | 152 | * We need to tell the secondary core where to find |
| @@ -143,8 +184,14 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
| 143 | secondary_data.stack = NULL; | 184 | secondary_data.stack = NULL; |
| 144 | secondary_data.pgdir = 0; | 185 | secondary_data.pgdir = 0; |
| 145 | 186 | ||
| 146 | *pmd = __pmd(0); | 187 | if (PHYS_OFFSET != PAGE_OFFSET) { |
| 147 | clean_pmd_entry(pmd); | 188 | #ifndef CONFIG_HOTPLUG_CPU |
| 189 | identity_mapping_del(pgd, __pa(__init_begin), __pa(__init_end)); | ||
| 190 | #endif | ||
| 191 | identity_mapping_del(pgd, __pa(_stext), __pa(_etext)); | ||
| 192 | identity_mapping_del(pgd, __pa(_sdata), __pa(_edata)); | ||
| 193 | } | ||
| 194 | |||
| 148 | pgd_free(&init_mm, pgd); | 195 | pgd_free(&init_mm, pgd); |
| 149 | 196 | ||
| 150 | if (ret) { | 197 | if (ret) { |
diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S index 065d35de0e01..1953e3d21abf 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S | |||
| @@ -8,6 +8,19 @@ | |||
| 8 | #include <asm/memory.h> | 8 | #include <asm/memory.h> |
| 9 | #include <asm/page.h> | 9 | #include <asm/page.h> |
| 10 | 10 | ||
| 11 | #define PROC_INFO \ | ||
| 12 | VMLINUX_SYMBOL(__proc_info_begin) = .; \ | ||
| 13 | *(.proc.info.init) \ | ||
| 14 | VMLINUX_SYMBOL(__proc_info_end) = .; | ||
| 15 | |||
| 16 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 17 | #define ARM_CPU_DISCARD(x) | ||
| 18 | #define ARM_CPU_KEEP(x) x | ||
| 19 | #else | ||
| 20 | #define ARM_CPU_DISCARD(x) x | ||
| 21 | #define ARM_CPU_KEEP(x) | ||
| 22 | #endif | ||
| 23 | |||
| 11 | OUTPUT_ARCH(arm) | 24 | OUTPUT_ARCH(arm) |
| 12 | ENTRY(stext) | 25 | ENTRY(stext) |
| 13 | 26 | ||
| @@ -31,9 +44,7 @@ SECTIONS | |||
| 31 | HEAD_TEXT | 44 | HEAD_TEXT |
| 32 | INIT_TEXT | 45 | INIT_TEXT |
| 33 | _einittext = .; | 46 | _einittext = .; |
| 34 | __proc_info_begin = .; | 47 | ARM_CPU_DISCARD(PROC_INFO) |
| 35 | *(.proc.info.init) | ||
| 36 | __proc_info_end = .; | ||
| 37 | __arch_info_begin = .; | 48 | __arch_info_begin = .; |
| 38 | *(.arch.info.init) | 49 | *(.arch.info.init) |
| 39 | __arch_info_end = .; | 50 | __arch_info_end = .; |
| @@ -73,10 +84,8 @@ SECTIONS | |||
| 73 | /DISCARD/ : { | 84 | /DISCARD/ : { |
| 74 | *(.ARM.exidx.exit.text) | 85 | *(.ARM.exidx.exit.text) |
| 75 | *(.ARM.extab.exit.text) | 86 | *(.ARM.extab.exit.text) |
| 76 | #ifndef CONFIG_HOTPLUG_CPU | 87 | ARM_CPU_DISCARD(*(.ARM.exidx.cpuexit.text)) |
| 77 | *(.ARM.exidx.cpuexit.text) | 88 | ARM_CPU_DISCARD(*(.ARM.extab.cpuexit.text)) |
| 78 | *(.ARM.extab.cpuexit.text) | ||
| 79 | #endif | ||
| 80 | #ifndef CONFIG_HOTPLUG | 89 | #ifndef CONFIG_HOTPLUG |
| 81 | *(.ARM.exidx.devexit.text) | 90 | *(.ARM.exidx.devexit.text) |
| 82 | *(.ARM.extab.devexit.text) | 91 | *(.ARM.extab.devexit.text) |
| @@ -105,6 +114,7 @@ SECTIONS | |||
| 105 | *(.glue_7) | 114 | *(.glue_7) |
| 106 | *(.glue_7t) | 115 | *(.glue_7t) |
| 107 | *(.got) /* Global offset table */ | 116 | *(.got) /* Global offset table */ |
| 117 | ARM_CPU_KEEP(PROC_INFO) | ||
| 108 | } | 118 | } |
| 109 | 119 | ||
| 110 | RO_DATA(PAGE_SIZE) | 120 | RO_DATA(PAGE_SIZE) |
diff --git a/arch/arm/mm/proc-arm1020.S b/arch/arm/mm/proc-arm1020.S index 203a4e944d9e..a6f5f8475b96 100644 --- a/arch/arm/mm/proc-arm1020.S +++ b/arch/arm/mm/proc-arm1020.S | |||
| @@ -430,7 +430,7 @@ ENTRY(cpu_arm1020_set_pte_ext) | |||
| 430 | #endif /* CONFIG_MMU */ | 430 | #endif /* CONFIG_MMU */ |
| 431 | mov pc, lr | 431 | mov pc, lr |
| 432 | 432 | ||
| 433 | __INIT | 433 | __CPUINIT |
| 434 | 434 | ||
| 435 | .type __arm1020_setup, #function | 435 | .type __arm1020_setup, #function |
| 436 | __arm1020_setup: | 436 | __arm1020_setup: |
diff --git a/arch/arm/mm/proc-arm1020e.S b/arch/arm/mm/proc-arm1020e.S index 1a511e765909..afc06b9c3133 100644 --- a/arch/arm/mm/proc-arm1020e.S +++ b/arch/arm/mm/proc-arm1020e.S | |||
| @@ -412,7 +412,7 @@ ENTRY(cpu_arm1020e_set_pte_ext) | |||
| 412 | #endif /* CONFIG_MMU */ | 412 | #endif /* CONFIG_MMU */ |
| 413 | mov pc, lr | 413 | mov pc, lr |
| 414 | 414 | ||
| 415 | __INIT | 415 | __CPUINIT |
| 416 | 416 | ||
| 417 | .type __arm1020e_setup, #function | 417 | .type __arm1020e_setup, #function |
| 418 | __arm1020e_setup: | 418 | __arm1020e_setup: |
diff --git a/arch/arm/mm/proc-arm1022.S b/arch/arm/mm/proc-arm1022.S index 1ffa4eb9c34f..8915e0ba3fe5 100644 --- a/arch/arm/mm/proc-arm1022.S +++ b/arch/arm/mm/proc-arm1022.S | |||
| @@ -394,7 +394,7 @@ ENTRY(cpu_arm1022_set_pte_ext) | |||
| 394 | #endif /* CONFIG_MMU */ | 394 | #endif /* CONFIG_MMU */ |
| 395 | mov pc, lr | 395 | mov pc, lr |
| 396 | 396 | ||
| 397 | __INIT | 397 | __CPUINIT |
| 398 | 398 | ||
| 399 | .type __arm1022_setup, #function | 399 | .type __arm1022_setup, #function |
| 400 | __arm1022_setup: | 400 | __arm1022_setup: |
diff --git a/arch/arm/mm/proc-arm1026.S b/arch/arm/mm/proc-arm1026.S index 5697c34b95b0..ff446c5d476f 100644 --- a/arch/arm/mm/proc-arm1026.S +++ b/arch/arm/mm/proc-arm1026.S | |||
| @@ -384,7 +384,7 @@ ENTRY(cpu_arm1026_set_pte_ext) | |||
| 384 | mov pc, lr | 384 | mov pc, lr |
| 385 | 385 | ||
| 386 | 386 | ||
| 387 | __INIT | 387 | __CPUINIT |
| 388 | 388 | ||
| 389 | .type __arm1026_setup, #function | 389 | .type __arm1026_setup, #function |
| 390 | __arm1026_setup: | 390 | __arm1026_setup: |
diff --git a/arch/arm/mm/proc-arm6_7.S b/arch/arm/mm/proc-arm6_7.S index 64e0b327c7c5..6a7be1863edd 100644 --- a/arch/arm/mm/proc-arm6_7.S +++ b/arch/arm/mm/proc-arm6_7.S | |||
| @@ -238,7 +238,7 @@ ENTRY(cpu_arm7_reset) | |||
| 238 | mcr p15, 0, r1, c1, c0, 0 @ turn off MMU etc | 238 | mcr p15, 0, r1, c1, c0, 0 @ turn off MMU etc |
| 239 | mov pc, r0 | 239 | mov pc, r0 |
| 240 | 240 | ||
| 241 | __INIT | 241 | __CPUINIT |
| 242 | 242 | ||
| 243 | .type __arm6_setup, #function | 243 | .type __arm6_setup, #function |
| 244 | __arm6_setup: mov r0, #0 | 244 | __arm6_setup: mov r0, #0 |
diff --git a/arch/arm/mm/proc-arm720.S b/arch/arm/mm/proc-arm720.S index 9d96824134fc..c285395f44b2 100644 --- a/arch/arm/mm/proc-arm720.S +++ b/arch/arm/mm/proc-arm720.S | |||
| @@ -113,7 +113,7 @@ ENTRY(cpu_arm720_reset) | |||
| 113 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 113 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
| 114 | mov pc, r0 | 114 | mov pc, r0 |
| 115 | 115 | ||
| 116 | __INIT | 116 | __CPUINIT |
| 117 | 117 | ||
| 118 | .type __arm710_setup, #function | 118 | .type __arm710_setup, #function |
| 119 | __arm710_setup: | 119 | __arm710_setup: |
diff --git a/arch/arm/mm/proc-arm740.S b/arch/arm/mm/proc-arm740.S index 6c1a9ab059ae..38b27dcba727 100644 --- a/arch/arm/mm/proc-arm740.S +++ b/arch/arm/mm/proc-arm740.S | |||
| @@ -55,7 +55,7 @@ ENTRY(cpu_arm740_reset) | |||
| 55 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 55 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
| 56 | mov pc, r0 | 56 | mov pc, r0 |
| 57 | 57 | ||
| 58 | __INIT | 58 | __CPUINIT |
| 59 | 59 | ||
| 60 | .type __arm740_setup, #function | 60 | .type __arm740_setup, #function |
| 61 | __arm740_setup: | 61 | __arm740_setup: |
diff --git a/arch/arm/mm/proc-arm7tdmi.S b/arch/arm/mm/proc-arm7tdmi.S index 6a850dbba22e..0c9786de20af 100644 --- a/arch/arm/mm/proc-arm7tdmi.S +++ b/arch/arm/mm/proc-arm7tdmi.S | |||
| @@ -46,7 +46,7 @@ ENTRY(cpu_arm7tdmi_proc_fin) | |||
| 46 | ENTRY(cpu_arm7tdmi_reset) | 46 | ENTRY(cpu_arm7tdmi_reset) |
| 47 | mov pc, r0 | 47 | mov pc, r0 |
| 48 | 48 | ||
| 49 | __INIT | 49 | __CPUINIT |
| 50 | 50 | ||
| 51 | .type __arm7tdmi_setup, #function | 51 | .type __arm7tdmi_setup, #function |
| 52 | __arm7tdmi_setup: | 52 | __arm7tdmi_setup: |
diff --git a/arch/arm/mm/proc-arm920.S b/arch/arm/mm/proc-arm920.S index 86f80aa56216..fecf570939f3 100644 --- a/arch/arm/mm/proc-arm920.S +++ b/arch/arm/mm/proc-arm920.S | |||
| @@ -375,7 +375,7 @@ ENTRY(cpu_arm920_set_pte_ext) | |||
| 375 | #endif | 375 | #endif |
| 376 | mov pc, lr | 376 | mov pc, lr |
| 377 | 377 | ||
| 378 | __INIT | 378 | __CPUINIT |
| 379 | 379 | ||
| 380 | .type __arm920_setup, #function | 380 | .type __arm920_setup, #function |
| 381 | __arm920_setup: | 381 | __arm920_setup: |
diff --git a/arch/arm/mm/proc-arm922.S b/arch/arm/mm/proc-arm922.S index f76ce9b62883..e3cbf87c9480 100644 --- a/arch/arm/mm/proc-arm922.S +++ b/arch/arm/mm/proc-arm922.S | |||
| @@ -379,7 +379,7 @@ ENTRY(cpu_arm922_set_pte_ext) | |||
| 379 | #endif /* CONFIG_MMU */ | 379 | #endif /* CONFIG_MMU */ |
| 380 | mov pc, lr | 380 | mov pc, lr |
| 381 | 381 | ||
| 382 | __INIT | 382 | __CPUINIT |
| 383 | 383 | ||
| 384 | .type __arm922_setup, #function | 384 | .type __arm922_setup, #function |
| 385 | __arm922_setup: | 385 | __arm922_setup: |
diff --git a/arch/arm/mm/proc-arm925.S b/arch/arm/mm/proc-arm925.S index 657bd3f7c153..572424c867b5 100644 --- a/arch/arm/mm/proc-arm925.S +++ b/arch/arm/mm/proc-arm925.S | |||
| @@ -428,7 +428,7 @@ ENTRY(cpu_arm925_set_pte_ext) | |||
| 428 | #endif /* CONFIG_MMU */ | 428 | #endif /* CONFIG_MMU */ |
| 429 | mov pc, lr | 429 | mov pc, lr |
| 430 | 430 | ||
| 431 | __INIT | 431 | __CPUINIT |
| 432 | 432 | ||
| 433 | .type __arm925_setup, #function | 433 | .type __arm925_setup, #function |
| 434 | __arm925_setup: | 434 | __arm925_setup: |
diff --git a/arch/arm/mm/proc-arm926.S b/arch/arm/mm/proc-arm926.S index 73f1f3c68910..63d168b4ebe6 100644 --- a/arch/arm/mm/proc-arm926.S +++ b/arch/arm/mm/proc-arm926.S | |||
| @@ -389,7 +389,7 @@ ENTRY(cpu_arm926_set_pte_ext) | |||
| 389 | #endif | 389 | #endif |
| 390 | mov pc, lr | 390 | mov pc, lr |
| 391 | 391 | ||
| 392 | __INIT | 392 | __CPUINIT |
| 393 | 393 | ||
| 394 | .type __arm926_setup, #function | 394 | .type __arm926_setup, #function |
| 395 | __arm926_setup: | 395 | __arm926_setup: |
diff --git a/arch/arm/mm/proc-arm940.S b/arch/arm/mm/proc-arm940.S index fffb061a45a5..f6a62822418e 100644 --- a/arch/arm/mm/proc-arm940.S +++ b/arch/arm/mm/proc-arm940.S | |||
| @@ -264,7 +264,7 @@ ENTRY(arm940_cache_fns) | |||
| 264 | .long arm940_dma_unmap_area | 264 | .long arm940_dma_unmap_area |
| 265 | .long arm940_dma_flush_range | 265 | .long arm940_dma_flush_range |
| 266 | 266 | ||
| 267 | __INIT | 267 | __CPUINIT |
| 268 | 268 | ||
| 269 | .type __arm940_setup, #function | 269 | .type __arm940_setup, #function |
| 270 | __arm940_setup: | 270 | __arm940_setup: |
diff --git a/arch/arm/mm/proc-arm946.S b/arch/arm/mm/proc-arm946.S index 249a6053760a..ea2e7f2eb95b 100644 --- a/arch/arm/mm/proc-arm946.S +++ b/arch/arm/mm/proc-arm946.S | |||
| @@ -317,7 +317,7 @@ ENTRY(cpu_arm946_dcache_clean_area) | |||
| 317 | mcr p15, 0, r0, c7, c10, 4 @ drain WB | 317 | mcr p15, 0, r0, c7, c10, 4 @ drain WB |
| 318 | mov pc, lr | 318 | mov pc, lr |
| 319 | 319 | ||
| 320 | __INIT | 320 | __CPUINIT |
| 321 | 321 | ||
| 322 | .type __arm946_setup, #function | 322 | .type __arm946_setup, #function |
| 323 | __arm946_setup: | 323 | __arm946_setup: |
diff --git a/arch/arm/mm/proc-arm9tdmi.S b/arch/arm/mm/proc-arm9tdmi.S index db475667fac2..db67e3134d7a 100644 --- a/arch/arm/mm/proc-arm9tdmi.S +++ b/arch/arm/mm/proc-arm9tdmi.S | |||
| @@ -46,7 +46,7 @@ ENTRY(cpu_arm9tdmi_proc_fin) | |||
| 46 | ENTRY(cpu_arm9tdmi_reset) | 46 | ENTRY(cpu_arm9tdmi_reset) |
| 47 | mov pc, r0 | 47 | mov pc, r0 |
| 48 | 48 | ||
| 49 | __INIT | 49 | __CPUINIT |
| 50 | 50 | ||
| 51 | .type __arm9tdmi_setup, #function | 51 | .type __arm9tdmi_setup, #function |
| 52 | __arm9tdmi_setup: | 52 | __arm9tdmi_setup: |
diff --git a/arch/arm/mm/proc-fa526.S b/arch/arm/mm/proc-fa526.S index 7803fdf70029..7c9ad621f0e6 100644 --- a/arch/arm/mm/proc-fa526.S +++ b/arch/arm/mm/proc-fa526.S | |||
| @@ -134,7 +134,7 @@ ENTRY(cpu_fa526_set_pte_ext) | |||
| 134 | #endif | 134 | #endif |
| 135 | mov pc, lr | 135 | mov pc, lr |
| 136 | 136 | ||
| 137 | __INIT | 137 | __CPUINIT |
| 138 | 138 | ||
| 139 | .type __fa526_setup, #function | 139 | .type __fa526_setup, #function |
| 140 | __fa526_setup: | 140 | __fa526_setup: |
diff --git a/arch/arm/mm/proc-feroceon.S b/arch/arm/mm/proc-feroceon.S index b304d0104a4e..578da69200cf 100644 --- a/arch/arm/mm/proc-feroceon.S +++ b/arch/arm/mm/proc-feroceon.S | |||
| @@ -494,7 +494,7 @@ ENTRY(cpu_feroceon_set_pte_ext) | |||
| 494 | #endif | 494 | #endif |
| 495 | mov pc, lr | 495 | mov pc, lr |
| 496 | 496 | ||
| 497 | __INIT | 497 | __CPUINIT |
| 498 | 498 | ||
| 499 | .type __feroceon_setup, #function | 499 | .type __feroceon_setup, #function |
| 500 | __feroceon_setup: | 500 | __feroceon_setup: |
diff --git a/arch/arm/mm/proc-mohawk.S b/arch/arm/mm/proc-mohawk.S index 5f6892fcc167..4458ee6aa713 100644 --- a/arch/arm/mm/proc-mohawk.S +++ b/arch/arm/mm/proc-mohawk.S | |||
| @@ -338,7 +338,7 @@ ENTRY(cpu_mohawk_set_pte_ext) | |||
| 338 | mcr p15, 0, r0, c7, c10, 4 @ drain WB | 338 | mcr p15, 0, r0, c7, c10, 4 @ drain WB |
| 339 | mov pc, lr | 339 | mov pc, lr |
| 340 | 340 | ||
| 341 | __INIT | 341 | __CPUINIT |
| 342 | 342 | ||
| 343 | .type __mohawk_setup, #function | 343 | .type __mohawk_setup, #function |
| 344 | __mohawk_setup: | 344 | __mohawk_setup: |
diff --git a/arch/arm/mm/proc-sa110.S b/arch/arm/mm/proc-sa110.S index a201eb04b5e1..5aa8d59c2e85 100644 --- a/arch/arm/mm/proc-sa110.S +++ b/arch/arm/mm/proc-sa110.S | |||
| @@ -156,7 +156,7 @@ ENTRY(cpu_sa110_set_pte_ext) | |||
| 156 | #endif | 156 | #endif |
| 157 | mov pc, lr | 157 | mov pc, lr |
| 158 | 158 | ||
| 159 | __INIT | 159 | __CPUINIT |
| 160 | 160 | ||
| 161 | .type __sa110_setup, #function | 161 | .type __sa110_setup, #function |
| 162 | __sa110_setup: | 162 | __sa110_setup: |
diff --git a/arch/arm/mm/proc-sa1100.S b/arch/arm/mm/proc-sa1100.S index 7ddc4805bf97..2ac4e6f10713 100644 --- a/arch/arm/mm/proc-sa1100.S +++ b/arch/arm/mm/proc-sa1100.S | |||
| @@ -169,7 +169,7 @@ ENTRY(cpu_sa1100_set_pte_ext) | |||
| 169 | #endif | 169 | #endif |
| 170 | mov pc, lr | 170 | mov pc, lr |
| 171 | 171 | ||
| 172 | __INIT | 172 | __CPUINIT |
| 173 | 173 | ||
| 174 | .type __sa1100_setup, #function | 174 | .type __sa1100_setup, #function |
| 175 | __sa1100_setup: | 175 | __sa1100_setup: |
diff --git a/arch/arm/mm/proc-v6.S b/arch/arm/mm/proc-v6.S index b95662dedb64..59a7e1ffe7bc 100644 --- a/arch/arm/mm/proc-v6.S +++ b/arch/arm/mm/proc-v6.S | |||
| @@ -135,7 +135,7 @@ cpu_pj4_name: | |||
| 135 | 135 | ||
| 136 | .align | 136 | .align |
| 137 | 137 | ||
| 138 | __INIT | 138 | __CPUINIT |
| 139 | 139 | ||
| 140 | /* | 140 | /* |
| 141 | * __v6_setup | 141 | * __v6_setup |
| @@ -193,6 +193,8 @@ __v6_setup: | |||
| 193 | v6_crval: | 193 | v6_crval: |
| 194 | crval clear=0x01e0fb7f, mmuset=0x00c0387d, ucset=0x00c0187c | 194 | crval clear=0x01e0fb7f, mmuset=0x00c0387d, ucset=0x00c0187c |
| 195 | 195 | ||
| 196 | __INITDATA | ||
| 197 | |||
| 196 | .type v6_processor_functions, #object | 198 | .type v6_processor_functions, #object |
| 197 | ENTRY(v6_processor_functions) | 199 | ENTRY(v6_processor_functions) |
| 198 | .word v6_early_abort | 200 | .word v6_early_abort |
| @@ -206,6 +208,8 @@ ENTRY(v6_processor_functions) | |||
| 206 | .word cpu_v6_set_pte_ext | 208 | .word cpu_v6_set_pte_ext |
| 207 | .size v6_processor_functions, . - v6_processor_functions | 209 | .size v6_processor_functions, . - v6_processor_functions |
| 208 | 210 | ||
| 211 | .section ".rodata" | ||
| 212 | |||
| 209 | .type cpu_arch_name, #object | 213 | .type cpu_arch_name, #object |
| 210 | cpu_arch_name: | 214 | cpu_arch_name: |
| 211 | .asciz "armv6" | 215 | .asciz "armv6" |
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index df422fee1cb6..055e9d50d015 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S | |||
| @@ -168,7 +168,7 @@ cpu_v7_name: | |||
| 168 | .ascii "ARMv7 Processor" | 168 | .ascii "ARMv7 Processor" |
| 169 | .align | 169 | .align |
| 170 | 170 | ||
| 171 | __INIT | 171 | __CPUINIT |
| 172 | 172 | ||
| 173 | /* | 173 | /* |
| 174 | * __v7_setup | 174 | * __v7_setup |
| @@ -325,6 +325,8 @@ v7_crval: | |||
| 325 | __v7_setup_stack: | 325 | __v7_setup_stack: |
| 326 | .space 4 * 11 @ 11 registers | 326 | .space 4 * 11 @ 11 registers |
| 327 | 327 | ||
| 328 | __INITDATA | ||
| 329 | |||
| 328 | .type v7_processor_functions, #object | 330 | .type v7_processor_functions, #object |
| 329 | ENTRY(v7_processor_functions) | 331 | ENTRY(v7_processor_functions) |
| 330 | .word v7_early_abort | 332 | .word v7_early_abort |
| @@ -338,6 +340,8 @@ ENTRY(v7_processor_functions) | |||
| 338 | .word cpu_v7_set_pte_ext | 340 | .word cpu_v7_set_pte_ext |
| 339 | .size v7_processor_functions, . - v7_processor_functions | 341 | .size v7_processor_functions, . - v7_processor_functions |
| 340 | 342 | ||
| 343 | .section ".rodata" | ||
| 344 | |||
| 341 | .type cpu_arch_name, #object | 345 | .type cpu_arch_name, #object |
| 342 | cpu_arch_name: | 346 | cpu_arch_name: |
| 343 | .asciz "armv7" | 347 | .asciz "armv7" |
diff --git a/arch/arm/mm/proc-xsc3.S b/arch/arm/mm/proc-xsc3.S index 361a51e49030..cad07e403044 100644 --- a/arch/arm/mm/proc-xsc3.S +++ b/arch/arm/mm/proc-xsc3.S | |||
| @@ -404,7 +404,7 @@ ENTRY(cpu_xsc3_set_pte_ext) | |||
| 404 | 404 | ||
| 405 | .align | 405 | .align |
| 406 | 406 | ||
| 407 | __INIT | 407 | __CPUINIT |
| 408 | 408 | ||
| 409 | .type __xsc3_setup, #function | 409 | .type __xsc3_setup, #function |
| 410 | __xsc3_setup: | 410 | __xsc3_setup: |
diff --git a/arch/arm/mm/proc-xscale.S b/arch/arm/mm/proc-xscale.S index 14075979bcba..cb245edb2c2b 100644 --- a/arch/arm/mm/proc-xscale.S +++ b/arch/arm/mm/proc-xscale.S | |||
| @@ -506,7 +506,7 @@ ENTRY(cpu_xscale_set_pte_ext) | |||
| 506 | 506 | ||
| 507 | .align | 507 | .align |
| 508 | 508 | ||
| 509 | __INIT | 509 | __CPUINIT |
| 510 | 510 | ||
| 511 | .type __xscale_setup, #function | 511 | .type __xscale_setup, #function |
| 512 | __xscale_setup: | 512 | __xscale_setup: |
