diff options
Diffstat (limited to 'arch/arm/boot/compressed/head.S')
-rw-r--r-- | arch/arm/boot/compressed/head.S | 46 |
1 files changed, 25 insertions, 21 deletions
diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S index 6abafb6f1844..aaa47400eb9c 100644 --- a/arch/arm/boot/compressed/head.S +++ b/arch/arm/boot/compressed/head.S | |||
@@ -84,7 +84,7 @@ | |||
84 | kputc #'\n' | 84 | kputc #'\n' |
85 | kphex r5, 8 /* decompressed kernel start */ | 85 | kphex r5, 8 /* decompressed kernel start */ |
86 | kputc #'-' | 86 | kputc #'-' |
87 | kphex r8, 8 /* decompressed kernel end */ | 87 | kphex r9, 8 /* decompressed kernel end */ |
88 | kputc #'>' | 88 | kputc #'>' |
89 | kphex r4, 8 /* kernel execution address */ | 89 | kphex r4, 8 /* kernel execution address */ |
90 | kputc #'\n' | 90 | kputc #'\n' |
@@ -116,7 +116,7 @@ start: | |||
116 | .word start @ absolute load/run zImage address | 116 | .word start @ absolute load/run zImage address |
117 | .word _edata @ zImage end address | 117 | .word _edata @ zImage end address |
118 | 1: mov r7, r1 @ save architecture ID | 118 | 1: mov r7, r1 @ save architecture ID |
119 | mov r8, #0 @ save r0 | 119 | mov r8, r2 @ save atags pointer |
120 | 120 | ||
121 | #ifndef __ARM_ARCH_2__ | 121 | #ifndef __ARM_ARCH_2__ |
122 | /* | 122 | /* |
@@ -144,7 +144,7 @@ not_angel: | |||
144 | 144 | ||
145 | /* | 145 | /* |
146 | * some architecture specific code can be inserted | 146 | * some architecture specific code can be inserted |
147 | * by the linker here, but it should preserve r7 and r8. | 147 | * by the linker here, but it should preserve r7, r8, and r9. |
148 | */ | 148 | */ |
149 | 149 | ||
150 | .text | 150 | .text |
@@ -249,16 +249,17 @@ not_relocated: mov r0, #0 | |||
249 | * r5 = decompressed kernel start | 249 | * r5 = decompressed kernel start |
250 | * r6 = processor ID | 250 | * r6 = processor ID |
251 | * r7 = architecture ID | 251 | * r7 = architecture ID |
252 | * r8-r14 = unused | 252 | * r8 = atags pointer |
253 | * r9-r14 = corrupted | ||
253 | */ | 254 | */ |
254 | add r1, r5, r0 @ end of decompressed kernel | 255 | add r1, r5, r0 @ end of decompressed kernel |
255 | adr r2, reloc_start | 256 | adr r2, reloc_start |
256 | ldr r3, LC1 | 257 | ldr r3, LC1 |
257 | add r3, r2, r3 | 258 | add r3, r2, r3 |
258 | 1: ldmia r2!, {r8 - r13} @ copy relocation code | 259 | 1: ldmia r2!, {r9 - r14} @ copy relocation code |
259 | stmia r1!, {r8 - r13} | 260 | stmia r1!, {r9 - r14} |
260 | ldmia r2!, {r8 - r13} | 261 | ldmia r2!, {r9 - r14} |
261 | stmia r1!, {r8 - r13} | 262 | stmia r1!, {r9 - r14} |
262 | cmp r2, r3 | 263 | cmp r2, r3 |
263 | blo 1b | 264 | blo 1b |
264 | 265 | ||
@@ -308,11 +309,12 @@ params: ldr r0, =params_phys | |||
308 | * r4 = kernel execution address | 309 | * r4 = kernel execution address |
309 | * r6 = processor ID | 310 | * r6 = processor ID |
310 | * r7 = architecture number | 311 | * r7 = architecture number |
311 | * r8 = run-time address of "start" | 312 | * r8 = atags pointer |
313 | * r9 = run-time address of "start" (???) | ||
312 | * On exit, | 314 | * On exit, |
313 | * r1, r2, r3, r8, r9, r12 corrupted | 315 | * r1, r2, r3, r9, r10, r12 corrupted |
314 | * This routine must preserve: | 316 | * This routine must preserve: |
315 | * r4, r5, r6, r7 | 317 | * r4, r5, r6, r7, r8 |
316 | */ | 318 | */ |
317 | .align 5 | 319 | .align 5 |
318 | cache_on: mov r3, #8 @ cache_on function | 320 | cache_on: mov r3, #8 @ cache_on function |
@@ -326,15 +328,15 @@ __setup_mmu: sub r3, r4, #16384 @ Page directory size | |||
326 | * bits for the RAM area only. | 328 | * bits for the RAM area only. |
327 | */ | 329 | */ |
328 | mov r0, r3 | 330 | mov r0, r3 |
329 | mov r8, r0, lsr #18 | 331 | mov r9, r0, lsr #18 |
330 | mov r8, r8, lsl #18 @ start of RAM | 332 | mov r9, r9, lsl #18 @ start of RAM |
331 | add r9, r8, #0x10000000 @ a reasonable RAM size | 333 | add r10, r9, #0x10000000 @ a reasonable RAM size |
332 | mov r1, #0x12 | 334 | mov r1, #0x12 |
333 | orr r1, r1, #3 << 10 | 335 | orr r1, r1, #3 << 10 |
334 | add r2, r3, #16384 | 336 | add r2, r3, #16384 |
335 | 1: cmp r1, r8 @ if virt > start of RAM | 337 | 1: cmp r1, r8 @ if virt > start of RAM |
336 | orrhs r1, r1, #0x0c @ set cacheable, bufferable | 338 | orrhs r1, r1, #0x0c @ set cacheable, bufferable |
337 | cmp r1, r9 @ if virt > end of RAM | 339 | cmp r1, r10 @ if virt > end of RAM |
338 | bichs r1, r1, #0x0c @ clear cacheable, bufferable | 340 | bichs r1, r1, #0x0c @ clear cacheable, bufferable |
339 | str r1, [r0], #4 @ 1:1 mapping | 341 | str r1, [r0], #4 @ 1:1 mapping |
340 | add r1, r1, #1048576 | 342 | add r1, r1, #1048576 |
@@ -403,26 +405,28 @@ __common_cache_on: | |||
403 | * r5 = decompressed kernel start | 405 | * r5 = decompressed kernel start |
404 | * r6 = processor ID | 406 | * r6 = processor ID |
405 | * r7 = architecture ID | 407 | * r7 = architecture ID |
406 | * r8-r14 = unused | 408 | * r8 = atags pointer |
409 | * r9-r14 = corrupted | ||
407 | */ | 410 | */ |
408 | .align 5 | 411 | .align 5 |
409 | reloc_start: add r8, r5, r0 | 412 | reloc_start: add r9, r5, r0 |
410 | debug_reloc_start | 413 | debug_reloc_start |
411 | mov r1, r4 | 414 | mov r1, r4 |
412 | 1: | 415 | 1: |
413 | .rept 4 | 416 | .rept 4 |
414 | ldmia r5!, {r0, r2, r3, r9 - r13} @ relocate kernel | 417 | ldmia r5!, {r0, r2, r3, r10 - r14} @ relocate kernel |
415 | stmia r1!, {r0, r2, r3, r9 - r13} | 418 | stmia r1!, {r0, r2, r3, r10 - r14} |
416 | .endr | 419 | .endr |
417 | 420 | ||
418 | cmp r5, r8 | 421 | cmp r5, r9 |
419 | blo 1b | 422 | blo 1b |
420 | debug_reloc_end | 423 | debug_reloc_end |
421 | 424 | ||
422 | call_kernel: bl cache_clean_flush | 425 | call_kernel: bl cache_clean_flush |
423 | bl cache_off | 426 | bl cache_off |
424 | mov r0, #0 | 427 | mov r0, #0 @ must be zero |
425 | mov r1, r7 @ restore architecture number | 428 | mov r1, r7 @ restore architecture number |
429 | mov r2, r8 @ restore atags pointer | ||
426 | mov pc, r4 @ call kernel | 430 | mov pc, r4 @ call kernel |
427 | 431 | ||
428 | /* | 432 | /* |