On Fri, Dec 08, 2017 at 08:09:46AM +0100, Heinrich Schuchardt wrote:
> On 12/07/2017 08:00 AM, Jonathan Gray wrote:
> > On Fri, Dec 01, 2017 at 04:10:33PM +0100, Alexander Graf wrote:
> > > Commit 884bcf6f65 (efi_loader: use proper device-paths for partitions) 
> > > tried
> > > to introduce the el torito scheme to all partition table types: Spawn
> > > individual disk objects for each partition on a disk.
> > > 
> > > Unfortunately, that code ended up creating partitions with offset=0 which 
> > > meant
> > > that anyone accessing these objects gets data from the raw block device 
> > > instead
> > > of the partition.
> 
> Hello Jonathan,
> 
> according to the UEFI standard the whole disk may be represented by as
> partition number 0 (with offset 0).

You are quoting Alexander there not me.

> 
> UEFI spec 2.7:
> 10.3.6.1 Hard Drive
> A partition number of zero can be used to represent the raw hard drive or a
> raw extended partition.
> 
> Do you have access to the source of the BSD loader that you are calling?
> Please, check that it complies to this aspect of the UEFI API.

Already mentioned in this thread, but again:
https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/sys/arch/arm64/stand/efiboot/

Which works fine with the EDK2 based firmware on the overdrive 1000.
And has found various regressions in changes made to the efi loader in
U-Boot over the last few months.

