On Mon, Apr 13, 2020 at 8:55 AM Ard Biesheuvel <ardb@xxxxxxxxxx> wrote: > > On arm64, the kernel image used to be virtually mapped via the linear > region, making the two mappings correlated in a way that required the > kernel to be located at the start of the linear region, or the memory > below would not be accessible. For this reason, the EFI stub loader > code for arm64 has the notion of a 'preferred offset' for the physical > placement of the kernel image, and tries to put the kernel there, or > at least as low as possible in physical memory (unless KASLR is active, > in which case the placement is randomized) > > When KASLR was introduced, the virtual mapping of the kernel was moved > into the vmalloc region, and now, regardless of whether KASLR support > is built in or active, the kernel can be placed anywhere in physical > memory without any detrimental side effects on the linear region. > > This means that we can drop the notion of 'preferred offset' entirely, > and invoke the kernel in place if the PE/COFF loader loaded it at the > right offset. If not, we can invoke the ordinary UEFI top down page > allocator to reallocate it elsewhere in memory. By updating the PE/COFF > metadata, we can inform the PE/COFF loader about the desired alignment, > making it less likely that we need to move the kernel image in the first > place. > > Ard Biesheuvel (8): > efi/libstub/random: align allocate size to EFI_ALLOC_ALIGN > efi/libstub/random: increase random alloc granularity > efi/libstub/arm64: replace 'preferred' offset with alignment check > efi/libstub/arm64: simplify randomized loading of kernel image > efi/libstub/arm64: align PE/COFF sections to segment alignment > efi/libstub: add API function to allocate aligned memory > efi/libstub/arm64: switch to ordinary page allocator for kernel image > efi/libstub: move efi_relocate_kernel() into separate source file > > arch/arm64/kernel/efi-header.S | 2 +- > arch/arm64/kernel/vmlinux.lds.S | 3 +- > drivers/firmware/efi/libstub/Makefile | 3 +- > drivers/firmware/efi/libstub/alignedmem.c | 57 ++++++ > drivers/firmware/efi/libstub/arm64-stub.c | 92 +++------- > drivers/firmware/efi/libstub/efistub.h | 18 +- > drivers/firmware/efi/libstub/mem.c | 191 +------------------- > drivers/firmware/efi/libstub/randomalloc.c | 6 +- > drivers/firmware/efi/libstub/relocate.c | 174 ++++++++++++++++++ > 9 files changed, 280 insertions(+), 266 deletions(-) > create mode 100644 drivers/firmware/efi/libstub/alignedmem.c > create mode 100644 drivers/firmware/efi/libstub/relocate.c > > -- > 2.17.1 > Oops. I just noticed this series after I sent out a v2. I see that efi_low_alloc is removed now and the handle_kernel_image is simplified for arm64. I will update the risc-v uefi series accordingly. Sorry for the noise. -- Regards, Atish