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.
> 
> 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

Reply via email to