> 
> Best regards
> 
> Heinrich
> 
> 
> > > 
> > > Furthermore, all the el torito logic to spawn devices for partitions was
> > > duplicated. So let's merge the two code paths and give partition disk 
> > > objects
> > > good offsets to work from, so that payloads can actually make use of them.
> > > 
> > > Fixes: 884bcf6f65 (efi_loader: use proper device-paths for partitions)
> > > Reported-by: Yousaf Kaukab <[email protected]>
> > > Signed-off-by: Alexander Graf <[email protected]>
> > 
> > This once again broke being able to find a DEVICE_PATH_TYPE_MEDIA_DEVICE
> > node with the loaded image protocol on rpi_3 with mmc/usb.
> > 
> > broken
> > ## Starting EFI application at 01000000 ...
> > Scanning disk [email protected]...
> > efi_disk_register BLK efi_disk_add_dev [email protected], 
> > if_typename=mmc_blk, dev_index=0 offset=0, part=0
> > efi_disk_create_partitions efi_disk_add_dev [email protected]:1, 
> > if_typename=mmc_blk, dev_index=0 offset=8192, part=1
> > efi_disk_create_partitions efi_disk_add_dev [email protected]:4, 
> > if_typename=mmc_blk, dev_index=0 offset=16384, part=4
> > Scanning disk usb_mass_storage.lun0...
> > efi_disk_register BLK efi_disk_add_dev name=usb_mass_storage.lun0, 
> > if_typename=usb_storage_blk, dev_index=0 offset=0, part=0
> > efi_disk_create_partitions efi_disk_add_dev name=usb_mass_storage.lun0:1, 
> > if_typename=usb_storage_blk, dev_index=0 offset=8192, part=1
> > efi_disk_create_partitions efi_disk_add_dev name=usb_mass_storage.lun0:4, 
> > if_typename=usb_storage_blk, dev_index=0 offset=40960, part=4
> > Found 6 disks
> > efi_dp_match a: len 20 type 1 b: len 20 type: 1
> > efi_dp_match a: len 20 type 1 b: len 20 type: 1
> > efi_dp_match a: len 20 type 1 b: len 20 type: 1
> > efi_dp_match a: len 20 type 1 b: len 20 type: 1
> > efi_dp_match a: len 11 type 3 b: len 11 type: 3
> > efi_dp_match a: len 11 type 3 b: len 11 type: 3
> > efi_dp_match a: len 11 type 3 b: len 11 type: 3
> > efi_diskprobe
> > efi_device_path_depth looking for type 4 i=0 type 1
> > efi_device_path_depth looking for type 4 i=1 type 3
> > efi_device_path_depth looking for type 4 i=2 type 3
> > efi_device_path_depth looking for type 4 i=3 type 3
> > efi_device_path_depth no match for type 4
> > depth=-1
> > 
> > working (this commit reverted)
> > ## Starting EFI application at 01000000 ...
> > Scanning disk [email protected]...
> > efi_disk_register BLK efi_disk_add_dev [email protected], 
> > if_typename=mmc_blk, dev_index=0 offset=0, part=1
> > efi_disk_register BLK efi_disk_add_dev [email protected], 
> > if_typename=mmc_blk, dev_index=0 offset=0, part=4
> > efi_disk_register BLK efi_disk_add_dev [email protected], 
> > if_typename=mmc_blk, dev_index=0 offset=0, part=0
> > Scanning disk usb_mass_storage.lun0...
> > efi_disk_register BLK efi_disk_add_dev name=usb_mass_storage.lun0, 
> > if_typename=usb_storage_blk, dev_index=0 offset=0, part=1
> > efi_disk_register BLK efi_disk_add_dev name=usb_mass_storage.lun0, 
> > if_typename=usb_storage_blk, dev_index=0 offset=0, part=4
> > efi_disk_register BLK efi_disk_add_dev name=usb_mass_storage.lun0, 
> > if_typename=usb_storage_blk, dev_index=0 offset=0, part=0
> > Found 2 disks
> > efi_dp_match a: len 20 type 1 b: len 20 type: 1
> > efi_dp_match a: len 20 type 1 b: len 20 type: 1
> > efi_dp_match a: len 20 type 1 b: len 20 type: 1
> > efi_dp_match a: len 20 type 1 b: len 20 type: 1
> > efi_dp_match a: len 11 type 3 b: len 11 type: 3
> > efi_dp_match a: len 11 type 3 b: len 11 type: 3
> > efi_dp_match a: len 11 type 3 b: len 11 type: 3
> > efi_dp_match a: len 42 type 4 b: len 42 type: 4
> > efi_diskprobe
> > efi_device_path_depth looking for type 4 i=0 type 1
> > efi_device_path_depth looking for type 4 i=1 type 3
> > efi_device_path_depth looking for type 4 i=2 type 3
> > efi_device_path_depth looking for type 4 i=3 type 3
> > efi_device_path_depth looking for type 4 i=4 type 4
> > depth=4
> > 
> > > ---
> > >   lib/efi_loader/efi_disk.c | 60 
> > > ++++++++++-------------------------------------
> > >   1 file changed, 13 insertions(+), 47 deletions(-)
> > > 
> > > diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c
> > > index 68ba2cf7b2..4e457a841b 100644
> > > --- a/lib/efi_loader/efi_disk.c
> > > +++ b/lib/efi_loader/efi_disk.c
> > > @@ -264,21 +264,17 @@ out_of_memory:
> > >           printf("ERROR: Out of memory\n");
> > >   }
> > > -static int efi_disk_create_eltorito(struct blk_desc *desc,
> > > -                             const char *if_typename,
> > > -                             int diskid,
> > > -                             const char *pdevname)
> > > +static int efi_disk_create_partitions(struct blk_desc *desc,
> > > +                               const char *if_typename,
> > > +                               int diskid,
> > > +                               const char *pdevname)
> > >   {
> > >           int disks = 0;
> > > -#if CONFIG_IS_ENABLED(ISO_PARTITION)
> > >           char devname[32] = { 0 }; /* dp->str is u16[32] long */
> > >           disk_partition_t info;
> > >           int part;
> > > - if (desc->part_type != PART_TYPE_ISO)
> > > -         return 0;
> > > -
> > > - /* and devices for each partition: */
> > > + /* Add devices for each partition */
> > >           for (part = 1; part <= MAX_SEARCH_PARTITIONS; part++) {
> > >                   if (part_get_info(desc, part, &info))
> > >                           continue;
> > > @@ -289,10 +285,6 @@ static int efi_disk_create_eltorito(struct blk_desc 
> > > *desc,
> > >                   disks++;
> > >           }
> > > - /* ... and add block device: */
> > > - efi_disk_add_dev(devname, if_typename, desc, diskid, 0, 0);
> > > -#endif
> > > -
> > >           return disks;
> > >   }
> > > @@ -318,31 +310,18 @@ int efi_disk_register(void)
> > >                uclass_next_device_check(&dev)) {
> > >                   struct blk_desc *desc = dev_get_uclass_platdata(dev);
> > >                   const char *if_typename = dev->driver->name;
> > > -         disk_partition_t info;
> > > -         int part;
> > >                   printf("Scanning disk %s...\n", dev->name);
> > > -         /* add devices for each partition: */
> > > -         for (part = 1; part <= MAX_SEARCH_PARTITIONS; part++) {
> > > -                 if (part_get_info(desc, part, &info))
> > > -                         continue;
> > > -                 efi_disk_add_dev(dev->name, if_typename, desc,
> > > -                                  desc->devnum, 0, part);
> > > -         }
> > > -
> > > -         /* ... and add block device: */
> > > +         /* Add block device for the full device */
> > >                   efi_disk_add_dev(dev->name, if_typename, desc,
> > >                                    desc->devnum, 0, 0);
> > >                   disks++;
> > > -         /*
> > > -         * El Torito images show up as block devices in an EFI world,
> > > -         * so let's create them here
> > > -         */
> > > -         disks += efi_disk_create_eltorito(desc, if_typename,
> > > -                                           desc->devnum, dev->name);
> > > +         /* Partitions show up as block devices in EFI */
> > > +         disks += efi_disk_create_partitions(desc, if_typename,
> > > +                                             desc->devnum, dev->name);
> > >           }
> > >   #else
> > >           int i, if_type;
> > > @@ -361,8 +340,6 @@ int efi_disk_register(void)
> > >                   for (i = 0; i < 4; i++) {
> > >                           struct blk_desc *desc;
> > >                           char devname[32] = { 0 }; /* dp->str is u16[32] 
> > > long */
> > > -                 disk_partition_t info;
> > > -                 int part;
> > >                           desc = blk_get_devnum_by_type(if_type, i);
> > >                           if (!desc)
> > > @@ -373,24 +350,13 @@ int efi_disk_register(void)
> > >                           snprintf(devname, sizeof(devname), "%s%d",
> > >                                    if_typename, i);
> > > -                 /* add devices for each partition: */
> > > -                 for (part = 1; part <= MAX_SEARCH_PARTITIONS; part++) {
> > > -                         if (part_get_info(desc, part, &info))
> > > -                                 continue;
> > > -                         efi_disk_add_dev(devname, if_typename, desc,
> > > -                                          i, 0, part);
> > > -                 }
> > > -
> > > -                 /* ... and add block device: */
> > > +                 /* Add block device for the full device */
> > >                           efi_disk_add_dev(devname, if_typename, desc, i, 
> > > 0, 0);
> > >                           disks++;
> > > -                 /*
> > > -                  * El Torito images show up as block devices
> > > -                  * in an EFI world, so let's create them here
> > > -                  */
> > > -                 disks += efi_disk_create_eltorito(desc, if_typename,
> > > -                                                   i, devname);
> > > +                 /* Partitions show up as block devices in EFI */
> > > +                 disks += efi_disk_create_partitions(desc, if_typename,
> > > +                                                     i, devname);
> > >                   }
> > >           }
> > >   #endif
> > > -- 
> > > 2.12.3
> > > 
> > > _______________________________________________
> > > U-Boot mailing list
> > > [email protected]
> > > https://lists.denx.de/listinfo/u-boot
> > 
> 
> _______________________________________________
> U-Boot mailing list
> [email protected]
> https://lists.denx.de/listinfo/u-boot
_______________________________________________
U-Boot mailing list
[email protected]
https://lists.denx.de/listinfo/u-boot

Reply via email to