(Send again. Previous mail might be lost.) Gary, I have two comments: 1. Do you need to consider the case when the multiple partition nodes might not be adjacent? 2. Maybe you could recursively call the function itself instead of using a loop. In this new way, you might be able to save some code.
> -----Original Message----- > From: Gary Lin <g...@suse.com> > Sent: Tuesday, January 15, 2019 5:46 PM > To: edk2-devel@lists.01.org > Cc: Ni, Ray <ray...@intel.com>; Zeng, Star <star.z...@intel.com>; Wang, Jian J > <jian.j.w...@intel.com>; Wu, Hao A <hao.a...@intel.com> > Subject: [PATCH] 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. > > Cc: Ruiyu Ni <ruiyu...@intel.com> > Cc: Star Zeng <star.z...@intel.com> > Cc: Jian J Wang <jian.j.w...@intel.com> > Cc: Hao Wu <hao.a...@intel.com> > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Gary Lin <g...@suse.com> > --- > .../Library/UefiBootManagerLib/BmBoot.c | 37 ++++++++++++------- > 1 file changed, 23 insertions(+), 14 deletions(-) > > diff --git a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c > b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c > index 6a23477eb873..8354c2af674b 100644 > --- a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c > +++ b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c > @@ -1995,21 +1995,30 @@ BmMatchPartitionDevicePathNode ( > return FALSE; > } > > - // > - // See if the harddrive device path in blockio matches the orig Hard Drive > Node > - // > - Node = (HARDDRIVE_DEVICE_PATH *) BlockIoDevicePath; > + do { > + // > + // 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) > - ); > + // > + // 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; > + } > + > + // See if a nested partition exists > + BlockIoDevicePath = NextDevicePathNode (BlockIoDevicePath); } > + while (!IsDevicePathEnd (BlockIoDevicePath) && > + (DevicePathType (BlockIoDevicePath) == MEDIA_DEVICE_PATH) && > + (DevicePathSubType (BlockIoDevicePath) == > + MEDIA_HARDDRIVE_DP)); > + > + return FALSE; > } > > /** > -- > 2.20.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel