
Hi Heinrich,
On Wed, 19 Jan 2022 at 04:47, Heinrich Schuchardt xypron.glpk@gmx.de wrote:
On 1/19/22 02:43, Simon Glass wrote:
Add a bootmeth driver which handles EFI boot manager, using EFI_LOADER.
In effect, this provides the same functionality as the 'bootefi bootmgr' command and shares the same code. But the interface into it is via a bootmeth, so it does not require any special scripts, etc.
For now this requires the 'bootefi' command be enabled. Future work may tidy this up so that it can be used without CONFIG_CMDLINE being enabled.
Signed-off-by: Simon Glass sjg@chromium.org
Changes in v3:
Add a log category
boot/Makefile | 3 ++ boot/bootmeth_efi_mgr.c | 86 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 boot/bootmeth_efi_mgr.c
diff --git a/boot/Makefile b/boot/Makefile index 795665f7ce5..38b10d81f0d 100644 --- a/boot/Makefile +++ b/boot/Makefile @@ -31,6 +31,9 @@ obj-$(CONFIG_$(SPL_TPL_)BOOTSTD) += bootstd-uclass.o obj-$(CONFIG_$(SPL_TPL_)BOOTMETH_DISTRO) += bootmeth_distro.o obj-$(CONFIG_$(SPL_TPL_)BOOTMETH_DISTRO_PXE) += bootmeth_pxe.o obj-$(CONFIG_$(SPL_TPL_)BOOTMETH_EFILOADER) += bootmeth_efi.o +ifdef CONFIG_$(SPL_TPL_)BOOTSTD_FULL +obj-$(CONFIG_$(SPL_TPL_)CMD_BOOTEFI_BOOTMGR) += bootmeth_efi_mgr.o +endif
obj-$(CONFIG_$(SPL_TPL_)OF_LIBFDT) += image-fdt.o obj-$(CONFIG_$(SPL_TPL_)FIT_SIGNATURE) += fdt_region.o diff --git a/boot/bootmeth_efi_mgr.c b/boot/bootmeth_efi_mgr.c new file mode 100644 index 00000000000..a6914466db7 --- /dev/null +++ b/boot/bootmeth_efi_mgr.c @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: GPL-2.0+ +/*
- Bootmethod for EFI boot manager
- Copyright 2021 Google LLC
- Written by Simon Glass sjg@chromium.org
- */
+#define LOG_CATEGORY UCLASS_BOOTSTD
+#include <common.h> +#include <bootdev.h> +#include <bootflow.h> +#include <bootmeth.h> +#include <command.h> +#include <dm.h>
+static int efi_mgr_check(struct udevice *dev, struct bootflow_iter *iter) +{
int ret;
/* Must be an bootstd device */
ret = bootflow_iter_uses_system(iter);
if (ret)
return log_msg_ret("net", ret);
return 0;
+}
+static int efi_mgr_read_bootflow(struct udevice *dev, struct bootflow *bflow) +{
/*
* Just assume there is something to boot since we don't have any way
* of knowing in advance
*/
bflow->state = BOOTFLOWST_READY;
return 0;
+}
+static int efi_mgr_read_file(struct udevice *dev, struct bootflow *bflow,
const char *file_path, ulong addr, ulong *sizep)
+{
/* Files are loaded by the 'bootefi bootmgr' command */
return -ENOSYS;
+}
+static int efi_mgr_boot(struct udevice *dev, struct bootflow *bflow) +{
int ret;
/* Booting is handled by the 'bootefi bootmgr' command */
ret = run_command("bootefi bootmgr", 0);
You are missing to provide the device tree.
OK well I can deal with that when I get to it, I suppose. Which distro can I try with?
Regards, Simon