Commit 362607df authored by Russell King's avatar Russell King

Merge first four commits of 'zImage_fixes' of git://git.linaro.org/people/nico/linux into fixes

parents 52fe1163 ea9df3b1
...@@ -74,7 +74,7 @@ ZTEXTADDR := $(CONFIG_ZBOOT_ROM_TEXT) ...@@ -74,7 +74,7 @@ ZTEXTADDR := $(CONFIG_ZBOOT_ROM_TEXT)
ZBSSADDR := $(CONFIG_ZBOOT_ROM_BSS) ZBSSADDR := $(CONFIG_ZBOOT_ROM_BSS)
else else
ZTEXTADDR := 0 ZTEXTADDR := 0
ZBSSADDR := ALIGN(4) ZBSSADDR := ALIGN(8)
endif endif
SEDFLAGS = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/ SEDFLAGS = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/
......
...@@ -179,15 +179,14 @@ not_angel: ...@@ -179,15 +179,14 @@ not_angel:
bl cache_on bl cache_on
restart: adr r0, LC0 restart: adr r0, LC0
ldmia r0, {r1, r2, r3, r5, r6, r9, r11, r12} ldmia r0, {r1, r2, r3, r6, r9, r11, r12}
ldr sp, [r0, #32] ldr sp, [r0, #28]
/* /*
* We might be running at a different address. We need * We might be running at a different address. We need
* to fix up various pointers. * to fix up various pointers.
*/ */
sub r0, r0, r1 @ calculate the delta offset sub r0, r0, r1 @ calculate the delta offset
add r5, r5, r0 @ _start
add r6, r6, r0 @ _edata add r6, r6, r0 @ _edata
#ifndef CONFIG_ZBOOT_ROM #ifndef CONFIG_ZBOOT_ROM
...@@ -206,31 +205,40 @@ restart: adr r0, LC0 ...@@ -206,31 +205,40 @@ restart: adr r0, LC0
/* /*
* Check to see if we will overwrite ourselves. * Check to see if we will overwrite ourselves.
* r4 = final kernel address * r4 = final kernel address
* r5 = start of this image
* r9 = size of decompressed image * r9 = size of decompressed image
* r10 = end of this image, including bss/stack/malloc space if non XIP * r10 = end of this image, including bss/stack/malloc space if non XIP
* We basically want: * We basically want:
* r4 >= r10 -> OK * r4 - 16k page directory >= r10 -> OK
* r4 + image length <= r5 -> OK * r4 + image length <= current position (pc) -> OK
*/ */
add r10, r10, #16384
cmp r4, r10 cmp r4, r10
bhs wont_overwrite bhs wont_overwrite
add r10, r4, r9 add r10, r4, r9
cmp r10, r5 ARM( cmp r10, pc )
THUMB( mov lr, pc )
THUMB( cmp r10, lr )
bls wont_overwrite bls wont_overwrite
/* /*
* Relocate ourselves past the end of the decompressed kernel. * Relocate ourselves past the end of the decompressed kernel.
* r5 = start of this image
* r6 = _edata * r6 = _edata
* r10 = end of the decompressed kernel * r10 = end of the decompressed kernel
* Because we always copy ahead, we need to do it from the end and go * Because we always copy ahead, we need to do it from the end and go
* backward in case the source and destination overlap. * backward in case the source and destination overlap.
*/ */
/* Round up to next 256-byte boundary. */ /*
add r10, r10, #256 * Bump to the next 256-byte boundary with the size of
* the relocation code added. This avoids overwriting
* ourself when the offset is small.
*/
add r10, r10, #((reloc_code_end - restart + 256) & ~255)
bic r10, r10, #255 bic r10, r10, #255
/* Get start of code we want to copy and align it down. */
adr r5, restart
bic r5, r5, #31
sub r9, r6, r5 @ size to copy sub r9, r6, r5 @ size to copy
add r9, r9, #31 @ rounded up to a multiple add r9, r9, #31 @ rounded up to a multiple
bic r9, r9, #31 @ ... of 32 bytes bic r9, r9, #31 @ ... of 32 bytes
...@@ -245,6 +253,11 @@ restart: adr r0, LC0 ...@@ -245,6 +253,11 @@ restart: adr r0, LC0
/* Preserve offset to relocated code. */ /* Preserve offset to relocated code. */
sub r6, r9, r6 sub r6, r9, r6
#ifndef CONFIG_ZBOOT_ROM
/* cache_clean_flush may use the stack, so relocate it */
add sp, sp, r6
#endif
bl cache_clean_flush bl cache_clean_flush
adr r0, BSYM(restart) adr r0, BSYM(restart)
...@@ -333,7 +346,6 @@ not_relocated: mov r0, #0 ...@@ -333,7 +346,6 @@ not_relocated: mov r0, #0
LC0: .word LC0 @ r1 LC0: .word LC0 @ r1
.word __bss_start @ r2 .word __bss_start @ r2
.word _end @ r3 .word _end @ r3
.word _start @ r5
.word _edata @ r6 .word _edata @ r6
.word _image_size @ r9 .word _image_size @ r9
.word _got_start @ r11 .word _got_start @ r11
...@@ -1062,6 +1074,7 @@ memdump: mov r12, r0 ...@@ -1062,6 +1074,7 @@ memdump: mov r12, r0
#endif #endif
.ltorg .ltorg
reloc_code_end:
.align .align
.section ".stack", "aw", %nobits .section ".stack", "aw", %nobits
......
...@@ -54,6 +54,7 @@ SECTIONS ...@@ -54,6 +54,7 @@ SECTIONS
.bss : { *(.bss) } .bss : { *(.bss) }
_end = .; _end = .;
. = ALIGN(8); /* the stack must be 64-bit aligned */
.stack : { *(.stack) } .stack : { *(.stack) }
.stab 0 : { *(.stab) } .stab 0 : { *(.stab) }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment