ARM: decompressor: defer loading of the contents of the LC0 structure
authorArd Biesheuvel <ardb@kernel.org>
Mon, 13 Apr 2020 16:21:33 +0000 (18:21 +0200)
committerArd Biesheuvel <ardb@kernel.org>
Tue, 19 May 2020 16:23:22 +0000 (18:23 +0200)
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>
arch/arm/boot/compressed/head.S

index 5d712e2c000111bf769692a45113cb6d544d1259..ce442ec5028a0f56fa67fb0e54a4d5bbef0c2944 100644 (file)
@@ -299,10 +299,6 @@ restart:   adr     r0, LC1
                add     sp, sp, 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
 
 #ifndef CONFIG_ZBOOT_ROM
@@ -320,9 +316,6 @@ restart:    adr     r0, LC1
                mov     r5, #0                  @ init dtb size to 0
 #ifdef CONFIG_ARM_APPENDED_DTB
 /*
- *   r0  = delta
- *   r2  = BSS start
- *   r3  = BSS end
  *   r4  = final kernel address (possibly with LSB set)
  *   r5  = appended dtb size (still unknown)
  *   r6  = _edata
@@ -330,8 +323,6 @@ restart:    adr     r0, LC1
  *   r8  = atags/device tree pointer
  *   r9  = size of decompressed image
  *   r10 = end of this image, including  bss/stack/malloc space if non XIP
- *   r11 = GOT start
- *   r12 = GOT end
  *   sp  = stack pointer
  *
  * 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 */
                add     sp, sp, r5
 
-               stmfd   sp!, {r0-r3, ip, lr}
                mov     r0, r8
                mov     r1, r6
                mov     r2, r5
@@ -398,7 +388,6 @@ restart:    adr     r0, LC1
                mov     r2, r5
                bleq    atags_to_fdt
 
-               ldmfd   sp!, {r0-r3, ip, lr}
                sub     sp, sp, r5
 #endif
 
@@ -535,6 +524,10 @@ dtb_check_done:
                mov     pc, r0
 
 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.
  *   r0  = delta