From d997d3c62f6c3255491da09235cc7410cefad850 Mon Sep 17 00:00:00 2001 From: Ceping Sun Date: Wed, 28 Aug 2024 01:16:34 -0400 Subject: [PATCH] OvmfPkg: Use TdHob instead of e820tables to get memory info in TDVF Currently, TDVF gets LowMemory and FistNonAddress from the e820tables via fw_cfg, while TD-Hob can also provide the memory info of LowMemory and FistNonAddress. In current stage e820tables are not measured but TD-Hob is measured in early phase by TDVF. So, from the security perspective we'd better use the information from TD-Hob instead of e820tables. Cc: Erdem Aktas Cc: Jiewen Yao Cc: Min Xu Cc: Gerd Hoffmann Cc: Elena Reshetova Signed-off-by: Ceping Sun --- OvmfPkg/Library/PlatformInitLib/MemDetect.c | 34 +++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/OvmfPkg/Library/PlatformInitLib/MemDetect.c b/OvmfPkg/Library/PlatformInitLib/MemDetect.c index 0acc0e1275..b6aefb321d 100644 --- a/OvmfPkg/Library/PlatformInitLib/MemDetect.c +++ b/OvmfPkg/Library/PlatformInitLib/MemDetect.c @@ -107,6 +107,36 @@ 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_UNACCEPTED) || + (Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY)) + { + 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 +377,10 @@ PlatformScanE820 ( return PlatformScanE820Pvh (Callback, PlatformInfoHob); } + if (TdIsEnabled ()) { + return PlatformScanE820Tdx (Callback, PlatformInfoHob); + } + Status = QemuFwCfgFindFile ("etc/e820", &FwCfgItem, &FwCfgSize); if (EFI_ERROR (Status)) { return Status;