From b9b0ea30c70bf37cc172604c67e6e9c5548870c1 Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Tue, 2 Feb 2021 17:53:14 +0100 Subject: [PATCH] efi_loader: install UEFI System Partition GUID On the handle for the UEFI System Partition we must install the System Partition GUID (with a NULL interface). Let the efidebug command display the GUID. Signed-off-by: Heinrich Schuchardt --- cmd/efidebug.c | 5 +++++ lib/efi_loader/efi_disk.c | 15 +++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/cmd/efidebug.c b/cmd/efidebug.c index 83bc2196a5..bbbcb0a546 100644 --- a/cmd/efidebug.c +++ b/cmd/efidebug.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -502,6 +503,10 @@ static const struct { "Device-Tree Fixup", EFI_DT_FIXUP_PROTOCOL_GUID, }, + { + "System Partition", + PARTITION_SYSTEM_GUID + }, /* Configuration table GUIDs */ { "ACPI table", diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c index d0aad0252a..1f6b817dea 100644 --- a/lib/efi_loader/efi_disk.c +++ b/lib/efi_loader/efi_disk.c @@ -19,6 +19,7 @@ struct efi_system_partition efi_system_partition; const efi_guid_t efi_block_io_guid = EFI_BLOCK_IO_PROTOCOL_GUID; +const efi_guid_t efi_system_partition_guid = PARTITION_SYSTEM_GUID; /** * struct efi_disk_obj - EFI disk object @@ -362,6 +363,7 @@ static efi_status_t efi_disk_add_dev( { struct efi_disk_obj *diskobj; struct efi_object *handle; + const efi_guid_t *guid = NULL; efi_status_t ret; /* Don't add empty devices */ @@ -400,6 +402,8 @@ static efi_status_t efi_disk_add_dev( efi_free_pool(node); diskobj->offset = part_info->start; diskobj->media.last_block = part_info->size - 1; + if (part_info->bootable & PART_EFI_SYSTEM_PARTITION) + guid = &efi_system_partition_guid; } else { diskobj->dp = efi_dp_from_part(desc, part); diskobj->offset = 0; @@ -417,7 +421,8 @@ static efi_status_t efi_disk_add_dev( handle = &diskobj->header; ret = EFI_CALL(efi_install_multiple_protocol_interfaces( &handle, &efi_guid_device_path, diskobj->dp, - &efi_block_io_guid, &diskobj->ops, NULL)); + &efi_block_io_guid, &diskobj->ops, + guid, NULL, NULL)); if (ret != EFI_SUCCESS) return ret; @@ -467,13 +472,7 @@ static efi_status_t efi_disk_add_dev( /* Store first EFI system partition */ if (part && !efi_system_partition.if_type) { - int r; - struct disk_partition info; - - r = part_get_info(desc, part, &info); - if (r) - return EFI_DEVICE_ERROR; - if (info.bootable & PART_EFI_SYSTEM_PARTITION) { + if (part_info->bootable & PART_EFI_SYSTEM_PARTITION) { efi_system_partition.if_type = desc->if_type; efi_system_partition.devnum = desc->devnum; efi_system_partition.part = part;