
Support for booting from removable media is now added to UEFI boot manager. Here we should modify efidebug command in order to define a proper "BootXXXX" variable.
With this patch applied, you will be able to specify the boot order, usb and scsi: => efidebug -b 1 SCSI scsi 0:1 => efidebug boot dump Boot0001: attributes: A-- (0x00000001) label: SCSI file_path: /VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b)/Scsi(0,0)/ HD(1,GPT,0ed48d12-1b4c-4e08-b3ee-decf20428036,0x800,0xa000) data: 00000000: 00 00 => efideubg -b 2 USB usb 0:1 => efidebug boot order 2 1 => bootefi bootmgr
Signed-off-by: AKASHI Takahiro takahiro.akashi@linaro.org --- cmd/efidebug.c | 46 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 6 deletions(-)
diff --git a/cmd/efidebug.c b/cmd/efidebug.c index a977ca9c72f5..aaf269cdf47d 100644 --- a/cmd/efidebug.c +++ b/cmd/efidebug.c @@ -933,6 +933,29 @@ out: return initrd_dp; }
+/** + * count_arguments - count the number of arguments + * @argc: Total number of arguments + * @argv: Argument array + * Return: Number of arguments + * + * Count the number of arguments for a given option, "-?" + * Specifically if the first argument is not "-?", return 0; + */ +static int count_arguments(int argc, char *const argv[]) +{ + int i; + + if (argv[0][0] != '-') + return 0; + + for (i = 1; i < argc; i++) + if (argv[i][0] == '-') + break; + + return i; +} + /** * do_efi_boot_add() - set UEFI load option * @@ -945,7 +968,7 @@ out: * * Implement efidebug "boot add" sub-command. Create or change UEFI load option. * - * efidebug boot add -b <id> <label> <interface> <devnum>[:<part>] <file> + * efidebug boot add -b <id> <label> <interface> <devnum>[:<part>] [<file>] * -i <file> <interface2> <devnum2>[:<part>] <initrd> * -s '<options>' */ @@ -979,7 +1002,10 @@ static int do_efi_boot_add(struct cmd_tbl *cmdtp, int flag, argv++; /* 'add' */ for (; argc > 0; argc--, argv++) { if (!strcmp(argv[0], "-b")) { - if (argc < 5 || lo.label) { + int num_args; + + num_args = count_arguments(argc, argv); + if (num_args < 5 || num_args > 6 || lo.label) { r = CMD_RET_USAGE; goto out; } @@ -1000,7 +1026,8 @@ static int do_efi_boot_add(struct cmd_tbl *cmdtp, int flag, utf8_utf16_strncpy(&label, argv[2], label_len);
/* file path */ - ret = efi_dp_from_name(argv[3], argv[4], argv[5], + ret = efi_dp_from_name(argv[3], argv[4], + num_args == 5 ? "" : argv[5], &device_path, &file_path); if (ret != EFI_SUCCESS) { printf("Cannot create device path for "%s %s"\n", @@ -1008,10 +1035,16 @@ static int do_efi_boot_add(struct cmd_tbl *cmdtp, int flag, r = CMD_RET_FAILURE; goto out; } + /* if no file name is given, use device_path */ + if (num_args == 5) { + efi_free_pool(file_path); + file_path = device_path; + device_path = NULL; + } fp_size += efi_dp_size(file_path) + sizeof(struct efi_device_path); - argc -= 5; - argv += 5; + argc -= num_args; + argv += num_args; } else if (!strcmp(argv[0], "-i")) { if (argc < 3 || initrd_dp) { r = CMD_RET_USAGE; @@ -1078,7 +1111,8 @@ out: free(data); efi_free_pool(final_fp); efi_free_pool(initrd_dp); - efi_free_pool(device_path); + if (device_path) + efi_free_pool(device_path); efi_free_pool(file_path); free(lo.label);