From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=195.135.221.5; helo=smtp.nue.novell.com; envelope-from=glin@suse.com; receiver=edk2-devel@lists.01.org Received: from smtp.nue.novell.com (smtp.nue.novell.com [195.135.221.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 162A1211B85CE for ; Tue, 22 Jan 2019 18:12:59 -0800 (PST) Received: from emea4-mta.ukb.novell.com ([10.120.13.87]) by smtp.nue.novell.com with ESMTP (TLS encrypted); Wed, 23 Jan 2019 03:12:57 +0100 Received: from GaryWorkstation (nwb-a10-snat.microfocus.com [10.120.13.202]) by emea4-mta.ukb.novell.com with ESMTP (TLS encrypted); Wed, 23 Jan 2019 02:12:54 +0000 Date: Wed, 23 Jan 2019 10:12:49 +0800 From: Gary Lin To: "Ni, Ray" Cc: "edk2-devel@lists.01.org" , "Zeng, Star" , "Wang, Jian J" , "Wu, Hao A" Message-ID: <20190123021148.GX3972@GaryWorkstation> References: <20190115094548.10214-1-glin@suse.com> <734D49CCEBEEF84792F5B80ED585239D5BFCEAA9@SHSMSX103.ccr.corp.intel.com> MIME-Version: 1.0 In-Reply-To: <734D49CCEBEEF84792F5B80ED585239D5BFCEAA9@SHSMSX103.ccr.corp.intel.com> User-Agent: Mutt/1.10.1 (2018-07-13) Subject: Re: [PATCH] MdeModulePkg/UefiBootManagerLib: Match the nested partitions X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 23 Jan 2019 02:13:00 -0000 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Tue, Jan 22, 2019 at 04:01:57PM +0000, Ni, Ray wrote: > (Send again. Previous mail might be lost.) > Gary, Hi Ray, > I have two comments: > 1. Do you need to consider the case when the multiple partition nodes might not be adjacent? In my cases, they are all partitions based on another partition, so all those nested partitions are adjacent to the "root" partition. I'm not sure if it's possible to create the node other than a nested partition node or a file node on a partition node. > 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. Since my targets are the partition nodes after a partition, loop brings a bit better performance by skipping the non-partition node check and saves the overhead of function call. If you prefer recursive call, I'll modify the patch accordingly. Thanks, Gary Lin > > -----Original Message----- > > From: Gary Lin > > Sent: Tuesday, January 15, 2019 5:46 PM > > To: edk2-devel@lists.01.org > > Cc: Ni, Ray ; Zeng, Star ; Wang, Jian J > > ; Wu, Hao A > > 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 > > Cc: Star Zeng > > Cc: Jian J Wang > > Cc: Hao Wu > > Contributed-under: TianoCore Contribution Agreement 1.1 > > Signed-off-by: Gary Lin > > --- > > .../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 > >