mirror of
https://github.com/acidanthera/audk.git
synced 2025-04-07 19:45:07 +02:00
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 <tbarrett@crusoeenergy.com> Acked-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
195e59bd0c
commit
bfad87ceec
@ -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 (
|
||||
|
Loading…
x
Reference in New Issue
Block a user