diff mbox series

distro_bootcmd: call EFI bootmgr even without having /EFI/boot

Message ID 20200923211550.18678-1-michael@walle.cc
State Accepted, archived
Delegated to: Tom Rini
Headers show
Series distro_bootcmd: call EFI bootmgr even without having /EFI/boot | expand

Commit Message

Michael Walle Sept. 23, 2020, 9:15 p.m. UTC
Currently, the EFI bootmgr is only called if there is a EFI binary
inside the path for removable media is found, i.e. /EFI/boot/. This
doesn't make sense. It is the duty of the bootmgr to find out the
path and name of the EFI binary to boot. It should be called even
if there is no /EFI/boot directory.

Thus, call the bootmgr before we try to boot the EFI binary inside
the removable media path.

Signed-off-by: Michael Walle <michael@walle.cc>
---
 include/config_distro_bootcmd.h | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

Comments

Heinrich Schuchardt Sept. 23, 2020, 10:17 p.m. UTC | #1
Am 23. September 2020 23:15:50 MESZ schrieb Michael Walle <michael@walle.cc>:
>Currently, the EFI bootmgr is only called if there is a EFI binary
>inside the path for removable media is found, i.e. /EFI/boot/. This
>doesn't make sense. It is the duty of the bootmgr to find out the
>path and name of the EFI binary to boot. It should be called even
>if there is no /EFI/boot directory.

Yes, UEFI variables indicating the boot binary take precedence. \EFI\boot\ is the fallback.

>
>Thus, call the bootmgr before we try to boot the EFI binary inside
>the removable media path.
>
>Signed-off-by: Michael Walle <michael@walle.cc>
>---
> include/config_distro_bootcmd.h | 7 +++++--
> 1 file changed, 5 insertions(+), 2 deletions(-)
>
>diff --git a/include/config_distro_bootcmd.h
>b/include/config_distro_bootcmd.h
>index fc0935fa21..c745f115f8 100644
>--- a/include/config_distro_bootcmd.h
>+++ b/include/config_distro_bootcmd.h
>@@ -123,12 +123,14 @@
> 
> 
>#define BOOTENV_SHARED_EFI                                             
>  \
>-	"boot_efi_binary="                                                \
>+	"boot_efi_bootmgr="                                               \
> 		"if fdt addr ${fdt_addr_r}; then "                        \

The problem here is that we don't have a clue which device tree we should load to $fdt_addr_r to make this true.


> 			"bootefi bootmgr ${fdt_addr_r};"                  \
> 		"else "                                                   \
> 			"bootefi bootmgr ${fdtcontroladdr};"  

Don't pass an fdt address in the else path. Some boards use ACPI. If ACPI is not used we have a fallback logic in cmd/bootefi.c.

Best regards

Heinrich

            \
>-		"fi;"                                                     \
>+		"fi\0"                                                    \
>+	\
>+	"boot_efi_binary="                                                \
> 		"load ${devtype} ${devnum}:${distro_bootpart} "           \
> 			"${kernel_addr_r} efi/boot/"BOOTEFI_NAME"; "      \
> 		"if fdt addr ${fdt_addr_r}; then "                        \
>@@ -152,6 +154,7 @@
> 				"run load_efi_dtb; "                      \
> 			"fi;"                                             \
> 		"done;"                                                   \
>+		"run boot_efi_bootmgr;"                                   \
> 		"if test -e ${devtype} ${devnum}:${distro_bootpart} "     \
> 					"efi/boot/"BOOTEFI_NAME"; then "  \
> 				"echo Found EFI removable media binary "  \
Michael Walle Sept. 25, 2020, 9:20 a.m. UTC | #2
Am 2020-09-24 00:17, schrieb Heinrich Schuchardt:
> Am 23. September 2020 23:15:50 MESZ schrieb Michael Walle 
> <michael@walle.cc>:
>> Currently, the EFI bootmgr is only called if there is a EFI binary
>> inside the path for removable media is found, i.e. /EFI/boot/. This
>> doesn't make sense. It is the duty of the bootmgr to find out the
>> path and name of the EFI binary to boot. It should be called even
>> if there is no /EFI/boot directory.
> 
> Yes, UEFI variables indicating the boot binary take precedence.
> \EFI\boot\ is the fallback.
> 
>> 
>> Thus, call the bootmgr before we try to boot the EFI binary inside
>> the removable media path.
>> 
>> Signed-off-by: Michael Walle <michael@walle.cc>
>> ---
>> include/config_distro_bootcmd.h | 7 +++++--
>> 1 file changed, 5 insertions(+), 2 deletions(-)
>> 
>> diff --git a/include/config_distro_bootcmd.h
>> b/include/config_distro_bootcmd.h
>> index fc0935fa21..c745f115f8 100644
>> --- a/include/config_distro_bootcmd.h
>> +++ b/include/config_distro_bootcmd.h
>> @@ -123,12 +123,14 @@
>> 
>> 
>> #define BOOTENV_SHARED_EFI
>>  \
>> -	"boot_efi_binary="                                                \
>> +	"boot_efi_bootmgr="                                               \
>> 		"if fdt addr ${fdt_addr_r}; then "                        \
> 
> The problem here is that we don't have a clue which device tree we
> should load to $fdt_addr_r to make this true.

The one specified in $fdtfile is loaded in the previous step if it
exists, just like in the removable media case. So I'm not sure I
what you mean.

But that raises the question how does the device tree end up in the
ESP. And I guess there can be only one set of device trees. For example
if you have two different kernel versions installed you'd have two
sets of device trees available, but only one can be put in //ESP/dtb
or //ESP/dtb/current).

>> 			"bootefi bootmgr ${fdt_addr_r};"                  \
>> 		"else "                                                   \
>> 			"bootefi bootmgr ${fdtcontroladdr};"
> 
> Don't pass an fdt address in the else path. Some boards use ACPI. If
> ACPI is not used we have a fallback logic in cmd/bootefi.c.

Ok.

-michael
diff mbox series

Patch

diff --git a/include/config_distro_bootcmd.h b/include/config_distro_bootcmd.h
index fc0935fa21..c745f115f8 100644
--- a/include/config_distro_bootcmd.h
+++ b/include/config_distro_bootcmd.h
@@ -123,12 +123,14 @@ 
 
 
 #define BOOTENV_SHARED_EFI                                                \
-	"boot_efi_binary="                                                \
+	"boot_efi_bootmgr="                                               \
 		"if fdt addr ${fdt_addr_r}; then "                        \
 			"bootefi bootmgr ${fdt_addr_r};"                  \
 		"else "                                                   \
 			"bootefi bootmgr ${fdtcontroladdr};"              \
-		"fi;"                                                     \
+		"fi\0"                                                    \
+	\
+	"boot_efi_binary="                                                \
 		"load ${devtype} ${devnum}:${distro_bootpart} "           \
 			"${kernel_addr_r} efi/boot/"BOOTEFI_NAME"; "      \
 		"if fdt addr ${fdt_addr_r}; then "                        \
@@ -152,6 +154,7 @@ 
 				"run load_efi_dtb; "                      \
 			"fi;"                                             \
 		"done;"                                                   \
+		"run boot_efi_bootmgr;"                                   \
 		"if test -e ${devtype} ${devnum}:${distro_bootpart} "     \
 					"efi/boot/"BOOTEFI_NAME"; then "  \
 				"echo Found EFI removable media binary "  \