Hello, Em seg., 16 de out. de 2023 às 08:47, Masahisa Kojima < masahisa.koj...@linaro.org> escreveu:
> From: Raymond Mao <raymond....@linaro.org> > > Changes for complying to EFI spec §3.5.1.1 > 'Removable Media Boot Behavior'. > Boot variables can be automatically generated during a removable > media is probed. At the same time, unused boot variables will be > detected and removed. > > Please note that currently the function 'efi_disk_remove' has no > ability to distinguish below two scenarios > a) Unplugging of a removable media under U-Boot > b) U-Boot exiting and booting an OS > Thus currently the boot variables management is not added into > 'efi_disk_remove' to avoid boot options being added/erased > repeatedly under scenario b) during power cycles > See TODO comments under function 'efi_disk_remove' for more details > > The original efi_secboot tests expect that BootOrder EFI variable > is not defined. With this commit, the BootOrder EFI variable is > automatically added when the disk is detected. The original > efi_secboot tests end up with unexpected failure. > The efi_secboot tests need to be modified to explicitly set > the BootOrder EFI variable. > > squashfs ls test is also affected by this modification, need to > clear the previous state before squashfs ls test starts. > > Co-developed-by: Masahisa Kojima <masahisa.koj...@linaro.org> > Signed-off-by: Masahisa Kojima <masahisa.koj...@linaro.org> > Signed-off-by: Raymond Mao <raymond....@linaro.org> > Reviewed-by: Heinrich Schuchardt <xypron.g...@gmx.de> > Reviewed-by: Ilias Apalodimas <ilias.apalodi...@linaro.org> > --- > lib/efi_loader/efi_disk.c | 18 ++++++++ > lib/efi_loader/efi_setup.c | 7 ++++ > test/py/tests/test_efi_secboot/test_signed.py | 42 +++++++++---------- > .../test_efi_secboot/test_signed_intca.py | 14 +++---- > .../tests/test_efi_secboot/test_unsigned.py | 14 +++---- > .../test_fs/test_squashfs/test_sqfs_ls.py | 6 +++ > 6 files changed, 66 insertions(+), 35 deletions(-) > > diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c > index f0d76113b0..b808a7fe62 100644 > --- a/lib/efi_loader/efi_disk.c > +++ b/lib/efi_loader/efi_disk.c > @@ -690,6 +690,13 @@ int efi_disk_probe(void *ctx, struct event *event) > return -1; > } > > + /* only do the boot option management when UEFI sub-system is > initialized */ > + if (IS_ENABLED(CONFIG_CMD_BOOTEFI_BOOTMGR) && > efi_obj_list_initialized == EFI_SUCCESS) { > + ret = efi_bootmgr_update_media_device_boot_option(); > + if (ret != EFI_SUCCESS) > + return -1; > + } > + > return 0; > } > > @@ -742,6 +749,17 @@ int efi_disk_remove(void *ctx, struct event *event) > dev_tag_del(dev, DM_TAG_EFI); > > return 0; > + > + /* > + * TODO A flag to distinguish below 2 different scenarios of this > + * function call is needed: > + * a) Unplugging of a removable media under U-Boot > + * b) U-Boot exiting and booting an OS > + * In case of scenario a), > efi_bootmgr_update_media_device_boot_option() > + * needs to be invoked here to update the boot options and remove > the > + * unnecessary ones. > + */ > + > } > > /** > diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c > index e6de685e87..37359a77bb 100644 > --- a/lib/efi_loader/efi_setup.c > +++ b/lib/efi_loader/efi_setup.c > @@ -245,6 +245,13 @@ efi_status_t efi_init_obj_list(void) > if (ret != EFI_SUCCESS) > goto out; > > + if (IS_ENABLED(CONFIG_CMD_BOOTEFI_BOOTMGR)) { > + /* update boot option after variable service initialized */ > + ret = efi_bootmgr_update_media_device_boot_option(); > + if (ret != EFI_SUCCESS) > + goto out; > + } > + > /* Define supported languages */ > ret = efi_init_platform_lang(); > if (ret != EFI_SUCCESS) > diff --git a/test/py/tests/test_efi_secboot/test_signed.py > b/test/py/tests/test_efi_secboot/test_signed.py > index ca52e853d8..2f862a259a 100644 > --- a/test/py/tests/test_efi_secboot/test_signed.py > +++ b/test/py/tests/test_efi_secboot/test_signed.py > @@ -29,7 +29,7 @@ class TestEfiSignedImage(object): > output = u_boot_console.run_command_list([ > 'host bind 0 %s' % disk_img, > 'efidebug boot add -b 1 HELLO1 host 0:1 > /helloworld.efi.signed -s ""', > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'bootefi bootmgr']) > assert 'Hello, world!' in ''.join(output) > > @@ -37,7 +37,7 @@ class TestEfiSignedImage(object): > # Test Case 1b, run unsigned image if no PK > output = u_boot_console.run_command_list([ > 'efidebug boot add -b 2 HELLO2 host 0:1 /helloworld.efi > -s ""', > - 'efidebug boot next 2', > + 'efidebug boot order 2', > 'bootefi bootmgr']) > assert 'Hello, world!' in ''.join(output) > > @@ -59,13 +59,13 @@ class TestEfiSignedImage(object): > assert 'Failed to set EFI variable' not in ''.join(output) > output = u_boot_console.run_command_list([ > 'efidebug boot add -b 1 HELLO1 host 0:1 > /helloworld.efi.signed -s ""', > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'efidebug test bootmgr']) > assert('\'HELLO1\' failed' in ''.join(output)) > assert('efi_start_image() returned: 26' in ''.join(output)) > output = u_boot_console.run_command_list([ > 'efidebug boot add -b 2 HELLO2 host 0:1 /helloworld.efi > -s ""', > - 'efidebug boot next 2', > + 'efidebug boot order 2', > 'efidebug test bootmgr']) > assert '\'HELLO2\' failed' in ''.join(output) > assert 'efi_start_image() returned: 26' in ''.join(output) > @@ -77,12 +77,12 @@ class TestEfiSignedImage(object): > 'setenv -e -nv -bs -rt -at -i 4000000:$filesize db']) > assert 'Failed to set EFI variable' not in ''.join(output) > output = u_boot_console.run_command_list([ > - 'efidebug boot next 2', > + 'efidebug boot order 2', > 'efidebug test bootmgr']) > assert '\'HELLO2\' failed' in ''.join(output) > assert 'efi_start_image() returned: 26' in ''.join(output) > output = u_boot_console.run_command_list([ > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'bootefi bootmgr']) > assert 'Hello, world!' in ''.join(output) > > @@ -105,7 +105,7 @@ class TestEfiSignedImage(object): > assert 'Failed to set EFI variable' not in ''.join(output) > output = u_boot_console.run_command_list([ > 'efidebug boot add -b 1 HELLO host 0:1 > /helloworld.efi.signed -s ""', > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'efidebug test bootmgr']) > assert '\'HELLO\' failed' in ''.join(output) > assert 'efi_start_image() returned: 26' in ''.join(output) > @@ -117,7 +117,7 @@ class TestEfiSignedImage(object): > 'setenv -e -nv -bs -rt -at -i 4000000:$filesize db']) > assert 'Failed to set EFI variable' not in ''.join(output) > output = u_boot_console.run_command_list([ > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'efidebug test bootmgr']) > assert '\'HELLO\' failed' in ''.join(output) > assert 'efi_start_image() returned: 26' in ''.join(output) > @@ -143,7 +143,7 @@ class TestEfiSignedImage(object): > assert 'Failed to set EFI variable' not in ''.join(output) > output = u_boot_console.run_command_list([ > 'efidebug boot add -b 1 HELLO host 0:1 > /helloworld.efi.signed -s ""', > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'efidebug test bootmgr']) > assert '\'HELLO\' failed' in ''.join(output) > assert 'efi_start_image() returned: 26' in ''.join(output) > @@ -170,7 +170,7 @@ class TestEfiSignedImage(object): > assert 'Failed to set EFI variable' not in ''.join(output) > output = u_boot_console.run_command_list([ > 'efidebug boot add -b 1 HELLO host 0:1 > /helloworld.efi.signed_2sigs -s ""', > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'efidebug test bootmgr']) > assert 'Hello, world!' in ''.join(output) > > @@ -181,7 +181,7 @@ class TestEfiSignedImage(object): > 'setenv -e -nv -bs -rt -at -a -i 4000000:$filesize db']) > assert 'Failed to set EFI variable' not in ''.join(output) > output = u_boot_console.run_command_list([ > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'efidebug test bootmgr']) > assert 'Hello, world!' in ''.join(output) > > @@ -193,7 +193,7 @@ class TestEfiSignedImage(object): > 'setenv -e -nv -bs -rt -at -i 4000000:$filesize dbx']) > assert 'Failed to set EFI variable' not in ''.join(output) > output = u_boot_console.run_command_list([ > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'efidebug test bootmgr']) > assert '\'HELLO\' failed' in ''.join(output) > assert 'efi_start_image() returned: 26' in ''.join(output) > @@ -205,7 +205,7 @@ class TestEfiSignedImage(object): > 'setenv -e -nv -bs -rt -at -a -i 4000000:$filesize dbx']) > assert 'Failed to set EFI variable' not in ''.join(output) > output = u_boot_console.run_command_list([ > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'efidebug test bootmgr']) > assert '\'HELLO\' failed' in ''.join(output) > assert 'efi_start_image() returned: 26' in ''.join(output) > @@ -230,7 +230,7 @@ class TestEfiSignedImage(object): > assert 'Failed to set EFI variable' not in ''.join(output) > output = u_boot_console.run_command_list([ > 'efidebug boot add -b 1 HELLO host 0:1 > /helloworld.efi.signed_2sigs -s ""', > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'efidebug test bootmgr']) > assert '\'HELLO\' failed' in ''.join(output) > assert 'efi_start_image() returned: 26' in ''.join(output) > @@ -254,7 +254,7 @@ class TestEfiSignedImage(object): > assert 'Failed to set EFI variable' not in ''.join(output) > output = u_boot_console.run_command_list([ > 'efidebug boot add -b 1 HELLO host 0:1 > /helloworld.efi.signed -s ""', > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'bootefi bootmgr']) > assert 'Hello, world!' in ''.join(output) > > @@ -265,7 +265,7 @@ class TestEfiSignedImage(object): > 'setenv -e -nv -bs -rt -at -i 4000000:$filesize dbx']) > assert 'Failed to set EFI variable' not in ''.join(output) > output = u_boot_console.run_command_list([ > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'efidebug test bootmgr']) > assert '\'HELLO\' failed' in ''.join(output) > assert 'efi_start_image() returned: 26' in ''.join(output) > @@ -279,7 +279,7 @@ class TestEfiSignedImage(object): > 'setenv -e -nv -bs -rt -at -i 4000000:$filesize dbx']) > assert 'Failed to set EFI variable' not in ''.join(output) > output = u_boot_console.run_command_list([ > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'efidebug test bootmgr']) > assert '\'HELLO\' failed' in ''.join(output) > assert 'efi_start_image() returned: 26' in ''.join(output) > @@ -307,7 +307,7 @@ class TestEfiSignedImage(object): > assert 'Failed to set EFI variable' not in ''.join(output) > output = u_boot_console.run_command_list([ > 'efidebug boot add -b 1 HELLO host 0:1 > /helloworld.efi.signed_2sigs -s ""', > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'efidebug test bootmgr']) > assert '\'HELLO\' failed' in ''.join(output) > assert 'efi_start_image() returned: 26' in ''.join(output) > @@ -330,7 +330,7 @@ class TestEfiSignedImage(object): > assert 'Failed to set EFI variable' not in ''.join(output) > output = u_boot_console.run_command_list([ > 'efidebug boot add -b 1 HELLO host 0:1 > /helloworld.efi.signed_2sigs -s ""', > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'efidebug test bootmgr']) > assert '\'HELLO\' failed' in ''.join(output) > assert 'efi_start_image() returned: 26' in ''.join(output) > @@ -349,7 +349,7 @@ class TestEfiSignedImage(object): > output = u_boot_console.run_command_list([ > 'host bind 0 %s' % disk_img, > 'efidebug boot add -b 1 HELLO1 host 0:1 > /helloworld_forged.efi.signed -s ""', > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'efidebug test bootmgr']) > assert('hELLO, world!' in ''.join(output)) > > @@ -364,7 +364,7 @@ class TestEfiSignedImage(object): > 'setenv -e -nv -bs -rt -at -i 4000000:$filesize PK']) > assert 'Failed to set EFI variable' not in ''.join(output) > output = u_boot_console.run_command_list([ > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'efidebug test bootmgr']) > assert(not 'hELLO, world!' in ''.join(output)) > assert('\'HELLO1\' failed' in ''.join(output)) > diff --git a/test/py/tests/test_efi_secboot/test_signed_intca.py > b/test/py/tests/test_efi_secboot/test_signed_intca.py > index d8d599d22f..8d9a5f3e7f 100644 > --- a/test/py/tests/test_efi_secboot/test_signed_intca.py > +++ b/test/py/tests/test_efi_secboot/test_signed_intca.py > @@ -40,7 +40,7 @@ class TestEfiSignedImageIntca(object): > > output = u_boot_console.run_command_list([ > 'efidebug boot add -b 1 HELLO_a host 0:1 > /helloworld.efi.signed_a -s ""', > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'efidebug test bootmgr']) > assert '\'HELLO_a\' failed' in ''.join(output) > assert 'efi_start_image() returned: 26' in ''.join(output) > @@ -49,7 +49,7 @@ class TestEfiSignedImageIntca(object): > # Test Case 1b, signed and authenticated by root CA > output = u_boot_console.run_command_list([ > 'efidebug boot add -b 2 HELLO_ab host 0:1 > /helloworld.efi.signed_ab -s ""', > - 'efidebug boot next 2', > + 'efidebug boot order 2', > 'bootefi bootmgr']) > assert 'Hello, world!' in ''.join(output) > > @@ -71,7 +71,7 @@ class TestEfiSignedImageIntca(object): > > output = u_boot_console.run_command_list([ > 'efidebug boot add -b 1 HELLO_abc host 0:1 > /helloworld.efi.signed_abc -s ""', > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'efidebug test bootmgr']) > assert '\'HELLO_abc\' failed' in ''.join(output) > assert 'efi_start_image() returned: 26' in ''.join(output) > @@ -81,7 +81,7 @@ class TestEfiSignedImageIntca(object): > output = u_boot_console.run_command_list([ > 'fatload host 0:1 4000000 db_b.auth', > 'setenv -e -nv -bs -rt -at -i 4000000:$filesize db', > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'efidebug test bootmgr']) > assert '\'HELLO_abc\' failed' in ''.join(output) > assert 'efi_start_image() returned: 26' in ''.join(output) > @@ -91,7 +91,7 @@ class TestEfiSignedImageIntca(object): > output = u_boot_console.run_command_list([ > 'fatload host 0:1 4000000 db_c.auth', > 'setenv -e -nv -bs -rt -at -i 4000000:$filesize db', > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'efidebug test bootmgr']) > assert 'Hello, world!' in ''.join(output) > > @@ -117,7 +117,7 @@ class TestEfiSignedImageIntca(object): > > output = u_boot_console.run_command_list([ > 'efidebug boot add -b 1 HELLO_abc host 0:1 > /helloworld.efi.signed_abc -s ""', > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'efidebug test bootmgr']) > assert 'Hello, world!' in ''.join(output) > # Or, > @@ -129,7 +129,7 @@ class TestEfiSignedImageIntca(object): > output = u_boot_console.run_command_list([ > 'fatload host 0:1 4000000 dbx_c.auth', > 'setenv -e -nv -bs -rt -at -i 4000000:$filesize dbx', > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'efidebug test bootmgr']) > assert '\'HELLO_abc\' failed' in ''.join(output) > assert 'efi_start_image() returned: 26' in ''.join(output) > diff --git a/test/py/tests/test_efi_secboot/test_unsigned.py > b/test/py/tests/test_efi_secboot/test_unsigned.py > index df63f0df08..7c078f220d 100644 > --- a/test/py/tests/test_efi_secboot/test_unsigned.py > +++ b/test/py/tests/test_efi_secboot/test_unsigned.py > @@ -36,11 +36,11 @@ class TestEfiUnsignedImage(object): > > output = u_boot_console.run_command_list([ > 'efidebug boot add -b 1 HELLO host 0:1 /helloworld.efi -s > ""', > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'bootefi bootmgr']) > assert '\'HELLO\' failed' in ''.join(output) > output = u_boot_console.run_command_list([ > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'efidebug test bootmgr']) > assert 'efi_start_image() returned: 26' in ''.join(output) > assert 'Hello, world!' not in ''.join(output) > @@ -65,7 +65,7 @@ class TestEfiUnsignedImage(object): > > output = u_boot_console.run_command_list([ > 'efidebug boot add -b 1 HELLO host 0:1 /helloworld.efi -s > ""', > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'bootefi bootmgr']) > assert 'Hello, world!' in ''.join(output) > > @@ -89,11 +89,11 @@ class TestEfiUnsignedImage(object): > > output = u_boot_console.run_command_list([ > 'efidebug boot add -b 1 HELLO host 0:1 /helloworld.efi -s > ""', > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'bootefi bootmgr']) > assert '\'HELLO\' failed' in ''.join(output) > output = u_boot_console.run_command_list([ > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'efidebug test bootmgr']) > assert 'efi_start_image() returned: 26' in ''.join(output) > assert 'Hello, world!' not in ''.join(output) > @@ -107,11 +107,11 @@ class TestEfiUnsignedImage(object): > > output = u_boot_console.run_command_list([ > 'efidebug boot add -b 1 HELLO host 0:1 /helloworld.efi -s > ""', > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'bootefi bootmgr']) > assert '\'HELLO\' failed' in ''.join(output) > output = u_boot_console.run_command_list([ > - 'efidebug boot next 1', > + 'efidebug boot order 1', > 'efidebug test bootmgr']) > assert 'efi_start_image() returned: 26' in ''.join(output) > assert 'Hello, world!' not in ''.join(output) > diff --git a/test/py/tests/test_fs/test_squashfs/test_sqfs_ls.py > b/test/py/tests/test_fs/test_squashfs/test_sqfs_ls.py > index 527a556ed8..3b8118104f 100644 > --- a/test/py/tests/test_fs/test_squashfs/test_sqfs_ls.py > +++ b/test/py/tests/test_fs/test_squashfs/test_sqfs_ls.py > @@ -118,6 +118,12 @@ def test_sqfs_ls(u_boot_console): > """ > build_dir = u_boot_console.config.build_dir > > + # If the EFI subsystem is enabled, default file(e.g. > EFI/BOOT/BOOTAA64.EFI) > + # is scanned when the new disk is detected. This ends up with the > unexpected > + # output at the first 'sqfsls' command. > + # Clear the previous state. > + u_boot_console.restart_uboot() > + > # setup test environment > check_mksquashfs_version() > generate_sqfs_src_dir(build_dir) > -- > 2.34.1 > > Signed-off-by: Joao Marcos Costa <jmcosta...@gmail.com> -- Best regards, João Marcos Costa www.linkedin.com/in/jmarcoscosta/ https://github.com/jmarcoscosta