efi/libstub: consolidate initrd handling across architectures
authorArd Biesheuvel <ardb@kernel.org>
Fri, 19 Nov 2021 11:47:44 +0000 (13:47 +0200)
committerArd Biesheuvel <ardb@kernel.org>
Sun, 21 Nov 2021 16:08:10 +0000 (17:08 +0100)
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>
drivers/firmware/efi/libstub/efi-stub-helper.c
drivers/firmware/efi/libstub/efi-stub.c
drivers/firmware/efi/libstub/efistub.h
drivers/firmware/efi/libstub/x86-stub.c

index d489bdc645fe1a824cf21c0245d497d635637aff..01677181453d4dc4d4f8b6d52a89630b24b70e39 100644 (file)
 
 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;
 }
 
index 26e69788f27a42dd1fcbceeeb8bab3085b59a526..e87e7f1b1a33a40d811b9ee00f71e9d0625e5afa 100644 (file)
@@ -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();
 
index a2825c43515805866cda774829b80896cf65abfc..edb77b0621ea3f5da7a2f2a0f2bd066c1925210d 100644 (file)
@@ -31,7 +31,6 @@
 
 extern bool efi_nochunk;
 extern bool efi_nokaslr;
-extern bool efi_noinitrd;
 extern int efi_loglevel;
 extern bool efi_novamap;
 
index f14c4ff5839f98bd748f8552942c6080cf3577dc..01ddd4502e28a116f553ffb5b3383e76def9fded 100644 (file)
@@ -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,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);
        }
 
        /*