[BUG] issues with new bootflow, uefi and virtio

Simon Glass sjg at chromium.org
Fri Apr 7 07:30:50 CEST 2023


Hi Mathew,

On Thu, 6 Apr 2023 at 12:25, Mathew McBride <matt at traverse.com.au> wrote:
>
> Hi Vincent,
>
> On Thu, Apr 6, 2023, at 1:04 AM, Vincent Stehlé wrote:
> > Hi,
> >
> > I am hitting an issue with the new bootflow when booting with UEFI from a
> > virtio device on Qemu Arm.
> >
> > It seems the device number computation in efiload_read_file() does not work
> > in the general virtio case, where it will pick the virtio device number
> > instead of the block device index. On Qemu arm virt machine, many virtio
> > mmio devices are provisioned in the memory map and no assumption can be
> > made on the number of the actual virtio device in use in the general case.
> >
> > This is an extract of the output of `dm tree' on this platform, focused on
> > the virtio device from which I would like to boot:
> >
> >   virtio    31  [ + ]   virtio-mmio     |-- virtio_mmio at a003e00
> >   blk        0  [ + ]   virtio-blk      |   |-- virtio-blk#31
> >   partition  0  [ + ]   blk_partition   |   |   |-- virtio-blk#31:1
> >   partition  1  [ + ]   blk_partition   |   |   `-- virtio-blk#31:2
> >   bootdev    2  [ + ]   virtio_bootdev  |   `-- virtio-blk#31.bootdev
> >
> > In this extract the actual virtio device number is 31, as will be picked by
> > efiload_read_file(), but the desired block device index is zero, as would
> > be used with e.g. `ls virtio 0'.
>
> I came across the exact same issue a few days ago. Below is a patch which I believe fixes the problem, by using the devnum of blk uclass (virtio 0) instead of the sequence number of the parent udevice (e.g virtio-blk#35).
>
> Separately, the devnum was previously being parsed as a hex which meant "virtio_blk#35" was actually being parsed as "virtio_blk#23". That confused me for a while.
>
> If the patch looks good I can re-post it directly to the ML. I'm not 100% sure that I got it right.
>
> In case the email mangles the patch, you can grab a diff here as well: https://gitlab.com/traversetech/ls1088firmware/u-boot/-/commit/5ed3315b4a297f143fb84f44117b5b31e5617af5
>
> - Matt
>
> ------------
>
> From 5ed3315b4a297f143fb84f44117b5b31e5617af5 Mon Sep 17 00:00:00 2001
> From: Mathew McBride <matt at traverse.com.au>
> Date: Wed, 5 Apr 2023 02:44:48 +0000
> Subject: [PATCH] bootstd: use blk uclass device numbers to set efi bootdev
>
> When loading a file from a block device, efiload_read_file
> was using the seq_num of the device (e.g "35" of virtio_blk#35)
> instead of the block device id (e.g what you get from running
> the corresponding device scan command, like "virtio 0")
>
> This cause EFI booting from these devices to fail as an
> invalid device number is passed to blk_get_device_part_str:
>
> Scanning bootdev 'virtio-blk#35.bootdev':
> distro_efi_read_bootflow_file start (efi,fname=<NULL>)
> distro_efi_read_bootflow_file start (efi,fname=<NULL>)
> setting bootdev virtio, 35, efi/boot/bootaa64.efi, 00000000beef9a40, 170800
> efi_dp_from_name calling blk_get_device_part_str
> dev=virtio devnr=35 path=efi/boot/bootaa64.efi
> blk_get_device_part_str (virtio,35)
> blk_get_device_by_str (virtio, 35)
> ** Bad device specification virtio 35 **
> Using default device tree: dtb/qemu-arm.dtb
> No device tree available
> 0  efi          ready   virtio       1  virtio-blk#35.bootdev.par efi/boot/bootaa64.efi
> ** Booting bootflow 'virtio-blk#35.bootdev.part_1' with efi
> blk_get_device_part_str (virtio,0:1)
> blk_get_device_by_str (virtio, 0)
> No UEFI binary known at beef9a40 (image buf=00000000beef9a40,addr=0000000000000000)
> Boot failed (err=-22)
>
> Signed-off-by: Mathew McBride <matt at traverse.com.au>
> ---
>  boot/bootmeth_efi.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/boot/bootmeth_efi.c b/boot/bootmeth_efi.c
> index 6a97ac02ff..bc106aa736 100644
> --- a/boot/bootmeth_efi.c
> +++ b/boot/bootmeth_efi.c
> @@ -117,7 +117,7 @@ static int efiload_read_file(struct blk_desc *desc, struct bootflow *bflow)
>          * this can go away.
>          */
>         media_dev = dev_get_parent(bflow->dev);
> -       snprintf(devnum_str, sizeof(devnum_str), "%x", dev_seq(media_dev));
> +       snprintf(devnum_str, sizeof(devnum_str), "%d", desc->devnum);

Yes this looks right to me.  I am actually changing the same line in a
current series, so I can pick up this patch and include it in the
series.

>
>         strlcpy(dirname, bflow->fname, sizeof(dirname));
>         last_slash = strrchr(dirname, '/');
> --
> 2.30.1
>
>
>

Regards,
Simon


More information about the U-Boot mailing list