diff --git a/OvmfPkg/IntelTdx/TdxHelperLib/SecTdxHelper.c b/OvmfPkg/IntelTdx/TdxHelperLib/SecTdxHelper.c index e430066549..0a28fa997b 100644 --- a/OvmfPkg/IntelTdx/TdxHelperLib/SecTdxHelper.c +++ b/OvmfPkg/IntelTdx/TdxHelperLib/SecTdxHelper.c @@ -376,7 +376,7 @@ AcceptMemoryForAPsStack ( // Parse the HOB list until end of list or matching type is found. // while (!END_OF_HOB_LIST (Hob) && !MemoryRegionFound) { - if (Hob.Header->HobType == EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) { + if (IS_RESOURCE_DESCRIPTOR_HOB (Hob)) { DEBUG ((DEBUG_INFO, "\nResourceType: 0x%x\n", Hob.ResourceDescriptor->ResourceType)); if (Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_MEMORY_UNACCEPTED) { @@ -384,7 +384,7 @@ AcceptMemoryForAPsStack ( PhysicalStart = Hob.ResourceDescriptor->PhysicalStart; PhysicalEnd = PhysicalStart + ResourceLength; - DEBUG ((DEBUG_INFO, "ResourceAttribute: 0x%x\n", Hob.ResourceDescriptor->ResourceAttribute)); + DEBUG ((DEBUG_INFO, "ResourceAttribute: 0x%x\n", GET_RESOURCE_HOB_ATTRIBUTE (Hob))); DEBUG ((DEBUG_INFO, "PhysicalStart: 0x%llx\n", PhysicalStart)); DEBUG ((DEBUG_INFO, "ResourceLength: 0x%llx\n", ResourceLength)); DEBUG ((DEBUG_INFO, "Owner: %g\n\n", &Hob.ResourceDescriptor->Owner)); @@ -454,7 +454,7 @@ AcceptMemory ( // Parse the HOB list until end of list or matching type is found. // while (!END_OF_HOB_LIST (Hob)) { - if (Hob.Header->HobType == EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) { + if (IS_RESOURCE_DESCRIPTOR_HOB (Hob)) { if (Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_MEMORY_UNACCEPTED) { PhysicalStart = Hob.ResourceDescriptor->PhysicalStart; PhysicalEnd = PhysicalStart + Hob.ResourceDescriptor->ResourceLength; @@ -482,7 +482,7 @@ AcceptMemory ( PhysicalEnd = AcceptMemoryEndAddress; } - DEBUG ((DEBUG_INFO, "ResourceAttribute: 0x%x\n", Hob.ResourceDescriptor->ResourceAttribute)); + DEBUG ((DEBUG_INFO, "ResourceAttribute: 0x%x\n", GET_RESOURCE_HOB_ATTRIBUTE (Hob))); DEBUG ((DEBUG_INFO, "PhysicalStart: 0x%llx\n", Hob.ResourceDescriptor->PhysicalStart)); DEBUG ((DEBUG_INFO, "ResourceLength: 0x%llx\n", Hob.ResourceDescriptor->ResourceLength)); DEBUG ((DEBUG_INFO, "Owner: %g\n\n", &Hob.ResourceDescriptor->Owner)); @@ -636,8 +636,11 @@ ValidateHobList ( break; case EFI_HOB_TYPE_RESOURCE_DESCRIPTOR: - if (Hob.Header->HobLength != sizeof (EFI_HOB_RESOURCE_DESCRIPTOR)) { - DEBUG ((DEBUG_ERROR, "HOB: Hob length is not equal corresponding hob structure. Type: 0x%04x\n", EFI_HOB_TYPE_RESOURCE_DESCRIPTOR)); + case EFI_HOB_TYPE_RESOURCE_DESCRIPTOR2: + if (((GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) && (Hob.Header->HobLength != sizeof (EFI_HOB_RESOURCE_DESCRIPTOR))) || + ((GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_RESOURCE_DESCRIPTOR2) && (Hob.Header->HobLength != sizeof (EFI_HOB_RESOURCE_DESCRIPTOR2)))) + { + DEBUG ((DEBUG_ERROR, "HOB: Hob length is not equal corresponding hob structure. Type: 0x%04x\n", GET_HOB_TYPE (Hob))); return FALSE; } @@ -646,36 +649,36 @@ ValidateHobList ( return FALSE; } - if ((Hob.ResourceDescriptor->ResourceAttribute & (~(EFI_RESOURCE_ATTRIBUTE_PRESENT | - EFI_RESOURCE_ATTRIBUTE_INITIALIZED | - EFI_RESOURCE_ATTRIBUTE_TESTED | - EFI_RESOURCE_ATTRIBUTE_READ_PROTECTED | - EFI_RESOURCE_ATTRIBUTE_WRITE_PROTECTED | - EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTED | - EFI_RESOURCE_ATTRIBUTE_PERSISTENT | - EFI_RESOURCE_ATTRIBUTE_SINGLE_BIT_ECC | - EFI_RESOURCE_ATTRIBUTE_MULTIPLE_BIT_ECC | - EFI_RESOURCE_ATTRIBUTE_ECC_RESERVED_1 | - EFI_RESOURCE_ATTRIBUTE_ECC_RESERVED_2 | - EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE | - EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE | - EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE | - EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE | - EFI_RESOURCE_ATTRIBUTE_16_BIT_IO | - EFI_RESOURCE_ATTRIBUTE_32_BIT_IO | - EFI_RESOURCE_ATTRIBUTE_64_BIT_IO | - EFI_RESOURCE_ATTRIBUTE_UNCACHED_EXPORTED | - EFI_RESOURCE_ATTRIBUTE_READ_PROTECTABLE | - EFI_RESOURCE_ATTRIBUTE_WRITE_PROTECTABLE | - EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTABLE | - EFI_RESOURCE_ATTRIBUTE_PERSISTABLE | - EFI_RESOURCE_ATTRIBUTE_READ_ONLY_PROTECTED | - EFI_RESOURCE_ATTRIBUTE_READ_ONLY_PROTECTABLE | - EFI_RESOURCE_ATTRIBUTE_ENCRYPTED| - EFI_RESOURCE_ATTRIBUTE_SPECIAL_PURPOSE | - EFI_RESOURCE_ATTRIBUTE_MORE_RELIABLE))) != 0) + if ((GET_RESOURCE_HOB_ATTRIBUTE (Hob) & (~(EFI_RESOURCE_ATTRIBUTE_PRESENT | + EFI_RESOURCE_ATTRIBUTE_INITIALIZED | + EFI_RESOURCE_ATTRIBUTE_TESTED | + EFI_RESOURCE_ATTRIBUTE_READ_PROTECTED | + EFI_RESOURCE_ATTRIBUTE_WRITE_PROTECTED | + EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTED | + EFI_RESOURCE_ATTRIBUTE_PERSISTENT | + EFI_RESOURCE_ATTRIBUTE_SINGLE_BIT_ECC | + EFI_RESOURCE_ATTRIBUTE_MULTIPLE_BIT_ECC | + EFI_RESOURCE_ATTRIBUTE_ECC_RESERVED_1 | + EFI_RESOURCE_ATTRIBUTE_ECC_RESERVED_2 | + EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE | + EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE | + EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE | + EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE | + EFI_RESOURCE_ATTRIBUTE_16_BIT_IO | + EFI_RESOURCE_ATTRIBUTE_32_BIT_IO | + EFI_RESOURCE_ATTRIBUTE_64_BIT_IO | + EFI_RESOURCE_ATTRIBUTE_UNCACHED_EXPORTED | + EFI_RESOURCE_ATTRIBUTE_READ_PROTECTABLE | + EFI_RESOURCE_ATTRIBUTE_WRITE_PROTECTABLE | + EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTABLE | + EFI_RESOURCE_ATTRIBUTE_PERSISTABLE | + EFI_RESOURCE_ATTRIBUTE_READ_ONLY_PROTECTED | + EFI_RESOURCE_ATTRIBUTE_READ_ONLY_PROTECTABLE | + EFI_RESOURCE_ATTRIBUTE_ENCRYPTED| + EFI_RESOURCE_ATTRIBUTE_SPECIAL_PURPOSE | + EFI_RESOURCE_ATTRIBUTE_MORE_RELIABLE))) != 0) { - DEBUG ((DEBUG_ERROR, "HOB: Unknow ResourceDescriptor ResourceAttribute type. Type: 0x%08x\n", Hob.ResourceDescriptor->ResourceAttribute)); + DEBUG ((DEBUG_ERROR, "HOB: Unknow ResourceDescriptor ResourceAttribute type. Type: 0x%08x\n", GET_RESOURCE_HOB_ATTRIBUTE (Hob))); return FALSE; } diff --git a/OvmfPkg/Library/PeilessStartupLib/Hob.c b/OvmfPkg/Library/PeilessStartupLib/Hob.c index 725927da73..6e191498ac 100644 --- a/OvmfPkg/Library/PeilessStartupLib/Hob.c +++ b/OvmfPkg/Library/PeilessStartupLib/Hob.c @@ -91,7 +91,7 @@ ConstructFwHobList ( // Parse the HOB list until end of list or matching type is found. // while (!END_OF_HOB_LIST (Hob)) { - if (Hob.Header->HobType == EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) { + if (IS_RESOURCE_DESCRIPTOR_HOB (Hob)) { if (Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_MEMORY_UNACCEPTED) { PhysicalEnd = Hob.ResourceDescriptor->PhysicalStart + Hob.ResourceDescriptor->ResourceLength; ResourceLength = Hob.ResourceDescriptor->ResourceLength; diff --git a/OvmfPkg/Library/PlatformInitLib/IntelTdx.c b/OvmfPkg/Library/PlatformInitLib/IntelTdx.c index c3e08d8812..dd4017b478 100644 --- a/OvmfPkg/Library/PlatformInitLib/IntelTdx.c +++ b/OvmfPkg/Library/PlatformInitLib/IntelTdx.c @@ -101,8 +101,9 @@ TransferTdxHobList ( while (!END_OF_HOB_LIST (Hob)) { switch (Hob.Header->HobType) { case EFI_HOB_TYPE_RESOURCE_DESCRIPTOR: + case EFI_HOB_TYPE_RESOURCE_DESCRIPTOR2: ResourceType = Hob.ResourceDescriptor->ResourceType; - ResourceAttribute = Hob.ResourceDescriptor->ResourceAttribute; + ResourceAttribute = GET_RESOURCE_HOB_ATTRIBUTE (Hob); if (ResourceType == EFI_RESOURCE_MEMORY_UNACCEPTED) { BuildResourceDescriptorHobForUnacceptedMemory (Hob.ResourceDescriptor); diff --git a/OvmfPkg/Library/PlatformInitLib/MemDetect.c b/OvmfPkg/Library/PlatformInitLib/MemDetect.c index b4ba998fe1..422a94049a 100644 --- a/OvmfPkg/Library/PlatformInitLib/MemDetect.c +++ b/OvmfPkg/Library/PlatformInitLib/MemDetect.c @@ -115,7 +115,7 @@ PlatformScanE820Tdx ( Hob.Raw = (UINT8 *)(UINTN)FixedPcdGet32 (PcdOvmfSecGhcbBase); while (!END_OF_HOB_LIST (Hob)) { - if (Hob.Header->HobType == EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) { + if (IS_RESOURCE_DESCRIPTOR_HOB (Hob)) { if ((Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_MEMORY_UNACCEPTED) || (Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY)) { diff --git a/OvmfPkg/PlatformPei/AmdSev.c b/OvmfPkg/PlatformPei/AmdSev.c index 9a77a34ecf..937663f80c 100644 --- a/OvmfPkg/PlatformPei/AmdSev.c +++ b/OvmfPkg/PlatformPei/AmdSev.c @@ -144,7 +144,7 @@ AmdSevSnpInitialize ( // Iterate through the system RAM and validate it. // for (Hob.Raw = GetHobList (); !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) { - if ((Hob.Raw != NULL) && (GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_RESOURCE_DESCRIPTOR)) { + if ((Hob.Raw != NULL) && IS_RESOURCE_DESCRIPTOR_HOB (Hob)) { ResourceHob = Hob.ResourceDescriptor; if (ResourceHob->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) { diff --git a/OvmfPkg/RiscVVirt/PlatformPei/PlatformPeim.c b/OvmfPkg/RiscVVirt/PlatformPei/PlatformPeim.c index fa157b4169..a7fb3cb8ee 100644 --- a/OvmfPkg/RiscVVirt/PlatformPei/PlatformPeim.c +++ b/OvmfPkg/RiscVVirt/PlatformPei/PlatformPeim.c @@ -79,7 +79,7 @@ FindInstallPeiMemory ( // Iterate through the HOB list Hob.Raw = HobList; while (!END_OF_HOB_LIST (Hob)) { - if (GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) { + if (IS_RESOURCE_DESCRIPTOR_HOB (Hob)) { ResourceHob = (EFI_HOB_RESOURCE_DESCRIPTOR *)Hob.Raw; if ( (ResourceHob->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) && (ResourceHob->PhysicalStart > PeiMemoryBase) diff --git a/OvmfPkg/TdxDxe/TdxDxe.c b/OvmfPkg/TdxDxe/TdxDxe.c index 30732f421b..842a23fb56 100644 --- a/OvmfPkg/TdxDxe/TdxDxe.c +++ b/OvmfPkg/TdxDxe/TdxDxe.c @@ -196,8 +196,11 @@ GetResourceDescriptor ( EFI_PEI_HOB_POINTERS Hob; EFI_HOB_RESOURCE_DESCRIPTOR *ResourceDescriptor = NULL; - Hob.Raw = GetFirstHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR); - while (Hob.Raw != NULL) { + for (Hob.Raw = GetHobList (); !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) { + if (!IS_RESOURCE_DESCRIPTOR_HOB (Hob)) { + continue; + } + DEBUG (( DEBUG_INFO, "%a:%d: resource type 0x%x %llx %llx\n", @@ -215,9 +218,6 @@ GetResourceDescriptor ( ResourceDescriptor = Hob.ResourceDescriptor; break; } - - Hob.Raw = GET_NEXT_HOB (Hob); - Hob.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, Hob.Raw); } return ResourceDescriptor; @@ -242,8 +242,11 @@ GetHighestResourceDescriptor ( EFI_PEI_HOB_POINTERS Hob; EFI_HOB_RESOURCE_DESCRIPTOR *ResourceDescriptor = NULL; - Hob.Raw = GetFirstHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR); - while (Hob.Raw != NULL) { + for (Hob.Raw = GetHobList (); !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) { + if (!IS_RESOURCE_DESCRIPTOR_HOB (Hob)) { + continue; + } + if ((Hob.ResourceDescriptor->ResourceType == Type) && (Hob.ResourceDescriptor->PhysicalStart < End)) { @@ -253,9 +256,6 @@ GetHighestResourceDescriptor ( ResourceDescriptor = Hob.ResourceDescriptor; } } - - Hob.Raw = GET_NEXT_HOB (Hob); - Hob.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, Hob.Raw); } return ResourceDescriptor; @@ -285,7 +285,7 @@ SetMmioSharedBit ( // Parse the HOB list until end of list or matching type is found. // while (!END_OF_HOB_LIST (Hob)) { - if ( (Hob.Header->HobType == EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) + if ( IS_RESOURCE_DESCRIPTOR_HOB (Hob) && (Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_MEMORY_MAPPED_IO)) { MemEncryptTdxSetPageSharedBit (