[Patch V2] Dump hob information from boot loader.


Zhiguang Liu
 

From: Thiyagu Kesavan Balakrishnan <thiyagux.kesavan.balakrishnan@intel.com>

V1:
Universal Payload will consume Hobs from boot loader.
Dump all hobs in the Universal Payload entry.
V2:
Add function comments

Cc: Maurice Ma <maurice.ma@intel.com>
Cc: Guo Dong <guo.dong@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Benjamin You <benjamin.you@intel.com>

Signed-off-by: Thiyagu Kesavan Balakrishnan <thiyagux.kesavan.balakrishnan@=
intel.com>
Signed-off-by: Zhiguang Liu <zhiguang.liu@intel.com>
---
UefiPayloadPkg/UefiPayloadEntry/PrintHob.c | 641 ++++++++++=
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
+++++++++++++++++++++++++++++++
UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c | 17 ++++++++++=
+++++++
UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf | 6 ++++++
3 files changed, 664 insertions(+)

diff --git a/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c b/UefiPayloadPkg/Ue=
fiPayloadEntry/PrintHob.c
new file mode 100644
index 0000000000..ef8cc40e5c
--- /dev/null
+++ b/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
@@ -0,0 +1,641 @@
+/** @file=0D
+ Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>=0D
+ SPDX-License-Identifier: BSD-2-Clause-Patent=0D
+**/=0D
+=0D
+#include "UefiPayloadEntry.h"=0D
+#include <UniversalPayload/AcpiTable.h>=0D
+#include <UniversalPayload/SerialPortInfo.h>=0D
+#include <UniversalPayload/PciRootBridges.h>=0D
+#include <UniversalPayload/ExtraData.h>=0D
+#include <Guid/MemoryTypeInformation.h>=0D
+#include <Guid/AcpiBoardInfoGuid.h>=0D
+=0D
+#define ROW_LIMITER 16=0D
+=0D
+typedef=0D
+EFI_STATUS=0D
+(*HOB_PRINT_HANDLER) (=0D
+ IN VOID *Hob,=0D
+ IN UINT16 Hobsize=0D
+);=0D
+=0D
+typedef struct{=0D
+ UINT16 Type;=0D
+ CHAR8 *Name;=0D
+ HOB_PRINT_HANDLER PrintHandler;=0D
+} HOB_PRINT_HANDLER_TABLE;=0D
+=0D
+CHAR8 * mMemoryTypeStr[] =3D {=0D
+ "EfiReservedMemoryType",=0D
+ "EfiLoaderCode",=0D
+ "EfiLoaderData",=0D
+ "EfiBootServicesCode",=0D
+ "EfiBootServicesData",=0D
+ "EfiRuntimeServicesCode",=0D
+ "EfiRuntimeServicesData",=0D
+ "EfiConventionalMemory",=0D
+ "EfiUnusableMemory",=0D
+ "EfiACPIReclaimMemory",=0D
+ "EfiACPIMemoryNVS",=0D
+ "EfiMemoryMappedIO",=0D
+ "EfiMemoryMappedIOPortSpace",=0D
+ "EfiPalCode",=0D
+ "EfiPersistentMemory",=0D
+ "EfiMaxMemoryType"=0D
+};=0D
+=0D
+CHAR8 * mResource_Type_List[] =3D {=0D
+ "EFI_RESOURCE_SYSTEM_MEMORY ", //0x00000000=0D
+ "EFI_RESOURCE_MEMORY_MAPPED_IO ", //0x00000001=0D
+ "EFI_RESOURCE_IO ", //0x00000002=0D
+ "EFI_RESOURCE_FIRMWARE_DEVICE ", //0x00000003=0D
+ "EFI_RESOURCE_MEMORY_MAPPED_IO_PORT ", //0x00000004=0D
+ "EFI_RESOURCE_MEMORY_RESERVED ", //0x00000005=0D
+ "EFI_RESOURCE_IO_RESERVED ", //0x00000006=0D
+ "EFI_RESOURCE_MAX_MEMORY_TYPE " //0x00000007=0D
+};=0D
+=0D
+typedef=0D
+EFI_STATUS=0D
+(*GUID_HOB_PRINT) (=0D
+ IN UINT8 *HobRaw,=0D
+ IN UINT16 Hobsize=0D
+);=0D
+=0D
+typedef struct {=0D
+ EFI_GUID *Guid;=0D
+ GUID_HOB_PRINT PrintHandler;=0D
+ CHAR8 *GuidName;=0D
+} GUID_HOB_PRINT_HANDLE;=0D
+=0D
+typedef struct{=0D
+ EFI_GUID *Guid;=0D
+ CHAR8 *Type;=0D
+} PRINT_MEMORY_ALLOCCATION_HOB;=0D
+=0D
+=0D
+/**=0D
+ Print the Hex value of a given range.=0D
+ @param[in] DataStart A pointer to the start of data to be printed.=
=0D
+ @param[in] DataSize The length of the data to be printed.=0D
+ @retval EFI_SUCCESS If it completed successfully.=0D
+**/=0D
+EFI_STATUS=0D
+PrintHex (=0D
+ IN UINT8 *DataStart,=0D
+ IN UINT16 DataSize=0D
+ )=0D
+{=0D
+ UINTN Index1;=0D
+ UINTN Index2;=0D
+ UINT8 *StartAddr;=0D
+=0D
+ StartAddr =3D DataStart;=0D
+ for (Index1 =3D 0; Index1 * ROW_LIMITER < DataSize; Index1++) {=0D
+ DEBUG ((DEBUG_VERBOSE, " 0x%04p:", (DataStart - StartAddr)));=0D
+ for (Index2 =3D 0; (Index2 < ROW_LIMITER) && (Index1 * ROW_LIMITER + I=
ndex2 < DataSize); Index2++){=0D
+ DEBUG ((DEBUG_VERBOSE, " %02x", *DataStart));=0D
+ DataStart++;=0D
+ }=0D
+ DEBUG ((DEBUG_VERBOSE, "\n"));=0D
+ }=0D
+=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Print the information in HandOffHob.=0D
+=0D
+ @param[in] HobStart A pointer to the HOB of type EFI_HOB_TYPE_HAN=
DOFF.=0D
+ @param[in] Hobsize The length in bytes of HOB of type EFI_HOB_TY=
PE_HANDOFF.=0D
+ @retval EFI_SUCCESS If it completed successfully.=0D
+**/=0D
+EFI_STATUS=0D
+PrintHandOffHob(=0D
+ IN VOID *HobStart,=0D
+ IN UINT16 Hobsize=0D
+ )=0D
+{=0D
+ EFI_PEI_HOB_POINTERS Hob;=0D
+ Hob.Raw =3D (UINT8 *) HobStart;=0D
+ ASSERT (Hobsize >=3D sizeof (*Hob.HandoffInformationTable));=0D
+ DEBUG ((DEBUG_INFO, " BootMode =3D 0x%x\n", Hob.HandoffInf=
ormationTable->BootMode));=0D
+ DEBUG ((DEBUG_INFO, " EfiMemoryTop =3D 0x%lx\n", Hob.HandoffInf=
ormationTable->EfiMemoryTop));=0D
+ DEBUG ((DEBUG_INFO, " EfiMemoryBottom =3D 0x%lx\n", Hob.HandoffInf=
ormationTable->EfiMemoryBottom));=0D
+ DEBUG ((DEBUG_INFO, " EfiFreeMemoryTop =3D 0x%lx\n", Hob.HandoffInf=
ormationTable->EfiFreeMemoryTop));=0D
+ DEBUG ((DEBUG_INFO, " EfiFreeMemoryBottom =3D 0x%lx\n", Hob.HandoffInf=
ormationTable->EfiFreeMemoryBottom));=0D
+ DEBUG ((DEBUG_INFO, " EfiEndOfHobList =3D 0x%lx\n", Hob.HandoffInf=
ormationTable->EfiEndOfHobList));=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Print the information in Memory Allocation Hob.=0D
+ @param[in] HobStart A pointer to the HOB of type EFI_HOB_TYPE_MEM=
ORY_ALLOCATION.=0D
+ @param[in] Hobsize The length in bytes of HOB of type EFI_HOB_TY=
PE_MEMORY_ALLOCATION.=0D
+ @retval EFI_SUCCESS If it completed successfully.=0D
+**/=0D
+EFI_STATUS=0D
+PrintMemoryAllocationHob (=0D
+ IN VOID *HobStart,=0D
+ IN UINT16 Hobsize=0D
+ )=0D
+{=0D
+ EFI_PEI_HOB_POINTERS Hob;=0D
+=0D
+ Hob.Raw =3D (UINT8 *) HobStart;=0D
+=0D
+ if(CompareGuid (&Hob.MemoryAllocation->AllocDescriptor.Name, &gEfiHobMem=
oryAllocStackGuid)) {=0D
+ ASSERT (Hobsize >=3D sizeof (*Hob.MemoryAllocationStack));=0D
+ DEBUG ((DEBUG_INFO, " Type =3D EFI_HOB_MEMORY_ALLOCATIO=
N_STACK\n"));=0D
+ } else if (CompareGuid (&Hob.MemoryAllocation->AllocDescriptor.Name, &gE=
fiHobMemoryAllocBspStoreGuid)) {=0D
+ ASSERT (Hobsize >=3D sizeof (*Hob.MemoryAllocationBspStore));=0D
+ DEBUG ((DEBUG_INFO, " Type =3D EFI_HOB_MEMORY_ALLOCATIO=
N_BSP_STORE\n"));=0D
+ } else if (CompareGuid (&Hob.MemoryAllocation->AllocDescriptor.Name, &gE=
fiHobMemoryAllocModuleGuid)) {=0D
+ ASSERT (Hobsize >=3D sizeof (*Hob.MemoryAllocationModule));=0D
+ DEBUG ((DEBUG_INFO, " Type =3D EFI_HOB_MEMORY_ALLOCATIO=
N_MODULE\n"));=0D
+ DEBUG ((DEBUG_INFO, " Module Name =3D %g\n", Hob.MemoryAllocat=
ionModule->ModuleName));=0D
+ DEBUG ((DEBUG_INFO, " Physical Address =3D 0x%lx\n", Hob.MemoryAllo=
cationModule->EntryPoint));=0D
+ } else {=0D
+ ASSERT (Hobsize >=3D sizeof (*Hob.MemoryAllocation));=0D
+ DEBUG ((DEBUG_INFO, " Type =3D EFI_HOB_TYPE_MEMORY_ALLO=
CATION\n"));=0D
+ }=0D
+ DEBUG ((DEBUG_INFO, " MemoryBaseAddress =3D 0x%lx\n", Hob.MemoryAlloca=
tionStack->AllocDescriptor.MemoryBaseAddress));=0D
+ DEBUG ((DEBUG_INFO, " MemoryLength =3D 0x%lx\n", Hob.MemoryAlloca=
tionStack->AllocDescriptor.MemoryLength));=0D
+ DEBUG ((DEBUG_INFO, " MemoryType =3D %a \n", mMemoryTypeStr[H=
ob.MemoryAllocationStack->AllocDescriptor.MemoryType]));=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Print the information in Resource Discriptor Hob.=0D
+ @param[in] HobStart A pointer to HOB of type EFI_HOB_TYPE_RESOURC=
E_DESCRIPTOR.=0D
+ @param[in] Hobsize The Length in bytes of HOB of type EFI_HOB_TY=
PE_RESOURCE_DESCRIPTOR.=0D
+ @retval EFI_SUCCESS If it completed successfully.=0D
+**/=0D
+EFI_STATUS=0D
+PrintResourceDiscriptorHob (=0D
+ IN VOID *HobStart,=0D
+ IN UINT16 Hobsize=0D
+ )=0D
+{=0D
+ EFI_PEI_HOB_POINTERS Hob;=0D
+=0D
+ Hob.Raw =3D (UINT8 *) HobStart;=0D
+ ASSERT (Hobsize >=3D sizeof (*Hob.ResourceDescriptor));=0D
+=0D
+ DEBUG ((DEBUG_INFO, " ResourceType =3D %a\n", mResource_Type_List=
[Hob.ResourceDescriptor->ResourceType]));=0D
+ if(!IsZeroGuid (&Hob.ResourceDescriptor->Owner)) {=0D
+ DEBUG ((DEBUG_INFO, " Owner =3D %g\n", Hob.ResourceDescrip=
tor->Owner));=0D
+ }=0D
+ DEBUG ((DEBUG_INFO, " ResourceAttribute =3D 0x%x\n", Hob.ResourceDesc=
riptor->ResourceAttribute));=0D
+ DEBUG ((DEBUG_INFO, " PhysicalStart =3D 0x%lx\n", Hob.ResourceDesc=
riptor->PhysicalStart));=0D
+ DEBUG ((DEBUG_INFO, " ResourceLength =3D 0x%lx\n", Hob.ResourceDesc=
riptor->ResourceLength));=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Print the information in Acpi Guid Hob.=0D
+ @param[in] HobRaw A pointer to the start of gUniversalPayloadAc=
piTableGuid HOB.=0D
+ @retval EFI_SUCCESS If it completed successfully.=0D
+**/=0D
+EFI_STATUS=0D
+PrintAcpiGuidHob (=0D
+ IN UINT8 *HobRaw,=0D
+ IN UINT16 Hobsize=0D
+ )=0D
+{=0D
+ UNIVERSAL_PAYLOAD_ACPI_TABLE *AcpiTableHob;=0D
+ AcpiTableHob =3D (UNIVERSAL_PAYLOAD_ACPI_TABLE *) GET_GUID_HOB_DATA (Hob=
Raw);=0D
+ ASSERT (Hobsize >=3D AcpiTableHob->Header.Length);=0D
+ DEBUG ((DEBUG_INFO, " Revision =3D 0x%x\n", AcpiTableHob->Header.Rev=
ision));=0D
+ DEBUG ((DEBUG_INFO, " Length =3D 0x%x\n", AcpiTableHob->Header.Len=
gth));=0D
+ DEBUG ((DEBUG_INFO, " Rsdp =3D 0x%p\n", (UINT64) AcpiTableHob->R=
sdp));=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Print the information in Serial Guid Hob.=0D
+ @param[in] HobRaw A pointer to the start of gUniversalPayloadSe=
rialPortInfoGuid HOB.=0D
+ @retval EFI_SUCCESS If it completed successfully.=0D
+**/=0D
+EFI_STATUS=0D
+PrintSerialGuidHob (=0D
+ IN UINT8 *HobRaw,=0D
+ IN UINT16 Hobsize=0D
+ )=0D
+{=0D
+ UNIVERSAL_PAYLOAD_SERIAL_PORT_INFO *SerialPortInfo;=0D
+ SerialPortInfo =3D (UNIVERSAL_PAYLOAD_SERIAL_PORT_INFO *) GET_GUID_HOB_D=
ATA (HobRaw);=0D
+ ASSERT (Hobsize >=3D SerialPortInfo->Header.Length);=0D
+ DEBUG ((DEBUG_INFO, " Revision =3D 0x%x\n", SerialPortInfo->Hea=
der.Revision));=0D
+ DEBUG ((DEBUG_INFO, " Length =3D 0x%x\n", SerialPortInfo->Hea=
der.Length));=0D
+ DEBUG ((DEBUG_INFO, " UseMmio =3D 0x%x\n", SerialPortInfo->Use=
Mmio));=0D
+ DEBUG ((DEBUG_INFO, " RegisterStride =3D 0x%x\n", SerialPortInfo->Reg=
isterStride));=0D
+ DEBUG ((DEBUG_INFO, " BaudRate =3D %d\n", SerialPortInfo->Bau=
dRate));=0D
+ DEBUG ((DEBUG_INFO, " RegisterBase =3D 0x%lx\n", SerialPortInfo->Reg=
isterBase));=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Print the information in Smbios Guid Hob.=0D
+ @param[in] HobRaw A pointer to the start of gUniversalPayloadSm=
bios3TableGuid HOB.=0D
+ @retval EFI_SUCCESS If it completed successfully.=0D
+**/=0D
+EFI_STATUS=0D
+PrintSmbios3GuidHob (=0D
+ IN UINT8 *HobRaw,=0D
+ IN UINT16 Hobsize=0D
+ )=0D
+{=0D
+ UNIVERSAL_PAYLOAD_SMBIOS_TABLE *SMBiosTable;=0D
+ SMBiosTable =3D (UNIVERSAL_PAYLOAD_SMBIOS_TABLE *) GET_GUID_HOB_DATA (Ho=
bRaw);=0D
+ ASSERT (Hobsize >=3D SMBiosTable->Header.Length);=0D
+ DEBUG ((DEBUG_INFO, " Revision =3D 0x%x\n", SMBiosTable->Head=
er.Revision));=0D
+ DEBUG ((DEBUG_INFO, " Length =3D 0x%x\n", SMBiosTable->Head=
er.Length));=0D
+ DEBUG ((DEBUG_INFO, " SmBiosEntryPoint =3D 0x%lx\n", (UINT64) SMBiosTa=
ble->SmBiosEntryPoint));=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Print the information in Smbios Guid Hob.=0D
+ @param[in] HobRaw A pointer to the start of gUniversalPayloadSm=
biosTableGuid HOB.=0D
+ @retval EFI_SUCCESS If it completed successfully.=0D
+**/=0D
+EFI_STATUS=0D
+PrintSmbiosTablGuidHob (=0D
+ IN UINT8 *HobRaw,=0D
+ IN UINT16 Hobsize=0D
+ )=0D
+{=0D
+ UNIVERSAL_PAYLOAD_SMBIOS_TABLE *SMBiosTable;=0D
+ SMBiosTable =3D (UNIVERSAL_PAYLOAD_SMBIOS_TABLE *) GET_GUID_HOB_DATA (Ho=
bRaw);=0D
+ ASSERT (Hobsize >=3D SMBiosTable->Header.Length);=0D
+ DEBUG ((DEBUG_INFO, " Revision =3D 0x%x\n", SMBiosTable->Head=
er.Revision));=0D
+ DEBUG ((DEBUG_INFO, " Length =3D 0x%x\n", SMBiosTable->Head=
er.Length));=0D
+ DEBUG ((DEBUG_INFO, " SmBiosEntryPoint =3D 0x%lx\n", (UINT64) SMBiosTa=
ble->SmBiosEntryPoint));=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Print the information in Acpi BoardInfo Guid Hob.=0D
+ @param[in] HobRaw A pointer to the start of gUefiAcpiBoardInfoG=
uid HOB.=0D
+ @retval EFI_SUCCESS If it completed successfully.=0D
+**/=0D
+EFI_STATUS=0D
+PrintAcpiBoardInfoGuidHob (=0D
+ IN UINT8 *HobRaw,=0D
+ IN UINT16 Hobsize=0D
+ )=0D
+{=0D
+ ACPI_BOARD_INFO *AcpBoardInfo;=0D
+ AcpBoardInfo =3D (ACPI_BOARD_INFO *) GET_GUID_HOB_DATA (HobRaw);=0D
+ ASSERT (Hobsize >=3D sizeof (*AcpBoardInfo));=0D
+ DEBUG ((DEBUG_INFO, " Revision =3D 0x%x\n", AcpBoardInfo->Revi=
sion));=0D
+ DEBUG ((DEBUG_INFO, " Reserved0 =3D 0x%x\n", AcpBoardInfo->Rese=
rved0));=0D
+ DEBUG ((DEBUG_INFO, " ResetValue =3D 0x%x\n", AcpBoardInfo->Rese=
tValue));=0D
+ DEBUG ((DEBUG_INFO, " PmEvtBase =3D 0x%lx\n", AcpBoardInfo->PmEv=
tBase));=0D
+ DEBUG ((DEBUG_INFO, " PmGpeEnBase =3D 0x%lx\n", AcpBoardInfo->PmGp=
eEnBase));=0D
+ DEBUG ((DEBUG_INFO, " PmCtrlRegBase =3D 0x%lx\n", AcpBoardInfo->PmCt=
rlRegBase));=0D
+ DEBUG ((DEBUG_INFO, " PmTimerRegBase =3D 0x%lx\n", AcpBoardInfo->PmTi=
merRegBase));=0D
+ DEBUG ((DEBUG_INFO, " ResetRegAddress =3D 0x%lx\n", AcpBoardInfo->Rese=
tRegAddress));=0D
+ DEBUG ((DEBUG_INFO, " PcieBaseAddress =3D 0x%lx\n", AcpBoardInfo->Pcie=
BaseAddress));=0D
+ DEBUG ((DEBUG_INFO, " PcieBaseSize =3D 0x%lx\n", AcpBoardInfo->Pcie=
BaseSize));=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Print the information in Pci RootBridge Info Guid Hob.=0D
+ @param[in] HobRaw A pointer to the start of gUniversalPayloadPc=
iRootBridgeInfoGuid HOB.=0D
+=0D
+ @retval EFI_SUCCESS If it completed successfully.=0D
+**/=0D
+EFI_STATUS=0D
+PrintPciRootBridgeInfoGuidHob (=0D
+ IN UINT8 *HobRaw,=0D
+ IN UINT16 Hobsize=0D
+ )=0D
+{=0D
+ UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES *PciRootBridges;=0D
+ UINTN Index;=0D
+ Index =3D 0;=0D
+ PciRootBridges =3D (UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES *) GET_GUID_HOB_D=
ATA (HobRaw);=0D
+ ASSERT (Hobsize >=3D sizeof (UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES));=0D
+ DEBUG ((DEBUG_INFO, " Revision =3D 0x%x\n", PciRootBridges->He=
ader.Revision));=0D
+ DEBUG ((DEBUG_INFO, " Length =3D 0x%x\n", PciRootBridges->He=
ader.Length));=0D
+ DEBUG ((DEBUG_INFO, " Count =3D 0x%x\n", PciRootBridges->Co=
unt));=0D
+ DEBUG ((DEBUG_INFO, " ResourceAssigned =3D %a\n", (PciRootBridges->R=
esourceAssigned ? "True" : "False")));=0D
+=0D
+ while(Index < PciRootBridges->Count) {=0D
+ DEBUG ((DEBUG_INFO, " Root Bridge Index[%d]:\n", Index));=0D
+ DEBUG ((DEBUG_INFO, " Segment =3D 0x%x\n", PciRootB=
ridges->RootBridge[Index].Segment));=0D
+ DEBUG ((DEBUG_INFO, " Supports =3D 0x%lx\n", PciRootB=
ridges->RootBridge[Index].Supports));=0D
+ DEBUG ((DEBUG_INFO, " Attributes =3D 0x%lx\n", PciRootB=
ridges->RootBridge[Index].Attributes));=0D
+ DEBUG ((DEBUG_INFO, " DmaAbove4G =3D 0x%x\n", PciRootB=
ridges->RootBridge[Index].DmaAbove4G));=0D
+ DEBUG ((DEBUG_INFO, " NoExtendedConfigSpace =3D 0x%x\n", PciRootB=
ridges->RootBridge[Index].NoExtendedConfigSpace));=0D
+ DEBUG ((DEBUG_INFO, " AllocationAttributes =3D 0x%lx\n", PciRootB=
ridges->RootBridge[Index].AllocationAttributes));=0D
+ DEBUG ((DEBUG_INFO, " Bus.Base =3D 0x%lx\n", PciRootB=
ridges->RootBridge[Index].Bus.Base));=0D
+ DEBUG ((DEBUG_INFO, " Bus.Limit =3D 0x%lx\n", PciRootB=
ridges->RootBridge[Index].Bus.Limit));=0D
+ DEBUG ((DEBUG_INFO, " Bus.Translation =3D 0x%lx\n", PciRootB=
ridges->RootBridge[Index].Bus.Translation));=0D
+ DEBUG ((DEBUG_INFO, " Io.Base =3D 0x%lx\n", PciRootB=
ridges->RootBridge[Index].Io.Base));=0D
+ DEBUG ((DEBUG_INFO, " Io.Limit =3D 0x%lx\n", PciRootB=
ridges->RootBridge[Index].Io.Limit));=0D
+ DEBUG ((DEBUG_INFO, " Io.Translation =3D 0x%lx\n", PciRootB=
ridges->RootBridge[Index].Io.Translation));=0D
+ DEBUG ((DEBUG_INFO, " Mem.Base =3D 0x%lx\n", PciRootB=
ridges->RootBridge[Index].Mem.Base));=0D
+ DEBUG ((DEBUG_INFO, " Mem.Limit =3D 0x%lx\n", PciRootB=
ridges->RootBridge[Index].Mem.Limit));=0D
+ DEBUG ((DEBUG_INFO, " Mem.Translation =3D 0x%lx\n", PciRootB=
ridges->RootBridge[Index].Mem.Translation));=0D
+ DEBUG ((DEBUG_INFO, " MemAbove4G.Base =3D 0x%lx\n", PciRootB=
ridges->RootBridge[Index].MemAbove4G.Base));=0D
+ DEBUG ((DEBUG_INFO, " MemAbove4G.Limit =3D 0x%lx\n", PciRootB=
ridges->RootBridge[Index].MemAbove4G.Limit));=0D
+ DEBUG ((DEBUG_INFO, " MemAbove4G.Translation =3D 0x%lx\n", PciRootB=
ridges->RootBridge[Index].MemAbove4G.Translation));=0D
+ DEBUG ((DEBUG_INFO, " PMem.Base =3D 0x%lx\n", PciRootB=
ridges->RootBridge[Index].PMem.Base));=0D
+ DEBUG ((DEBUG_INFO, " PMem.Limit =3D 0x%lx\n", PciRootB=
ridges->RootBridge[Index].PMem.Limit));=0D
+ DEBUG ((DEBUG_INFO, " PMem.Translation =3D 0x%lx\n", PciRootB=
ridges->RootBridge[Index].PMem.Translation));=0D
+ DEBUG ((DEBUG_INFO, " PMemAbove4G.Base =3D 0x%lx\n", PciRootB=
ridges->RootBridge[Index].PMemAbove4G.Base));=0D
+ DEBUG ((DEBUG_INFO, " PMemAbove4G.Limit =3D 0x%lx\n", PciRootB=
ridges->RootBridge[Index].PMemAbove4G.Limit));=0D
+ DEBUG ((DEBUG_INFO, " PMemAbove4G.Translation =3D 0x%lx\n", PciRootB=
ridges->RootBridge[Index].PMemAbove4G.Translation));=0D
+ Index+=3D1;=0D
+ }=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Print the information in Extra Data Guid Hob.=0D
+ @param[in] HobRaw A pointer to the start of gUniversalPayloadEx=
traDataGuid HOB.=0D
+ @retval EFI_SUCCESS If it completed successfully.=0D
+**/=0D
+EFI_STATUS=0D
+PrintExtraDataGuidHob (=0D
+ IN UINT8 *HobRaw,=0D
+ IN UINT16 Hobsize=0D
+ )=0D
+{=0D
+ UNIVERSAL_PAYLOAD_EXTRA_DATA *ExtraData;=0D
+ UINTN Index;=0D
+=0D
+ Index =3D 0;=0D
+ ExtraData =3D (UNIVERSAL_PAYLOAD_EXTRA_DATA *) GET_GUID_HOB_DATA (HobRaw=
);=0D
+ ASSERT (Hobsize >=3D ExtraData->Header.Length);=0D
+ DEBUG ((DEBUG_INFO, " Revision =3D 0x%x\n", ExtraData->Header.Revisio=
n));=0D
+ DEBUG ((DEBUG_INFO, " Length =3D 0x%x\n", ExtraData->Header.Length)=
);=0D
+ DEBUG ((DEBUG_INFO, " Count =3D 0x%x\n", ExtraData->Count));=0D
+=0D
+ while (Index < ExtraData->Count) {=0D
+ DEBUG ((DEBUG_INFO, " Id[%d] =3D %a\n", Index,ExtraData->Entr=
y[Index].Identifier));=0D
+ DEBUG ((DEBUG_INFO, " Base[%d] =3D 0x%lx\n", Index,ExtraData->Entr=
y[Index].Base));=0D
+ DEBUG ((DEBUG_INFO, " Size[%d] =3D 0x%lx\n", Index,ExtraData->Entr=
y[Index].Size));=0D
+ Index+=3D1;=0D
+ }=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Print the information in MemoryTypeInfoGuidHob.=0D
+ @param[in] HobRaw A pointer to the start of gEfiMemoryTypeInfor=
mationGuid HOB.=0D
+ @retval EFI_SUCCESS If it completed successfully.=0D
+**/=0D
+EFI_STATUS=0D
+PrintMemoryTypeInfoGuidHob (=0D
+ IN UINT8 *HobRaw,=0D
+ IN UINT16 Hobsize=0D
+ )=0D
+{=0D
+ EFI_MEMORY_TYPE_INFORMATION *MemoryTypeInfo;=0D
+=0D
+ MemoryTypeInfo =3D (EFI_MEMORY_TYPE_INFORMATION *) GET_GUID_HOB_DATA (Ho=
bRaw);=0D
+ ASSERT (Hobsize >=3D sizeof (*MemoryTypeInfo));=0D
+ DEBUG ((DEBUG_INFO, " Type =3D 0x%x\n", MemoryTypeInfo->Typ=
e));=0D
+ DEBUG ((DEBUG_INFO, " NumberOfPages =3D 0x%x\n", MemoryTypeInfo->Num=
berOfPages));=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+//=0D
+// Mappint table for dump Guid Hob information.=0D
+// This table can be easily extented.=0D
+//=0D
+GUID_HOB_PRINT_HANDLE GuidHobPrintHandleTable[] =3D {=0D
+ {&gUniversalPayloadAcpiTableGuid, PrintAcpiGuidHob, =
"gUniversalPayloadAcpiTableGuid(ACPI table Guid)"},=0D
+ {&gUniversalPayloadSerialPortInfoGuid, PrintSerialGuidHob, =
"gUniversalPayloadSerialPortInfoGuid(Serial Port Info)"},=0D
+ {&gUniversalPayloadSmbios3TableGuid, PrintSmbios3GuidHob, =
"gUniversalPayloadSmbios3TableGuid(SmBios Guid)"},=0D
+ {&gUniversalPayloadSmbiosTableGuid, PrintSmbiosTablGuidHob, =
"gUniversalPayloadSmbiosTableGuid(SmBios Guid)"},=0D
+ {&gUefiAcpiBoardInfoGuid, PrintAcpiBoardInfoGuidHob, =
"gUefiAcpiBoardInfoGuid(Acpi Guid)"},=0D
+ {&gUniversalPayloadPciRootBridgeInfoGuid, PrintPciRootBridgeInfoGuidHob,=
"gUniversalPayloadPciRootBridgeInfoGuid(Pci Guid)"},=0D
+ {&gEfiMemoryTypeInformationGuid, PrintMemoryTypeInfoGuidHob, =
"gEfiMemoryTypeInformationGuid(Memory Type Information Guid)"},=0D
+ {&gUniversalPayloadExtraDataGuid, PrintExtraDataGuidHob, =
"gUniversalPayloadExtraDataGuid(PayLoad Extra Data Guid)"}=0D
+};=0D
+=0D
+/**=0D
+ Print the Guid Hob using related print handle function.=0D
+ @param[in] HobStart A pointer to the HOB of type EFI_HOB_TYPE_GUI=
D_EXTENSION.=0D
+ @param[in] Hobsize The length in bytes of the HOB of type EFI_HO=
B_TYPE_GUID_EXTENSION.=0D
+ @retval EFI_SUCCESS If it completed successfully.=0D
+**/=0D
+EFI_STATUS=0D
+PrintGuidHob (=0D
+ IN VOID *HobStart,=0D
+ IN UINT16 Hobsize=0D
+ )=0D
+{=0D
+ EFI_PEI_HOB_POINTERS Hob;=0D
+ UINTN Index;=0D
+ EFI_STATUS Status;=0D
+=0D
+ Hob.Raw =3D (UINT8 *) HobStart;=0D
+ ASSERT (Hobsize >=3D sizeof (Hob.Guid));=0D
+=0D
+ for (Index =3D 0; Index < ARRAY_SIZE (GuidHobPrintHandleTable); Index++)=
{=0D
+ if (CompareGuid (&Hob.Guid->Name, GuidHobPrintHandleTable[Index].Guid)=
) {=0D
+ DEBUG ((DEBUG_INFO, " Guid =3D %a\n", GuidHobPrintHandleTable[In=
dex].GuidName));=0D
+ Status =3D GuidHobPrintHandleTable[Index].PrintHandler (Hob.Raw, Hob=
.Header->HobLength);=0D
+ return Status;=0D
+ }=0D
+ }=0D
+ DEBUG ((DEBUG_INFO, " Name =3D %g\n", &Hob.Guid->Name));=0D
+ PrintHex (GET_GUID_HOB_DATA (Hob.Raw), GET_GUID_HOB_DATA_SIZE (Hob.Raw))=
;=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Print the information in FV Hob.=0D
+ @param[in] HobStart A pointer to the HOB of type EFI_HOB_TYPE_FV.=
=0D
+ @param[in] Hobsize The length in bytes of the HOB of type EFI_HO=
B_TYPE_FV.=0D
+ @retval EFI_SUCCESS If it completed successfully.=0D
+**/=0D
+EFI_STATUS=0D
+PrintFvHob (=0D
+ IN VOID *HobStart,=0D
+ IN UINT16 Hobsize=0D
+ )=0D
+{=0D
+ EFI_PEI_HOB_POINTERS Hob;=0D
+=0D
+ Hob.Raw =3D (UINT8 *) HobStart;=0D
+ ASSERT (Hobsize >=3D sizeof (*Hob.FirmwareVolume));=0D
+=0D
+ DEBUG ((DEBUG_INFO, " BaseAddress =3D 0x%lx\n", Hob.FirmwareVolume->Ba=
seAddress));=0D
+ DEBUG ((DEBUG_INFO, " Length =3D 0x%lx\n", Hob.FirmwareVolume->Le=
ngth));=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Print the information in Cpu Hob.=0D
+ @param[in] HobStart A pointer to the HOB of type EFI_HOB_TYPE_CPU=
.=0D
+ @param[in] Hobsize The length in bytes of the HOB of type EFI_HO=
B_TYPE_CPU.=0D
+ @retval EFI_SUCCESS If it completed successfully.=0D
+**/=0D
+EFI_STATUS=0D
+PrintCpuHob (=0D
+ IN VOID *HobStart,=0D
+ IN UINT16 Hobsize=0D
+ )=0D
+{=0D
+ EFI_PEI_HOB_POINTERS Hob;=0D
+=0D
+ Hob.Raw =3D (UINT8 *) HobStart;=0D
+ ASSERT (Hobsize >=3D sizeof (*Hob.Cpu));=0D
+=0D
+ DEBUG ((DEBUG_INFO, " SizeOfMemorySpace =3D 0x%lx\n", Hob.Cpu->SizeOfM=
emorySpace));=0D
+ DEBUG ((DEBUG_INFO, " SizeOfIoSpace =3D 0x%lx\n", Hob.Cpu->SizeOfI=
oSpace));=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Print the information in MemoryPoolHob.=0D
+ @param[in] HobStart A pointer to the HOB of type EFI_HOB_TYPE_MEM=
ORY_POOL.=0D
+ @param[in] Hobsize The length in bytes of the HOB of type EFI_HO=
B_TYPE_MEMORY_POOL.=0D
+ @retval EFI_SUCCESS If it completed successfully.=0D
+**/=0D
+EFI_STATUS=0D
+PrintMemoryPoolHob (=0D
+ IN VOID *HobStart,=0D
+ IN UINT16 Hobsize=0D
+ )=0D
+{=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Print the information in Fv2Hob.=0D
+ @param[in] HobStart A pointer to the HOB of type EFI_HOB_TYPE_FV2=
.=0D
+ @param[in] Hobsize The length in bytes of the HOB of type EFI_HO=
B_TYPE_FV2.=0D
+ @retval EFI_SUCCESS If it completed successfully.=0D
+**/=0D
+EFI_STATUS=0D
+PrintFv2Hob (=0D
+ IN VOID *HobStart,=0D
+ IN UINT16 Hobsize=0D
+ )=0D
+{=0D
+ EFI_PEI_HOB_POINTERS Hob;=0D
+=0D
+ Hob.Raw =3D (UINT8 *) HobStart;=0D
+ ASSERT (Hobsize >=3D sizeof (*Hob.FirmwareVolume2));=0D
+=0D
+ DEBUG ((DEBUG_INFO, " BaseAddress =3D 0x%lx\n", Hob.FirmwareVolume2->B=
aseAddress));=0D
+ DEBUG ((DEBUG_INFO, " Length =3D 0x%lx\n", Hob.FirmwareVolume2->L=
ength));=0D
+ DEBUG ((DEBUG_INFO, " FvName =3D %g\n", &Hob.FirmwareVolume2->=
FvName));=0D
+ DEBUG ((DEBUG_INFO, " FileName =3D %g\n", &Hob.FirmwareVolume2->=
FileName));=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Print the information in Capsule Hob.=0D
+ @param[in] HobStart A pointer to the HOB of type EFI_HOB_TYPE_UEF=
I_CAPSULE.=0D
+ @param[in] Hobsize The length in bytes of the HOB of type EFI_HO=
B_TYPE_UEFI_CAPSULE.=0D
+ @retval EFI_SUCCESS If it completed successfully.=0D
+**/=0D
+EFI_STATUS=0D
+PrintCapsuleHob (=0D
+ IN VOID *HobStart,=0D
+ IN UINT16 Hobsize=0D
+ )=0D
+{=0D
+ EFI_PEI_HOB_POINTERS Hob;=0D
+=0D
+ Hob.Raw =3D (UINT8 *) HobStart;=0D
+ ASSERT (Hobsize >=3D sizeof (*Hob.Capsule));=0D
+=0D
+ DEBUG ((DEBUG_INFO, " BaseAddress =3D 0x%lx\n", Hob.Capsule->BaseAddre=
ss));=0D
+ DEBUG ((DEBUG_INFO, " Length =3D 0x%lx\n", Hob.Capsule->Length));=
=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Print the information in Fv3 Hob.=0D
+ @param[in] HobStart A pointer to the HOB of type EFI_HOB_TYPE_FV3=
.=0D
+ @param[in] Hobsize The length in bytes of the HOB of type EFI_HO=
B_TYPE_FV3.=0D
+ @retval EFI_SUCCESS If it completed successfully.=0D
+**/=0D
+EFI_STATUS=0D
+PrintFv3Hob (=0D
+ IN VOID *HobStart,=0D
+ IN UINT16 Hobsize=0D
+ )=0D
+{=0D
+ EFI_PEI_HOB_POINTERS Hob;=0D
+ Hob.Raw =3D (UINT8 *) HobStart;=0D
+ ASSERT (Hobsize >=3D sizeof (*Hob.FirmwareVolume3));=0D
+=0D
+ DEBUG ((DEBUG_INFO, " BaseAddress =3D 0x%lx\n", Hob.FirmwareV=
olume3->BaseAddress));=0D
+ DEBUG ((DEBUG_INFO, " Length =3D 0x%lx\n", Hob.FirmwareV=
olume3->Length));=0D
+ DEBUG ((DEBUG_INFO, " AuthenticationStatus =3D 0x%x\n", Hob.FirmwareV=
olume3->AuthenticationStatus));=0D
+ DEBUG ((DEBUG_INFO, " ExtractedFv =3D %a\n", (Hob.Firmware=
Volume3->ExtractedFv ? "True" : "False")));=0D
+ DEBUG ((DEBUG_INFO, " FVName =3D %g\n", &Hob.Firmware=
Volume3->FvName));=0D
+ DEBUG ((DEBUG_INFO, " FileName =3D %g\n", &Hob.Firmware=
Volume3->FileName));=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+//=0D
+// Mappint table from Hob type to Hob print function.=0D
+//=0D
+HOB_PRINT_HANDLER_TABLE mHobHandles[] =3D {=0D
+ {EFI_HOB_TYPE_HANDOFF, "EFI_HOB_TYPE_HANDOFF", P=
rintHandOffHob}, //0x0001=0D
+ {EFI_HOB_TYPE_MEMORY_ALLOCATION, "EFI_HOB_TYPE_MEMORY_ALLOCATION", P=
rintMemoryAllocationHob}, //0x0002=0D
+ {EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, "EFI_HOB_TYPE_RESOURCE_DESCRIPTOR", P=
rintResourceDiscriptorHob}, //0x0003=0D
+ {EFI_HOB_TYPE_GUID_EXTENSION, "EFI_HOB_TYPE_GUID_EXTENSION", P=
rintGuidHob}, //0x0004=0D
+ {EFI_HOB_TYPE_FV, "EFI_HOB_TYPE_FV", P=
rintFvHob}, //0x0005=0D
+ {EFI_HOB_TYPE_CPU, "EFI_HOB_TYPE_CPU", P=
rintCpuHob}, //0x0006=0D
+ {EFI_HOB_TYPE_MEMORY_POOL, "EFI_HOB_TYPE_MEMORY_POOL", P=
rintMemoryPoolHob}, //0x0007=0D
+ {EFI_HOB_TYPE_FV2, "EFI_HOB_TYPE_FV2", P=
rintFv2Hob}, //0x0009=0D
+ {EFI_HOB_TYPE_UEFI_CAPSULE, "EFI_HOB_TYPE_UEFI_CAPSULE", P=
rintCapsuleHob}, //0x000B=0D
+ {EFI_HOB_TYPE_FV3, "EFI_HOB_TYPE_FV3", P=
rintFv3Hob} //0x000C=0D
+};=0D
+=0D
+=0D
+/**=0D
+ Print all HOBs info from the HOB list.=0D
+ @param[in] HobStart A pointer to the HOB list=0D
+ @return The pointer to the HOB list.=0D
+**/=0D
+VOID=0D
+PrintHob (=0D
+ IN CONST VOID *HobStart=0D
+ )=0D
+{=0D
+ EFI_PEI_HOB_POINTERS Hob;=0D
+ UINTN Count;=0D
+ UINTN Index;=0D
+ ASSERT (HobStart !=3D NULL);=0D
+=0D
+ Hob.Raw =3D (UINT8 *) HobStart;=0D
+ DEBUG ((DEBUG_INFO, "Print all Hob information from Hob 0x%p\n", Hob.Raw=
));=0D
+=0D
+ Count =3D 0;=0D
+ //=0D
+ // Parse the HOB list to see which type it is, and print the information=
.=0D
+ //=0D
+ while (!END_OF_HOB_LIST (Hob)) {=0D
+ for (Index =3D 0; Index < ARRAY_SIZE (mHobHandles); Index++) {=0D
+ if (Hob.Header->HobType =3D=3D mHobHandles[Index].Type) {=0D
+ DEBUG ((DEBUG_INFO, "HOB[%d]: Type =3D %a, Offset =3D 0x%p, Length=
=3D 0x%x\n", Count, mHobHandles[Index].Name, (Hob.Raw - (UINT8 *) HobStart=
), Hob.Header->HobLength));=0D
+ mHobHandles[Index].PrintHandler (Hob.Raw, Hob.Header->HobLength);=
=0D
+ break;=0D
+ }=0D
+ }=0D
+ if (Index =3D=3D ARRAY_SIZE (mHobHandles)) {=0D
+ DEBUG ((DEBUG_INFO, "HOB[%d]: Type =3D %d, Offset =3D 0x%p, Length =
=3D 0x%x\n", Count, Hob.Header->HobType, (Hob.Raw - (UINT8 *)HobStart), Hob=
.Header->HobLength));=0D
+ DEBUG ((DEBUG_INFO, " Unkown Hob type\n"));=0D
+ PrintHex (Hob.Raw, Hob.Header->HobLength);=0D
+ }=0D
+ Count++;=0D
+ Hob.Raw =3D GET_NEXT_HOB (Hob);=0D
+ }=0D
+ DEBUG ((DEBUG_INFO, "There are totally %d Hobs, the End Hob address is %=
p\n", Count, Hob.Raw));=0D
+}
\ No newline at end of file
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c b/Uefi=
PayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
index 7a00a56ab9..09dd1e8378 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
@@ -25,6 +25,16 @@
=0D
extern VOID *mHobList;=0D
=0D
+/**=0D
+ Print all HOBs info from the HOB list.=0D
+=0D
+ @return The pointer to the HOB list.=0D
+**/=0D
+VOID=0D
+PrintHob (=0D
+ IN CONST VOID *HobStart=0D
+ );=0D
+=0D
/**=0D
Some bootloader may pass a pcd database, and UPL also contain a PCD data=
base.=0D
Dxe PCD driver has the assumption that the two PCD database can be caten=
ated and=0D
@@ -375,6 +385,13 @@ _ModuleEntryPoint (
DEBUG ((DEBUG_INFO, "Entering Universal Payload...\n"));=0D
DEBUG ((DEBUG_INFO, "sizeof(UINTN) =3D 0x%x\n", sizeof(UINTN)));=0D
=0D
+ DEBUG_CODE (=0D
+ //=0D
+ // Dump the Hobs from boot loader=0D
+ //=0D
+ PrintHob (mHobList);=0D
+ );=0D
+=0D
// Initialize floating point operating environment to be compliant with =
UEFI spec.=0D
InitializeFloatingPointUnits ();=0D
=0D
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf b/Ue=
fiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
index 76d7e4791c..416a620598 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
+++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
@@ -24,6 +24,7 @@
UniversalPayloadEntry.c=0D
LoadDxeCore.c=0D
MemoryAllocation.c=0D
+ PrintHob.c=0D
=0D
[Sources.Ia32]=0D
X64/VirtualMemory.h=0D
@@ -64,6 +65,11 @@
gUefiSerialPortInfoGuid=0D
gUniversalPayloadExtraDataGuid=0D
gPcdDataBaseHobGuid=0D
+ gUniversalPayloadSmbiosTableGuid=0D
+ gEfiHobMemoryAllocBspStoreGuid=0D
+ gUniversalPayloadAcpiTableGuid=0D
+ gUniversalPayloadPciRootBridgeInfoGuid=0D
+ gUniversalPayloadSmbios3TableGuid=0D
=0D
[FeaturePcd.IA32]=0D
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode ## CONSUME=
S=0D
--=20
2.30.0.windows.2

Join devel@edk2.groups.io to automatically receive all group messages.