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: | ||
