diff options
| -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 | /* |
