[U-Boot] [PATCH 2/3] efi_loader: correctly setup device paths for block devices

Mark Kettenis mark.kettenis at xs4all.nl
Mon Dec 4 13:39:59 UTC 2017


xypron.glpk at gmx.de schreef op 2017-12-03 22:20:
> On Sunday, December 3, 2017 8:24:39 PM CET Mark Kettenis wrote:
>> Heinrich Schuchardt schreef op 2017-12-02 13:42:
>> > For each block device we have to setup:
>> > - a device path for the block device
>> > - a partition device path for the block device with
>> >
>> >   partition number 0
>> 
>> Do x86 UEFI implementations actually generate these partition number 0
>> paths?
> 
> Thanks for reviewing.
> 
> I do not have access the an x86 computer with UEFI firmware.
> Maybe somebody else on the list has.
> 
> Another reference point is EDK2.
> 
> Part of the relevant coding is in function 
> PartitionInstallMbrChildHandles(),
> MdeModulePkg/Universal/Disk/PartitionDxe/Mbr.c:47.
> 
> Another part is in PartitionInstallChildHandle(),
> MdeModulePkg/Universal/Disk/PartitionDxe/Partition.c.
> 
> I could not identify any line referring to partition 0.
> 
>> The standard says that 0 can be used in tis fashion but doesn't seem 
>> to
>> prescribe their use.
> 
> <cite>A partition number of  zero can be used to represent the raw hard 
> drive
> or a raw extended partition.</cite>
> 
> Do you think we should not generate this entry?

I think it would be better to not generate this entry if other UEFI 
implementations don't generate it either.
Your analysis of the EDK2 code suggests that they don't, so U-Boot 
probably shouldn't do this either.

Was going to check whether the EDK2-based firmware on my Overdrive 1000 
provides a partition 0, but I managed
to hang it in the process and I'll have to power-cycle it when I get 
home later today...

>> > - a partition device path for each partition
>> >
>> > Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
>> > ---
>> >
>> >  lib/efi_loader/efi_device_path.c | 11 +++++++----
>> >  lib/efi_loader/efi_disk.c        |  7 +++++--
>> >  2 files changed, 12 insertions(+), 6 deletions(-)
>> >
>> > diff --git a/lib/efi_loader/efi_device_path.c
>> > b/lib/efi_loader/efi_device_path.c
>> > index 42fe6e1185..d0d62ff428 100644
>> > --- a/lib/efi_loader/efi_device_path.c
>> > +++ b/lib/efi_loader/efi_device_path.c
>> > @@ -412,15 +412,18 @@ static void *dp_part_fill(void *buf, struct
>> > blk_desc *desc, int part)
>> >
>> >  	buf = &udp[1];
>> >
>> >  #endif
>> >
>> > -	if (part == 0) /* the actual disk, not a partition */
>> > +	if (part == -1) /* the actual disk, not a partition */
>> >
>> >  		return buf;
>> >
>> > -	part_get_info(desc, part, &info);
>> > +	if (part == 0)
>> > +		part_get_info_whole_disk(desc, &info);
>> > +	else
>> > +		part_get_info(desc, part, &info);
>> >
>> >  	if (desc->part_type == PART_TYPE_ISO) {
>> >
>> >  		struct efi_device_path_cdrom_path *cddp = buf;
>> >
>> > -		cddp->boot_entry = part - 1;
>> > +		cddp->boot_entry = part;
>> >
>> >  		cddp->dp.type = DEVICE_PATH_TYPE_MEDIA_DEVICE;
>> >  		cddp->dp.sub_type = DEVICE_PATH_SUB_TYPE_CDROM_PATH;
>> >  		cddp->dp.length = sizeof(*cddp);
>> >
>> > @@ -434,7 +437,7 @@ static void *dp_part_fill(void *buf, struct
>> > blk_desc *desc, int part)
>> >
>> >  		hddp->dp.type = DEVICE_PATH_TYPE_MEDIA_DEVICE;
>> >  		hddp->dp.sub_type = DEVICE_PATH_SUB_TYPE_HARD_DRIVE_PATH;
>> >  		hddp->dp.length = sizeof(*hddp);
>> >
>> > -		hddp->partition_number = part - 1;
>> > +		hddp->partition_number = part;
>> >
>> >  		hddp->partition_start = info.start;
>> >  		hddp->partition_end = info.size;
>> >  		if (desc->part_type == PART_TYPE_EFI)
>> >
>> > diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c
>> > index 4e457a841b..19f75aa919 100644
>> > --- a/lib/efi_loader/efi_disk.c
>> > +++ b/lib/efi_loader/efi_disk.c
>> > @@ -274,6 +274,9 @@ static int efi_disk_create_partitions(struct
>> > blk_desc *desc,
>> >
>> >  	disk_partition_t info;
>> >  	int part;
>> >
>> > +	/* Add devices for disk */
>> > +	snprintf(devname, sizeof(devname), "%s", pdevname);
>> > +	efi_disk_add_dev(devname, if_typename, desc, diskid, info.start, 0);
>> >
>> >  	/* Add devices for each partition */
>> >  	for (part = 1; part <= MAX_SEARCH_PARTITIONS; part++) {
>> >
>> >  		if (part_get_info(desc, part, &info))
>> >
>> > @@ -315,7 +318,7 @@ int efi_disk_register(void)
>> >
>> >  		/* Add block device for the full device */
>> >  		efi_disk_add_dev(dev->name, if_typename, desc,
>> >
>> > -				 desc->devnum, 0, 0);
>> > +				 desc->devnum, 0, -1);
>> >
>> >  		disks++;
>> >
>> > @@ -351,7 +354,7 @@ int efi_disk_register(void)
>> >
>> >  				 if_typename, i);
>> >
>> >  			/* Add block device for the full device */
>> >
>> > -			efi_disk_add_dev(devname, if_typename, desc, i, 0, 0);
>> > +			efi_disk_add_dev(devname, if_typename, desc, i, 0, -1);
>> >
>> >  			disks++;
>> >
>> >  			/* Partitions show up as block devices in EFI */


More information about the U-Boot mailing list