diff --git a/OvmfPkg/Library/PlatformInitLib/MemDetect.c b/OvmfPkg/Library/PlatformInitLib/MemDetect.c index bd6c79e4e4e48..d313925a226c1 100644 --- a/OvmfPkg/Library/PlatformInitLib/MemDetect.c +++ b/OvmfPkg/Library/PlatformInitLib/MemDetect.c @@ -107,6 +107,34 @@ typedef VOID (*E820_SCAN_CALLBACK) ( EFI_HOB_PLATFORM_INFO *PlatformInfoHob ); +STATIC +EFI_STATUS +PlatformScanE820Tdx ( + IN E820_SCAN_CALLBACK Callback, + IN OUT EFI_HOB_PLATFORM_INFO *PlatformInfoHob + ) +{ + EFI_E820_ENTRY64 E820Entry; + EFI_PEI_HOB_POINTERS Hob; + + Hob.Raw = (UINT8 *)(UINTN)FixedPcdGet32 (PcdOvmfSecGhcbBase); + + while (!END_OF_HOB_LIST (Hob)) { + if (Hob.Header->HobType == EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) { + if (Hob.ResourceDescriptor->ResourceType != EFI_RESOURCE_MEMORY_MAPPED_IO) { + E820Entry.BaseAddr = Hob.ResourceDescriptor->PhysicalStart; + E820Entry.Length = Hob.ResourceDescriptor->ResourceLength; + E820Entry.Type = EfiAcpiAddressRangeMemory; + Callback (&E820Entry, PlatformInfoHob); + } + } + + Hob.Raw = (UINT8 *)(Hob.Raw + Hob.Header->HobLength); + } + + return EFI_SUCCESS; +} + /** Store first address not used by e820 RAM entries in PlatformInfoHob->FirstNonAddress @@ -347,6 +375,10 @@ PlatformScanE820 ( return PlatformScanE820Pvh (Callback, PlatformInfoHob); } + if (TdIsEnabled ()) { + return PlatformScanE820Tdx (Callback, PlatformInfoHob); + } + Status = QemuFwCfgFindFile ("etc/e820", &FwCfgItem, &FwCfgSize); if (EFI_ERROR (Status)) { return Status;