return EFI_SUCCESS;\r
}\r
\r
-STATIC EFI_STATUS InsertSystemMemoryResources(LIST_ENTRY *ResourceList, EFI_HOB_RESOURCE_DESCRIPTOR *ResHob) {\r
- BDS_SYSTEM_MEMORY_RESOURCE NewResource;\r
- LIST_ENTRY *Link;\r
- BDS_SYSTEM_MEMORY_RESOURCE *Resource;\r
-\r
- //DEBUG ((EFI_D_ERROR, "** InsertSystemMemoryResources(0x%X,0x%X)\n",(UINT32)ResHob->PhysicalStart,(UINT32)ResHob->ResourceLength));\r
-\r
- if (IsListEmpty (ResourceList)) {\r
- ZeroMem(&NewResource,sizeof(BDS_SYSTEM_MEMORY_RESOURCE));\r
- NewResource.PhysicalStart = ResHob->PhysicalStart;\r
- NewResource.ResourceLength = ResHob->ResourceLength;\r
- InsertTailList (ResourceList, &NewResource.Link);\r
- return EFI_SUCCESS;\r
- }\r
+STATIC\r
+EFI_STATUS\r
+InsertSystemMemoryResources (\r
+ LIST_ENTRY *ResourceList,\r
+ EFI_HOB_RESOURCE_DESCRIPTOR *ResHob\r
+ )\r
+{\r
+ BDS_SYSTEM_MEMORY_RESOURCE *NewResource;\r
+ LIST_ENTRY *Link;\r
+ LIST_ENTRY *NextLink;\r
+ LIST_ENTRY AttachedResources;\r
+ BDS_SYSTEM_MEMORY_RESOURCE *Resource;\r
+ EFI_PHYSICAL_ADDRESS NewResourceEnd;\r
+\r
+ if (IsListEmpty (ResourceList)) {\r
+ NewResource = AllocateZeroPool (sizeof(BDS_SYSTEM_MEMORY_RESOURCE));\r
+ NewResource->PhysicalStart = ResHob->PhysicalStart;\r
+ NewResource->ResourceLength = ResHob->ResourceLength;\r
+ InsertTailList (ResourceList, &NewResource->Link);\r
+ return EFI_SUCCESS;\r
+ }\r
\r
- //for (Link = GetFirstNode (ResourceList); !IsNull (ResourceList,Link); Link = GetNextNode (ResourceList,Link)) {\r
- Link = ResourceList->ForwardLink;\r
- while (Link != NULL && Link != ResourceList) {\r
- Resource = (BDS_SYSTEM_MEMORY_RESOURCE*)Link;\r
- //DEBUG ((EFI_D_ERROR, " - (0x%X,0x%X)\n",(UINT32)Resource->PhysicalStart,(UINT32)Resource->ResourceLength));\r
-\r
- // Sanity Check. The resources should not overlapped.\r
- ASSERT(!((ResHob->PhysicalStart >= Resource->PhysicalStart) && (ResHob->PhysicalStart < (Resource->PhysicalStart + Resource->ResourceLength))));\r
- ASSERT(!((ResHob->PhysicalStart + ResHob->ResourceLength >= Resource->PhysicalStart) &&\r
- ((ResHob->PhysicalStart + ResHob->ResourceLength) < (Resource->PhysicalStart + Resource->ResourceLength))));\r
-\r
- // The new resource is attached after this resource descriptor\r
- if (ResHob->PhysicalStart == Resource->PhysicalStart + Resource->ResourceLength) {\r
- Resource->ResourceLength = Resource->ResourceLength + ResHob->ResourceLength;\r
- //DEBUG ((EFI_D_ERROR, "** Attached new Length:0x%X\n",(UINT32)Resource->ResourceLength));\r
- return EFI_SUCCESS;\r
- }\r
- // The new resource is attached before this resource descriptor\r
- else if (ResHob->PhysicalStart + ResHob->ResourceLength == Resource->PhysicalStart) {\r
- Resource->PhysicalStart = ResHob->PhysicalStart;\r
- Resource->ResourceLength = Resource->ResourceLength + ResHob->ResourceLength;\r
- //DEBUG ((EFI_D_ERROR, "** Attached2 new Length:0x%X\n",(UINT32)Resource->ResourceLength));\r
- return EFI_SUCCESS;\r
- }\r
- Link = Link->ForwardLink;\r
- }\r
+ InitializeListHead (&AttachedResources);\r
\r
- // None of the Resource of the list is attached to this ResHob. Create a new entry for it\r
- ZeroMem(&NewResource,sizeof(BDS_SYSTEM_MEMORY_RESOURCE));\r
- NewResource.PhysicalStart = ResHob->PhysicalStart;\r
- NewResource.ResourceLength = ResHob->ResourceLength;\r
- InsertTailList (ResourceList, &NewResource.Link);\r
- return EFI_SUCCESS;\r
-}\r
+ Link = ResourceList->ForwardLink;\r
+ ASSERT (Link != NULL);\r
+ while (Link != ResourceList) {\r
+ Resource = (BDS_SYSTEM_MEMORY_RESOURCE*)Link;\r
\r
-EFI_STATUS GetSystemMemoryResources(LIST_ENTRY *ResourceList) {\r
- EFI_HOB_RESOURCE_DESCRIPTOR *ResHob;\r
+ // Sanity Check. The resources should not overlapped.\r
+ ASSERT(!((ResHob->PhysicalStart >= Resource->PhysicalStart) && (ResHob->PhysicalStart < (Resource->PhysicalStart + Resource->ResourceLength))));\r
+ ASSERT(!((ResHob->PhysicalStart + ResHob->ResourceLength - 1 >= Resource->PhysicalStart) &&\r
+ ((ResHob->PhysicalStart + ResHob->ResourceLength - 1) < (Resource->PhysicalStart + Resource->ResourceLength))));\r
\r
- InitializeListHead (ResourceList);\r
- \r
- // Find the first System Memory Resource Descriptor\r
- ResHob = (EFI_HOB_RESOURCE_DESCRIPTOR *)GetFirstHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR);\r
- while ((ResHob != NULL) && (ResHob->ResourceType != EFI_RESOURCE_SYSTEM_MEMORY)) {\r
- ResHob = (EFI_HOB_RESOURCE_DESCRIPTOR *)GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR,(VOID *)((UINTN)ResHob + ResHob->Header.HobLength)); \r
- }\r
+ // The new resource is attached after this resource descriptor\r
+ if (ResHob->PhysicalStart == Resource->PhysicalStart + Resource->ResourceLength) {\r
+ Resource->ResourceLength = Resource->ResourceLength + ResHob->ResourceLength;\r
\r
- // Did not find any\r
- if (ResHob == NULL) {\r
- return EFI_NOT_FOUND;\r
+ NextLink = RemoveEntryList (&Resource->Link);\r
+ InsertTailList (&AttachedResources, &Resource->Link);\r
+ Link = NextLink;\r
+ }\r
+ // The new resource is attached before this resource descriptor\r
+ else if (ResHob->PhysicalStart + ResHob->ResourceLength == Resource->PhysicalStart) {\r
+ Resource->PhysicalStart = ResHob->PhysicalStart;\r
+ Resource->ResourceLength = Resource->ResourceLength + ResHob->ResourceLength;\r
+\r
+ NextLink = RemoveEntryList (&Resource->Link);\r
+ InsertTailList (&AttachedResources, &Resource->Link);\r
+ Link = NextLink;\r
} else {\r
- InsertSystemMemoryResources(ResourceList, ResHob);\r
+ Link = Link->ForwardLink;\r
}\r
+ }\r
\r
- ResHob = (EFI_HOB_RESOURCE_DESCRIPTOR *)GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR,(VOID *)((UINTN)ResHob + ResHob->Header.HobLength)); \r
- while (ResHob != NULL) {\r
- if (ResHob->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) {\r
- InsertSystemMemoryResources(ResourceList, ResHob);\r
- }\r
- ResHob = (EFI_HOB_RESOURCE_DESCRIPTOR *)GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR,(VOID *)((UINTN)ResHob + ResHob->Header.HobLength)); \r
+ if (!IsListEmpty (&AttachedResources)) {\r
+ // See if we can merge the attached resource with other resources\r
+\r
+ NewResource = (BDS_SYSTEM_MEMORY_RESOURCE*)GetFirstNode (&AttachedResources);\r
+ Link = RemoveEntryList (&NewResource->Link);\r
+ while (!IsListEmpty (&AttachedResources)) {\r
+ // Merge resources\r
+ Resource = (BDS_SYSTEM_MEMORY_RESOURCE*)Link;\r
+\r
+ // Ensure they overlap each other\r
+ ASSERT(\r
+ ((NewResource->PhysicalStart >= Resource->PhysicalStart) && (NewResource->PhysicalStart < (Resource->PhysicalStart + Resource->ResourceLength))) ||\r
+ (((NewResource->PhysicalStart + NewResource->ResourceLength) >= Resource->PhysicalStart) && ((NewResource->PhysicalStart + NewResource->ResourceLength) < (Resource->PhysicalStart + Resource->ResourceLength)))\r
+ );\r
+\r
+ NewResourceEnd = MAX (NewResource->PhysicalStart + NewResource->ResourceLength, Resource->PhysicalStart + Resource->ResourceLength);\r
+ NewResource->PhysicalStart = MIN (NewResource->PhysicalStart, Resource->PhysicalStart);\r
+ NewResource->ResourceLength = NewResourceEnd - NewResource->PhysicalStart;\r
+\r
+ Link = RemoveEntryList (Link);\r
+ }\r
+ } else {\r
+ // None of the Resource of the list is attached to this ResHob. Create a new entry for it\r
+ NewResource = AllocateZeroPool (sizeof(BDS_SYSTEM_MEMORY_RESOURCE));\r
+ NewResource->PhysicalStart = ResHob->PhysicalStart;\r
+ NewResource->ResourceLength = ResHob->ResourceLength;\r
+ }\r
+ InsertTailList (ResourceList, &NewResource->Link);\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+GetSystemMemoryResources (\r
+ IN LIST_ENTRY *ResourceList\r
+ )\r
+{\r
+ EFI_HOB_RESOURCE_DESCRIPTOR *ResHob;\r
+\r
+ InitializeListHead (ResourceList);\r
+\r
+ // Find the first System Memory Resource Descriptor\r
+ ResHob = (EFI_HOB_RESOURCE_DESCRIPTOR *)GetFirstHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR);\r
+ while ((ResHob != NULL) && (ResHob->ResourceType != EFI_RESOURCE_SYSTEM_MEMORY)) {\r
+ ResHob = (EFI_HOB_RESOURCE_DESCRIPTOR *)GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR,(VOID *)((UINTN)ResHob + ResHob->Header.HobLength));\r
+ }\r
+\r
+ // Did not find any\r
+ if (ResHob == NULL) {\r
+ return EFI_NOT_FOUND;\r
+ } else {\r
+ InsertSystemMemoryResources (ResourceList, ResHob);\r
+ }\r
+\r
+ ResHob = (EFI_HOB_RESOURCE_DESCRIPTOR *)GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR,(VOID *)((UINTN)ResHob + ResHob->Header.HobLength));\r
+ while (ResHob != NULL) {\r
+ if (ResHob->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) {\r
+ InsertSystemMemoryResources (ResourceList, ResHob);\r
}\r
+ ResHob = (EFI_HOB_RESOURCE_DESCRIPTOR *)GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR,(VOID *)((UINTN)ResHob + ResHob->Header.HobLength));\r
+ }\r
\r
- return EFI_SUCCESS;\r
+ return EFI_SUCCESS;\r
}\r