mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Ard Biesheuvel <ardb@kernel.org>
To: linux-efi@vger.kernel.org, Ingo Molnar <mingo@kernel.org>,
	Thomas Gleixner <tglx@linutronix.de>
Cc: Ard Biesheuvel <ardb@kernel.org>,
	linux-kernel@vger.kernel.org, Arnd Bergmann <arnd@arndb.de>,
	Arvind Sankar <nivedita@alum.mit.edu>,
	Guenter Roeck <linux@roeck-us.net>, Joe Perches <joe@perches.com>
Subject: [PATCH 08/15] efi/x86: Move command-line initrd loading to efi_main
Date: Fri,  8 May 2020 20:01:50 +0200	[thread overview]
Message-ID: <20200508180157.1816-9-ardb@kernel.org> (raw)
In-Reply-To: <20200508180157.1816-1-ardb@kernel.org>

From: Arvind Sankar <nivedita@alum.mit.edu>

Consolidate the initrd loading in efi_main.

The command line options now need to be parsed only once.

Signed-off-by: Arvind Sankar <nivedita@alum.mit.edu>
Link: https://lore.kernel.org/r/20200430182843.2510180-9-nivedita@alum.mit.edu
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
---
 drivers/firmware/efi/libstub/x86-stub.c | 64 ++++++++++---------------
 1 file changed, 25 insertions(+), 39 deletions(-)

diff --git a/drivers/firmware/efi/libstub/x86-stub.c b/drivers/firmware/efi/libstub/x86-stub.c
index 3800eb22232e..defeb6035109 100644
--- a/drivers/firmware/efi/libstub/x86-stub.c
+++ b/drivers/firmware/efi/libstub/x86-stub.c
@@ -22,6 +22,7 @@
 
 const efi_system_table_t *efi_system_table;
 extern u32 image_offset;
+static efi_loaded_image_t *image = NULL;
 
 static efi_status_t
 preserve_pci_rom_image(efi_pci_io_protocol_t *pci, struct pci_setup_rom **__rom)
