
On 11/9/21 02:32, AKASHI Takahiro wrote:
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:
I guess for a removable device this should work even if the device is not present. But currently:
=> efidebug boot add -b 1000 USB_present usb 0:1 EFI/BOOT/BOOTARM.EFI => efidebug boot add -b 1000 USB_not_present usb 1:1 EFI/BOOT/BOOTARM.EFI Cannot create device path for "usb 1:1"
A media device path like:
/VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b)/UsbClass(0x0,0x0,0x9,0x0,0x1)/UsbClass(0x781,0x5571,0x0,0x0,0x0)/HD(1,MBR,0x0c449046,0x800,0x800)
is not very helpful because the next device that you insert may have a different location of the ESP partition.
I think you should store
/VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b)/UsbClass(0x0,0x0,0x9,0x0,0x1)/UsbClass(0x781,0x5571,0x0,0x0,0x0)
and find the ESP on it at runtime.
=> 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
Best regards
Heinrich
=> 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;
} else if (!strcmp(argv[0], "-i")) { if (argc < 3 || initrd_dp) { r = CMD_RET_USAGE;argv += num_args;
@@ -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(file_path); free(lo.label);efi_free_pool(device_path);