[PATCH v2 1/4] boot: correct the default sequence of boot methods

Heinrich Schuchardt heinrich.schuchardt at canonical.com
Thu Apr 4 17:37:27 CEST 2024


On 04.04.24 17:18, Mark Kettenis wrote:
>> From: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>
>> Date: Thu,  4 Apr 2024 13:47:39 +0200
>>
>> The default sequence of boot methods is determined by alphabetical sorting
>> during linkage.
>>
>> * efi_mgr must run before efi to be UEFI compliant
>> * pxe should run as last resort
>>
>> Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>
> 
> This sound very much like you're working around a standard boot design
> flaw.
> 
> Who does the alphabetical sorting here?  Is that just a result of how
> the toolchain behaves?  If so, that sounds fragile to me and I think
> it would be better to make the order explicit in the code.

Thanks for reviewing.

Please, observe the SORT command in our linker script lines

     KEEP(*(SORT(__u_boot_list*)));

This ensures that linker generated lists are always alphabetically 
sorted. We rely on this in other places too. See 
part_driver_lookup_type() where GPT must be tested before FAT (commit 
96e5b03c8ab7 ("dm: part: Convert partition API use to linker lists").

Best regards

Heinrich

> 
> Cheers,
> 
> Mark
> 
>> ---
>> v2:
>> 	no change
>> ---
>>   boot/bootmeth_efi.c     | 2 +-
>>   boot/bootmeth_efi_mgr.c | 2 +-
>>   boot/bootmeth_pxe.c     | 2 +-
>>   test/boot/bootflow.c    | 2 +-
>>   4 files changed, 4 insertions(+), 4 deletions(-)
>>
>> diff --git a/boot/bootmeth_efi.c b/boot/bootmeth_efi.c
>> index c4eb331d69e..a46b6c9c805 100644
>> --- a/boot/bootmeth_efi.c
>> +++ b/boot/bootmeth_efi.c
>> @@ -489,7 +489,7 @@ static const struct udevice_id distro_efi_bootmeth_ids[] = {
>>   	{ }
>>   };
>>   
>> -U_BOOT_DRIVER(bootmeth_efi) = {
>> +U_BOOT_DRIVER(bootmeth_4efi) = {
>>   	.name		= "bootmeth_efi",
>>   	.id		= UCLASS_BOOTMETH,
>>   	.of_match	= distro_efi_bootmeth_ids,
>> diff --git a/boot/bootmeth_efi_mgr.c b/boot/bootmeth_efi_mgr.c
>> index ed29d7ef021..b7d429f2c3d 100644
>> --- a/boot/bootmeth_efi_mgr.c
>> +++ b/boot/bootmeth_efi_mgr.c
>> @@ -114,7 +114,7 @@ static const struct udevice_id efi_mgr_bootmeth_ids[] = {
>>   	{ }
>>   };
>>   
>> -U_BOOT_DRIVER(bootmeth_efi_mgr) = {
>> +U_BOOT_DRIVER(bootmeth_3efi_mgr) = {
>>   	.name		= "bootmeth_efi_mgr",
>>   	.id		= UCLASS_BOOTMETH,
>>   	.of_match	= efi_mgr_bootmeth_ids,
>> diff --git a/boot/bootmeth_pxe.c b/boot/bootmeth_pxe.c
>> index 8d489a11aa4..70f693aa239 100644
>> --- a/boot/bootmeth_pxe.c
>> +++ b/boot/bootmeth_pxe.c
>> @@ -184,7 +184,7 @@ static const struct udevice_id extlinux_bootmeth_pxe_ids[] = {
>>   	{ }
>>   };
>>   
>> -U_BOOT_DRIVER(bootmeth_pxe) = {
>> +U_BOOT_DRIVER(bootmeth_zpxe) = {
>>   	.name		= "bootmeth_pxe",
>>   	.id		= UCLASS_BOOTMETH,
>>   	.of_match	= extlinux_bootmeth_pxe_ids,
>> diff --git a/test/boot/bootflow.c b/test/boot/bootflow.c
>> index 4845b7121c8..e60e9309fa9 100644
>> --- a/test/boot/bootflow.c
>> +++ b/test/boot/bootflow.c
>> @@ -377,7 +377,7 @@ static int bootflow_system(struct unit_test_state *uts)
>>   	if (!IS_ENABLED(CONFIG_EFI_BOOTMGR))
>>   		return -EAGAIN;
>>   	ut_assertok(uclass_first_device_err(UCLASS_BOOTSTD, &bootstd));
>> -	ut_assertok(device_bind(bootstd, DM_DRIVER_GET(bootmeth_efi_mgr),
>> +	ut_assertok(device_bind(bootstd, DM_DRIVER_GET(bootmeth_3efi_mgr),
>>   				"efi_mgr", 0, ofnode_null(), &dev));
>>   	ut_assertok(device_probe(dev));
>>   	sandbox_set_fake_efi_mgr_dev(dev, true);
>> -- 
>> 2.43.0
>>
>>



More information about the U-Boot mailing list