]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ArmPkg/BdsLib: Fix GetSystemMemoryResources()
authoroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 31 Mar 2011 12:17:37 +0000 (12:17 +0000)
committeroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 31 Mar 2011 12:17:37 +0000 (12:17 +0000)
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

ArmPkg/Library/BdsLib/BdsHelper.c

index 896ae73820769570f6c9cc4f71025611fa336811..88e8fa34533c18069e0be2281463e9b91a51e600 100644 (file)
@@ -103,81 +103,121 @@ BdsConnectAllDrivers( VOID ) {
     return EFI_SUCCESS;\r
 }\r
 \r
     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
 \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
 \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
 \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
 \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
 \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
     } else {\r
-        InsertSystemMemoryResources(ResourceList, ResHob);\r
+      Link = Link->ForwardLink;\r
     }\r
     }\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
     }\r
+    ResHob = (EFI_HOB_RESOURCE_DESCRIPTOR *)GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR,(VOID *)((UINTN)ResHob + ResHob->Header.HobLength));\r
+  }\r
 \r
 \r
-    return EFI_SUCCESS;\r
+  return EFI_SUCCESS;\r
 }\r
 }\r