]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg: CloudHv: Rely on PVH memmap instead of CMOS
authorSebastien Boeuf <sebastien.boeuf@intel.com>
Wed, 2 Mar 2022 13:31:36 +0000 (21:31 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Fri, 4 Mar 2022 02:41:57 +0000 (02:41 +0000)
Instead of using the CMOS, the CloudHv platform relies on the list of
memmap entries provided through the PVH boot protocol to determine the
last RAM address below 4G.

Acked-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
OvmfPkg/PlatformPei/MemDetect.c
OvmfPkg/PlatformPei/PlatformPei.inf

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
index 8ef404168c4530e9ae619295bba48300eaa37843..212aa7b04751fd5a931274f8b0d903b5de4e6858 100644 (file)
@@ -91,6 +91,8 @@
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDecompressionScratchEnd\r
   gUefiOvmfPkgTokenSpaceGuid.PcdQ35TsegMbytes\r
   gUefiOvmfPkgTokenSpaceGuid.PcdQ35SmramAtDefaultSmbase\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdXenPvhStartOfDayStructPtr\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdXenPvhStartOfDayStructPtrSize\r
   gEfiMdePkgTokenSpaceGuid.PcdGuidedExtractHandlerTableAddress\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize\r