[PATCH v6 12/12] test: efi: boot: Add a test for the efi bootmeth

Simon Glass sjg at chromium.org
Sun Oct 13 21:33:23 CEST 2024


Hi Tom,

On Fri, 11 Oct 2024 at 16:32, Tom Rini <trini at konsulko.com> wrote:
>
> On Fri, Sep 27, 2024 at 12:02:23AM +0200, Simon Glass wrote:
>
> > Add a simple test of booting with the EFI bootmeth, which runs the app
> > and checks that it can call 'exit boot-services' (to check that all the
> > device-removal code doesn't break anything) and then exit back to
> > U-Boot.
> >
> > This uses a disk image containing the testapp, ready for execution by
> > sandbox when needed.
> >
> > Signed-off-by: Simon Glass <sjg at chromium.org>
>
> So lets go to the problem point. What asserts here fail due to ANSI
> escape codes being in the output and needing to be filtered out?
>
> [snip]
> > diff --git a/test/boot/bootflow.c b/test/boot/bootflow.c
> > index e05103188b4..da2ee1ab345 100644
> > --- a/test/boot/bootflow.c
> > +++ b/test/boot/bootflow.c
> > @@ -13,6 +13,7 @@
> >  #include <cli.h>
> >  #include <dm.h>
> >  #include <efi_default_filename.h>
> > +#include <efi_loader.h>
> >  #include <expo.h>
> >  #ifdef CONFIG_SANDBOX
> >  #include <asm/test.h>
> > @@ -31,6 +32,9 @@ extern U_BOOT_DRIVER(bootmeth_android);
> >  extern U_BOOT_DRIVER(bootmeth_cros);
> >  extern U_BOOT_DRIVER(bootmeth_2script);
> >
> > +/* Use this as the vendor for EFI to tell the app to exit boot services */
> > +static u16 __efi_runtime_data test_vendor[] = u"U-Boot testing";
> > +
> >  static int inject_response(struct unit_test_state *uts)
> >  {
> >       /*
> > @@ -1205,3 +1209,62 @@ static int bootflow_android(struct unit_test_state *uts)
> >       return 0;
> >  }
> >  BOOTSTD_TEST(bootflow_android, UTF_CONSOLE);
> > +
> > +/* Test EFI bootmeth */
> > +static int bootflow_efi(struct unit_test_state *uts)
> > +{
> > +     /* disable ethernet since the hunter will run dhcp */
> > +     test_set_eth_enable(false);
> > +
> > +     /* make USB scan without delays */
> > +     test_set_skip_delays(true);
> > +
> > +     bootstd_reset_usb();
> > +
> > +     /* Avoid outputting ANSI characters which mess with our asserts */
> > +     efi_console_set_ansi(false);
> > +
> > +     ut_assertok(bootstd_test_drop_bootdev_order(uts));
> > +     ut_assertok(run_command("bootflow scan", 0));
> > +     ut_assert_skip_to_line(
> > +             "Bus usb at 1: scanning bus usb at 1 for devices... 5 USB Device(s) found");
> > +
> > +     ut_assertok(run_command("bootflow list", 0));
> > +
> > +     ut_assert_nextlinen("Showing all");
> > +     ut_assert_nextlinen("Seq");
> > +     ut_assert_nextlinen("---");
> > +     ut_assert_nextlinen("  0  extlinux");
> > +     ut_assert_nextlinen(
> > +             "  1  efi          ready   usb_mass_    1  usb_mass_storage.lun0.boo /EFI/BOOT/BOOTSBOX.EFI");
> > +     ut_assert_nextlinen("---");
> > +     ut_assert_skip_to_line("(2 bootflows, 2 valid)");
> > +     ut_assert_console_end();
> > +
> > +     ut_assertok(run_command("bootflow select 1", 0));
> > +     ut_assert_console_end();
> > +
> > +     systab.fw_vendor = test_vendor;
> > +
> > +     ut_asserteq(1, run_command("bootflow boot", 0));
> > +     ut_assert_nextline(
> > +             "** Booting bootflow 'usb_mass_storage.lun0.bootdev.part_1' with efi");
> > +     if (IS_ENABLED(CONFIG_LOGF_FUNC))
> > +             ut_assert_skip_to_line("       efi_run_image() Booting /\\EFI\\BOOT\\BOOTSBOX.EFI");
> > +     else
> > +             ut_assert_skip_to_line("Booting /\\EFI\\BOOT\\BOOTSBOX.EFI");
> > +
> > +     /* TODO: Why the \r ? */
> > +     ut_assert_nextline("U-Boot test app for EFI_LOADER\r");
> > +     ut_assert_nextline("Exiting boot sevices");
> > +     if (IS_ENABLED(CONFIG_LOGF_FUNC))
> > +             ut_assert_nextline("     do_bootefi_exec() ## Application failed, r = 5");
> > +     else
> > +             ut_assert_nextline("## Application failed, r = 5");
> > +     ut_assert_nextline("Boot failed (err=-22)");
> > +
> > +     ut_assert_console_end();
> > +
> > +     return 0;
> > +}
> > +BOOTSTD_TEST(bootflow_efi, UTF_CONSOLE);

Thanks for taking an interest in this.

Nothing at present, as I added ut_assert_skip_to_line() to skip it
all. But it really is just wrong...I get gibberish showing up in the
terminal after I run tests! This is what I see with this series:

** Booting bootflow 'usb_mass_storage.lun0.bootdev.part_1' with efi
 7 [r [999;999H [6n 8No EFI system partition

^^^ strange output there but I'm not sure if it will come through on email

No EFI system partition
Failed to persist EFI variables
No EFI system partition
Failed to persist EFI variables
No EFI system partition
Failed to persist EFI variables
Booting /\EFI\BOOT\BOOTSBOX.EFI
U-Boot test app for EFI_LOADER

Exiting boot sevices
## Application failed, r = 5
Boot failed (err=-22)
Failures: 0

>
> --
> Tom

I just want this applied or some other fix to stop it happening. It
doesn't hurt anything and it should not be controversial.

Regards,
Simon


More information about the U-Boot mailing list