diff options
Diffstat (limited to 'arch/arm/boot/compressed/head.S')
-rw-r--r-- | arch/arm/boot/compressed/head.S | 40 |
1 files changed, 29 insertions, 11 deletions
diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S index c5191b1532e8..abf4d65acf62 100644 --- a/arch/arm/boot/compressed/head.S +++ b/arch/arm/boot/compressed/head.S | |||
@@ -170,9 +170,16 @@ not_angel: | |||
170 | 170 | ||
171 | .text | 171 | .text |
172 | adr r0, LC0 | 172 | adr r0, LC0 |
173 | ARM( ldmia r0, {r1, r2, r3, r4, r5, r6, r11, ip, sp}) | 173 | ARM( ldmia r0, {r1, r2, r3, r5, r6, r11, ip, sp}) |
174 | THUMB( ldmia r0, {r1, r2, r3, r4, r5, r6, r11, ip} ) | 174 | THUMB( ldmia r0, {r1, r2, r3, r5, r6, r11, ip} ) |
175 | THUMB( ldr sp, [r0, #32] ) | 175 | THUMB( ldr sp, [r0, #32] ) |
176 | #ifdef CONFIG_AUTO_ZRELADDR | ||
177 | @ determine final kernel image address | ||
178 | and r4, pc, #0xf8000000 | ||
179 | add r4, r4, #TEXT_OFFSET | ||
180 | #else | ||
181 | ldr r4, =CONFIG_ZRELADDR | ||
182 | #endif | ||
176 | subs r0, r0, r1 @ calculate the delta offset | 183 | subs r0, r0, r1 @ calculate the delta offset |
177 | 184 | ||
178 | @ if delta is zero, we are | 185 | @ if delta is zero, we are |
@@ -310,18 +317,17 @@ wont_overwrite: mov r0, r4 | |||
310 | LC0: .word LC0 @ r1 | 317 | LC0: .word LC0 @ r1 |
311 | .word __bss_start @ r2 | 318 | .word __bss_start @ r2 |
312 | .word _end @ r3 | 319 | .word _end @ r3 |
313 | .word zreladdr @ r4 | ||
314 | .word _start @ r5 | 320 | .word _start @ r5 |
315 | .word _image_size @ r6 | 321 | .word _image_size @ r6 |
316 | .word _got_start @ r11 | 322 | .word _got_start @ r11 |
317 | .word _got_end @ ip | 323 | .word _got_end @ ip |
318 | .word user_stack+4096 @ sp | 324 | .word user_stack_end @ sp |
319 | LC1: .word reloc_end - reloc_start | 325 | LC1: .word reloc_end - reloc_start |
320 | .size LC0, . - LC0 | 326 | .size LC0, . - LC0 |
321 | 327 | ||
322 | #ifdef CONFIG_ARCH_RPC | 328 | #ifdef CONFIG_ARCH_RPC |
323 | .globl params | 329 | .globl params |
324 | params: ldr r0, =params_phys | 330 | params: ldr r0, =0x10000100 @ params_phys for RPC |
325 | mov pc, lr | 331 | mov pc, lr |
326 | .ltorg | 332 | .ltorg |
327 | .align | 333 | .align |
@@ -339,9 +345,8 @@ params: ldr r0, =params_phys | |||
339 | * r4 = kernel execution address | 345 | * r4 = kernel execution address |
340 | * r7 = architecture number | 346 | * r7 = architecture number |
341 | * r8 = atags pointer | 347 | * r8 = atags pointer |
342 | * r9 = run-time address of "start" (???) | ||
343 | * On exit, | 348 | * On exit, |
344 | * r1, r2, r3, r9, r10, r12 corrupted | 349 | * r0, r1, r2, r3, r9, r10, r12 corrupted |
345 | * This routine must preserve: | 350 | * This routine must preserve: |
346 | * r4, r5, r6, r7, r8 | 351 | * r4, r5, r6, r7, r8 |
347 | */ | 352 | */ |
@@ -396,12 +401,18 @@ __armv3_mpu_cache_on: | |||
396 | 401 | ||
397 | mov r0, #0 | 402 | mov r0, #0 |
398 | mcr p15, 0, r0, c7, c0, 0 @ invalidate whole cache v3 | 403 | mcr p15, 0, r0, c7, c0, 0 @ invalidate whole cache v3 |
404 | /* | ||
405 | * ?? ARMv3 MMU does not allow reading the control register, | ||
406 | * does this really work on ARMv3 MPU? | ||
407 | */ | ||
399 | mrc p15, 0, r0, c1, c0, 0 @ read control reg | 408 | mrc p15, 0, r0, c1, c0, 0 @ read control reg |
400 | @ .... .... .... WC.M | 409 | @ .... .... .... WC.M |
401 | orr r0, r0, #0x000d @ .... .... .... 11.1 | 410 | orr r0, r0, #0x000d @ .... .... .... 11.1 |
411 | /* ?? this overwrites the value constructed above? */ | ||
402 | mov r0, #0 | 412 | mov r0, #0 |
403 | mcr p15, 0, r0, c1, c0, 0 @ write control reg | 413 | mcr p15, 0, r0, c1, c0, 0 @ write control reg |
404 | 414 | ||
415 | /* ?? invalidate for the second time? */ | ||
405 | mcr p15, 0, r0, c7, c0, 0 @ invalidate whole cache v3 | 416 | mcr p15, 0, r0, c7, c0, 0 @ invalidate whole cache v3 |
406 | mov pc, lr | 417 | mov pc, lr |
407 | 418 | ||
@@ -771,8 +782,10 @@ proc_types: | |||
771 | * Turn off the Cache and MMU. ARMv3 does not support | 782 | * Turn off the Cache and MMU. ARMv3 does not support |
772 | * reading the control register, but ARMv4 does. | 783 | * reading the control register, but ARMv4 does. |
773 | * | 784 | * |
774 | * On exit, r0, r1, r2, r3, r9, r12 corrupted | 785 | * On exit, |
775 | * This routine must preserve: r4, r6, r7 | 786 | * r0, r1, r2, r3, r9, r12 corrupted |
787 | * This routine must preserve: | ||
788 | * r4, r6, r7 | ||
776 | */ | 789 | */ |
777 | .align 5 | 790 | .align 5 |
778 | cache_off: mov r3, #12 @ cache_off function | 791 | cache_off: mov r3, #12 @ cache_off function |
@@ -845,7 +858,7 @@ __armv3_mmu_cache_off: | |||
845 | * Clean and flush the cache to maintain consistency. | 858 | * Clean and flush the cache to maintain consistency. |
846 | * | 859 | * |
847 | * On exit, | 860 | * On exit, |
848 | * r1, r2, r3, r9, r11, r12 corrupted | 861 | * r1, r2, r3, r9, r10, r11, r12 corrupted |
849 | * This routine must preserve: | 862 | * This routine must preserve: |
850 | * r0, r4, r5, r6, r7 | 863 | * r0, r4, r5, r6, r7 |
851 | */ | 864 | */ |
@@ -988,7 +1001,7 @@ no_cache_id: | |||
988 | __armv3_mmu_cache_flush: | 1001 | __armv3_mmu_cache_flush: |
989 | __armv3_mpu_cache_flush: | 1002 | __armv3_mpu_cache_flush: |
990 | mov r1, #0 | 1003 | mov r1, #0 |
991 | mcr p15, 0, r0, c7, c0, 0 @ invalidate whole cache v3 | 1004 | mcr p15, 0, r1, c7, c0, 0 @ invalidate whole cache v3 |
992 | mov pc, lr | 1005 | mov pc, lr |
993 | 1006 | ||
994 | /* | 1007 | /* |
@@ -1001,6 +1014,7 @@ __armv3_mpu_cache_flush: | |||
1001 | phexbuf: .space 12 | 1014 | phexbuf: .space 12 |
1002 | .size phexbuf, . - phexbuf | 1015 | .size phexbuf, . - phexbuf |
1003 | 1016 | ||
1017 | @ phex corrupts {r0, r1, r2, r3} | ||
1004 | phex: adr r3, phexbuf | 1018 | phex: adr r3, phexbuf |
1005 | mov r2, #0 | 1019 | mov r2, #0 |
1006 | strb r2, [r3, r1] | 1020 | strb r2, [r3, r1] |
@@ -1015,6 +1029,7 @@ phex: adr r3, phexbuf | |||
1015 | strb r2, [r3, r1] | 1029 | strb r2, [r3, r1] |
1016 | b 1b | 1030 | b 1b |
1017 | 1031 | ||
1032 | @ puts corrupts {r0, r1, r2, r3} | ||
1018 | puts: loadsp r3, r1 | 1033 | puts: loadsp r3, r1 |
1019 | 1: ldrb r2, [r0], #1 | 1034 | 1: ldrb r2, [r0], #1 |
1020 | teq r2, #0 | 1035 | teq r2, #0 |
@@ -1029,12 +1044,14 @@ puts: loadsp r3, r1 | |||
1029 | teq r0, #0 | 1044 | teq r0, #0 |
1030 | bne 1b | 1045 | bne 1b |
1031 | mov pc, lr | 1046 | mov pc, lr |
1047 | @ putc corrupts {r0, r1, r2, r3} | ||
1032 | putc: | 1048 | putc: |
1033 | mov r2, r0 | 1049 | mov r2, r0 |
1034 | mov r0, #0 | 1050 | mov r0, #0 |
1035 | loadsp r3, r1 | 1051 | loadsp r3, r1 |
1036 | b 2b | 1052 | b 2b |
1037 | 1053 | ||
1054 | @ memdump corrupts {r0, r1, r2, r3, r10, r11, r12, lr} | ||
1038 | memdump: mov r12, r0 | 1055 | memdump: mov r12, r0 |
1039 | mov r10, lr | 1056 | mov r10, lr |
1040 | mov r11, #0 | 1057 | mov r11, #0 |
@@ -1070,3 +1087,4 @@ reloc_end: | |||
1070 | .align | 1087 | .align |
1071 | .section ".stack", "w" | 1088 | .section ".stack", "w" |
1072 | user_stack: .space 4096 | 1089 | user_stack: .space 4096 |
1090 | user_stack_end: | ||