summaryrefslogtreecommitdiffstats
path: root/MdeModulePkg/Library
diff options
context:
space:
mode:
authorGary Lin <glin@suse.com>2019-01-23 12:40:04 +0800
committerRuiyu Ni <ruiyu.ni@intel.com>2019-01-31 12:25:36 +0800
commit02021d2ea4f64be3f29d4a0d9707a60889f3f71b (patch)
tree1ccf0d5659c6af310eb8c86de5d5f17258e8676d /MdeModulePkg/Library
parenta824c7ebde0a431413329049252b8c1d3770de82 (diff)
downloadedk2-02021d2ea4f64be3f29d4a0d9707a60889f3f71b.tar.gz
edk2-02021d2ea4f64be3f29d4a0d9707a60889f3f71b.tar.bz2
edk2-02021d2ea4f64be3f29d4a0d9707a60889f3f71b.zip
MdeModulePkg/UefiBootManagerLib: Match the nested partitions
In some cases, such as MD RAID1 in Linux, the bootloader may be in a nested EFI system partition partition. For example, sda1 and sdb1 are combined as md0 and the first partition of md0, md0p1, is an EFI system partition. Then, the bootloader can be located by the following device paths: PCI()/SATA(sda)/Partition(sda1)/Partition(md0p1)/File(bootloader.efi) PCI()/SATA(sdb)/Partition(sdb1)/Partition(md0p1)/File(bootloader.efi) To make the boot option more resilient, we may create a boot option with the short-form device path like "Partition(md0p1)/File(bootloader.efi)". However, BmMatchPartitionDevicePathNode() only matched the first partition node and ignored the nested partitions, so the firmware would refuse to load bootloader.efi since "Partition(md0p1)" doesn't match either "Partition(sda1)" or "Partition(sda2)". This commit modifies BmMatchPartitionDevicePathNode() to iterate all nested partitions so that the above boot option could work. v2 - Simplify the node matching logic Cc: Ruiyu Ni <ruiyu.ni@intel.com> Cc: Star Zeng <star.zeng@intel.com> Cc: Jian J Wang <jian.j.wang@intel.com> Cc: Hao Wu <hao.a.wu@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Gary Lin <glin@suse.com> Reviewed-by: Ray Ni <ray.ni@intel.com>
Diffstat (limited to 'MdeModulePkg/Library')
-rw-r--r--MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c38
1 files changed, 17 insertions, 21 deletions
diff --git a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
index 6a23477eb8..2284ce1a56 100644
--- a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
+++ b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
@@ -1979,37 +1979,33 @@ BmMatchPartitionDevicePathNode (
}
//
- // find the partition device path node
+ // Match all the partition device path nodes including the nested partition nodes
//
while (!IsDevicePathEnd (BlockIoDevicePath)) {
if ((DevicePathType (BlockIoDevicePath) == MEDIA_DEVICE_PATH) &&
(DevicePathSubType (BlockIoDevicePath) == MEDIA_HARDDRIVE_DP)
) {
- break;
+ //
+ // See if the harddrive device path in blockio matches the orig Hard Drive Node
+ //
+ Node = (HARDDRIVE_DEVICE_PATH *) BlockIoDevicePath;
+
+ //
+ // Match Signature and PartitionNumber.
+ // Unused bytes in Signature are initiaized with zeros.
+ //
+ if ((Node->PartitionNumber == HardDriveDevicePath->PartitionNumber) &&
+ (Node->MBRType == HardDriveDevicePath->MBRType) &&
+ (Node->SignatureType == HardDriveDevicePath->SignatureType) &&
+ (CompareMem (Node->Signature, HardDriveDevicePath->Signature, sizeof (Node->Signature)) == 0)) {
+ return TRUE;
+ }
}
BlockIoDevicePath = NextDevicePathNode (BlockIoDevicePath);
}
- if (IsDevicePathEnd (BlockIoDevicePath)) {
- return FALSE;
- }
-
- //
- // See if the harddrive device path in blockio matches the orig Hard Drive Node
- //
- Node = (HARDDRIVE_DEVICE_PATH *) BlockIoDevicePath;
-
- //
- // Match Signature and PartitionNumber.
- // Unused bytes in Signature are initiaized with zeros.
- //
- return (BOOLEAN) (
- (Node->PartitionNumber == HardDriveDevicePath->PartitionNumber) &&
- (Node->MBRType == HardDriveDevicePath->MBRType) &&
- (Node->SignatureType == HardDriveDevicePath->SignatureType) &&
- (CompareMem (Node->Signature, HardDriveDevicePath->Signature, sizeof (Node->Signature)) == 0)
- );
+ return FALSE;
}
/**