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>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
Reviewed-by: Chasel Chiu <chasel.chiu@intel.com>
This commit is contained in:
Star Zeng 2017-11-17 13:56:37 +08:00
parent 37de70b764
commit 032de38a07
1 changed files with 90 additions and 0 deletions

View File

@ -624,6 +624,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.
@ -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;
}