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 AD3F1211963EC for ; Tue, 22 Jan 2019 20:02:29 -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 05:02:27 +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 04:02:15 +0000 Date: Wed, 23 Jan 2019 12:02:10 +0800 From: Gary Lin To: "Ni, Ray" Cc: "'edk2-devel@lists.01.org'" , "Zeng, Star" , "Wang, Jian J" , "Wu, Hao A" Message-ID: <20190123040210.GB20220@GaryWorkstation> References: <20190115094548.10214-1-glin@suse.com> <734D49CCEBEEF84792F5B80ED585239D5BFCEAA9@SHSMSX103.ccr.corp.intel.com> <20190123021148.GX3972@GaryWorkstation> <734D49CCEBEEF84792F5B80ED585239D5BFCFA08@SHSMSX103.ccr.corp.intel.com> <734D49CCEBEEF84792F5B80ED585239D5BFCFA2E@SHSMSX103.ccr.corp.intel.com> MIME-Version: 1.0 In-Reply-To: <734D49CCEBEEF84792F5B80ED585239D5BFCFA2E@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 04:02:30 -0000 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Wed, Jan 23, 2019 at 03:49:16AM +0000, Ni, Ray wrote: > > > > -----Original Message----- > > From: Ni, Ray > > Sent: Wednesday, January 23, 2019 11:48 AM > > To: 'Gary Lin' > > Cc: edk2-devel@lists.01.org; Zeng, Star ; Wang, Jian J > > ; Wu, Hao A > > Subject: RE: [PATCH] MdeModulePkg/UefiBootManagerLib: Match the > > nested partitions > > > > > > > > > -----Original Message----- > > > From: Gary Lin > > > Sent: Wednesday, January 23, 2019 10:13 AM > > > To: Ni, Ray > > > Cc: edk2-devel@lists.01.org; Zeng, Star ; Wang, > > > Jian J ; Wu, Hao A > > > Subject: Re: [PATCH] MdeModulePkg/UefiBootManagerLib: Match the > > nested > > > partitions > > > > > > 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. > > Sure. Let's just assume the multiple partition nodes are 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. > > > 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. > > I just want to avoid having two code blocks to check device path node against > > END and partition node. > > First one is in original while(). Second one is introduced by this patch. > > If we can avoid the duplicated code, using loop is also fine. Ok. I'll see what I can do. Thanks, Gary Lin > > > > > > > > > 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.e > > > > > fi > > > > > ) > > > > > PCI()/SATA(sdb)/Partition(sdb1)/Partition(md0p1)/File(bootloader.e > > > > > fi > > > > > ) > > > > > > > > > > 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 > > > > > > > > >