]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg CapsulePei: Sort and merge memory resource entries
authorStar Zeng <star.zeng@intel.com>
Fri, 17 Nov 2017 05:56:37 +0000 (13:56 +0800)
committerStar Zeng <star.zeng@intel.com>
Tue, 5 Dec 2017 02:21:18 +0000 (10:21 +0800)
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>
MdeModulePkg/Universal/CapsulePei/UefiCapsule.c

index cca455ec396c6b28c73e8e470a4d484469695093..043365f7f770193ca2e02af507da9e1f614fd13d 100644 (file)
@@ -624,6 +624,82 @@ GetPhysicalAddressBits (
 }\r
 #endif\r
 \r
+/**\r
+  Sort memory resource entries based upon PhysicalStart, from low to high.\r
+\r
+  @param[in, out] MemoryResource    A pointer to the memory resource entry buffer.\r
+\r
+**/\r
+VOID\r
+SortMemoryResourceDescriptor (\r
+  IN OUT MEMORY_RESOURCE_DESCRIPTOR *MemoryResource\r
+  )\r
+{\r
+  MEMORY_RESOURCE_DESCRIPTOR        *MemoryResourceEntry;\r
+  MEMORY_RESOURCE_DESCRIPTOR        *NextMemoryResourceEntry;\r
+  MEMORY_RESOURCE_DESCRIPTOR        TempMemoryResource;\r
+\r
+  MemoryResourceEntry = MemoryResource;\r
+  NextMemoryResourceEntry = MemoryResource + 1;\r
+  while (MemoryResourceEntry->ResourceLength != 0) {\r
+    while (NextMemoryResourceEntry->ResourceLength != 0) {\r
+      if (MemoryResourceEntry->PhysicalStart > NextMemoryResourceEntry->PhysicalStart) {\r
+        CopyMem (&TempMemoryResource, MemoryResourceEntry, sizeof (MEMORY_RESOURCE_DESCRIPTOR));\r
+        CopyMem (MemoryResourceEntry, NextMemoryResourceEntry, sizeof (MEMORY_RESOURCE_DESCRIPTOR));\r
+        CopyMem (NextMemoryResourceEntry, &TempMemoryResource, sizeof (MEMORY_RESOURCE_DESCRIPTOR));\r
+      }\r
+\r
+      NextMemoryResourceEntry = NextMemoryResourceEntry + 1;\r
+    }\r
+\r
+    MemoryResourceEntry     = MemoryResourceEntry + 1;\r
+    NextMemoryResourceEntry = MemoryResourceEntry + 1;\r
+  }\r
+}\r
+\r
+/**\r
+  Merge continous memory resource entries.\r
+\r
+  @param[in, out] MemoryResource    A pointer to the memory resource entry buffer.\r
+\r
+**/\r
+VOID\r
+MergeMemoryResourceDescriptor (\r
+  IN OUT MEMORY_RESOURCE_DESCRIPTOR *MemoryResource\r
+  )\r
+{\r
+  MEMORY_RESOURCE_DESCRIPTOR        *MemoryResourceEntry;\r
+  MEMORY_RESOURCE_DESCRIPTOR        *NewMemoryResourceEntry;\r
+  MEMORY_RESOURCE_DESCRIPTOR        *NextMemoryResourceEntry;\r
+  MEMORY_RESOURCE_DESCRIPTOR        *MemoryResourceEnd;\r
+\r
+  MemoryResourceEntry = MemoryResource;\r
+  NewMemoryResourceEntry = MemoryResource;\r
+  while (MemoryResourceEntry->ResourceLength != 0) {\r
+    CopyMem (NewMemoryResourceEntry, MemoryResourceEntry, sizeof (MEMORY_RESOURCE_DESCRIPTOR));\r
+    NextMemoryResourceEntry = MemoryResourceEntry + 1;\r
+\r
+    while ((NextMemoryResourceEntry->ResourceLength != 0) &&\r
+           (NextMemoryResourceEntry->PhysicalStart == (MemoryResourceEntry->PhysicalStart + MemoryResourceEntry->ResourceLength))) {\r
+      MemoryResourceEntry->ResourceLength += NextMemoryResourceEntry->ResourceLength;\r
+      if (NewMemoryResourceEntry != MemoryResourceEntry) {\r
+        NewMemoryResourceEntry->ResourceLength += NextMemoryResourceEntry->ResourceLength;\r
+      }\r
\r
+      NextMemoryResourceEntry = NextMemoryResourceEntry + 1;\r
+    }\r
+\r
+    MemoryResourceEntry = NextMemoryResourceEntry;\r
+    NewMemoryResourceEntry = NewMemoryResourceEntry + 1;\r
+  }\r
+\r
+  //\r
+  // Set NULL terminate memory resource descriptor after merging.\r
+  //\r
+  MemoryResourceEnd = NewMemoryResourceEntry;\r
+  ZeroMem (MemoryResourceEnd, sizeof (MEMORY_RESOURCE_DESCRIPTOR));\r
+}\r
+\r
 /**\r
   Build memory resource descriptor from resource descriptor in HOB list.\r
 \r
@@ -704,6 +780,20 @@ BuildMemoryResourceDescriptor (
     Hob.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, Hob.Raw);\r
   }\r
 \r
+  SortMemoryResourceDescriptor (MemoryResource);\r
+  MergeMemoryResourceDescriptor (MemoryResource);\r
+\r
+  DEBUG ((DEBUG_INFO, "Dump MemoryResource[] after sorted and merged\n"));\r
+  for (Index = 0; MemoryResource[Index].ResourceLength != 0; Index++) {\r
+    DEBUG ((\r
+      DEBUG_INFO,\r
+      "  MemoryResource[0x%x] - Start(0x%0lx) Length(0x%0lx)\n",\r
+      Index,\r
+      MemoryResource[Index].PhysicalStart,\r
+      MemoryResource[Index].ResourceLength\r
+      ));\r
+  }\r
+\r
   return MemoryResource;\r
 }\r
 \r