Commit 895bc3a1 authored by Ard Biesheuvel's avatar Ard Biesheuvel
Browse files

efi: libstub: Factor out min alignment and preferred kernel load address



Factor out the expressions that describe the preferred placement of the
loaded image as well as the minimum alignment so we can reuse them in
the decompressor.

Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
parent 1f1ba325
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -84,6 +84,21 @@ static inline unsigned long efi_get_max_initrd_addr(unsigned long image_addr)
	return (image_addr & ~(SZ_1G - 1UL)) + (1UL << (VA_BITS_MIN - 1));
}

static inline unsigned long efi_get_kimg_min_align(void)
{
	extern bool efi_nokaslr;

	/*
	 * Although relocatable kernels can fix up the misalignment with
	 * respect to MIN_KIMG_ALIGN, the resulting virtual text addresses are
	 * subtly out of sync with those recorded in the vmlinux when kaslr is
	 * disabled but the image required relocation anyway. Therefore retain
	 * 2M alignment if KASLR was explicitly disabled, even if it was not
	 * going to be activated to begin with.
	 */
	return efi_nokaslr ? MIN_KIMG_ALIGN : EFI_KIMG_ALIGN;
}

#define EFI_ALLOC_ALIGN		SZ_64K

/*
+7 −0
Original line number Diff line number Diff line
@@ -24,4 +24,11 @@ static inline unsigned long efi_get_max_initrd_addr(unsigned long image_addr)
	return ULONG_MAX;
}

static inline unsigned long efi_get_kimg_min_align(void)
{
	return SZ_2M;
}

#define EFI_KIMG_PREFERRED_ADDRESS	PHYSADDR(VMLINUX_LOAD_ADDRESS)

#endif /* _ASM_LOONGARCH_EFI_H */
+11 −0
Original line number Diff line number Diff line
@@ -31,6 +31,17 @@ static inline unsigned long efi_get_max_initrd_addr(unsigned long image_addr)
	return ULONG_MAX;
}

static inline unsigned long efi_get_kimg_min_align(void)
{
	/*
	 * RISC-V requires the kernel image to placed 2 MB aligned base for 64
	 * bit and 4MB for 32 bit.
	 */
	return IS_ENABLED(CONFIG_64BIT) ? SZ_2M : SZ_4M;
}

#define EFI_KIMG_PREFERRED_ADDRESS	efi_get_kimg_min_align()

void efi_virtmap_load(void);
void efi_virtmap_unload(void);

+1 −10
Original line number Diff line number Diff line
@@ -88,16 +88,7 @@ efi_status_t handle_kernel_image(unsigned long *image_addr,
	efi_status_t status;
	unsigned long kernel_size, kernel_memsize = 0;
	u32 phys_seed = 0;

	/*
	 * Although relocatable kernels can fix up the misalignment with
	 * respect to MIN_KIMG_ALIGN, the resulting virtual text addresses are
	 * subtly out of sync with those recorded in the vmlinux when kaslr is
	 * disabled but the image required relocation anyway. Therefore retain
	 * 2M alignment if KASLR was explicitly disabled, even if it was not
	 * going to be activated to begin with.
	 */
	u64 min_kimg_align = efi_nokaslr ? MIN_KIMG_ALIGN : EFI_KIMG_ALIGN;
	u64 min_kimg_align = efi_get_kimg_min_align();

	if (IS_ENABLED(CONFIG_RANDOMIZE_BASE)) {
		efi_guid_t li_fixed_proto = LINUX_EFI_LOADED_IMAGE_FIXED_GUID;
+2 −1
Original line number Diff line number Diff line
@@ -35,7 +35,8 @@ efi_status_t handle_kernel_image(unsigned long *image_addr,
	kernel_addr = (unsigned long)&kernel_offset - kernel_offset;

	status = efi_relocate_kernel(&kernel_addr, kernel_fsize, kernel_asize,
				     PHYSADDR(VMLINUX_LOAD_ADDRESS), SZ_2M, 0x0);
				     EFI_KIMG_PREFERRED_ADDRESS,
				     efi_get_kimg_min_align(), 0x0);

	*image_addr = kernel_addr;
	*image_size = kernel_asize;
Loading