From bfad87ceec39eae9f836a5e2c9597948fc1a7395 Mon Sep 17 00:00:00 2001 From: Thomas Barrett Date: Fri, 12 Jan 2024 18:31:42 +0000 Subject: [PATCH] OvmfPkg: Add CloudHv support to PlatformScanE820 utility function. The PlatformScanE820 utility function is not currently compatible with CloudHv since it relies on the prescence of the "etc/e820" QemuFwCfg file. Update the PlatformScanE820 to iterate through the PVH e820 entries when running on a CloudHv guest. Signed-off-by: Thomas Barrett Acked-by: Gerd Hoffmann --- OvmfPkg/Library/PlatformInitLib/MemDetect.c | 95 ++++++++++++++------- 1 file changed, 65 insertions(+), 30 deletions(-) diff --git a/OvmfPkg/Library/PlatformInitLib/MemDetect.c b/OvmfPkg/Library/PlatformInitLib/MemDetect.c index 662e7e85bb..76a9dc9211 100644 --- a/OvmfPkg/Library/PlatformInitLib/MemDetect.c +++ b/OvmfPkg/Library/PlatformInitLib/MemDetect.c @@ -248,6 +248,67 @@ PlatformReservationConflictCB ( PlatformInfoHob->PcdPciMmio64Base = NewBase; } +/** + Returns PVH memmap + @param Entries Pointer to PVH memmap + @param Count Number of entries + @return EFI_STATUS +**/ +EFI_STATUS +GetPvhMemmapEntries ( + struct hvm_memmap_table_entry **Entries, + UINT32 *Count + ) +{ + UINT32 *PVHResetVectorData; + struct hvm_start_info *pvh_start_info; + + PVHResetVectorData = (VOID *)(UINTN)PcdGet32 (PcdXenPvhStartOfDayStructPtr); + if (PVHResetVectorData == 0) { + return EFI_NOT_FOUND; + } + + pvh_start_info = (struct hvm_start_info *)(UINTN)PVHResetVectorData[0]; + + *Entries = (struct hvm_memmap_table_entry *)(UINTN)pvh_start_info->memmap_paddr; + *Count = pvh_start_info->memmap_entries; + + return EFI_SUCCESS; +} + +STATIC +EFI_STATUS +PlatformScanE820Pvh ( + IN E820_SCAN_CALLBACK Callback, + IN OUT EFI_HOB_PLATFORM_INFO *PlatformInfoHob + ) +{ + struct hvm_memmap_table_entry *Memmap; + UINT32 MemmapEntriesCount; + struct hvm_memmap_table_entry *Entry; + EFI_E820_ENTRY64 E820Entry; + EFI_STATUS Status; + UINT32 Loop; + + Status = GetPvhMemmapEntries (&Memmap, &MemmapEntriesCount); + if (EFI_ERROR (Status)) { + return Status; + } + + for (Loop = 0; Loop < MemmapEntriesCount; Loop++) { + Entry = Memmap + Loop; + + if (Entry->type == XEN_HVM_MEMMAP_TYPE_RAM) { + E820Entry.BaseAddr = Entry->addr; + E820Entry.Length = Entry->size; + E820Entry.Type = Entry->type; + Callback (&E820Entry, PlatformInfoHob); + } + } + + return EFI_SUCCESS; +} + /** Iterate over the entries in QEMU's fw_cfg E820 RAM map, call the passed callback for each entry. @@ -279,6 +340,10 @@ PlatformScanE820 ( EFI_E820_ENTRY64 E820Entry; UINTN Processed; + if (PlatformInfoHob->HostBridgeDevId == CLOUDHV_DEVICE_ID) { + return PlatformScanE820Pvh (Callback, PlatformInfoHob); + } + Status = QemuFwCfgFindFile ("etc/e820", &FwCfgItem, &FwCfgSize); if (EFI_ERROR (Status)) { return Status; @@ -297,36 +362,6 @@ PlatformScanE820 ( return EFI_SUCCESS; } -/** - Returns PVH memmap - - @param Entries Pointer to PVH memmap - @param Count Number of entries - - @return EFI_STATUS -**/ -EFI_STATUS -GetPvhMemmapEntries ( - struct hvm_memmap_table_entry **Entries, - UINT32 *Count - ) -{ - UINT32 *PVHResetVectorData; - struct hvm_start_info *pvh_start_info; - - PVHResetVectorData = (VOID *)(UINTN)PcdGet32 (PcdXenPvhStartOfDayStructPtr); - if (PVHResetVectorData == 0) { - return EFI_NOT_FOUND; - } - - pvh_start_info = (struct hvm_start_info *)(UINTN)PVHResetVectorData[0]; - - *Entries = (struct hvm_memmap_table_entry *)(UINTN)pvh_start_info->memmap_paddr; - *Count = pvh_start_info->memmap_entries; - - return EFI_SUCCESS; -} - STATIC UINT64 GetHighestSystemMemoryAddressFromPvhMemmap (