[U-Boot] [PATCH v2] efi: Export mbr partition for EFI.
Ard Biesheuvel
ard.biesheuvel at linaro.org
Tue Jun 20 12:02:44 UTC 2017
On 20 June 2017 at 13:55, Alexander Graf <agraf at suse.de> wrote:
>
>
> On 20.06.17 08:35, Emmanuel Vadot wrote:
>>
>> While MBR partition isn't supposed to work in a EFI environment some
>
>
> It actually is supposed to work :). I've used it on edk2 based systems a few
> times already.
>
Correct. Even though UEFI reinvented everything including
partitioning, the spec mandates support for MBR, GPT and El Torito for
platforms that have the ability to boot from SSD/HDD drives and/or
optical drives.
>> board rely partially or fully on MBR (BeagleBone, RPI and probably
>> others).
>> This export the MBR partition as logical partition which is useful to efi
>> application that cannot read raw disks.
>>
>> Signed-off-by: Emmanuel Vadot <manu at bidouilliste.com>
>
>
> I think we should do whatever edk2 does here to stay compatible. Ard, can
> you please enlighten me what that would be? Does edk2 expose logical
> partitions as raw disks?
>
The UEFI partition driver consumes block and disk I/O protocols of raw
devices and produces the same protocols for each individual partition
that it recognizes.
I hope this answers your question, otherwise could you elaborate?
>> ---
>> Changes in v2:
>> * Pass correct arg to efi_disk_create_mbr
>>
>> lib/efi_loader/efi_disk.c | 59
>> +++++++++++++++++++++++++++++++++++++++--------
>> 1 file changed, 50 insertions(+), 9 deletions(-)
>>
>> diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c
>> index 39e602a868..097bb544d7 100644
>> --- a/lib/efi_loader/efi_disk.c
>> +++ b/lib/efi_loader/efi_disk.c
>> @@ -197,11 +197,13 @@ static void efi_disk_add_dev(const char *name,
>> const char *if_typename,
>> const struct blk_desc *desc,
>> int dev_index,
>> - lbaint_t offset)
>> + disk_partition_t *info,
>> + int logical_partition)
>> {
>> struct efi_disk_obj *diskobj;
>> struct efi_device_path_file_path *dp;
>> int objlen = sizeof(*diskobj) + (sizeof(*dp) * 2);
>> + static int mediaid;
>> /* Don't add empty devices */
>> if (!desc->lba)
>> @@ -218,16 +220,26 @@ static void efi_disk_add_dev(const char *name,
>> diskobj->ops = block_io_disk_template;
>> diskobj->ifname = if_typename;
>> diskobj->dev_index = dev_index;
>> - diskobj->offset = offset;
>> + if (info)
>> + diskobj->offset = info->start;
>> +
>> diskobj->desc = desc;
>> /* Fill in EFI IO Media info (for read/write callbacks) */
>> diskobj->media.removable_media = desc->removable;
>> diskobj->media.media_present = 1;
>> - diskobj->media.block_size = desc->blksz;
>> - diskobj->media.io_align = desc->blksz;
>> - diskobj->media.last_block = desc->lba - offset;
>> + diskobj->media.media_id = mediaid++;
>> diskobj->ops.media = &diskobj->media;
>> + if (logical_partition) {
>> + diskobj->media.logical_partition = 1;
>> + diskobj->media.block_size = info->blksz;
>> + diskobj->media.io_align = info->blksz;
>> + diskobj->media.last_block = info->size - 1;
>> + } else {
>> + diskobj->media.block_size = desc->blksz;
>> + diskobj->media.io_align = desc->blksz;
>> + diskobj->media.last_block = desc->lba;
>> + }
>> /* Fill in device path */
>> dp = (void*)&diskobj[1];
>> @@ -262,8 +274,33 @@ static int efi_disk_create_eltorito(struct blk_desc
>> *desc,
>> while (!part_get_info(desc, part, &info)) {
>> snprintf(devname, sizeof(devname), "%s:%d", pdevname,
>> part);
>> - efi_disk_add_dev(devname, if_typename, desc, diskid,
>> - info.start);
>> + efi_disk_add_dev(devname, if_typename, desc, diskid, 0,
>> 0);
>> + part++;
>> + disks++;
>> + }
>> +#endif
>> +
>> + return disks;
>> +}
>> +
>> +static int efi_disk_create_mbr(struct blk_desc *desc,
>> + const char *if_typename,
>> + int diskid)
>> +{
>> + int disks = 0;
>> +#if CONFIG_IS_ENABLED(DOS_PARTITION)
>> + char devname[32] = { 0 }; /* dp->str is u16[32] long */
>> + disk_partition_t info;
>> + int part = 1;
>> +
>> + if (desc->part_type != PART_TYPE_DOS)
>> + return 0;
>> +
>> + while (!part_get_info(desc, part, &info)) {
>> + snprintf(devname, sizeof(devname), "%s%d:%d", if_typename,
>> + diskid, part);
>> +
>> + efi_disk_add_dev(devname, if_typename, desc, diskid,
>> &info, 1);
>> part++;
>> disks++;
>> }
>> @@ -296,9 +333,11 @@ int efi_disk_register(void)
>> const char *if_typename = dev->driver->name;
>> printf("Scanning disk %s...\n", dev->name);
>> - efi_disk_add_dev(dev->name, if_typename, desc,
>> desc->devnum, 0);
>> + efi_disk_add_dev(dev->name, if_typename, desc,
>> desc->devnum,
>> + NULL, 0);
>> disks++;
>> + disks += efi_disk_create_mbr(desc, if_typename,
>> desc->devnum);
>> /*
>> * El Torito images show up as block devices in an EFI
>> world,
>> * so let's create them here
>> @@ -332,15 +371,17 @@ int efi_disk_register(void)
>> snprintf(devname, sizeof(devname), "%s%d",
>> if_typename, i);
>> - efi_disk_add_dev(devname, if_typename, desc, i,
>> 0);
>> + efi_disk_add_dev(devname, if_typename, desc, i, 0,
>> 0);
>> disks++;
>> + disks += efi_disk_create_mbr(desc, if_typename,
>> i);
>> /*
>> * 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);
>> +
>> }
>> }
>> #endif
>>
>
More information about the U-Boot
mailing list