#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
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
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
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDecompressionScratchEnd\r
gUefiOvmfPkgTokenSpaceGuid.PcdQ35TsegMbytes\r
gUefiOvmfPkgTokenSpaceGuid.PcdQ35SmramAtDefaultSmbase\r
+ gUefiOvmfPkgTokenSpaceGuid.PcdXenPvhStartOfDayStructPtr\r
+ gUefiOvmfPkgTokenSpaceGuid.PcdXenPvhStartOfDayStructPtrSize\r
gEfiMdePkgTokenSpaceGuid.PcdGuidedExtractHandlerTableAddress\r
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize\r
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize\r