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

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.orgSigned-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
parent 44f155b4
...@@ -20,10 +20,10 @@ ...@@ -20,10 +20,10 @@
bool efi_nochunk; bool efi_nochunk;
bool efi_nokaslr = !IS_ENABLED(CONFIG_RANDOMIZE_BASE); bool efi_nokaslr = !IS_ENABLED(CONFIG_RANDOMIZE_BASE);
bool efi_noinitrd;
int efi_loglevel = CONSOLE_LOGLEVEL_DEFAULT; int efi_loglevel = CONSOLE_LOGLEVEL_DEFAULT;
bool efi_novamap; bool efi_novamap;
static bool efi_noinitrd;
static bool efi_nosoftreserve; static bool efi_nosoftreserve;
static bool efi_disable_pci_dma = IS_ENABLED(CONFIG_EFI_DISABLE_PCI_DMA); 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, ...@@ -643,8 +643,10 @@ efi_status_t efi_load_initrd(efi_loaded_image_t *image,
{ {
efi_status_t status; efi_status_t status;
if (!load_addr || !load_size) if (efi_noinitrd) {
return EFI_INVALID_PARAMETER; *load_addr = *load_size = 0;
return EFI_SUCCESS;
}
status = efi_load_initrd_dev_path(load_addr, load_size, hard_limit); status = efi_load_initrd_dev_path(load_addr, load_size, hard_limit);
if (status == EFI_SUCCESS) { if (status == EFI_SUCCESS) {
...@@ -655,7 +657,10 @@ efi_status_t efi_load_initrd(efi_loaded_image_t *image, ...@@ -655,7 +657,10 @@ efi_status_t efi_load_initrd(efi_loaded_image_t *image,
if (status == EFI_SUCCESS && *load_size > 0) if (status == EFI_SUCCESS && *load_size > 0)
efi_info("Loaded initrd from command line option\n"); 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; return status;
} }
......
...@@ -134,7 +134,6 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle, ...@@ -134,7 +134,6 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,
enum efi_secureboot_mode secure_boot; enum efi_secureboot_mode secure_boot;
struct screen_info *si; struct screen_info *si;
efi_properties_table_t *prop_tbl; efi_properties_table_t *prop_tbl;
unsigned long max_addr;
efi_system_table = sys_table_arg; efi_system_table = sys_table_arg;
...@@ -240,13 +239,8 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle, ...@@ -240,13 +239,8 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,
if (!fdt_addr) if (!fdt_addr)
efi_info("Generating empty DTB\n"); efi_info("Generating empty DTB\n");
if (!efi_noinitrd) { efi_load_initrd(image, &initrd_addr, &initrd_size, ULONG_MAX,
max_addr = efi_get_max_initrd_addr(image_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_random_get_seed(); efi_random_get_seed();
......
...@@ -31,7 +31,6 @@ ...@@ -31,7 +31,6 @@
extern bool efi_nochunk; extern bool efi_nochunk;
extern bool efi_nokaslr; extern bool efi_nokaslr;
extern bool efi_noinitrd;
extern int efi_loglevel; extern int efi_loglevel;
extern bool efi_novamap; extern bool efi_novamap;
......
...@@ -673,6 +673,7 @@ unsigned long efi_main(efi_handle_t handle, ...@@ -673,6 +673,7 @@ unsigned long efi_main(efi_handle_t handle,
unsigned long bzimage_addr = (unsigned long)startup_32; unsigned long bzimage_addr = (unsigned long)startup_32;
unsigned long buffer_start, buffer_end; unsigned long buffer_start, buffer_end;
struct setup_header *hdr = &boot_params->hdr; struct setup_header *hdr = &boot_params->hdr;
unsigned long addr, size;
efi_status_t status; efi_status_t status;
efi_system_table = sys_table_arg; efi_system_table = sys_table_arg;
...@@ -761,22 +762,15 @@ unsigned long efi_main(efi_handle_t handle, ...@@ -761,22 +762,15 @@ unsigned long efi_main(efi_handle_t handle,
* arguments will be processed only if image is not NULL, which will be * 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. * the case only if we were loaded via the PE entry point.
*/ */
if (!efi_noinitrd) { status = efi_load_initrd(image, &addr, &size, hdr->initrd_addr_max,
unsigned long addr, size; ULONG_MAX);
if (status != EFI_SUCCESS)
status = efi_load_initrd(image, &addr, &size, goto fail;
hdr->initrd_addr_max, ULONG_MAX); if (size > 0) {
efi_set_u64_split(addr, &hdr->ramdisk_image,
if (status != EFI_SUCCESS) { &boot_params->ext_ramdisk_image);
efi_err("Failed to load initrd!\n"); efi_set_u64_split(size, &hdr->ramdisk_size,
goto fail; &boot_params->ext_ramdisk_size);
}
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);
}
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment