commit 76a91aaad86bff5366f2934168df1f28db68d895 Author: Kyle Evans Date: Sun Apr 3 15:48:38 2022 -0500 cmd: bootefi: restore ability to boot arbitrary blob Up until 5f59518a7b1ae ("efi_loader: setting boot device"), we could boot an arbitrary blob with bootefi. Indeed, efi_run_image() even has a special case for missing device paths indicating a payload that was directly loaded via JTAG, for example. Restore the ability to inject a UEFI payload into memory and `bootefi` it. If the address passed isn't the last PE-COFF loaded, then we'll wipe out the pre-existing DP/Image information and let efi_run_image() synthesize a memory device path. An image size is required if we're booting an arbitrary payload, and the FDT argument has been changed to accept `-`. Signed-off-by: Kyle Evans diff --git a/cmd/bootefi.c b/cmd/bootefi.c index 53d9f0e0dc..eeed0ae460 100644 --- a/cmd/bootefi.c +++ b/cmd/bootefi.c @@ -425,7 +425,7 @@ static int do_efibootmgr(void) * @image_opt: string of image start address * Return: status code */ -static int do_bootefi_image(const char *image_opt) +static int do_bootefi_image(const char *image_opt, const char *size_opt) { void *image_buf; unsigned long addr, size; @@ -444,13 +444,29 @@ static int do_bootefi_image(const char *image_opt) if (!addr) return CMD_RET_USAGE; + size = 0; + if (size_opt != NULL) { + size = strtoul(size_opt, NULL, 16); + /* Check that a numeric value was passed */ + if (!size) + return CMD_RET_USAGE; + } + image_buf = map_sysmem(addr, 0); if (image_buf != image_addr) { - log_err("No UEFI binary known at %s\n", image_opt); - return CMD_RET_FAILURE; + /* Fake device path -- we must have a size. */ + + if (image_addr != NULL) + efi_clear_bootdev(); + + if (size == 0) + return CMD_RET_USAGE; + } else { + if (size != 0) + return CMD_RET_USAGE; + size = image_size; } - size = image_size; } ret = efi_run_image(image_buf, size); @@ -654,7 +670,7 @@ static int do_bootefi(struct cmd_tbl *cmdtp, int flag, int argc, return CMD_RET_FAILURE; } - if (argc > 2) { + if (argc > 2 && strcmp(argv[2], "-") != 0) { uintptr_t fdt_addr; fdt_addr = hextoul(argv[2], NULL); @@ -677,15 +693,17 @@ static int do_bootefi(struct cmd_tbl *cmdtp, int flag, int argc, return do_efi_selftest(); #endif - return do_bootefi_image(argv[1]); + return do_bootefi_image(argv[1], argc > 3 ? argv[3] : NULL); } #ifdef CONFIG_SYS_LONGHELP static char bootefi_help_text[] = - " [fdt address]\n" + " [fdt address [image size]]\n" " - boot EFI payload stored at address .\n" " If specified, the device tree located at gets\n" " exposed as EFI configuration table.\n" + " The image size is required if this is not a preloaded image, but\n" + " it must be omitted if the image was preloaded.\n" #ifdef CONFIG_CMD_BOOTEFI_HELLO "bootefi hello\n" " - boot a sample Hello World application stored within U-Boot\n" @@ -707,7 +725,7 @@ static char bootefi_help_text[] = #endif U_BOOT_CMD( - bootefi, 3, 0, do_bootefi, + bootefi, 4, 0, do_bootefi, "Boots an EFI payload from memory", bootefi_help_text );