From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=192.55.52.120; helo=mga04.intel.com; envelope-from=ray.ni@intel.com; receiver=edk2-devel@lists.01.org Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (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 6CF9F211B111E for ; Tue, 22 Jan 2019 08:02:00 -0800 (PST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 22 Jan 2019 08:01:59 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,507,1539673200"; d="scan'208";a="140330578" Received: from fmsmsx108.amr.corp.intel.com ([10.18.124.206]) by fmsmga001.fm.intel.com with ESMTP; 22 Jan 2019 08:01:59 -0800 Received: from fmsmsx157.amr.corp.intel.com (10.18.116.73) by FMSMSX108.amr.corp.intel.com (10.18.124.206) with Microsoft SMTP Server (TLS) id 14.3.408.0; Tue, 22 Jan 2019 08:01:59 -0800 Received: from shsmsx152.ccr.corp.intel.com (10.239.6.52) by FMSMSX157.amr.corp.intel.com (10.18.116.73) with Microsoft SMTP Server (TLS) id 14.3.408.0; Tue, 22 Jan 2019 08:01:59 -0800 Received: from shsmsx103.ccr.corp.intel.com ([169.254.4.150]) by SHSMSX152.ccr.corp.intel.com ([169.254.6.147]) with mapi id 14.03.0415.000; Wed, 23 Jan 2019 00:01:57 +0800 From: "Ni, Ray" To: 'Gary Lin' , "edk2-devel@lists.01.org" CC: "Zeng, Star" , "Wang, Jian J" , "Wu, Hao A" Thread-Topic: [PATCH] MdeModulePkg/UefiBootManagerLib: Match the nested partitions Thread-Index: AQHUrLc/dbAL75tJHk2lV7q/514ebqW7fqiA Date: Tue, 22 Jan 2019 16:01:57 +0000 Message-ID: <734D49CCEBEEF84792F5B80ED585239D5BFCEAA9@SHSMSX103.ccr.corp.intel.com> References: <20190115094548.10214-1-glin@suse.com> In-Reply-To: <20190115094548.10214-1-glin@suse.com> Accept-Language: en-US, zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] MIME-Version: 1.0 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: Tue, 22 Jan 2019 16:02:00 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable (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 > Sent: Tuesday, January 15, 2019 5:46 PM > To: edk2-devel@lists.01.org > Cc: Ni, Ray ; Zeng, Star ; Wang, J= ian J > ; Wu, Hao A > Subject: [PATCH] MdeModulePkg/UefiBootManagerLib: Match the nested > partitions >=20 > In some cases, such as MD RAID1 in Linux, the bootloader may be in a nest= ed EFI > system partition partition. For example, sda1 and sdb1 are combined as md= 0 and > the first partition of md0, md0p1, is an EFI system partition. Then, the > bootloader can be located by the following device > paths: >=20 > PCI()/SATA(sda)/Partition(sda1)/Partition(md0p1)/File(bootloader.efi) > PCI()/SATA(sdb)/Partition(sdb1)/Partition(md0p1)/File(bootloader.efi) >=20 > 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)". >=20 > However, BmMatchPartitionDevicePathNode() only matched the first partitio= n > node and ignored the nested partitions, so the firmware would refuse to l= oad > bootloader.efi since "Partition(md0p1)" doesn't match either "Partition(s= da1)" or > "Partition(sda2)". >=20 > This commit modifies BmMatchPartitionDevicePathNode() to iterate all nest= ed > partitions so that the above boot option could work. >=20 > 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(-) >=20 > 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; > } >=20 > - // > - // See if the harddrive device path in blockio matches the orig Hard D= rive Node > - // > - Node =3D (HARDDRIVE_DEVICE_PATH *) BlockIoDevicePath; > + do { > + // > + // See if the harddrive device path in blockio matches the orig Hard= Drive > Node > + // > + Node =3D (HARDDRIVE_DEVICE_PATH *) BlockIoDevicePath; >=20 > - // > - // Match Signature and PartitionNumber. > - // Unused bytes in Signature are initiaized with zeros. > - // > - return (BOOLEAN) ( > - (Node->PartitionNumber =3D=3D HardDriveDevicePath->PartitionNumber) = && > - (Node->MBRType =3D=3D HardDriveDevicePath->MBRType) && > - (Node->SignatureType =3D=3D HardDriveDevicePath->SignatureType) && > - (CompareMem (Node->Signature, HardDriveDevicePath->Signature, sizeof > (Node->Signature)) =3D=3D 0) > - ); > + // > + // Match Signature and PartitionNumber. > + // Unused bytes in Signature are initiaized with zeros. > + // > + if ((Node->PartitionNumber =3D=3D HardDriveDevicePath->PartitionNumb= er) && > + (Node->MBRType =3D=3D HardDriveDevicePath->MBRType) && > + (Node->SignatureType =3D=3D HardDriveDevicePath->SignatureType) = && > + (CompareMem (Node->Signature, HardDriveDevicePath->Signature, si= zeof > (Node->Signature)) =3D=3D 0)) { > + return TRUE; > + } > + > + // See if a nested partition exists > + BlockIoDevicePath =3D NextDevicePathNode (BlockIoDevicePath); } > + while (!IsDevicePathEnd (BlockIoDevicePath) && > + (DevicePathType (BlockIoDevicePath) =3D=3D MEDIA_DEVICE_PATH)= && > + (DevicePathSubType (BlockIoDevicePath) =3D=3D > + MEDIA_HARDDRIVE_DP)); > + > + return FALSE; > } >=20 > /** > -- > 2.20.1