@@ -355,7 +356,6 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,
 {
 	struct boot_params *boot_params;
 	struct setup_header *hdr;
-	efi_loaded_image_t *image;
 	void *image_base;
 	efi_guid_t proto = LOADED_IMAGE_PROTOCOL_GUID;
 	int options_size = 0;
@@ -414,30 +414,9 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,
 	hdr->ramdisk_image = 0;
 	hdr->ramdisk_size = 0;
 
-	if (efi_is_native()) {
-		status = efi_parse_options(cmdline_ptr);
-		if (status != EFI_SUCCESS)
-			goto fail2;
-
-		if (!efi_noinitrd) {
-			status = efi_load_initrd(image, &ramdisk_addr,
-						 &ramdisk_size,
-						 hdr->initrd_addr_max,
-						 ULONG_MAX);
-			if (status != EFI_SUCCESS)
-				goto fail2;
-			efi_set_u64_split(ramdisk_addr, &hdr->ramdisk_image,
-					  &boot_params->ext_ramdisk_image);
-			efi_set_u64_split(ramdisk_size, &hdr->ramdisk_size,
-					  &boot_params->ext_ramdisk_size);
-		}
-	}
-
 	efi_stub_entry(handle, sys_table_arg, boot_params);
 	/* not reached */
 
-fail2:
-	efi_free(options_size, (unsigned long)cmdline_ptr);
 fail:
 	efi_free(sizeof(struct boot_params), (unsigned long)boot_params);
 
@@ -760,35 +739,42 @@ unsigned long efi_main(efi_handle_t handle,
 		image_offset = 0;
 	}
 
-	/*
-	 * efi_pe_entry() may have been called before efi_main(), in which
-	 * case this is the second time we parse the cmdline. This is ok,
-	 * parsing the cmdline multiple times does not have side-effects.
-	 */
 	cmdline_paddr = ((u64)hdr->cmd_line_ptr |
 			 ((u64)boot_params->ext_cmd_line_ptr << 32));
 	efi_parse_options((char *)cmdline_paddr);
 
 	/*
-	 * At this point, an initrd may already have been loaded, either by
-	 * the bootloader and passed via bootparams, or loaded from a initrd=
-	 * command line option by efi_pe_entry() above. In either case, we
-	 * permit an initrd loaded from the LINUX_EFI_INITRD_MEDIA_GUID device
-	 * path to supersede it.
+	 * At this point, an initrd may already have been loaded by the
+	 * bootloader and passed via bootparams. We permit an initrd loaded
+	 * from the LINUX_EFI_INITRD_MEDIA_GUID device path to supersede it.
+	 *
+	 * If the device path is not present, any command-line initrd=
+	 * 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_dev_path(&addr, &size, ULONG_MAX);
-		if (status == EFI_SUCCESS) {
-			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);
-		} else if (status != EFI_NOT_FOUND) {
-			efi_err("efi_load_initrd_dev_path() failed!\n");
+		if (status == EFI_NOT_FOUND) {
+			if (efi_is_native() && image != NULL) {
+				status = efi_load_initrd(image, &addr, &size,
+							 hdr->initrd_addr_max,
+							 ULONG_MAX);
+			} else {
+				addr = size = 0;
+				status = EFI_SUCCESS;
+			}
+		}
+
+		if (status != EFI_SUCCESS) {
+			efi_err("Failed to load initrd!\n");
 			goto fail;
 		}
+		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);
 	}
 
 	/*
-- 
2.17.1


  parent reply	other threads:[~2020-05-08 18:02 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-08 18:01 [GIT PULL 00/15] More EFI changes for v5.8 Ard Biesheuvel
2020-05-08 18:01 ` [PATCH 01/15] efi/x86: Use correct size for boot_params Ard Biesheuvel
2020-05-08 18:01 ` [PATCH 02/15] efi/libstub: Add a helper function to split 64-bit values Ard Biesheuvel
2020-05-08 18:01 ` [PATCH 03/15] efi/libstub: Move pr_efi/pr_efi_err into efi namespace Ard Biesheuvel
2020-05-08 18:01 ` [PATCH 04/15] efi/x86: Use efi_err for error messages Ard Biesheuvel
2020-05-08 18:01 ` [PATCH 05/15] efi/gop: " Ard Biesheuvel
2020-05-08 18:01 ` [PATCH 06/15] efi/tpm: " Ard Biesheuvel
2020-05-08 18:01 ` [PATCH 07/15] efi/libstub: Upgrade ignored dtb= argument message to error Ard Biesheuvel
2020-05-08 18:01 ` Ard Biesheuvel [this message]
2020-05-27 22:30   ` [PATCH 08/15] efi/x86: Move command-line initrd loading to efi_main Williams, Dan J
2020-05-27 22:46     ` Arvind Sankar
2020-05-27 22:56       ` Dan Williams
2020-05-27 23:02         ` Arvind Sankar
2020-05-27 23:13           ` Dan Williams
2020-05-27 23:26             ` [PATCH] efi/x86: Don't blow away existing initrd Arvind Sankar
2020-05-28  6:34               ` Ard Biesheuvel
2020-05-08 18:01 ` [PATCH 09/15] efi/libstub: Unify initrd loading across architectures Ard Biesheuvel
2020-05-08 18:01 ` [PATCH 10/15] efi/x86: Support builtin command line Ard Biesheuvel
2020-05-08 18:01 ` [PATCH 11/15] efi/libstub: Check return value of efi_parse_options Ard Biesheuvel
2020-05-08 18:01 ` [PATCH 12/15] efi/libstub: Fix mixed mode boot issue after macro refactor Ard Biesheuvel
2020-05-08 18:01 ` [PATCH 13/15] efi/libstub/x86: Work around LLVM ELF quirk build regression Ard Biesheuvel
2020-05-08 18:01 ` [PATCH 14/15] efi/libstub: Make efi_printk() input argument const char* Ard Biesheuvel
2020-05-08 18:01 ` [PATCH 15/15] efi/libstub: Correct comment typos Ard Biesheuvel
2020-05-14  9:05 ` [GIT PULL 00/15] More EFI changes for v5.8 Ard Biesheuvel
2020-05-20  7:20   ` Ard Biesheuvel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200508180157.1816-9-ardb@kernel.org \
    --to=ardb@kernel.org \
    --cc=arnd@arndb.de \
    --cc=joe@perches.com \
    --cc=linux-efi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@roeck-us.net \
    --cc=mingo@kernel.org \
    --cc=nivedita@alum.mit.edu \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome