Commit 20287d56 authored by Ard Biesheuvel's avatar Ard Biesheuvel
Browse files

efi/libstub: consolidate initrd handling across architectures



Before adding TPM measurement of the initrd contents, refactor the
initrd handling slightly to be more self-contained and consistent.

Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
Signed-off-by: default avatarIlias Apalodimas <ilias.apalodimas@linaro.org>
Link: https://lore.kernel.org/r/20211119114745.1560453-4-ilias.apalodimas@linaro.org


Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
parent 44f155b4
Loading
Loading
Loading
Loading
+9 −4
Original line number Diff line number Diff line
@@ -20,10 +20,10 @@

bool efi_nochunk;
bool efi_nokaslr = !IS_ENABLED(CONFIG_RANDOMIZE_BASE);
bool efi_noinitrd;
int efi_loglevel = CONSOLE_LOGLEVEL_DEFAULT;
bool efi_novamap;

static bool efi_noinitrd;
static bool efi_nosoftreserve;
static bool efi_disable_pci_dma = IS_ENABLED(CONFIG_EFI_DISABLE_PCI_DMA);

@@ -643,8 +643,10 @@ efi_status_t efi_load_initrd(efi_loaded_image_t *image,
{
	efi_status_t status;

	if (!load_addr || !load_size)
		return EFI_INVALID_PARAMETER;
	if (efi_noinitrd) {
		*load_addr = *load_size = 0;
		return EFI_SUCCESS;
	}

	status = efi_load_initrd_dev_path(load_addr, load_size, hard_limit);
	if (status == EFI_SUCCESS) {
@@ -655,7 +657,10 @@ efi_status_t efi_load_initrd(efi_loaded_image_t *image,
		if (status == EFI_SUCCESS && *load_size > 0)
			efi_info("Loaded initrd from command line option\n");
	}

	if (status != EFI_SUCCESS) {
		efi_err("Failed to load initrd: 0x%lx\n", status);
		*load_addr = *load_size = 0;
	}
	return status;
}

+2 −8
Original line number Diff line number Diff line
@@ -134,7 +134,6 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,
	enum efi_secureboot_mode secure_boot;
	struct screen_info *si;
	efi_properties_table_t *prop_tbl;
	unsigned long max_addr;

	efi_system_table = sys_table_arg;

@@ -240,13 +239,8 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,
	if (!fdt_addr)
		efi_info("Generating empty DTB\n");

	if (!efi_noinitrd) {
		max_addr = efi_get_max_initrd_addr(image_addr);
		status = efi_load_initrd(image, &initrd_addr, &initrd_size,
					 ULONG_MAX, max_addr);
		if (status != EFI_SUCCESS)
			efi_err("Failed to load initrd!\n");
	}
	efi_load_initrd(image, &initrd_addr, &initrd_size, ULONG_MAX,
			efi_get_max_initrd_addr(image_addr));

	efi_random_get_seed();

+0 −1
Original line number Diff line number Diff line
@@ -31,7 +31,6 @@

extern bool efi_nochunk;
extern bool efi_nokaslr;
extern bool efi_noinitrd;
extern int efi_loglevel;
extern bool efi_novamap;

+10 −16
Original line number Diff line number Diff line
@@ -673,6 +673,7 @@ unsigned long efi_main(efi_handle_t handle,
	unsigned long bzimage_addr = (unsigned long)startup_32;
	unsigned long buffer_start, buffer_end;
	struct setup_header *hdr = &boot_params->hdr;
	unsigned long addr, size;
	efi_status_t status;

	efi_system_table = sys_table_arg;
@@ -761,23 +762,16 @@ unsigned long efi_main(efi_handle_t handle,
	 * arguments will be processed only if image is not NULL, which will be
	 * the case only if we were loaded via the PE entry point.
	 */
	if (!efi_noinitrd) {
		unsigned long addr, size;

		status = efi_load_initrd(image, &addr, &size,
					 hdr->initrd_addr_max, ULONG_MAX);

		if (status != EFI_SUCCESS) {
			efi_err("Failed to load initrd!\n");
	status = efi_load_initrd(image, &addr, &size, hdr->initrd_addr_max,
				 ULONG_MAX);
	if (status != EFI_SUCCESS)
		goto fail;
		}
	if (size > 0) {
		efi_set_u64_split(addr, &hdr->ramdisk_image,
				  &boot_params->ext_ramdisk_image);
		efi_set_u64_split(size, &hdr->ramdisk_size,
				  &boot_params->ext_ramdisk_size);
	}
	}

	/*
	 * If the boot loader gave us a value for secure_boot then we use that,