From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.100; helo=mga07.intel.com; envelope-from=jiewen.yao@intel.com; receiver=edk2-devel@lists.01.org Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 4FCA720356242 for ; Mon, 4 Dec 2017 16:53:22 -0800 (PST) Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 04 Dec 2017 16:57:51 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.45,362,1508828400"; d="scan'208";a="1251915786" Received: from fmsmsx107.amr.corp.intel.com ([10.18.124.205]) by fmsmga002.fm.intel.com with ESMTP; 04 Dec 2017 16:57:51 -0800 Received: from shsmsx103.ccr.corp.intel.com (10.239.4.69) by fmsmsx107.amr.corp.intel.com (10.18.124.205) with Microsoft SMTP Server (TLS) id 14.3.319.2; Mon, 4 Dec 2017 16:57:51 -0800 Received: from shsmsx102.ccr.corp.intel.com ([169.254.2.175]) by SHSMSX103.ccr.corp.intel.com ([169.254.4.213]) with mapi id 14.03.0319.002; Tue, 5 Dec 2017 08:57:50 +0800 From: "Yao, Jiewen" To: "Zeng, Star" , "edk2-devel@lists.01.org" CC: "Chiu, Chasel" , "Chiang, Dakota" Thread-Topic: [PATCH] MdeModulePkg CapsulePei: Sort and merge memory resource entries Thread-Index: AQHTbObY+/Afn8WCY0qIGe/xS/kSkqMz7kiA Date: Tue, 5 Dec 2017 00:57:48 +0000 Message-ID: <74D8A39837DF1E4DA445A8C0B3885C503AA3982A@shsmsx102.ccr.corp.intel.com> References: <1512381656-10312-1-git-send-email-star.zeng@intel.com> In-Reply-To: <1512381656-10312-1-git-send-email-star.zeng@intel.com> Accept-Language: zh-CN, en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiOTM1OGFlYmUtZWZjYS00YWRmLWJmZDgtMDRkN2Q5YWI0ODhmIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX0lDIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjIuNS4xOCIsIlRydXN0ZWRMYWJlbEhhc2giOiI5UWxrQjJGc3R3SkgwZ0pMajJLc2FXVkM0RXlOWllcLzBcL21TV055SzZzSldqVW9vc0dLdzM1UDhmRmUxaVl0YUIifQ== x-ctpclassification: CTP_IC dlp-product: dlpe-windows dlp-version: 11.0.0.116 dlp-reaction: no-action x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Subject: Re: [PATCH] MdeModulePkg CapsulePei: Sort and merge memory resource entries X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 05 Dec 2017 00:53:22 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Jiewen.yao@intel.com > -----Original Message----- > From: Zeng, Star > Sent: Monday, December 4, 2017 6:01 PM > To: edk2-devel@lists.01.org > Cc: Zeng, Star ; Yao, Jiewen ; > Chiu, Chasel ; Chiang, Dakota > > Subject: [PATCH] MdeModulePkg CapsulePei: Sort and merge memory resource > entries >=20 > Sort and merge memory resource entries to handle the case that > the memory resource HOBs are reported differently between > BOOT_ON_FLASH_UPDATE boot mode and normal boot mode, and the > capsule buffer from UpdateCapsule at normal boot sits across > two memory resource descriptors at BOOT_ON_FLASH_UPDATE boot mode. >=20 > Cc: Jiewen Yao > Cc: Chasel Chiu > Cc: Dakota Chiang > Tested-by: Dakota Chiang > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Star Zeng > --- > MdeModulePkg/Universal/CapsulePei/UefiCapsule.c | 90 > +++++++++++++++++++++++++ > 1 file changed, 90 insertions(+) >=20 > diff --git a/MdeModulePkg/Universal/CapsulePei/UefiCapsule.c > b/MdeModulePkg/Universal/CapsulePei/UefiCapsule.c > index cca455ec396c..043365f7f770 100644 > --- a/MdeModulePkg/Universal/CapsulePei/UefiCapsule.c > +++ b/MdeModulePkg/Universal/CapsulePei/UefiCapsule.c > @@ -625,6 +625,82 @@ GetPhysicalAddressBits ( > #endif >=20 > /** > + Sort memory resource entries based upon PhysicalStart, from low to hig= h. > + > + @param[in, out] MemoryResource A pointer to the memory resource > entry buffer. > + > +**/ > +VOID > +SortMemoryResourceDescriptor ( > + IN OUT MEMORY_RESOURCE_DESCRIPTOR *MemoryResource > + ) > +{ > + MEMORY_RESOURCE_DESCRIPTOR *MemoryResourceEntry; > + MEMORY_RESOURCE_DESCRIPTOR *NextMemoryResourceEntry; > + MEMORY_RESOURCE_DESCRIPTOR TempMemoryResource; > + > + MemoryResourceEntry =3D MemoryResource; > + NextMemoryResourceEntry =3D MemoryResource + 1; > + while (MemoryResourceEntry->ResourceLength !=3D 0) { > + while (NextMemoryResourceEntry->ResourceLength !=3D 0) { > + if (MemoryResourceEntry->PhysicalStart > > NextMemoryResourceEntry->PhysicalStart) { > + CopyMem (&TempMemoryResource, MemoryResourceEntry, sizeof > (MEMORY_RESOURCE_DESCRIPTOR)); > + CopyMem (MemoryResourceEntry, NextMemoryResourceEntry, > sizeof (MEMORY_RESOURCE_DESCRIPTOR)); > + CopyMem (NextMemoryResourceEntry, &TempMemoryResource, > sizeof (MEMORY_RESOURCE_DESCRIPTOR)); > + } > + > + NextMemoryResourceEntry =3D NextMemoryResourceEntry + 1; > + } > + > + MemoryResourceEntry =3D MemoryResourceEntry + 1; > + NextMemoryResourceEntry =3D MemoryResourceEntry + 1; > + } > +} > + > +/** > + Merge continous memory resource entries. > + > + @param[in, out] MemoryResource A pointer to the memory resource > entry buffer. > + > +**/ > +VOID > +MergeMemoryResourceDescriptor ( > + IN OUT MEMORY_RESOURCE_DESCRIPTOR *MemoryResource > + ) > +{ > + MEMORY_RESOURCE_DESCRIPTOR *MemoryResourceEntry; > + MEMORY_RESOURCE_DESCRIPTOR *NewMemoryResourceEntry; > + MEMORY_RESOURCE_DESCRIPTOR *NextMemoryResourceEntry; > + MEMORY_RESOURCE_DESCRIPTOR *MemoryResourceEnd; > + > + MemoryResourceEntry =3D MemoryResource; > + NewMemoryResourceEntry =3D MemoryResource; > + while (MemoryResourceEntry->ResourceLength !=3D 0) { > + CopyMem (NewMemoryResourceEntry, MemoryResourceEntry, sizeof > (MEMORY_RESOURCE_DESCRIPTOR)); > + NextMemoryResourceEntry =3D MemoryResourceEntry + 1; > + > + while ((NextMemoryResourceEntry->ResourceLength !=3D 0) && > + (NextMemoryResourceEntry->PhysicalStart =3D=3D > (MemoryResourceEntry->PhysicalStart + > MemoryResourceEntry->ResourceLength))) { > + MemoryResourceEntry->ResourceLength +=3D > NextMemoryResourceEntry->ResourceLength; > + if (NewMemoryResourceEntry !=3D MemoryResourceEntry) { > + NewMemoryResourceEntry->ResourceLength +=3D > NextMemoryResourceEntry->ResourceLength; > + } > + > + NextMemoryResourceEntry =3D NextMemoryResourceEntry + 1; > + } > + > + MemoryResourceEntry =3D NextMemoryResourceEntry; > + NewMemoryResourceEntry =3D NewMemoryResourceEntry + 1; > + } > + > + // > + // Set NULL terminate memory resource descriptor after merging. > + // > + MemoryResourceEnd =3D NewMemoryResourceEntry; > + ZeroMem (MemoryResourceEnd, sizeof > (MEMORY_RESOURCE_DESCRIPTOR)); > +} > + > +/** > Build memory resource descriptor from resource descriptor in HOB list. >=20 > @return Pointer to the buffer of memory resource descriptor. > @@ -704,6 +780,20 @@ BuildMemoryResourceDescriptor ( > Hob.Raw =3D GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, > Hob.Raw); > } >=20 > + SortMemoryResourceDescriptor (MemoryResource); > + MergeMemoryResourceDescriptor (MemoryResource); > + > + DEBUG ((DEBUG_INFO, "Dump MemoryResource[] after sorted and > merged\n")); > + for (Index =3D 0; MemoryResource[Index].ResourceLength !=3D 0; Index++= ) { > + DEBUG (( > + DEBUG_INFO, > + " MemoryResource[0x%x] - Start(0x%0lx) Length(0x%0lx)\n", > + Index, > + MemoryResource[Index].PhysicalStart, > + MemoryResource[Index].ResourceLength > + )); > + } > + > return MemoryResource; > } >=20 > -- > 2.7.0.windows.1