From: "Guo Dong" <guo.dong@intel.com>
To: "Liu, Zhiguang" <zhiguang.liu@intel.com>,
"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: "Ma, Maurice" <maurice.ma@intel.com>,
"Ni, Ray" <ray.ni@intel.com>,
"You, Benjamin" <benjamin.you@intel.com>,
"Kesavan Balakrishnan,
ThiyaguX" <thiyagux.kesavan.balakrishnan@intel.com>
Subject: Re: [Patch V3] UefiPayloadPkg: Dump hob information from boot loader
Date: Tue, 13 Jul 2021 21:00:54 +0000 [thread overview]
Message-ID: <BYAPR11MB3622980FAD00086BEF09F1729E149@BYAPR11MB3622.namprd11.prod.outlook.com> (raw)
In-Reply-To: <20210713071042.2007-1-zhiguang.liu@intel.com>
Signed-off-by: Guo Dong <guo.dong@intel.com>
> -----Original Message-----
> From: Liu, Zhiguang <zhiguang.liu@intel.com>
> Sent: Tuesday, July 13, 2021 12:11 AM
> To: devel@edk2.groups.io
> Cc: Ma, Maurice <maurice.ma@intel.com>; Dong, Guo
> <guo.dong@intel.com>; Ni, Ray <ray.ni@intel.com>; You, Benjamin
> <benjamin.you@intel.com>; Kesavan Balakrishnan, ThiyaguX
> <thiyagux.kesavan.balakrishnan@intel.com>
> Subject: [Patch V3] UefiPayloadPkg: Dump hob information from boot loader
>
> 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 <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/UefiPayloadEntry/PrintHob.c
> new file mode 100644
> index 0000000000..5fb638d4a4
> --- /dev/null
> +++ b/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
> @@ -0,0 +1,641 @@
> +/** @file
>
> + Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
>
> + SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +**/
>
> +
>
> +#include "UefiPayloadEntry.h"
>
> +#include <UniversalPayload/AcpiTable.h>
>
> +#include <UniversalPayload/SerialPortInfo.h>
>
> +#include <UniversalPayload/PciRootBridges.h>
>
> +#include <UniversalPayload/ExtraData.h>
>
> +#include <Guid/MemoryTypeInformation.h>
>
> +#include <Guid/AcpiBoardInfoGuid.h>
>
> +
>
> +#define ROW_LIMITER 16
>
> +
>
> +typedef
>
> +EFI_STATUS
>
> +(*HOB_PRINT_HANDLER) (
>
> + IN VOID *Hob,
>
> + IN UINT16 HobLength
>
> +);
>
> +
>
> +typedef struct{
>
> + UINT16 Type;
>
> + CHAR8 *Name;
>
> + HOB_PRINT_HANDLER PrintHandler;
>
> +} HOB_PRINT_HANDLER_TABLE;
>
> +
>
> +CHAR8 * mMemoryTypeStr[] = {
>
> + "EfiReservedMemoryType",
>
> + "EfiLoaderCode",
>
> + "EfiLoaderData",
>
> + "EfiBootServicesCode",
>
> + "EfiBootServicesData",
>
> + "EfiRuntimeServicesCode",
>
> + "EfiRuntimeServicesData",
>
> + "EfiConventionalMemory",
>
> + "EfiUnusableMemory",
>
> + "EfiACPIReclaimMemory",
>
> + "EfiACPIMemoryNVS",
>
> + "EfiMemoryMappedIO",
>
> + "EfiMemoryMappedIOPortSpace",
>
> + "EfiPalCode",
>
> + "EfiPersistentMemory",
>
> + "EfiMaxMemoryType"
>
> +};
>
> +
>
> +CHAR8 * mResource_Type_List[] = {
>
> + "EFI_RESOURCE_SYSTEM_MEMORY ", //0x00000000
>
> + "EFI_RESOURCE_MEMORY_MAPPED_IO ", //0x00000001
>
> + "EFI_RESOURCE_IO ", //0x00000002
>
> + "EFI_RESOURCE_FIRMWARE_DEVICE ", //0x00000003
>
> + "EFI_RESOURCE_MEMORY_MAPPED_IO_PORT ", //0x00000004
>
> + "EFI_RESOURCE_MEMORY_RESERVED ", //0x00000005
>
> + "EFI_RESOURCE_IO_RESERVED ", //0x00000006
>
> + "EFI_RESOURCE_MAX_MEMORY_TYPE " //0x00000007
>
> +};
>
> +
>
> +typedef
>
> +EFI_STATUS
>
> +(*GUID_HOB_PRINT) (
>
> + IN UINT8 *HobRaw,
>
> + IN UINT16 HobLength
>
> +);
>
> +
>
> +typedef struct {
>
> + EFI_GUID *Guid;
>
> + GUID_HOB_PRINT PrintHandler;
>
> + CHAR8 *GuidName;
>
> +} GUID_HOB_PRINT_HANDLE;
>
> +
>
> +typedef struct{
>
> + EFI_GUID *Guid;
>
> + CHAR8 *Type;
>
> +} PRINT_MEMORY_ALLOCCATION_HOB;
>
> +
>
> +
>
> +/**
>
> + Print the Hex value of a given range.
>
> + @param[in] DataStart A pointer to the start of data to be printed.
>
> + @param[in] DataSize The length of the data to be printed.
>
> + @retval EFI_SUCCESS If it completed successfully.
>
> +**/
>
> +EFI_STATUS
>
> +PrintHex (
>
> + IN UINT8 *DataStart,
>
> + IN UINT16 DataSize
>
> + )
>
> +{
>
> + UINTN Index1;
>
> + UINTN Index2;
>
> + UINT8 *StartAddr;
>
> +
>
> + StartAddr = DataStart;
>
> + for (Index1 = 0; Index1 * ROW_LIMITER < DataSize; Index1++) {
>
> + DEBUG ((DEBUG_VERBOSE, " 0x%04p:", (DataStart - StartAddr)));
>
> + for (Index2 = 0; (Index2 < ROW_LIMITER) && (Index1 * ROW_LIMITER +
> Index2 < DataSize); Index2++){
>
> + DEBUG ((DEBUG_VERBOSE, " %02x", *DataStart));
>
> + DataStart++;
>
> + }
>
> + DEBUG ((DEBUG_VERBOSE, "\n"));
>
> + }
>
> +
>
> + return EFI_SUCCESS;
>
> +}
>
> +
>
> +/**
>
> + Print the information in HandOffHob.
>
> +
>
> + @param[in] HobStart A pointer to the HOB of type
> EFI_HOB_TYPE_HANDOFF.
>
> + @param[in] HobLength The length in bytes of HOB of type
> EFI_HOB_TYPE_HANDOFF.
>
> + @retval EFI_SUCCESS If it completed successfully.
>
> +**/
>
> +EFI_STATUS
>
> +PrintHandOffHob(
>
> + IN VOID *HobStart,
>
> + IN UINT16 HobLength
>
> + )
>
> +{
>
> + EFI_PEI_HOB_POINTERS Hob;
>
> + Hob.Raw = (UINT8 *) HobStart;
>
> + ASSERT (HobLength >= sizeof (*Hob.HandoffInformationTable));
>
> + DEBUG ((DEBUG_INFO, " BootMode = 0x%x\n",
> Hob.HandoffInformationTable->BootMode));
>
> + DEBUG ((DEBUG_INFO, " EfiMemoryTop = 0x%lx\n",
> Hob.HandoffInformationTable->EfiMemoryTop));
>
> + DEBUG ((DEBUG_INFO, " EfiMemoryBottom = 0x%lx\n",
> Hob.HandoffInformationTable->EfiMemoryBottom));
>
> + DEBUG ((DEBUG_INFO, " EfiFreeMemoryTop = 0x%lx\n",
> Hob.HandoffInformationTable->EfiFreeMemoryTop));
>
> + DEBUG ((DEBUG_INFO, " EfiFreeMemoryBottom = 0x%lx\n",
> Hob.HandoffInformationTable->EfiFreeMemoryBottom));
>
> + DEBUG ((DEBUG_INFO, " EfiEndOfHobList = 0x%lx\n",
> Hob.HandoffInformationTable->EfiEndOfHobList));
>
> + return EFI_SUCCESS;
>
> +}
>
> +
>
> +/**
>
> + Print the information in Memory Allocation Hob.
>
> + @param[in] HobStart A pointer to the HOB of type
> EFI_HOB_TYPE_MEMORY_ALLOCATION.
>
> + @param[in] HobLength The length in bytes of HOB of type
> EFI_HOB_TYPE_MEMORY_ALLOCATION.
>
> + @retval EFI_SUCCESS If it completed successfully.
>
> +**/
>
> +EFI_STATUS
>
> +PrintMemoryAllocationHob (
>
> + IN VOID *HobStart,
>
> + IN UINT16 HobLength
>
> + )
>
> +{
>
> + EFI_PEI_HOB_POINTERS Hob;
>
> +
>
> + Hob.Raw = (UINT8 *) HobStart;
>
> +
>
> + if(CompareGuid (&Hob.MemoryAllocation->AllocDescriptor.Name,
> &gEfiHobMemoryAllocStackGuid)) {
>
> + ASSERT (HobLength >= sizeof (*Hob.MemoryAllocationStack));
>
> + DEBUG ((DEBUG_INFO, " Type =
> EFI_HOB_MEMORY_ALLOCATION_STACK\n"));
>
> + } else if (CompareGuid (&Hob.MemoryAllocation->AllocDescriptor.Name,
> &gEfiHobMemoryAllocBspStoreGuid)) {
>
> + ASSERT (HobLength >= sizeof (*Hob.MemoryAllocationBspStore));
>
> + DEBUG ((DEBUG_INFO, " Type =
> EFI_HOB_MEMORY_ALLOCATION_BSP_STORE\n"));
>
> + } else if (CompareGuid (&Hob.MemoryAllocation->AllocDescriptor.Name,
> &gEfiHobMemoryAllocModuleGuid)) {
>
> + ASSERT (HobLength >= sizeof (*Hob.MemoryAllocationModule));
>
> + DEBUG ((DEBUG_INFO, " Type =
> EFI_HOB_MEMORY_ALLOCATION_MODULE\n"));
>
> + DEBUG ((DEBUG_INFO, " Module Name = %g\n",
> Hob.MemoryAllocationModule->ModuleName));
>
> + DEBUG ((DEBUG_INFO, " Physical Address = 0x%lx\n",
> Hob.MemoryAllocationModule->EntryPoint));
>
> + } else {
>
> + ASSERT (HobLength >= sizeof (*Hob.MemoryAllocation));
>
> + DEBUG ((DEBUG_INFO, " Type =
> EFI_HOB_TYPE_MEMORY_ALLOCATION\n"));
>
> + }
>
> + DEBUG ((DEBUG_INFO, " MemoryBaseAddress = 0x%lx\n",
> Hob.MemoryAllocationStack->AllocDescriptor.MemoryBaseAddress));
>
> + DEBUG ((DEBUG_INFO, " MemoryLength = 0x%lx\n",
> Hob.MemoryAllocationStack->AllocDescriptor.MemoryLength));
>
> + DEBUG ((DEBUG_INFO, " MemoryType = %a \n",
> mMemoryTypeStr[Hob.MemoryAllocationStack-
> >AllocDescriptor.MemoryType]));
>
> + return EFI_SUCCESS;
>
> +}
>
> +
>
> +/**
>
> + Print the information in Resource Discriptor Hob.
>
> + @param[in] HobStart A pointer to HOB of type
> EFI_HOB_TYPE_RESOURCE_DESCRIPTOR.
>
> + @param[in] HobLength The Length in bytes of HOB of type
> EFI_HOB_TYPE_RESOURCE_DESCRIPTOR.
>
> + @retval EFI_SUCCESS If it completed successfully.
>
> +**/
>
> +EFI_STATUS
>
> +PrintResourceDiscriptorHob (
>
> + IN VOID *HobStart,
>
> + IN UINT16 HobLength
>
> + )
>
> +{
>
> + EFI_PEI_HOB_POINTERS Hob;
>
> +
>
> + Hob.Raw = (UINT8 *) HobStart;
>
> + ASSERT (HobLength >= sizeof (*Hob.ResourceDescriptor));
>
> +
>
> + DEBUG ((DEBUG_INFO, " ResourceType = %a\n",
> mResource_Type_List[Hob.ResourceDescriptor->ResourceType]));
>
> + if(!IsZeroGuid (&Hob.ResourceDescriptor->Owner)) {
>
> + DEBUG ((DEBUG_INFO, " Owner = %g\n", Hob.ResourceDescriptor-
> >Owner));
>
> + }
>
> + DEBUG ((DEBUG_INFO, " ResourceAttribute = 0x%x\n",
> Hob.ResourceDescriptor->ResourceAttribute));
>
> + DEBUG ((DEBUG_INFO, " PhysicalStart = 0x%lx\n",
> Hob.ResourceDescriptor->PhysicalStart));
>
> + DEBUG ((DEBUG_INFO, " ResourceLength = 0x%lx\n",
> Hob.ResourceDescriptor->ResourceLength));
>
> + return EFI_SUCCESS;
>
> +}
>
> +
>
> +/**
>
> + Print the information in Acpi Guid Hob.
>
> + @param[in] HobRaw A pointer to the start of
> gUniversalPayloadAcpiTableGuid HOB.
>
> + @retval EFI_SUCCESS If it completed successfully.
>
> +**/
>
> +EFI_STATUS
>
> +PrintAcpiGuidHob (
>
> + IN UINT8 *HobRaw,
>
> + IN UINT16 HobLength
>
> + )
>
> +{
>
> + UNIVERSAL_PAYLOAD_ACPI_TABLE *AcpiTableHob;
>
> + AcpiTableHob = (UNIVERSAL_PAYLOAD_ACPI_TABLE *)
> GET_GUID_HOB_DATA (HobRaw);
>
> + ASSERT (HobLength >= AcpiTableHob->Header.Length);
>
> + DEBUG ((DEBUG_INFO, " Revision = 0x%x\n", AcpiTableHob-
> >Header.Revision));
>
> + DEBUG ((DEBUG_INFO, " Length = 0x%x\n", AcpiTableHob-
> >Header.Length));
>
> + DEBUG ((DEBUG_INFO, " Rsdp = 0x%p\n", (UINT64) AcpiTableHob-
> >Rsdp));
>
> + return EFI_SUCCESS;
>
> +}
>
> +
>
> +/**
>
> + Print the information in Serial Guid Hob.
>
> + @param[in] HobRaw A pointer to the start of
> gUniversalPayloadSerialPortInfoGuid HOB.
>
> + @retval EFI_SUCCESS If it completed successfully.
>
> +**/
>
> +EFI_STATUS
>
> +PrintSerialGuidHob (
>
> + IN UINT8 *HobRaw,
>
> + IN UINT16 HobLength
>
> + )
>
> +{
>
> + UNIVERSAL_PAYLOAD_SERIAL_PORT_INFO *SerialPortInfo;
>
> + SerialPortInfo = (UNIVERSAL_PAYLOAD_SERIAL_PORT_INFO *)
> GET_GUID_HOB_DATA (HobRaw);
>
> + ASSERT (HobLength >= SerialPortInfo->Header.Length);
>
> + DEBUG ((DEBUG_INFO, " Revision = 0x%x\n", SerialPortInfo-
> >Header.Revision));
>
> + DEBUG ((DEBUG_INFO, " Length = 0x%x\n", SerialPortInfo-
> >Header.Length));
>
> + DEBUG ((DEBUG_INFO, " UseMmio = 0x%x\n", SerialPortInfo-
> >UseMmio));
>
> + DEBUG ((DEBUG_INFO, " RegisterStride = 0x%x\n", SerialPortInfo-
> >RegisterStride));
>
> + DEBUG ((DEBUG_INFO, " BaudRate = %d\n", SerialPortInfo-
> >BaudRate));
>
> + DEBUG ((DEBUG_INFO, " RegisterBase = 0x%lx\n", SerialPortInfo-
> >RegisterBase));
>
> + return EFI_SUCCESS;
>
> +}
>
> +
>
> +/**
>
> + Print the information in Smbios Guid Hob.
>
> + @param[in] HobRaw A pointer to the start of
> gUniversalPayloadSmbios3TableGuid HOB.
>
> + @retval EFI_SUCCESS If it completed successfully.
>
> +**/
>
> +EFI_STATUS
>
> +PrintSmbios3GuidHob (
>
> + IN UINT8 *HobRaw,
>
> + IN UINT16 HobLength
>
> + )
>
> +{
>
> + UNIVERSAL_PAYLOAD_SMBIOS_TABLE *SmBiosTable;
>
> + SmBiosTable = (UNIVERSAL_PAYLOAD_SMBIOS_TABLE *)
> GET_GUID_HOB_DATA (HobRaw);
>
> + ASSERT (HobLength >= SmBiosTable->Header.Length);
>
> + DEBUG ((DEBUG_INFO, " Revision = 0x%x\n", SmBiosTable-
> >Header.Revision));
>
> + DEBUG ((DEBUG_INFO, " Length = 0x%x\n", SmBiosTable-
> >Header.Length));
>
> + DEBUG ((DEBUG_INFO, " SmBiosEntryPoint = 0x%lx\n", (UINT64)
> SmBiosTable->SmBiosEntryPoint));
>
> + return EFI_SUCCESS;
>
> +}
>
> +
>
> +/**
>
> + Print the information in Smbios Guid Hob.
>
> + @param[in] HobRaw A pointer to the start of
> gUniversalPayloadSmbiosTableGuid HOB.
>
> + @retval EFI_SUCCESS If it completed successfully.
>
> +**/
>
> +EFI_STATUS
>
> +PrintSmbiosTablGuidHob (
>
> + IN UINT8 *HobRaw,
>
> + IN UINT16 HobLength
>
> + )
>
> +{
>
> + UNIVERSAL_PAYLOAD_SMBIOS_TABLE *SmBiosTable;
>
> + SmBiosTable = (UNIVERSAL_PAYLOAD_SMBIOS_TABLE *)
> GET_GUID_HOB_DATA (HobRaw);
>
> + ASSERT (HobLength >= SmBiosTable->Header.Length);
>
> + DEBUG ((DEBUG_INFO, " Revision = 0x%x\n", SmBiosTable-
> >Header.Revision));
>
> + DEBUG ((DEBUG_INFO, " Length = 0x%x\n", SmBiosTable-
> >Header.Length));
>
> + DEBUG ((DEBUG_INFO, " SmBiosEntryPoint = 0x%lx\n", (UINT64)
> SmBiosTable->SmBiosEntryPoint));
>
> + return EFI_SUCCESS;
>
> +}
>
> +
>
> +/**
>
> + Print the information in Acpi BoardInfo Guid Hob.
>
> + @param[in] HobRaw A pointer to the start of gUefiAcpiBoardInfoGuid
> HOB.
>
> + @retval EFI_SUCCESS If it completed successfully.
>
> +**/
>
> +EFI_STATUS
>
> +PrintAcpiBoardInfoGuidHob (
>
> + IN UINT8 *HobRaw,
>
> + IN UINT16 HobLength
>
> + )
>
> +{
>
> + ACPI_BOARD_INFO *AcpBoardInfo;
>
> + AcpBoardInfo = (ACPI_BOARD_INFO *) GET_GUID_HOB_DATA (HobRaw);
>
> + ASSERT (HobLength >= sizeof (*AcpBoardInfo));
>
> + DEBUG ((DEBUG_INFO, " Revision = 0x%x\n", AcpBoardInfo-
> >Revision));
>
> + DEBUG ((DEBUG_INFO, " Reserved0 = 0x%x\n", AcpBoardInfo-
> >Reserved0));
>
> + DEBUG ((DEBUG_INFO, " ResetValue = 0x%x\n", AcpBoardInfo-
> >ResetValue));
>
> + DEBUG ((DEBUG_INFO, " PmEvtBase = 0x%lx\n", AcpBoardInfo-
> >PmEvtBase));
>
> + DEBUG ((DEBUG_INFO, " PmGpeEnBase = 0x%lx\n", AcpBoardInfo-
> >PmGpeEnBase));
>
> + DEBUG ((DEBUG_INFO, " PmCtrlRegBase = 0x%lx\n", AcpBoardInfo-
> >PmCtrlRegBase));
>
> + DEBUG ((DEBUG_INFO, " PmTimerRegBase = 0x%lx\n", AcpBoardInfo-
> >PmTimerRegBase));
>
> + DEBUG ((DEBUG_INFO, " ResetRegAddress = 0x%lx\n", AcpBoardInfo-
> >ResetRegAddress));
>
> + DEBUG ((DEBUG_INFO, " PcieBaseAddress = 0x%lx\n", AcpBoardInfo-
> >PcieBaseAddress));
>
> + DEBUG ((DEBUG_INFO, " PcieBaseSize = 0x%lx\n", AcpBoardInfo-
> >PcieBaseSize));
>
> + return EFI_SUCCESS;
>
> +}
>
> +
>
> +/**
>
> + Print the information in Pci RootBridge Info Guid Hob.
>
> + @param[in] HobRaw A pointer to the start of
> gUniversalPayloadPciRootBridgeInfoGuid HOB.
>
> +
>
> + @retval EFI_SUCCESS If it completed successfully.
>
> +**/
>
> +EFI_STATUS
>
> +PrintPciRootBridgeInfoGuidHob (
>
> + IN UINT8 *HobRaw,
>
> + IN UINT16 HobLength
>
> + )
>
> +{
>
> + UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES *PciRootBridges;
>
> + UINTN Index;
>
> + Index = 0;
>
> + PciRootBridges = (UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES *)
> GET_GUID_HOB_DATA (HobRaw);
>
> + ASSERT (HobLength >= sizeof
> (UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES));
>
> + DEBUG ((DEBUG_INFO, " Revision = 0x%x\n", PciRootBridges-
> >Header.Revision));
>
> + DEBUG ((DEBUG_INFO, " Length = 0x%x\n", PciRootBridges-
> >Header.Length));
>
> + DEBUG ((DEBUG_INFO, " Count = 0x%x\n", PciRootBridges->Count));
>
> + DEBUG ((DEBUG_INFO, " ResourceAssigned = %a\n", (PciRootBridges-
> >ResourceAssigned ? "True" : "False")));
>
> +
>
> + while(Index < PciRootBridges->Count) {
>
> + DEBUG ((DEBUG_INFO, " Root Bridge Index[%d]:\n", Index));
>
> + DEBUG ((DEBUG_INFO, " Segment = 0x%x\n", PciRootBridges-
> >RootBridge[Index].Segment));
>
> + DEBUG ((DEBUG_INFO, " Supports = 0x%lx\n", PciRootBridges-
> >RootBridge[Index].Supports));
>
> + DEBUG ((DEBUG_INFO, " Attributes = 0x%lx\n", PciRootBridges-
> >RootBridge[Index].Attributes));
>
> + DEBUG ((DEBUG_INFO, " DmaAbove4G = 0x%x\n",
> PciRootBridges->RootBridge[Index].DmaAbove4G));
>
> + DEBUG ((DEBUG_INFO, " NoExtendedConfigSpace = 0x%x\n",
> PciRootBridges->RootBridge[Index].NoExtendedConfigSpace));
>
> + DEBUG ((DEBUG_INFO, " AllocationAttributes = 0x%lx\n",
> PciRootBridges->RootBridge[Index].AllocationAttributes));
>
> + DEBUG ((DEBUG_INFO, " Bus.Base = 0x%lx\n", PciRootBridges-
> >RootBridge[Index].Bus.Base));
>
> + DEBUG ((DEBUG_INFO, " Bus.Limit = 0x%lx\n", PciRootBridges-
> >RootBridge[Index].Bus.Limit));
>
> + DEBUG ((DEBUG_INFO, " Bus.Translation = 0x%lx\n",
> PciRootBridges->RootBridge[Index].Bus.Translation));
>
> + DEBUG ((DEBUG_INFO, " Io.Base = 0x%lx\n", PciRootBridges-
> >RootBridge[Index].Io.Base));
>
> + DEBUG ((DEBUG_INFO, " Io.Limit = 0x%lx\n", PciRootBridges-
> >RootBridge[Index].Io.Limit));
>
> + DEBUG ((DEBUG_INFO, " Io.Translation = 0x%lx\n", PciRootBridges-
> >RootBridge[Index].Io.Translation));
>
> + DEBUG ((DEBUG_INFO, " Mem.Base = 0x%lx\n", PciRootBridges-
> >RootBridge[Index].Mem.Base));
>
> + DEBUG ((DEBUG_INFO, " Mem.Limit = 0x%lx\n", PciRootBridges-
> >RootBridge[Index].Mem.Limit));
>
> + DEBUG ((DEBUG_INFO, " Mem.Translation = 0x%lx\n",
> PciRootBridges->RootBridge[Index].Mem.Translation));
>
> + DEBUG ((DEBUG_INFO, " MemAbove4G.Base = 0x%lx\n",
> PciRootBridges->RootBridge[Index].MemAbove4G.Base));
>
> + DEBUG ((DEBUG_INFO, " MemAbove4G.Limit = 0x%lx\n",
> PciRootBridges->RootBridge[Index].MemAbove4G.Limit));
>
> + DEBUG ((DEBUG_INFO, " MemAbove4G.Translation = 0x%lx\n",
> PciRootBridges->RootBridge[Index].MemAbove4G.Translation));
>
> + DEBUG ((DEBUG_INFO, " PMem.Base = 0x%lx\n", PciRootBridges-
> >RootBridge[Index].PMem.Base));
>
> + DEBUG ((DEBUG_INFO, " PMem.Limit = 0x%lx\n", PciRootBridges-
> >RootBridge[Index].PMem.Limit));
>
> + DEBUG ((DEBUG_INFO, " PMem.Translation = 0x%lx\n",
> PciRootBridges->RootBridge[Index].PMem.Translation));
>
> + DEBUG ((DEBUG_INFO, " PMemAbove4G.Base = 0x%lx\n",
> PciRootBridges->RootBridge[Index].PMemAbove4G.Base));
>
> + DEBUG ((DEBUG_INFO, " PMemAbove4G.Limit = 0x%lx\n",
> PciRootBridges->RootBridge[Index].PMemAbove4G.Limit));
>
> + DEBUG ((DEBUG_INFO, " PMemAbove4G.Translation = 0x%lx\n",
> PciRootBridges->RootBridge[Index].PMemAbove4G.Translation));
>
> + Index+=1;
>
> + }
>
> + return EFI_SUCCESS;
>
> +}
>
> +
>
> +/**
>
> + Print the information in Extra Data Guid Hob.
>
> + @param[in] HobRaw A pointer to the start of
> gUniversalPayloadExtraDataGuid HOB.
>
> + @retval EFI_SUCCESS If it completed successfully.
>
> +**/
>
> +EFI_STATUS
>
> +PrintExtraDataGuidHob (
>
> + IN UINT8 *HobRaw,
>
> + IN UINT16 HobLength
>
> + )
>
> +{
>
> + UNIVERSAL_PAYLOAD_EXTRA_DATA *ExtraData;
>
> + UINTN Index;
>
> +
>
> + Index = 0;
>
> + ExtraData = (UNIVERSAL_PAYLOAD_EXTRA_DATA *)
> GET_GUID_HOB_DATA (HobRaw);
>
> + ASSERT (HobLength >= ExtraData->Header.Length);
>
> + DEBUG ((DEBUG_INFO, " Revision = 0x%x\n", ExtraData-
> >Header.Revision));
>
> + DEBUG ((DEBUG_INFO, " Length = 0x%x\n", ExtraData-
> >Header.Length));
>
> + DEBUG ((DEBUG_INFO, " Count = 0x%x\n", ExtraData->Count));
>
> +
>
> + while (Index < ExtraData->Count) {
>
> + DEBUG ((DEBUG_INFO, " Id[%d] = %a\n", Index,ExtraData-
> >Entry[Index].Identifier));
>
> + DEBUG ((DEBUG_INFO, " Base[%d] = 0x%lx\n", Index,ExtraData-
> >Entry[Index].Base));
>
> + DEBUG ((DEBUG_INFO, " Size[%d] = 0x%lx\n", Index,ExtraData-
> >Entry[Index].Size));
>
> + Index+=1;
>
> + }
>
> + return EFI_SUCCESS;
>
> +}
>
> +
>
> +/**
>
> + Print the information in MemoryTypeInfoGuidHob.
>
> + @param[in] HobRaw A pointer to the start of
> gEfiMemoryTypeInformationGuid HOB.
>
> + @retval EFI_SUCCESS If it completed successfully.
>
> +**/
>
> +EFI_STATUS
>
> +PrintMemoryTypeInfoGuidHob (
>
> + IN UINT8 *HobRaw,
>
> + IN UINT16 HobLength
>
> + )
>
> +{
>
> + EFI_MEMORY_TYPE_INFORMATION *MemoryTypeInfo;
>
> +
>
> + MemoryTypeInfo = (EFI_MEMORY_TYPE_INFORMATION *)
> GET_GUID_HOB_DATA (HobRaw);
>
> + ASSERT (HobLength >= sizeof (*MemoryTypeInfo));
>
> + DEBUG ((DEBUG_INFO, " Type = 0x%x\n", MemoryTypeInfo-
> >Type));
>
> + DEBUG ((DEBUG_INFO, " NumberOfPages = 0x%x\n", MemoryTypeInfo-
> >NumberOfPages));
>
> + return EFI_SUCCESS;
>
> +}
>
> +
>
> +//
>
> +// Mappint table for dump Guid Hob information.
>
> +// This table can be easily extented.
>
> +//
>
> +GUID_HOB_PRINT_HANDLE GuidHobPrintHandleTable[] = {
>
> + {&gUniversalPayloadAcpiTableGuid, PrintAcpiGuidHob,
> "gUniversalPayloadAcpiTableGuid(ACPI table Guid)"},
>
> + {&gUniversalPayloadSerialPortInfoGuid, PrintSerialGuidHob,
> "gUniversalPayloadSerialPortInfoGuid(Serial Port Info)"},
>
> + {&gUniversalPayloadSmbios3TableGuid, PrintSmbios3GuidHob,
> "gUniversalPayloadSmbios3TableGuid(SmBios Guid)"},
>
> + {&gUniversalPayloadSmbiosTableGuid, PrintSmbiosTablGuidHob,
> "gUniversalPayloadSmbiosTableGuid(SmBios Guid)"},
>
> + {&gUefiAcpiBoardInfoGuid, PrintAcpiBoardInfoGuidHob,
> "gUefiAcpiBoardInfoGuid(Acpi Guid)"},
>
> + {&gUniversalPayloadPciRootBridgeInfoGuid,
> PrintPciRootBridgeInfoGuidHob,
> "gUniversalPayloadPciRootBridgeInfoGuid(Pci Guid)"},
>
> + {&gEfiMemoryTypeInformationGuid, PrintMemoryTypeInfoGuidHob,
> "gEfiMemoryTypeInformationGuid(Memory Type Information Guid)"},
>
> + {&gUniversalPayloadExtraDataGuid, PrintExtraDataGuidHob,
> "gUniversalPayloadExtraDataGuid(PayLoad Extra Data Guid)"}
>
> +};
>
> +
>
> +/**
>
> + Print the Guid Hob using related print handle function.
>
> + @param[in] HobStart A pointer to the HOB of type
> EFI_HOB_TYPE_GUID_EXTENSION.
>
> + @param[in] HobLength The length in bytes of the HOB of type
> EFI_HOB_TYPE_GUID_EXTENSION.
>
> + @retval EFI_SUCCESS If it completed successfully.
>
> +**/
>
> +EFI_STATUS
>
> +PrintGuidHob (
>
> + IN VOID *HobStart,
>
> + IN UINT16 HobLength
>
> + )
>
> +{
>
> + EFI_PEI_HOB_POINTERS Hob;
>
> + UINTN Index;
>
> + EFI_STATUS Status;
>
> +
>
> + Hob.Raw = (UINT8 *) HobStart;
>
> + ASSERT (HobLength >= sizeof (Hob.Guid));
>
> +
>
> + for (Index = 0; Index < ARRAY_SIZE (GuidHobPrintHandleTable); Index++) {
>
> + if (CompareGuid (&Hob.Guid->Name,
> GuidHobPrintHandleTable[Index].Guid)) {
>
> + DEBUG ((DEBUG_INFO, " Guid = %a\n",
> GuidHobPrintHandleTable[Index].GuidName));
>
> + Status = GuidHobPrintHandleTable[Index].PrintHandler (Hob.Raw,
> Hob.Header->HobLength);
>
> + return Status;
>
> + }
>
> + }
>
> + DEBUG ((DEBUG_INFO, " Name = %g\n", &Hob.Guid->Name));
>
> + PrintHex (GET_GUID_HOB_DATA (Hob.Raw), GET_GUID_HOB_DATA_SIZE
> (Hob.Raw));
>
> + return EFI_SUCCESS;
>
> +}
>
> +
>
> +/**
>
> + Print the information in FV Hob.
>
> + @param[in] HobStart A pointer to the HOB of type EFI_HOB_TYPE_FV.
>
> + @param[in] HobLength The length in bytes of the HOB of type
> EFI_HOB_TYPE_FV.
>
> + @retval EFI_SUCCESS If it completed successfully.
>
> +**/
>
> +EFI_STATUS
>
> +PrintFvHob (
>
> + IN VOID *HobStart,
>
> + IN UINT16 HobLength
>
> + )
>
> +{
>
> + EFI_PEI_HOB_POINTERS Hob;
>
> +
>
> + Hob.Raw = (UINT8 *) HobStart;
>
> + ASSERT (HobLength >= sizeof (*Hob.FirmwareVolume));
>
> +
>
> + DEBUG ((DEBUG_INFO, " BaseAddress = 0x%lx\n",
> Hob.FirmwareVolume->BaseAddress));
>
> + DEBUG ((DEBUG_INFO, " Length = 0x%lx\n", Hob.FirmwareVolume-
> >Length));
>
> + return EFI_SUCCESS;
>
> +}
>
> +
>
> +/**
>
> + Print the information in Cpu Hob.
>
> + @param[in] HobStart A pointer to the HOB of type EFI_HOB_TYPE_CPU.
>
> + @param[in] HobLength The length in bytes of the HOB of type
> EFI_HOB_TYPE_CPU.
>
> + @retval EFI_SUCCESS If it completed successfully.
>
> +**/
>
> +EFI_STATUS
>
> +PrintCpuHob (
>
> + IN VOID *HobStart,
>
> + IN UINT16 HobLength
>
> + )
>
> +{
>
> + EFI_PEI_HOB_POINTERS Hob;
>
> +
>
> + Hob.Raw = (UINT8 *) HobStart;
>
> + ASSERT (HobLength >= sizeof (*Hob.Cpu));
>
> +
>
> + DEBUG ((DEBUG_INFO, " SizeOfMemorySpace = 0x%lx\n", Hob.Cpu-
> >SizeOfMemorySpace));
>
> + DEBUG ((DEBUG_INFO, " SizeOfIoSpace = 0x%lx\n", Hob.Cpu-
> >SizeOfIoSpace));
>
> + return EFI_SUCCESS;
>
> +}
>
> +
>
> +/**
>
> + Print the information in MemoryPoolHob.
>
> + @param[in] HobStart A pointer to the HOB of type
> EFI_HOB_TYPE_MEMORY_POOL.
>
> + @param[in] HobLength The length in bytes of the HOB of type
> EFI_HOB_TYPE_MEMORY_POOL.
>
> + @retval EFI_SUCCESS If it completed successfully.
>
> +**/
>
> +EFI_STATUS
>
> +PrintMemoryPoolHob (
>
> + IN VOID *HobStart,
>
> + IN UINT16 HobLength
>
> + )
>
> +{
>
> + return EFI_SUCCESS;
>
> +}
>
> +
>
> +/**
>
> + Print the information in Fv2Hob.
>
> + @param[in] HobStart A pointer to the HOB of type EFI_HOB_TYPE_FV2.
>
> + @param[in] HobLength The length in bytes of the HOB of type
> EFI_HOB_TYPE_FV2.
>
> + @retval EFI_SUCCESS If it completed successfully.
>
> +**/
>
> +EFI_STATUS
>
> +PrintFv2Hob (
>
> + IN VOID *HobStart,
>
> + IN UINT16 HobLength
>
> + )
>
> +{
>
> + EFI_PEI_HOB_POINTERS Hob;
>
> +
>
> + Hob.Raw = (UINT8 *) HobStart;
>
> + ASSERT (HobLength >= sizeof (*Hob.FirmwareVolume2));
>
> +
>
> + DEBUG ((DEBUG_INFO, " BaseAddress = 0x%lx\n",
> Hob.FirmwareVolume2->BaseAddress));
>
> + DEBUG ((DEBUG_INFO, " Length = 0x%lx\n", Hob.FirmwareVolume2-
> >Length));
>
> + DEBUG ((DEBUG_INFO, " FvName = %g\n", &Hob.FirmwareVolume2-
> >FvName));
>
> + DEBUG ((DEBUG_INFO, " FileName = %g\n", &Hob.FirmwareVolume2-
> >FileName));
>
> + return EFI_SUCCESS;
>
> +}
>
> +
>
> +/**
>
> + Print the information in Capsule Hob.
>
> + @param[in] HobStart A pointer to the HOB of type
> EFI_HOB_TYPE_UEFI_CAPSULE.
>
> + @param[in] HobLength The length in bytes of the HOB of type
> EFI_HOB_TYPE_UEFI_CAPSULE.
>
> + @retval EFI_SUCCESS If it completed successfully.
>
> +**/
>
> +EFI_STATUS
>
> +PrintCapsuleHob (
>
> + IN VOID *HobStart,
>
> + IN UINT16 HobLength
>
> + )
>
> +{
>
> + EFI_PEI_HOB_POINTERS Hob;
>
> +
>
> + Hob.Raw = (UINT8 *) HobStart;
>
> + ASSERT (HobLength >= sizeof (*Hob.Capsule));
>
> +
>
> + DEBUG ((DEBUG_INFO, " BaseAddress = 0x%lx\n", Hob.Capsule-
> >BaseAddress));
>
> + DEBUG ((DEBUG_INFO, " Length = 0x%lx\n", Hob.Capsule->Length));
>
> + return EFI_SUCCESS;
>
> +}
>
> +
>
> +/**
>
> + Print the information in Fv3 Hob.
>
> + @param[in] HobStart A pointer to the HOB of type EFI_HOB_TYPE_FV3.
>
> + @param[in] HobLength The length in bytes of the HOB of type
> EFI_HOB_TYPE_FV3.
>
> + @retval EFI_SUCCESS If it completed successfully.
>
> +**/
>
> +EFI_STATUS
>
> +PrintFv3Hob (
>
> + IN VOID *HobStart,
>
> + IN UINT16 HobLength
>
> + )
>
> +{
>
> + EFI_PEI_HOB_POINTERS Hob;
>
> + Hob.Raw = (UINT8 *) HobStart;
>
> + ASSERT (HobLength >= sizeof (*Hob.FirmwareVolume3));
>
> +
>
> + DEBUG ((DEBUG_INFO, " BaseAddress = 0x%lx\n",
> Hob.FirmwareVolume3->BaseAddress));
>
> + DEBUG ((DEBUG_INFO, " Length = 0x%lx\n",
> Hob.FirmwareVolume3->Length));
>
> + DEBUG ((DEBUG_INFO, " AuthenticationStatus = 0x%x\n",
> Hob.FirmwareVolume3->AuthenticationStatus));
>
> + DEBUG ((DEBUG_INFO, " ExtractedFv = %a\n",
> (Hob.FirmwareVolume3->ExtractedFv ? "True" : "False")));
>
> + DEBUG ((DEBUG_INFO, " FVName = %g\n",
> &Hob.FirmwareVolume3->FvName));
>
> + DEBUG ((DEBUG_INFO, " FileName = %g\n",
> &Hob.FirmwareVolume3->FileName));
>
> + return EFI_SUCCESS;
>
> +}
>
> +
>
> +//
>
> +// Mappint table from Hob type to Hob print function.
>
> +//
>
> +HOB_PRINT_HANDLER_TABLE mHobHandles[] = {
>
> + {EFI_HOB_TYPE_HANDOFF, "EFI_HOB_TYPE_HANDOFF",
> PrintHandOffHob},
>
> + {EFI_HOB_TYPE_MEMORY_ALLOCATION,
> "EFI_HOB_TYPE_MEMORY_ALLOCATION", PrintMemoryAllocationHob},
>
> + {EFI_HOB_TYPE_RESOURCE_DESCRIPTOR,
> "EFI_HOB_TYPE_RESOURCE_DESCRIPTOR", PrintResourceDiscriptorHob},
>
> + {EFI_HOB_TYPE_GUID_EXTENSION, "EFI_HOB_TYPE_GUID_EXTENSION",
> PrintGuidHob},
>
> + {EFI_HOB_TYPE_FV, "EFI_HOB_TYPE_FV", PrintFvHob},
>
> + {EFI_HOB_TYPE_CPU, "EFI_HOB_TYPE_CPU",
> PrintCpuHob},
>
> + {EFI_HOB_TYPE_MEMORY_POOL, "EFI_HOB_TYPE_MEMORY_POOL",
> PrintMemoryPoolHob},
>
> + {EFI_HOB_TYPE_FV2, "EFI_HOB_TYPE_FV2", PrintFv2Hob},
>
> + {EFI_HOB_TYPE_UEFI_CAPSULE, "EFI_HOB_TYPE_UEFI_CAPSULE",
> PrintCapsuleHob},
>
> + {EFI_HOB_TYPE_FV3, "EFI_HOB_TYPE_FV3", PrintFv3Hob}
>
> +};
>
> +
>
> +
>
> +/**
>
> + Print all HOBs info from the HOB list.
>
> + @param[in] HobStart A pointer to the HOB list
>
> + @return The pointer to the HOB list.
>
> +**/
>
> +VOID
>
> +PrintHob (
>
> + IN CONST VOID *HobStart
>
> + )
>
> +{
>
> + EFI_PEI_HOB_POINTERS Hob;
>
> + UINTN Count;
>
> + UINTN Index;
>
> + ASSERT (HobStart != NULL);
>
> +
>
> + Hob.Raw = (UINT8 *) HobStart;
>
> + DEBUG ((DEBUG_INFO, "Print all Hob information from Hob 0x%p\n",
> Hob.Raw));
>
> +
>
> + Count = 0;
>
> + //
>
> + // Parse the HOB list to see which type it is, and print the information.
>
> + //
>
> + while (!END_OF_HOB_LIST (Hob)) {
>
> + for (Index = 0; Index < ARRAY_SIZE (mHobHandles); Index++) {
>
> + if (Hob.Header->HobType == mHobHandles[Index].Type) {
>
> + DEBUG ((DEBUG_INFO, "HOB[%d]: Type = %a, Offset = 0x%p, Length =
> 0x%x\n", Count, mHobHandles[Index].Name, (Hob.Raw - (UINT8 *)
> HobStart), Hob.Header->HobLength));
>
> + mHobHandles[Index].PrintHandler (Hob.Raw, Hob.Header-
> >HobLength);
>
> + break;
>
> + }
>
> + }
>
> + if (Index == ARRAY_SIZE (mHobHandles)) {
>
> + DEBUG ((DEBUG_INFO, "HOB[%d]: Type = %d, Offset = 0x%p, Length =
> 0x%x\n", Count, Hob.Header->HobType, (Hob.Raw - (UINT8 *)HobStart),
> Hob.Header->HobLength));
>
> + DEBUG ((DEBUG_INFO, " Unkown Hob type\n"));
>
> + PrintHex (Hob.Raw, Hob.Header->HobLength);
>
> + }
>
> + Count++;
>
> + Hob.Raw = GET_NEXT_HOB (Hob);
>
> + }
>
> + DEBUG ((DEBUG_INFO, "There are totally %d Hobs, the End Hob address
> is %p\n", Count, Hob.Raw));
>
> +}
>
> diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
> b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
> index 7a00a56ab9..09dd1e8378 100644
> --- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
> +++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
> @@ -25,6 +25,16 @@
>
>
> extern VOID *mHobList;
>
>
>
> +/**
>
> + Print all HOBs info from the HOB list.
>
> +
>
> + @return The pointer to the HOB list.
>
> +**/
>
> +VOID
>
> +PrintHob (
>
> + IN CONST VOID *HobStart
>
> + );
>
> +
>
> /**
>
> Some bootloader may pass a pcd database, and UPL also contain a PCD
> database.
>
> Dxe PCD driver has the assumption that the two PCD database can be
> catenated and
>
> @@ -375,6 +385,13 @@ _ModuleEntryPoint (
> DEBUG ((DEBUG_INFO, "Entering Universal Payload...\n"));
>
> DEBUG ((DEBUG_INFO, "sizeof(UINTN) = 0x%x\n", sizeof(UINTN)));
>
>
>
> + DEBUG_CODE (
>
> + //
>
> + // Dump the Hobs from boot loader
>
> + //
>
> + PrintHob (mHobList);
>
> + );
>
> +
>
> // Initialize floating point operating environment to be compliant with UEFI
> spec.
>
> InitializeFloatingPointUnits ();
>
>
>
> diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
> b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
> index 76d7e4791c..416a620598 100644
> --- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
> +++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
> @@ -24,6 +24,7 @@
> UniversalPayloadEntry.c
>
> LoadDxeCore.c
>
> MemoryAllocation.c
>
> + PrintHob.c
>
>
>
> [Sources.Ia32]
>
> X64/VirtualMemory.h
>
> @@ -64,6 +65,11 @@
> gUefiSerialPortInfoGuid
>
> gUniversalPayloadExtraDataGuid
>
> gPcdDataBaseHobGuid
>
> + gUniversalPayloadSmbiosTableGuid
>
> + gEfiHobMemoryAllocBspStoreGuid
>
> + gUniversalPayloadAcpiTableGuid
>
> + gUniversalPayloadPciRootBridgeInfoGuid
>
> + gUniversalPayloadSmbios3TableGuid
>
>
>
> [FeaturePcd.IA32]
>
> gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode ##
> CONSUMES
>
> --
> 2.30.0.windows.2
prev parent reply other threads:[~2021-07-13 21:01 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-13 7:10 [Patch V3] UefiPayloadPkg: Dump hob information from boot loader Zhiguang Liu
2021-07-13 21:00 ` Guo Dong [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=BYAPR11MB3622980FAD00086BEF09F1729E149@BYAPR11MB3622.namprd11.prod.outlook.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox