]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/PlatformPei/MemDetect.c
OvmfPkg: CloudHv: Rely on PVH memmap instead of CMOS
[mirror_edk2.git] / OvmfPkg / PlatformPei / MemDetect.c
index 1bcb5a08bca640e24ed1cf9ea0e81e7114f10328..8ecc8257f9b9315f56e7d479424969a6fa19c201 100644 (file)
@@ -17,6 +17,7 @@ Module Name:
 #include <IndustryStandard/I440FxPiix4.h>\r
 #include <IndustryStandard/Q35MchIch9.h>\r
 #include <IndustryStandard/CloudHv.h>\r
+#include <IndustryStandard/Xen/arch-x86/hvm/start_info.h>\r
 #include <PiPei.h>\r
 #include <Register/Intel/SmramSaveStateMap.h>\r
 \r
@@ -315,6 +316,73 @@ ScanOrAdd64BitE820Ram (
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Returns PVH memmap\r
+\r
+  @param Entries      Pointer to PVH memmap\r
+  @param Count        Number of entries\r
+\r
+  @return EFI_STATUS\r
+**/\r
+EFI_STATUS\r
+GetPvhMemmapEntries (\r
+  struct hvm_memmap_table_entry  **Entries,\r
+  UINT32                         *Count\r
+  )\r
+{\r
+  UINT32                 *PVHResetVectorData;\r
+  struct hvm_start_info  *pvh_start_info;\r
+\r
+  PVHResetVectorData = (VOID *)(UINTN)PcdGet32 (PcdXenPvhStartOfDayStructPtr);\r
+  if (PVHResetVectorData == 0) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+\r
+  pvh_start_info = (struct hvm_start_info *)(UINTN)PVHResetVectorData[0];\r
+\r
+  *Entries = (struct hvm_memmap_table_entry *)(UINTN)pvh_start_info->memmap_paddr;\r
+  *Count   = pvh_start_info->memmap_entries;\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+STATIC\r
+UINT64\r
+GetHighestSystemMemoryAddressFromPvhMemmap (\r
+  BOOLEAN  Below4gb\r
+  )\r
+{\r
+  struct hvm_memmap_table_entry  *Memmap;\r
+  UINT32                         MemmapEntriesCount;\r
+  struct hvm_memmap_table_entry  *Entry;\r
+  EFI_STATUS                     Status;\r
+  UINT32                         Loop;\r
+  UINT64                         HighestAddress;\r
+  UINT64                         EntryEnd;\r
+\r
+  HighestAddress = 0;\r
+\r
+  Status = GetPvhMemmapEntries (&Memmap, &MemmapEntriesCount);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  for (Loop = 0; Loop < MemmapEntriesCount; Loop++) {\r
+    Entry    = Memmap + Loop;\r
+    EntryEnd = Entry->addr + Entry->size;\r
+\r
+    if ((Entry->type == XEN_HVM_MEMMAP_TYPE_RAM) &&\r
+        (EntryEnd > HighestAddress))\r
+    {\r
+      if (Below4gb && (EntryEnd <= BASE_4GB)) {\r
+        HighestAddress = EntryEnd;\r
+      } else if (!Below4gb && (EntryEnd >= BASE_4GB)) {\r
+        HighestAddress = EntryEnd;\r
+      }\r
+    }\r
+  }\r
+\r
+  return HighestAddress;\r
+}\r
+\r
 UINT32\r
 GetSystemMemorySizeBelow4gb (\r
   VOID\r
@@ -325,6 +393,11 @@ GetSystemMemorySizeBelow4gb (
   UINT8       Cmos0x34;\r
   UINT8       Cmos0x35;\r
 \r
+  if (mHostBridgeDevId == CLOUDHV_DEVICE_ID) {\r
+    // Get the information from PVH memmap\r
+    return (UINT32)GetHighestSystemMemoryAddressFromPvhMemmap (TRUE);\r
+  }\r
+\r
   Status = ScanOrAdd64BitE820Ram (FALSE, &LowerMemorySize, NULL);\r
   if ((Status == EFI_SUCCESS) && (LowerMemorySize > 0)) {\r
     return (UINT32)LowerMemorySize;\r