From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by mx.groups.io with SMTP id smtpd.web12.1221.1626160301443150839 for ; Tue, 13 Jul 2021 00:11:42 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 134.134.136.24, mailfrom: zhiguang.liu@intel.com) X-IronPort-AV: E=McAfee;i="6200,9189,10043"; a="210087646" X-IronPort-AV: E=Sophos;i="5.84,235,1620716400"; d="scan'208";a="210087646" Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Jul 2021 00:11:38 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.84,235,1620716400"; d="scan'208";a="502865903" Received: from fieedk002.ccr.corp.intel.com ([10.239.158.144]) by fmsmga002.fm.intel.com with ESMTP; 13 Jul 2021 00:11:35 -0700 From: "Zhiguang Liu" To: devel@edk2.groups.io Cc: Maurice Ma , Guo Dong , Ray Ni , Benjamin You , Thiyagu Kesavan Balakrishnan Subject: [Patch V3] UefiPayloadPkg: Dump hob information from boot loader Date: Tue, 13 Jul 2021 15:10:42 +0800 Message-Id: <20210713071042.2007-1-zhiguang.liu@intel.com> X-Mailer: git-send-email 2.30.0.windows.2 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable V1: Universal Payload will consume Hobs from boot loader. Dump all hobs in the Universal Payload entry. V2: Add function comments V3: minor change, for example Hobsize -> HobLength, SMBiosTable -> SmBiosTable Cc: Maurice Ma Cc: Guo Dong Cc: Ray Ni Cc: Benjamin You Signed-off-by: Thiyagu Kesavan Balakrishnan Signed-off-by: Zhiguang Liu --- 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..5fb638d4a4 --- /dev/null +++ b/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c @@ -0,0 +1,641 @@ +/** @file=0D + Copyright (c) 2021, Intel Corporation. All rights reserved.
=0D + SPDX-License-Identifier: BSD-2-Clause-Patent=0D +**/=0D +=0D +#include "UefiPayloadEntry.h"=0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +=0D +#define ROW_LIMITER 16=0D +=0D +typedef=0D +EFI_STATUS=0D +(*HOB_PRINT_HANDLER) (=0D + IN VOID *Hob,=0D + IN UINT16 HobLength=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 HobLength=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] HobLength 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 HobLength=0D + )=0D +{=0D + EFI_PEI_HOB_POINTERS Hob;=0D + Hob.Raw =3D (UINT8 *) HobStart;=0D + ASSERT (HobLength >=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] HobLength 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 HobLength=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 (HobLength >=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 (HobLength >=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 (HobLength >=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 (HobLength >=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] HobLength 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 HobLength=0D + )=0D +{=0D + EFI_PEI_HOB_POINTERS Hob;=0D +=0D + Hob.Raw =3D (UINT8 *) HobStart;=0D + ASSERT (HobLength >=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 HobLength=0D + )=0D +{=0D + UNIVERSAL_PAYLOAD_ACPI_TABLE *AcpiTableHob;=0D + AcpiTableHob =3D (UNIVERSAL_PAYLOAD_ACPI_TABLE *) GET_GUID_HOB_DATA (Hob= Raw);=0D + ASSERT (HobLength >=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 HobLength=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 (HobLength >=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 HobLength=0D + )=0D +{=0D + UNIVERSAL_PAYLOAD_SMBIOS_TABLE *SmBiosTable;=0D + SmBiosTable =3D (UNIVERSAL_PAYLOAD_SMBIOS_TABLE *) GET_GUID_HOB_DATA (Ho= bRaw);=0D + ASSERT (HobLength >=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 HobLength=0D + )=0D +{=0D + UNIVERSAL_PAYLOAD_SMBIOS_TABLE *SmBiosTable;=0D + SmBiosTable =3D (UNIVERSAL_PAYLOAD_SMBIOS_TABLE *) GET_GUID_HOB_DATA (Ho= bRaw);=0D + ASSERT (HobLength >=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 HobLength=0D + )=0D +{=0D + ACPI_BOARD_INFO *AcpBoardInfo;=0D + AcpBoardInfo =3D (ACPI_BOARD_INFO *) GET_GUID_HOB_DATA (HobRaw);=0D + ASSERT (HobLength >=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 HobLength=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 (HobLength >=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 HobLength=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 (HobLength >=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 HobLength=0D + )=0D +{=0D + EFI_MEMORY_TYPE_INFORMATION *MemoryTypeInfo;=0D +=0D + MemoryTypeInfo =3D (EFI_MEMORY_TYPE_INFORMATION *) GET_GUID_HOB_DATA (Ho= bRaw);=0D + ASSERT (HobLength >=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] HobLength 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 HobLength=0D + )=0D +{=0D + EFI_PEI_HOB_POINTERS Hob;=0D + UINTN Index;=0D + EFI_STATUS Status;=0D +=0D + Hob.Raw =3D (UINT8 *) HobStart;=0D + ASSERT (HobLength >=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] HobLength 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 HobLength=0D + )=0D +{=0D + EFI_PEI_HOB_POINTERS Hob;=0D +=0D + Hob.Raw =3D (UINT8 *) HobStart;=0D + ASSERT (HobLength >=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] HobLength 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 HobLength=0D + )=0D +{=0D + EFI_PEI_HOB_POINTERS Hob;=0D +=0D + Hob.Raw =3D (UINT8 *) HobStart;=0D + ASSERT (HobLength >=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] HobLength 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 HobLength=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] HobLength 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 HobLength=0D + )=0D +{=0D + EFI_PEI_HOB_POINTERS Hob;=0D +=0D + Hob.Raw =3D (UINT8 *) HobStart;=0D + ASSERT (HobLength >=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] HobLength 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 HobLength=0D + )=0D +{=0D + EFI_PEI_HOB_POINTERS Hob;=0D +=0D + Hob.Raw =3D (UINT8 *) HobStart;=0D + ASSERT (HobLength >=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] HobLength 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 HobLength=0D + )=0D +{=0D + EFI_PEI_HOB_POINTERS Hob;=0D + Hob.Raw =3D (UINT8 *) HobStart;=0D + ASSERT (HobLength >=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},=0D + {EFI_HOB_TYPE_MEMORY_ALLOCATION, "EFI_HOB_TYPE_MEMORY_ALLOCATION", P= rintMemoryAllocationHob},=0D + {EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, "EFI_HOB_TYPE_RESOURCE_DESCRIPTOR", P= rintResourceDiscriptorHob},=0D + {EFI_HOB_TYPE_GUID_EXTENSION, "EFI_HOB_TYPE_GUID_EXTENSION", P= rintGuidHob},=0D + {EFI_HOB_TYPE_FV, "EFI_HOB_TYPE_FV", P= rintFvHob},=0D + {EFI_HOB_TYPE_CPU, "EFI_HOB_TYPE_CPU", P= rintCpuHob},=0D + {EFI_HOB_TYPE_MEMORY_POOL, "EFI_HOB_TYPE_MEMORY_POOL", P= rintMemoryPoolHob},=0D + {EFI_HOB_TYPE_FV2, "EFI_HOB_TYPE_FV2", P= rintFv2Hob},=0D + {EFI_HOB_TYPE_UEFI_CAPSULE, "EFI_HOB_TYPE_UEFI_CAPSULE", P= rintCapsuleHob},=0D + {EFI_HOB_TYPE_FV3, "EFI_HOB_TYPE_FV3", P= rintFv3Hob}=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 +}=0D 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