ARM: decompressor: run decompressor in place if loaded via UEFI

The decompressor can load from anywhere in memory, and the only reason
the EFI stub code relocates it is to ensure it appears within the first
128 MiB of memory, so that the uncompressed kernel ends up at the right
offset in memory.

We can short circuit this, and simply jump into the decompressor startup
code at the point where it knows where the base of memory lives. This
also means there is no need to disable the MMU and caches, create new
page tables and re-enable them.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Reviewed-by: Nicolas Pitre <nico@fluxnic.net>
This commit is contained in:
Ard Biesheuvel
2020-04-13 18:21:35 +02:00
parent 35d57d1215
commit d0f9ca9be1
2 changed files with 21 additions and 65 deletions

View File

@@ -1430,37 +1430,26 @@ reloc_code_end:
#ifdef CONFIG_EFI_STUB
ENTRY(efi_enter_kernel)
mov r7, r0 @ preserve image base
mov r4, r1 @ preserve DT pointer
mov r4, r0 @ preserve image base
mov r8, r1 @ preserve DT pointer
mov r0, r4 @ DT start
add r1, r4, r2 @ DT end
mrc p15, 0, r0, c1, c0, 0 @ read SCTLR
tst r0, #0x1 @ MMU enabled?
orreq r4, r4, #1 @ set LSB if not
mov r0, r8 @ DT start
add r1, r8, r2 @ DT end
bl cache_clean_flush
mov r0, r7 @ relocated zImage
ldr r1, =_edata @ size of zImage
add r1, r1, r0 @ end of zImage
bl cache_clean_flush
adr r0, 0f @ switch to our stack
ldr sp, [r0]
add sp, sp, r0
@ The PE/COFF loader might not have cleaned the code we are
@ running beyond the PoU, and so calling cache_off below from
@ inside the PE/COFF loader allocated region is unsafe unless
@ we explicitly clean it to the PoC.
adr r0, call_cache_fn @ region of code we will
adr r1, 0f @ run with MMU off
bl cache_clean_flush
bl cache_off
@ Set parameters for booting zImage according to boot protocol
@ put FDT address in r2, it was returned by efi_entry()
@ r1 is the machine type, and r0 needs to be 0
mov r0, #0
mov r1, #0xFFFFFFFF
mov r2, r4
add r7, r7, #(__efi_start - start)
mov pc, r7 @ no mode switch
mov r5, #0 @ appended DTB size
mov r7, #0xFFFFFFFF @ machine ID
b wont_overwrite
ENDPROC(efi_enter_kernel)
0:
0: .long .L_user_stack_end - .
#endif
.align