Merge first four commits of 'zImage_fixes' of git://git.linaro.org/people/nico/linux into fixes
This commit is contained in:
@@ -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:
|
|||||||
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
|
|||||||
/*
|
/*
|
||||||
* 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
|
|||||||
/* 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
|
|||||||
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
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
.ltorg
|
.ltorg
|
||||||
|
reloc_code_end:
|
||||||
|
|
||||||
.align
|
.align
|
||||||
.section ".stack", "aw", %nobits
|
.section ".stack", "aw", %nobits
|
||||||
|
@@ -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) }
|
||||||
|
Reference in New Issue
Block a user