mirror of https://github.com/acidanthera/audk.git
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:
parent
37de70b764
commit
032de38a07
|
@ -624,6 +624,82 @@ GetPhysicalAddressBits (
|
||||||
}
|
}
|
||||||
#endif
|
#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.
|
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);
|
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;
|
return MemoryResource;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue