Skip to content

Commit

Permalink
efi/libstub: consolidate initrd handling across architectures
Browse files Browse the repository at this point in the history
Before adding TPM measurement of the initrd contents, refactor the
initrd handling slightly to be more self-contained and consistent.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
Link: https://lore.kernel.org/r/20211119114745.1560453-4-ilias.apalodimas@linaro.org
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
  • Loading branch information
Ard Biesheuvel committed Nov 21, 2021
1 parent 44f155b commit 20287d5
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 29 deletions.
13 changes: 9 additions & 4 deletions drivers/firmware/efi/libstub/efi-stub-helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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) {
Expand All @@ -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;
}

Expand Down
10 changes: 2 additions & 8 deletions drivers/firmware/efi/libstub/efi-stub.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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();

Expand Down
1 change: 0 additions & 1 deletion drivers/firmware/efi/libstub/efistub.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@

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

Expand Down
26 changes: 10 additions & 16 deletions drivers/firmware/efi/libstub/x86-stub.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
* 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");
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);
}
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);
}

/*
Expand Down

0 comments on commit 20287d5

Please sign in to comment.