]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/PlatformPei/MemDetect.c
OvmfPkg/PlatformPei: reserve the SMRAM at the default SMBASE, if it exists
[mirror_edk2.git] / OvmfPkg / PlatformPei / MemDetect.c
index 4879ee87b797613fe9f024fcf47cebca92d8632d..8fdc9c2ed7c9676163e5a3afa1518a0a15ddeaba 100644 (file)
@@ -646,6 +646,28 @@ PublishPeiMemory (
 }\r
 \r
 \r
+STATIC\r
+VOID\r
+QemuInitializeRamBelow1gb (\r
+  VOID\r
+  )\r
+{\r
+  if (FeaturePcdGet (PcdSmmSmramRequire) && mQ35SmramAtDefaultSmbase) {\r
+    AddMemoryRangeHob (0, SMM_DEFAULT_SMBASE);\r
+    AddReservedMemoryBaseSizeHob (SMM_DEFAULT_SMBASE, MCH_DEFAULT_SMBASE_SIZE,\r
+      TRUE /* Cacheable */);\r
+    STATIC_ASSERT (\r
+      SMM_DEFAULT_SMBASE + MCH_DEFAULT_SMBASE_SIZE < BASE_512KB + BASE_128KB,\r
+      "end of SMRAM at default SMBASE ends at, or exceeds, 640KB"\r
+      );\r
+    AddMemoryRangeHob (SMM_DEFAULT_SMBASE + MCH_DEFAULT_SMBASE_SIZE,\r
+      BASE_512KB + BASE_128KB);\r
+  } else {\r
+    AddMemoryRangeHob (0, BASE_512KB + BASE_128KB);\r
+  }\r
+}\r
+\r
+\r
 /**\r
   Peform Memory Detection for QEMU / KVM\r
 \r
@@ -690,12 +712,12 @@ QemuInitializeRam (
     // allocation HOBs, and to honor preexistent memory allocation HOBs when\r
     // looking for an area to borrow.\r
     //\r
-    AddMemoryRangeHob (0, BASE_512KB + BASE_128KB);\r
+    QemuInitializeRamBelow1gb ();\r
   } else {\r
     //\r
     // Create memory HOBs\r
     //\r
-    AddMemoryRangeHob (0, BASE_512KB + BASE_128KB);\r
+    QemuInitializeRamBelow1gb ();\r
 \r
     if (FeaturePcdGet (PcdSmmSmramRequire)) {\r
       UINT32 TsegSize;\r
@@ -861,6 +883,17 @@ InitializeRamRegions (
         TsegSize,\r
         EfiReservedMemoryType\r
         );\r
+      //\r
+      // Similarly, allocate away the (already reserved) SMRAM at the default\r
+      // SMBASE, if it exists.\r
+      //\r
+      if (mQ35SmramAtDefaultSmbase) {\r
+        BuildMemoryAllocationHob (\r
+          SMM_DEFAULT_SMBASE,\r
+          MCH_DEFAULT_SMBASE_SIZE,\r
+          EfiReservedMemoryType\r
+          );\r
+      }\r
     }\r
   }\r
 }\r