* [PATCH] MdeModulePkg CapsulePei: Sort and merge memory resource entries
@ 2017-12-04 10:00 Star Zeng
2017-12-04 12:51 ` Chiu, Chasel
2017-12-05 0:57 ` Yao, Jiewen
0 siblings, 2 replies; 3+ messages in thread
From: Star Zeng @ 2017-12-04 10:00 UTC (permalink / raw)
To: edk2-devel; +Cc: Star Zeng, Jiewen Yao, Chasel Chiu, Dakota Chiang
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.
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Chasel Chiu <chasel.chiu@intel.com>
Cc: Dakota Chiang <dakota.chiang@intel.com>
Tested-by: Dakota Chiang <dakota.chiang@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Star Zeng <star.zeng@intel.com>
---
MdeModulePkg/Universal/CapsulePei/UefiCapsule.c | 90 +++++++++++++++++++++++++
1 file changed, 90 insertions(+)
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
/**
+ Sort memory resource entries based upon PhysicalStart, from low to high.
+
+ @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 = MemoryResource;
+ NextMemoryResourceEntry = MemoryResource + 1;
+ while (MemoryResourceEntry->ResourceLength != 0) {
+ while (NextMemoryResourceEntry->ResourceLength != 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 = NextMemoryResourceEntry + 1;
+ }
+
+ MemoryResourceEntry = MemoryResourceEntry + 1;
+ NextMemoryResourceEntry = 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 = MemoryResource;
+ NewMemoryResourceEntry = MemoryResource;
+ while (MemoryResourceEntry->ResourceLength != 0) {
+ CopyMem (NewMemoryResourceEntry, MemoryResourceEntry, sizeof (MEMORY_RESOURCE_DESCRIPTOR));
+ NextMemoryResourceEntry = MemoryResourceEntry + 1;
+
+ while ((NextMemoryResourceEntry->ResourceLength != 0) &&
+ (NextMemoryResourceEntry->PhysicalStart == (MemoryResourceEntry->PhysicalStart + MemoryResourceEntry->ResourceLength))) {
+ MemoryResourceEntry->ResourceLength += NextMemoryResourceEntry->ResourceLength;
+ if (NewMemoryResourceEntry != MemoryResourceEntry) {
+ NewMemoryResourceEntry->ResourceLength += NextMemoryResourceEntry->ResourceLength;
+ }
+
+ NextMemoryResourceEntry = NextMemoryResourceEntry + 1;
+ }
+
+ MemoryResourceEntry = NextMemoryResourceEntry;
+ NewMemoryResourceEntry = NewMemoryResourceEntry + 1;
+ }
+
+ //
+ // Set NULL terminate memory resource descriptor after merging.
+ //
+ MemoryResourceEnd = NewMemoryResourceEntry;
+ ZeroMem (MemoryResourceEnd, sizeof (MEMORY_RESOURCE_DESCRIPTOR));
+}
+
+/**
Build memory resource descriptor from resource descriptor in HOB list.
@return Pointer to the buffer of memory resource descriptor.
@@ -704,6 +780,20 @@ BuildMemoryResourceDescriptor (
Hob.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, Hob.Raw);
}
+ SortMemoryResourceDescriptor (MemoryResource);
+ MergeMemoryResourceDescriptor (MemoryResource);
+
+ DEBUG ((DEBUG_INFO, "Dump MemoryResource[] after sorted and merged\n"));
+ for (Index = 0; MemoryResource[Index].ResourceLength != 0; Index++) {
+ DEBUG ((
+ DEBUG_INFO,
+ " MemoryResource[0x%x] - Start(0x%0lx) Length(0x%0lx)\n",
+ Index,
+ MemoryResource[Index].PhysicalStart,
+ MemoryResource[Index].ResourceLength
+ ));
+ }
+
return MemoryResource;
}
--
2.7.0.windows.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] MdeModulePkg CapsulePei: Sort and merge memory resource entries
2017-12-04 10:00 [PATCH] MdeModulePkg CapsulePei: Sort and merge memory resource entries Star Zeng
@ 2017-12-04 12:51 ` Chiu, Chasel
2017-12-05 0:57 ` Yao, Jiewen
1 sibling, 0 replies; 3+ messages in thread
From: Chiu, Chasel @ 2017-12-04 12:51 UTC (permalink / raw)
To: Zeng, Star, edk2-devel@lists.01.org; +Cc: Yao, Jiewen, Chiang, Dakota
Reviewed-by: Chasel Chiu <chasel.chiu@intel.com>
-----Original Message-----
From: Zeng, Star
Sent: Monday, December 4, 2017 6:01 PM
To: edk2-devel@lists.01.org
Cc: Zeng, Star <star.zeng@intel.com>; Yao, Jiewen <jiewen.yao@intel.com>; Chiu, Chasel <chasel.chiu@intel.com>; Chiang, Dakota <dakota.chiang@intel.com>
Subject: [PATCH] MdeModulePkg CapsulePei: Sort and merge memory resource entries
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.
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Chasel Chiu <chasel.chiu@intel.com>
Cc: Dakota Chiang <dakota.chiang@intel.com>
Tested-by: Dakota Chiang <dakota.chiang@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Star Zeng <star.zeng@intel.com>
---
MdeModulePkg/Universal/CapsulePei/UefiCapsule.c | 90 +++++++++++++++++++++++++
1 file changed, 90 insertions(+)
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
/**
+ Sort memory resource entries based upon PhysicalStart, from low to high.
+
+ @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 = MemoryResource; NextMemoryResourceEntry =
+ MemoryResource + 1; while (MemoryResourceEntry->ResourceLength != 0)
+ {
+ while (NextMemoryResourceEntry->ResourceLength != 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 = NextMemoryResourceEntry + 1;
+ }
+
+ MemoryResourceEntry = MemoryResourceEntry + 1;
+ NextMemoryResourceEntry = 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 = MemoryResource; NewMemoryResourceEntry =
+ MemoryResource; while (MemoryResourceEntry->ResourceLength != 0) {
+ CopyMem (NewMemoryResourceEntry, MemoryResourceEntry, sizeof (MEMORY_RESOURCE_DESCRIPTOR));
+ NextMemoryResourceEntry = MemoryResourceEntry + 1;
+
+ while ((NextMemoryResourceEntry->ResourceLength != 0) &&
+ (NextMemoryResourceEntry->PhysicalStart == (MemoryResourceEntry->PhysicalStart + MemoryResourceEntry->ResourceLength))) {
+ MemoryResourceEntry->ResourceLength += NextMemoryResourceEntry->ResourceLength;
+ if (NewMemoryResourceEntry != MemoryResourceEntry) {
+ NewMemoryResourceEntry->ResourceLength += NextMemoryResourceEntry->ResourceLength;
+ }
+
+ NextMemoryResourceEntry = NextMemoryResourceEntry + 1;
+ }
+
+ MemoryResourceEntry = NextMemoryResourceEntry;
+ NewMemoryResourceEntry = NewMemoryResourceEntry + 1; }
+
+ //
+ // Set NULL terminate memory resource descriptor after merging.
+ //
+ MemoryResourceEnd = NewMemoryResourceEntry;
+ ZeroMem (MemoryResourceEnd, sizeof (MEMORY_RESOURCE_DESCRIPTOR)); }
+
+/**
Build memory resource descriptor from resource descriptor in HOB list.
@return Pointer to the buffer of memory resource descriptor.
@@ -704,6 +780,20 @@ BuildMemoryResourceDescriptor (
Hob.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, Hob.Raw);
}
+ SortMemoryResourceDescriptor (MemoryResource);
+ MergeMemoryResourceDescriptor (MemoryResource);
+
+ DEBUG ((DEBUG_INFO, "Dump MemoryResource[] after sorted and
+ merged\n")); for (Index = 0; MemoryResource[Index].ResourceLength != 0; Index++) {
+ DEBUG ((
+ DEBUG_INFO,
+ " MemoryResource[0x%x] - Start(0x%0lx) Length(0x%0lx)\n",
+ Index,
+ MemoryResource[Index].PhysicalStart,
+ MemoryResource[Index].ResourceLength
+ ));
+ }
+
return MemoryResource;
}
--
2.7.0.windows.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] MdeModulePkg CapsulePei: Sort and merge memory resource entries
2017-12-04 10:00 [PATCH] MdeModulePkg CapsulePei: Sort and merge memory resource entries Star Zeng
2017-12-04 12:51 ` Chiu, Chasel
@ 2017-12-05 0:57 ` Yao, Jiewen
1 sibling, 0 replies; 3+ messages in thread
From: Yao, Jiewen @ 2017-12-05 0:57 UTC (permalink / raw)
To: Zeng, Star, edk2-devel@lists.01.org; +Cc: Chiu, Chasel, Chiang, Dakota
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 <star.zeng@intel.com>; Yao, Jiewen <jiewen.yao@intel.com>;
> Chiu, Chasel <chasel.chiu@intel.com>; Chiang, Dakota
> <dakota.chiang@intel.com>
> Subject: [PATCH] MdeModulePkg CapsulePei: Sort and merge memory resource
> entries
>
> 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.
>
> Cc: Jiewen Yao <jiewen.yao@intel.com>
> Cc: Chasel Chiu <chasel.chiu@intel.com>
> Cc: Dakota Chiang <dakota.chiang@intel.com>
> Tested-by: Dakota Chiang <dakota.chiang@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Star Zeng <star.zeng@intel.com>
> ---
> MdeModulePkg/Universal/CapsulePei/UefiCapsule.c | 90
> +++++++++++++++++++++++++
> 1 file changed, 90 insertions(+)
>
> 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
>
> /**
> + Sort memory resource entries based upon PhysicalStart, from low to high.
> +
> + @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 = MemoryResource;
> + NextMemoryResourceEntry = MemoryResource + 1;
> + while (MemoryResourceEntry->ResourceLength != 0) {
> + while (NextMemoryResourceEntry->ResourceLength != 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 = NextMemoryResourceEntry + 1;
> + }
> +
> + MemoryResourceEntry = MemoryResourceEntry + 1;
> + NextMemoryResourceEntry = 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 = MemoryResource;
> + NewMemoryResourceEntry = MemoryResource;
> + while (MemoryResourceEntry->ResourceLength != 0) {
> + CopyMem (NewMemoryResourceEntry, MemoryResourceEntry, sizeof
> (MEMORY_RESOURCE_DESCRIPTOR));
> + NextMemoryResourceEntry = MemoryResourceEntry + 1;
> +
> + while ((NextMemoryResourceEntry->ResourceLength != 0) &&
> + (NextMemoryResourceEntry->PhysicalStart ==
> (MemoryResourceEntry->PhysicalStart +
> MemoryResourceEntry->ResourceLength))) {
> + MemoryResourceEntry->ResourceLength +=
> NextMemoryResourceEntry->ResourceLength;
> + if (NewMemoryResourceEntry != MemoryResourceEntry) {
> + NewMemoryResourceEntry->ResourceLength +=
> NextMemoryResourceEntry->ResourceLength;
> + }
> +
> + NextMemoryResourceEntry = NextMemoryResourceEntry + 1;
> + }
> +
> + MemoryResourceEntry = NextMemoryResourceEntry;
> + NewMemoryResourceEntry = NewMemoryResourceEntry + 1;
> + }
> +
> + //
> + // Set NULL terminate memory resource descriptor after merging.
> + //
> + MemoryResourceEnd = NewMemoryResourceEntry;
> + ZeroMem (MemoryResourceEnd, sizeof
> (MEMORY_RESOURCE_DESCRIPTOR));
> +}
> +
> +/**
> Build memory resource descriptor from resource descriptor in HOB list.
>
> @return Pointer to the buffer of memory resource descriptor.
> @@ -704,6 +780,20 @@ BuildMemoryResourceDescriptor (
> Hob.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR,
> Hob.Raw);
> }
>
> + SortMemoryResourceDescriptor (MemoryResource);
> + MergeMemoryResourceDescriptor (MemoryResource);
> +
> + DEBUG ((DEBUG_INFO, "Dump MemoryResource[] after sorted and
> merged\n"));
> + for (Index = 0; MemoryResource[Index].ResourceLength != 0; Index++) {
> + DEBUG ((
> + DEBUG_INFO,
> + " MemoryResource[0x%x] - Start(0x%0lx) Length(0x%0lx)\n",
> + Index,
> + MemoryResource[Index].PhysicalStart,
> + MemoryResource[Index].ResourceLength
> + ));
> + }
> +
> return MemoryResource;
> }
>
> --
> 2.7.0.windows.1
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2017-12-05 0:53 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-12-04 10:00 [PATCH] MdeModulePkg CapsulePei: Sort and merge memory resource entries Star Zeng
2017-12-04 12:51 ` Chiu, Chasel
2017-12-05 0:57 ` Yao, Jiewen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox