mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-27 07:34:06 +02:00
ArmPkg/BdsLib: Fix GetSystemMemoryResources()
The function was not correctly merging the system memory chunks. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11479 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
bad880b172
commit
cf3a77a02a
@ -103,57 +103,97 @@ BdsConnectAllDrivers( VOID ) {
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC EFI_STATUS InsertSystemMemoryResources(LIST_ENTRY *ResourceList, EFI_HOB_RESOURCE_DESCRIPTOR *ResHob) {
|
STATIC
|
||||||
BDS_SYSTEM_MEMORY_RESOURCE NewResource;
|
EFI_STATUS
|
||||||
|
InsertSystemMemoryResources (
|
||||||
|
LIST_ENTRY *ResourceList,
|
||||||
|
EFI_HOB_RESOURCE_DESCRIPTOR *ResHob
|
||||||
|
)
|
||||||
|
{
|
||||||
|
BDS_SYSTEM_MEMORY_RESOURCE *NewResource;
|
||||||
LIST_ENTRY *Link;
|
LIST_ENTRY *Link;
|
||||||
|
LIST_ENTRY *NextLink;
|
||||||
|
LIST_ENTRY AttachedResources;
|
||||||
BDS_SYSTEM_MEMORY_RESOURCE *Resource;
|
BDS_SYSTEM_MEMORY_RESOURCE *Resource;
|
||||||
|
EFI_PHYSICAL_ADDRESS NewResourceEnd;
|
||||||
//DEBUG ((EFI_D_ERROR, "** InsertSystemMemoryResources(0x%X,0x%X)\n",(UINT32)ResHob->PhysicalStart,(UINT32)ResHob->ResourceLength));
|
|
||||||
|
|
||||||
if (IsListEmpty (ResourceList)) {
|
if (IsListEmpty (ResourceList)) {
|
||||||
ZeroMem(&NewResource,sizeof(BDS_SYSTEM_MEMORY_RESOURCE));
|
NewResource = AllocateZeroPool (sizeof(BDS_SYSTEM_MEMORY_RESOURCE));
|
||||||
NewResource.PhysicalStart = ResHob->PhysicalStart;
|
NewResource->PhysicalStart = ResHob->PhysicalStart;
|
||||||
NewResource.ResourceLength = ResHob->ResourceLength;
|
NewResource->ResourceLength = ResHob->ResourceLength;
|
||||||
InsertTailList (ResourceList, &NewResource.Link);
|
InsertTailList (ResourceList, &NewResource->Link);
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
//for (Link = GetFirstNode (ResourceList); !IsNull (ResourceList,Link); Link = GetNextNode (ResourceList,Link)) {
|
InitializeListHead (&AttachedResources);
|
||||||
|
|
||||||
Link = ResourceList->ForwardLink;
|
Link = ResourceList->ForwardLink;
|
||||||
while (Link != NULL && Link != ResourceList) {
|
ASSERT (Link != NULL);
|
||||||
|
while (Link != ResourceList) {
|
||||||
Resource = (BDS_SYSTEM_MEMORY_RESOURCE*)Link;
|
Resource = (BDS_SYSTEM_MEMORY_RESOURCE*)Link;
|
||||||
//DEBUG ((EFI_D_ERROR, " - (0x%X,0x%X)\n",(UINT32)Resource->PhysicalStart,(UINT32)Resource->ResourceLength));
|
|
||||||
|
|
||||||
// Sanity Check. The resources should not overlapped.
|
// Sanity Check. The resources should not overlapped.
|
||||||
ASSERT(!((ResHob->PhysicalStart >= Resource->PhysicalStart) && (ResHob->PhysicalStart < (Resource->PhysicalStart + Resource->ResourceLength))));
|
ASSERT(!((ResHob->PhysicalStart >= Resource->PhysicalStart) && (ResHob->PhysicalStart < (Resource->PhysicalStart + Resource->ResourceLength))));
|
||||||
ASSERT(!((ResHob->PhysicalStart + ResHob->ResourceLength >= Resource->PhysicalStart) &&
|
ASSERT(!((ResHob->PhysicalStart + ResHob->ResourceLength - 1 >= Resource->PhysicalStart) &&
|
||||||
((ResHob->PhysicalStart + ResHob->ResourceLength) < (Resource->PhysicalStart + Resource->ResourceLength))));
|
((ResHob->PhysicalStart + ResHob->ResourceLength - 1) < (Resource->PhysicalStart + Resource->ResourceLength))));
|
||||||
|
|
||||||
// The new resource is attached after this resource descriptor
|
// The new resource is attached after this resource descriptor
|
||||||
if (ResHob->PhysicalStart == Resource->PhysicalStart + Resource->ResourceLength) {
|
if (ResHob->PhysicalStart == Resource->PhysicalStart + Resource->ResourceLength) {
|
||||||
Resource->ResourceLength = Resource->ResourceLength + ResHob->ResourceLength;
|
Resource->ResourceLength = Resource->ResourceLength + ResHob->ResourceLength;
|
||||||
//DEBUG ((EFI_D_ERROR, "** Attached new Length:0x%X\n",(UINT32)Resource->ResourceLength));
|
|
||||||
return EFI_SUCCESS;
|
NextLink = RemoveEntryList (&Resource->Link);
|
||||||
|
InsertTailList (&AttachedResources, &Resource->Link);
|
||||||
|
Link = NextLink;
|
||||||
}
|
}
|
||||||
// The new resource is attached before this resource descriptor
|
// The new resource is attached before this resource descriptor
|
||||||
else if (ResHob->PhysicalStart + ResHob->ResourceLength == Resource->PhysicalStart) {
|
else if (ResHob->PhysicalStart + ResHob->ResourceLength == Resource->PhysicalStart) {
|
||||||
Resource->PhysicalStart = ResHob->PhysicalStart;
|
Resource->PhysicalStart = ResHob->PhysicalStart;
|
||||||
Resource->ResourceLength = Resource->ResourceLength + ResHob->ResourceLength;
|
Resource->ResourceLength = Resource->ResourceLength + ResHob->ResourceLength;
|
||||||
//DEBUG ((EFI_D_ERROR, "** Attached2 new Length:0x%X\n",(UINT32)Resource->ResourceLength));
|
|
||||||
return EFI_SUCCESS;
|
NextLink = RemoveEntryList (&Resource->Link);
|
||||||
}
|
InsertTailList (&AttachedResources, &Resource->Link);
|
||||||
|
Link = NextLink;
|
||||||
|
} else {
|
||||||
Link = Link->ForwardLink;
|
Link = Link->ForwardLink;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!IsListEmpty (&AttachedResources)) {
|
||||||
|
// See if we can merge the attached resource with other resources
|
||||||
|
|
||||||
|
NewResource = (BDS_SYSTEM_MEMORY_RESOURCE*)GetFirstNode (&AttachedResources);
|
||||||
|
Link = RemoveEntryList (&NewResource->Link);
|
||||||
|
while (!IsListEmpty (&AttachedResources)) {
|
||||||
|
// Merge resources
|
||||||
|
Resource = (BDS_SYSTEM_MEMORY_RESOURCE*)Link;
|
||||||
|
|
||||||
|
// Ensure they overlap each other
|
||||||
|
ASSERT(
|
||||||
|
((NewResource->PhysicalStart >= Resource->PhysicalStart) && (NewResource->PhysicalStart < (Resource->PhysicalStart + Resource->ResourceLength))) ||
|
||||||
|
(((NewResource->PhysicalStart + NewResource->ResourceLength) >= Resource->PhysicalStart) && ((NewResource->PhysicalStart + NewResource->ResourceLength) < (Resource->PhysicalStart + Resource->ResourceLength)))
|
||||||
|
);
|
||||||
|
|
||||||
|
NewResourceEnd = MAX (NewResource->PhysicalStart + NewResource->ResourceLength, Resource->PhysicalStart + Resource->ResourceLength);
|
||||||
|
NewResource->PhysicalStart = MIN (NewResource->PhysicalStart, Resource->PhysicalStart);
|
||||||
|
NewResource->ResourceLength = NewResourceEnd - NewResource->PhysicalStart;
|
||||||
|
|
||||||
|
Link = RemoveEntryList (Link);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
// None of the Resource of the list is attached to this ResHob. Create a new entry for it
|
// None of the Resource of the list is attached to this ResHob. Create a new entry for it
|
||||||
ZeroMem(&NewResource,sizeof(BDS_SYSTEM_MEMORY_RESOURCE));
|
NewResource = AllocateZeroPool (sizeof(BDS_SYSTEM_MEMORY_RESOURCE));
|
||||||
NewResource.PhysicalStart = ResHob->PhysicalStart;
|
NewResource->PhysicalStart = ResHob->PhysicalStart;
|
||||||
NewResource.ResourceLength = ResHob->ResourceLength;
|
NewResource->ResourceLength = ResHob->ResourceLength;
|
||||||
InsertTailList (ResourceList, &NewResource.Link);
|
}
|
||||||
|
InsertTailList (ResourceList, &NewResource->Link);
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS GetSystemMemoryResources(LIST_ENTRY *ResourceList) {
|
EFI_STATUS
|
||||||
|
GetSystemMemoryResources (
|
||||||
|
IN LIST_ENTRY *ResourceList
|
||||||
|
)
|
||||||
|
{
|
||||||
EFI_HOB_RESOURCE_DESCRIPTOR *ResHob;
|
EFI_HOB_RESOURCE_DESCRIPTOR *ResHob;
|
||||||
|
|
||||||
InitializeListHead (ResourceList);
|
InitializeListHead (ResourceList);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user