
From: Heinrich Schuchardt heinrich.schuchardt@canonical.com Date: Tue, 17 Oct 2023 19:51:48 +0200
Only auto-generate boot options for removable media.
For testing the different handling of removable and non-removable devices an emulated USB device can be used:
make qemu-riscv64_smode_defconfig; make qemu-system-riscv64 -M virt -kernel u-boot.bin -nographic \ -device qemu-xhci -drive if=none,file=disk.img,format=raw,id=USB1 \ -device usb-storage,drive=USB1,removable=on
Unless I misunderstand what this patch does, this may result in systems that don't boot after installation.
On most boards U-Boot does not provide a way to create persistent EFI variables after ExitBootServices() is called. This means that an OS installer cannot create a boot entry for the OS installation it just created. Therefore the EFI boot manager will not boot the newly installed system.
Now as long as the traditional distro boot mechanism or the EFI distro boot bootmeth is enabled the system will probobly still attempt to boot the installed system. But do want to rely on that?
Fixes: c416f1c0bcab ("bootmenu: add removable media entries") Fixes: 339b527bd450 ("Move bootorder and bootoption apis to lib") Signed-off-by: Heinrich Schuchardt heinrich.schuchardt@canonical.com
lib/efi_loader/efi_bootmgr.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/lib/efi_loader/efi_bootmgr.c b/lib/efi_loader/efi_bootmgr.c index a40762c74c..96d45157b3 100644 --- a/lib/efi_loader/efi_bootmgr.c +++ b/lib/efi_loader/efi_bootmgr.c @@ -346,7 +346,7 @@ error: }
/**
- efi_bootmgr_enumerate_boot_option() - enumerate the possible bootable media
- efi_bootmgr_enumerate_boot_option() - boot options for removable boot media
- @opt: pointer to the media boot option structure
- @volume_handles: pointer to the efi handles
@@ -370,6 +370,9 @@ static efi_status_t efi_bootmgr_enumerate_boot_option(struct eficonfig_media_boo struct efi_device_path *device_path; struct efi_device_path *short_dp;
if (!efi_disk_is_removable(volume_handles[i]))
continue;
- ret = efi_search_protocol(volume_handles[i], &efi_guid_device_path, &handler); if (ret != EFI_SUCCESS) continue;
@@ -674,7 +677,10 @@ efi_status_t efi_bootmgr_update_media_device_boot_option(void) goto out; }
- /* enumerate all devices supporting EFI_SIMPLE_FILE_SYSTEM_PROTOCOL */
- /*
* Enumerate all removable devices supporting the
* EFI_SIMPLE_FILE_SYSTEM_PROTOCOL.
ret = efi_bootmgr_enumerate_boot_option(opt, volume_handles, count); if (ret != EFI_SUCCESS) goto out;*/
-- 2.40.1