ARM: decompressor: defer loading of the contents of the LC0 structure

The remaining contents of LC0 are only used after the point in the
decompressor startup code where we enter via 'wont_overwrite'. So
move the loading of the LC0 structure after it. This will allow us
to jump to wont_overwrite directly from the EFI stub, and execute
the decompressor in place at the offset it was loaded by the UEFI
firmware.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Nicolas Pitre <nico@fluxnic.net>
This commit is contained in:
Ard Biesheuvel 2020-04-13 18:21:33 +02:00
parent 161e04a5ba
commit f1f012b033

View File

@ -299,10 +299,6 @@ restart: adr r0, LC1
add sp, sp, r0 add sp, sp, r0
add r6, r6, r0 add r6, r6, r0
adr r0, LC0
ldmia r0, {r1, r2, r3, r11, r12}
sub r0, r0, r1 @ calculate the delta offset
get_inflated_image_size r9, r10, lr get_inflated_image_size r9, r10, lr
#ifndef CONFIG_ZBOOT_ROM #ifndef CONFIG_ZBOOT_ROM
@ -320,9 +316,6 @@ restart: adr r0, LC1
mov r5, #0 @ init dtb size to 0 mov r5, #0 @ init dtb size to 0
#ifdef CONFIG_ARM_APPENDED_DTB #ifdef CONFIG_ARM_APPENDED_DTB
/* /*
* r0 = delta
* r2 = BSS start
* r3 = BSS end
* r4 = final kernel address (possibly with LSB set) * r4 = final kernel address (possibly with LSB set)
* r5 = appended dtb size (still unknown) * r5 = appended dtb size (still unknown)
* r6 = _edata * r6 = _edata
@ -330,8 +323,6 @@ restart: adr r0, LC1
* r8 = atags/device tree pointer * r8 = atags/device tree pointer
* 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
* r11 = GOT start
* r12 = GOT end
* sp = stack pointer * sp = stack pointer
* *
* if there are device trees (dtb) appended to zImage, advance r10 so that the * if there are device trees (dtb) appended to zImage, advance r10 so that the
@ -379,7 +370,6 @@ restart: adr r0, LC1
/* temporarily relocate the stack past the DTB work space */ /* temporarily relocate the stack past the DTB work space */
add sp, sp, r5 add sp, sp, r5
stmfd sp!, {r0-r3, ip, lr}
mov r0, r8 mov r0, r8
mov r1, r6 mov r1, r6
mov r2, r5 mov r2, r5
@ -398,7 +388,6 @@ restart: adr r0, LC1
mov r2, r5 mov r2, r5
bleq atags_to_fdt bleq atags_to_fdt
ldmfd sp!, {r0-r3, ip, lr}
sub sp, sp, r5 sub sp, sp, r5
#endif #endif
@ -535,6 +524,10 @@ dtb_check_done:
mov pc, r0 mov pc, r0
wont_overwrite: wont_overwrite:
adr r0, LC0
ldmia r0, {r1, r2, r3, r11, r12}
sub r0, r0, r1 @ calculate the delta offset
/* /*
* If delta is zero, we are running at the address we were linked at. * If delta is zero, we are running at the address we were linked at.
* r0 = delta * r0 = delta