public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Wu, Hao A" <hao.a.wu@intel.com>
To: "Liu, Zhiguang" <zhiguang.liu@intel.com>,
	"Ni, Ray" <ray.ni@intel.com>,
	"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: "Wang, Jian J" <jian.j.wang@intel.com>,
	"Bi, Dandan" <dandan.bi@intel.com>,
	"Zeng, Star" <star.zeng@intel.com>,
	"Gao, Zhichao" <zhichao.gao@intel.com>,
	Patrick Rudolph <patrick.rudolph@9elements.com>
Subject: Re: [PATCH 5/9] MdeModulePkg/Universal/SmbiosDxe: Scan for existing tables
Date: Wed, 26 May 2021 06:15:28 +0000	[thread overview]
Message-ID: <BN8PR11MB3666AE93F9F181964CD42342CA249@BN8PR11MB3666.namprd11.prod.outlook.com> (raw)
In-Reply-To: <20210524071234.1056-6-zhiguang.liu@intel.com>

Adding Ray.

Hello Ray, I saw most of your comments in previous patch:
"[PATCH - resend] MdeModulePkg/Universal/SmbiosDxe: Scan for existing tables"
have been addressed in this patch series.
Could you help to check if there are additional comments for this patch? Thanks.

Some inline comments below:


> -----Original Message-----
> From: Liu, Zhiguang <zhiguang.liu@intel.com>
> Sent: Monday, May 24, 2021 3:13 PM
> To: devel@edk2.groups.io
> Cc: Wang, Jian J <jian.j.wang@intel.com>; Wu, Hao A <hao.a.wu@intel.com>;
> Bi, Dandan <dandan.bi@intel.com>; Zeng, Star <star.zeng@intel.com>; Gao,
> Zhichao <zhichao.gao@intel.com>; Patrick Rudolph
> <patrick.rudolph@9elements.com>
> Subject: [PATCH 5/9] MdeModulePkg/Universal/SmbiosDxe: Scan for
> existing tables
> 
> V1:
> The default EfiSmbiosProtocol operates on an empty SMBIOS table.
> The SMBIOS tables are provided by the bootloader on UefiPayloadPkg.
> Scan for existing tables in SmbiosDxe and load them if they seem valid.
> 
> This fixes the settings menu not showing any hardware information, instead
> only "0 MB RAM" was displayed.
> 
> Tests showed that the OS can still see the SMBIOS tables.
> 
> V2:
> SmbiosDxe will get the SMBIOS from a guid Hob.
> Aslo will keep the SmbiosHandle if it is available.
> 
> Cc: Jian J Wang <jian.j.wang@intel.com>
> Cc: Hao A Wu <hao.a.wu@intel.com>
> Cc: Dandan Bi <dandan.bi@intel.com>
> Cc: Star Zeng <star.zeng@intel.com>
> Cc: Zhichao Gao <zhichao.gao@intel.com>
> Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
> Signed-off-by: Zhiguang Liu <zhiguang.liu@intel.com>
> ---
>  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.c   | 299
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> +++++++--
>  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.h   |   4 +++-
>  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf |   5 ++++-
>  3 files changed, 304 insertions(+), 4 deletions(-)
> 
> diff --git a/MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.c
> b/MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.c
> index 3cdb0b1ed7..d2aa15d43f 100644
> --- a/MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.c
> +++ b/MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.c
> @@ -2,7 +2,7 @@
>    This code produces the Smbios protocol. It also responsible for constructing
> 
>    SMBIOS table into system table.
> 
> 
> 
> -Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
> 
> +Copyright (c) 2009 - 2021, Intel Corporation. All rights reserved.<BR>
> 
>  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> 
> 
>  **/
> 
> @@ -1408,6 +1408,300 @@ SmbiosTableConstruction (
>    }
> 
>  }
> 
> 
> 
> +/**
> 
> +  Validates a SMBIOS 2.0 table entry point.
> 
> +
> 
> +  @param  SmbiosTable   The SMBIOS_TABLE_ENTRY_POINT to validate.
> 
> +
> 
> +  @retval TRUE           SMBIOS table entry point is valid.
> 
> +  @retval FALSE          SMBIOS table entry point is malformed.
> 
> +
> 
> +**/
> 
> +STATIC
> 
> +BOOLEAN
> 
> +IsValidSmbios20Table (
> 
> +  IN SMBIOS_TABLE_ENTRY_POINT      *SmbiosTable
> 
> +  )
> 
> +{
> 
> +  UINT8 Checksum;
> 
> +
> 
> +  if (CompareMem (SmbiosTable->AnchorString, "_SM_", 4) != 0) {
> 
> +    return FALSE;
> 
> +  }


Should a check for the 'IntermediateAnchorString' be added here as well?


> 
> +
> 
> +  //
> 
> +  // The actual value of the EntryPointLength should be 1Fh.
> 
> +  // However, it was incorrectly stated in version 2.1 of smbios specification.
> 
> +  // Therefore, 0x1F and 0x1E are both accepted.
> 
> +  //
> 
> +  if (SmbiosTable->EntryPointLength != 0x1E ||
> + SmbiosTable->EntryPointLength != sizeof (SMBIOS_TABLE_ENTRY_POINT))
> {
> 
> +    return FALSE;
> 
> +  }
> 
> +
> 
> +  //
> 
> +  // MajorVersion should be 2.
> 
> +  //
> 
> +  if (SmbiosTable->MajorVersion != 2) {
> 
> +    return FALSE;


I might be wrong on this.
My take with the SMBIOS spec is that a 2.0 table is allowed to has this field greater than 2.
As long as a specific version of the SMBIOS spec still support this format (which is still true for version 3.0).

So I think I check like:
  if (EntryPointStructure->MajorVersion < 2) {...}
should be used here.


> 
> +  }
> 
> +
> 
> +  //
> 
> +  // The whole struct check sum should be zero
> 
> +  //
> 
> +  Checksum = CalculateSum8 (
> 
> +               (UINT8 *) SmbiosTable,
> 
> +               SmbiosTable->EntryPointLength
> 
> +               );
> 
> +  if (Checksum != 0) {
> 
> +    return FALSE;
> 
> +  }
> 
> +
> 
> +  //
> 
> +  // The Intermediate Entry Point Structure check sum should be zero.
> 
> +  //
> 
> +  Checksum = CalculateSum8 (
> 
> +               (UINT8 *) SmbiosTable + OFFSET_OF
> + (SMBIOS_TABLE_ENTRY_POINT, IntermediateAnchorString),
> 
> +               SmbiosTable->EntryPointLength - OFFSET_OF
> + (SMBIOS_TABLE_ENTRY_POINT, IntermediateAnchorString)
> 
> +               );
> 
> +  return (BOOLEAN) (Checksum == 0);
> 
> +}
> 
> +
> 
> +/**
> 
> +  Validates a SMBIOS 3.0 table entry point.
> 
> +
> 
> +  @param  SmbiosTable   The SMBIOS_TABLE_3_0_ENTRY_POINT to validate.
> 
> +
> 
> +  @retval TRUE           SMBIOS table entry point is valid.
> 
> +  @retval FALSE          SMBIOS table entry point is malformed.
> 
> +
> 
> +**/
> 
> +STATIC
> 
> +BOOLEAN
> 
> +IsValidSmbios30Table (
> 
> +  IN SMBIOS_TABLE_3_0_ENTRY_POINT  *SmbiosTable
> 
> +  )
> 
> +{
> 
> +  UINT8 Checksum;
> 
> +
> 
> +  if (CompareMem (SmbiosTable->AnchorString, "_SM3_", 5) != 0) {
> 
> +    return FALSE;
> 
> +  }
> 
> +  if (SmbiosTable->EntryPointLength < sizeof
> + (SMBIOS_TABLE_3_0_ENTRY_POINT)) {
> 
> +    return FALSE;
> 
> +  }
> 
> +  if (SmbiosTable->MajorVersion < 3) {
> 
> +    return FALSE;
> 
> +  }
> 
> +
> 
> +  //
> 
> +  // The whole struct check sum should be zero
> 
> +  //
> 
> +  Checksum = CalculateSum8 (
> 
> +               (UINT8 *) SmbiosTable,
> 
> +               SmbiosTable->EntryPointLength
> 
> +               );
> 
> +  if (Checksum != 0) {
> 
> +    return FALSE;
> 
> +  }
> 
> +  return TRUE;
> 
> +}
> 
> +
> 
> +/**
> 
> +  Parse an existing SMBIOS table and insert it using SmbiosAdd.
> 
> +
> 
> +  @param  ImageHandle           The EFI_HANDLE to this driver.
> 
> +  @param  Smbios                The SMBIOS table to parse.
> 
> +  @param  Length                The length of the SMBIOS table.
> 
> +
> 
> +  @retval EFI_SUCCESS           SMBIOS table was parsed and installed.
> 
> +  @retval EFI_OUT_OF_RESOURCES  Record was not added due to lack of
> system resources.
> 
> +  @retval EFI_INVALID_PARAMETER Smbios is not a correct smbios table
> 
> +
> 
> +**/
> 
> +STATIC
> 
> +EFI_STATUS
> 
> +ParseAndAddExistingSmbiosTable (
> 
> +  IN EFI_HANDLE                    ImageHandle,
> 
> +  IN SMBIOS_STRUCTURE_POINTER      Smbios,
> 
> +  IN UINTN                         Length
> 
> +  )
> 
> +{
> 
> +  EFI_STATUS                    Status;
> 
> +  CHAR8                         *String;
> 
> +  EFI_SMBIOS_HANDLE             SmbiosHandle;
> 
> +  SMBIOS_STRUCTURE_POINTER      SmbiosEnd;
> 
> +
> 
> +  SmbiosEnd.Raw = Smbios.Raw + Length;
> 
> +
> 
> +  if (Smbios.Raw >= SmbiosEnd.Raw || Smbios.Raw == NULL) {
> 
> +    return EFI_INVALID_PARAMETER;
> 
> +  }
> 
> +
> 
> +  do {
> 
> +    //
> 
> +    // Make sure not to access memory beyond SmbiosEnd
> 
> +    //
> 
> +    if (Smbios.Raw + sizeof (SMBIOS_STRUCTURE) > SmbiosEnd.Raw ||
> 
> +      Smbios.Raw + sizeof (SMBIOS_STRUCTURE) < Smbios.Raw) {
> 
> +      return EFI_INVALID_PARAMETER;
> 
> +    }
> 
> +    //
> 
> +    // Check for end marker
> 
> +    //
> 
> +    if (Smbios.Hdr->Type == SMBIOS_TYPE_END_OF_TABLE) {
> 
> +      break;
> 
> +    }
> 
> +    //
> 
> +    // Make sure not to access memory beyond SmbiosEnd
> 
> +    // Each structure shall be terminated by a double-null (0000h).
> 
> +    //
> 
> +    if (Smbios.Raw + Smbios.Hdr->Length + 2 * sizeof (UINT8) >
> + SmbiosEnd.Raw ||
> 
> +      Smbios.Raw + Smbios.Hdr->Length + 2 * sizeof (UINT8) <
> + Smbios.Raw) {
> 
> +      return EFI_INVALID_PARAMETER;
> 
> +    }
> 
> +    //
> 
> +    // Install the table
> 
> +    //
> 
> +    SmbiosHandle = Smbios.Hdr->Handle;
> 
> +    Status = SmbiosAdd (
> 
> +               &mPrivateData.Smbios,
> 
> +               ImageHandle,
> 
> +               &SmbiosHandle,
> 
> +               Smbios.Hdr
> 
> +               );
> 
> +
> 
> +    ASSERT_EFI_ERROR (Status);
> 
> +    if (EFI_ERROR (Status)) {
> 
> +      return Status;
> 
> +    }
> 
> +    //
> 
> +    // Go to the next SMBIOS structure. Each SMBIOS structure may include 2
> parts:
> 
> +    // 1. Formatted section; 2. Unformatted string section. So, 2 steps
> + are needed
> 
> +    // to skip one SMBIOS structure.
> 
> +    //
> 
> +
> 
> +    //
> 
> +    // Step 1: Skip over formatted section.
> 
> +    //
> 
> +    String = (CHAR8 *) (Smbios.Raw + Smbios.Hdr->Length);
> 
> +
> 
> +    //
> 
> +    // Step 2: Skip over unformatted string section.
> 
> +    //
> 
> +    do {
> 
> +      //
> 
> +      // Each string is terminated with a NULL(00h) BYTE and the sets
> + of strings
> 
> +      // is terminated with an additional NULL(00h) BYTE.
> 
> +      //
> 
> +      for ( ; *String != 0; String++) {
> 
> +        if ((UINTN) String >= (UINTN) SmbiosEnd.Raw - sizeof (UINT8)) {
> 
> +          return EFI_INVALID_PARAMETER;
> 
> +        }
> 
> +      }
> 
> +
> 
> +      if (*(UINT8 *) ++String == 0) {
> 
> +        //
> 
> +        // Pointer to the next SMBIOS structure.
> 
> +        //
> 
> +        Smbios.Raw = (UINT8 *) ++String;
> 
> +        break;
> 
> +      }
> 
> +    } while (TRUE);
> 
> +  } while (Smbios.Raw < SmbiosEnd.Raw);
> 
> +
> 
> +  return EFI_SUCCESS;
> 
> +}
> 
> +
> 
> +
> 
> +/**
> 
> +  Retrieve SMBIOS from Hob.
> 
> +  @param ImageHandle     Module's image handle
> 
> +
> 
> +  @retval EFI_SUCCESS    Smbios from Hob is installed.
> 
> +  @return EFI_NOT_FOUND  Not found Smbios from Hob.
> 
> +  @retval Other          No Smbios from Hob is installed.
> 
> +
> 
> +**/
> 
> +EFI_STATUS
> 
> +EFIAPI


I think RetrieveSmbiosFromHob() is an internal function.
Please help to remove the 'EFIAPI' keyword here.


> 
> +RetrieveSmbiosFromHob (
> 
> +  IN EFI_HANDLE           ImageHandle
> 
> +  )
> 
> +{
> 
> +  EFI_STATUS                    Status;
> 
> +  SMBIOS_TABLE_ENTRY_POINT      *SmbiosTable;
> 
> +  SMBIOS_TABLE_3_0_ENTRY_POINT  *Smbios30Table;
> 
> +  SMBIOS_STRUCTURE_POINTER      Smbios;
> 
> +  EFI_HOB_GUID_TYPE             *GuidHob;
> 
> +  PLD_SMBIOS_TABLE              *SmBiosTableAdress;
> 
> +  PLD_GENERIC_HEADER            *GenericHeader;
> 
> +
> 
> +  Status = EFI_NOT_FOUND;
> 
> +  //
> 
> +  // Scan for existing SMBIOS tables from gPldSmbios3TableGuid Guid Hob
> 
> +  //
> 
> +  GuidHob = GetFirstGuidHob (&gPldSmbios3TableGuid);
> 
> +  if (GuidHob != NULL) {
> 
> +    GenericHeader = (PLD_GENERIC_HEADER *) GET_GUID_HOB_DATA
> (GuidHob);
> 
> +    if ((sizeof (PLD_GENERIC_HEADER) <= GET_GUID_HOB_DATA_SIZE
> + (GuidHob)) && (GenericHeader->Length <= GET_GUID_HOB_DATA_SIZE
> + (GuidHob))) {
> 
> +      if (GenericHeader->Revision == PLD_SMBIOS_TABLE_REVISION) {
> 
> +        //
> 
> +        // PLD_SMBIOS_TABLE structure is used when Revision equals to
> + PLD_SMBIOS_TABLE_REVISION
> 
> +        //
> 
> +        SmBiosTableAdress = (PLD_SMBIOS_TABLE *) GET_GUID_HOB_DATA
> + (GuidHob);
> 
> +        if (GenericHeader->Length >= PLD_SIZEOF_THROUGH_FIELD
> + (PLD_SMBIOS_TABLE, SmBiosEntryPoint)) {
> 
> +          Smbios30Table = (SMBIOS_TABLE_3_0_ENTRY_POINT *) (UINTN)
> + SmBiosTableAdress->SmBiosEntryPoint;
> 
> +          if (IsValidSmbios30Table (Smbios30Table)) {
> 
> +            Smbios.Raw = (UINT8 *) (UINTN) Smbios30Table->TableAddress;
> 
> +            Status = ParseAndAddExistingSmbiosTable (ImageHandle,
> + Smbios, Smbios30Table->TableMaximumSize);
> 
> +            if (EFI_ERROR (Status)) {
> 
> +              DEBUG ((DEBUG_ERROR, "RetrieveSmbiosFromHob: Failed to
> + parse preinstalled tables from gPldSmbios3TableGuid Guid Hob\n"));
> 
> +              Status = EFI_UNSUPPORTED;
> 
> +            } else {
> 
> +              return EFI_SUCCESS;
> 
> +            }
> 
> +          }
> 
> +        }
> 
> +      } else {
> 
> +        Status = EFI_UNSUPPORTED;
> 
> +      }
> 
> +    }
> 
> +  }
> 
> +
> 
> +  //
> 
> +  // Scan for existing SMBIOS tables from gPldSmbiosTableGuid Guid Hob,
> 
> +  // if gPldSmbios3TableGuid Hob doesn't exist or parsing
> + gPldSmbios3TableGuid failed
> 
> +  //
> 
> +  GuidHob = GetFirstGuidHob (&gPldSmbiosTableGuid);
> 
> +
> 
> +  if (GuidHob != NULL) {
> 
> +    GenericHeader = (PLD_GENERIC_HEADER *) GET_GUID_HOB_DATA
> (GuidHob);
> 
> +    if ((sizeof (PLD_GENERIC_HEADER) <= GET_GUID_HOB_DATA_SIZE
> + (GuidHob)) && (GenericHeader->Length <= GET_GUID_HOB_DATA_SIZE
> + (GuidHob))) {
> 
> +      if (GenericHeader->Revision == PLD_SMBIOS_TABLE_REVISION) {
> 
> +        //
> 
> +        // PLD_SMBIOS_TABLE structure is used when Revision equals to
> + PLD_SMBIOS_TABLE_REVISION
> 
> +        //
> 
> +        SmBiosTableAdress = (PLD_SMBIOS_TABLE *) GET_GUID_HOB_DATA
> + (GuidHob);
> 
> +        if (GenericHeader->Length >= PLD_SIZEOF_THROUGH_FIELD
> + (PLD_SMBIOS_TABLE, SmBiosEntryPoint)) {
> 
> +          SmbiosTable = (SMBIOS_TABLE_ENTRY_POINT *) (UINTN)
> + SmBiosTableAdress->SmBiosEntryPoint;
> 
> +          if (IsValidSmbios20Table (SmbiosTable)) {
> 
> +            Smbios.Raw = (UINT8 *) (UINTN) SmbiosTable->TableAddress;
> 
> +            Status = ParseAndAddExistingSmbiosTable (ImageHandle,
> + Smbios, SmbiosTable->TableLength);
> 
> +            if (EFI_ERROR (Status)) {
> 
> +              DEBUG ((DEBUG_ERROR, "RetrieveSmbiosFromHob: Failed to
> + parse preinstalled tables from gPldSmbiosTableGuid Guid Hob\n"));
> 
> +              Status = EFI_UNSUPPORTED;
> 
> +            }
> 
> +            return EFI_SUCCESS;
> 
> +          }
> 
> +        }
> 
> +      } else {
> 
> +        Status = EFI_UNSUPPORTED;
> 
> +      }
> 
> +    }
> 
> +  }


Is it possible to abstract the codes that:
  a) Search & parse of gPldSmbios3TableGuid
  b) Search & parse of gPldSmbiosTableGuid
into a function?

I found that most of the logic is identical.

Best Regards,
Hao Wu


> 
> +  return Status;
> 
> +}
> 
> +
> 
>  /**
> 
> 
> 
>    Driver to produce Smbios protocol and pre-allocate 1 page for the final
> SMBIOS table.
> 
> @@ -1451,5 +1745,6 @@ SmbiosDriverEntryPoint (
>                    &mPrivateData.Smbios
> 
>                    );
> 
> 
> 
> -  return Status;
> 
> +  RetrieveSmbiosFromHob (ImageHandle);
> 
> +  return EFI_SUCCESS;
> 
>  }
> 
> diff --git a/MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.h
> b/MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.h
> index f97c85ae40..a260cf695e 100644
> --- a/MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.h
> +++ b/MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.h
> @@ -1,7 +1,7 @@
>  /** @file
> 
>    This code supports the implementation of the Smbios protocol
> 
> 
> 
> -Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
> 
> +Copyright (c) 2009 - 2021, Intel Corporation. All rights reserved.<BR>
> 
>  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> 
> 
>  **/
> 
> @@ -24,6 +24,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent  #include
> <Library/MemoryAllocationLib.h>
> 
>  #include <Library/UefiBootServicesTableLib.h>
> 
>  #include <Library/PcdLib.h>
> 
> +#include <Library/HobLib.h>
> 
> +#include <UniversalPayload/SmbiosTable.h>
> 
> 
> 
>  #define SMBIOS_INSTANCE_SIGNATURE SIGNATURE_32 ('S', 'B', 'i', 's')
> 
>  typedef struct {
> 
> diff --git a/MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
> b/MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
> index f6c036e1dc..3286575098 100644
> --- a/MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
> +++ b/MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
> @@ -1,7 +1,7 @@
>  ## @file
> 
>  # This driver initializes and installs the SMBIOS protocol, constructs SMBIOS
> table into system configuration table.
> 
>  #
> 
> -# Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
> 
> +# Copyright (c) 2009 - 2021, Intel Corporation. All rights
> +reserved.<BR>
> 
>  #
> 
>  #  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
>  #
> 
> @@ -41,6 +41,7 @@
>    UefiDriverEntryPoint
> 
>    DebugLib
> 
>    PcdLib
> 
> +  HobLib
> 
> 
> 
>  [Protocols]
> 
>    gEfiSmbiosProtocolGuid                            ## PRODUCES
> 
> @@ -48,6 +49,8 @@
>  [Guids]
> 
>    gEfiSmbiosTableGuid                               ## SOMETIMES_PRODUCES ##
> SystemTable
> 
>    gEfiSmbios3TableGuid                              ## SOMETIMES_PRODUCES ##
> SystemTable
> 
> +  gPldSmbios3TableGuid
> 
> +  gPldSmbiosTableGuid
> 
> 
> 
>  [Pcd]
> 
>    gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosVersion   ## CONSUMES
> 
> --
> 2.30.0.windows.2


  reply	other threads:[~2021-05-26  6:15 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-24  7:12 [PATCH 0/9] Create multiple Hobs for Universal Payload Zhiguang Liu
2021-05-24  7:12 ` [PATCH 1/9] MdePkg: Add Universal Payload general defination header file Zhiguang Liu
2021-05-24  7:12 ` [PATCH 2/9] MdePkg: Add new structure for the PCI Root Bridge Info Hob Zhiguang Liu
2021-05-24  7:12 ` [PATCH 3/9] UefiPayloadPkg: UefiPayload retrieve PCI root bridge from Guid Hob Zhiguang Liu
2021-05-24  7:12 ` [PATCH 4/9] MdePkg: Add new structure for the Universal Payload SMBios Table Info Hob Zhiguang Liu
2021-05-24  7:12 ` [PATCH 5/9] MdeModulePkg/Universal/SmbiosDxe: Scan for existing tables Zhiguang Liu
2021-05-26  6:15   ` Wu, Hao A [this message]
2021-05-26  6:32     ` [edk2-devel] " Wu, Hao A
2021-05-26  8:56       ` Zhiguang Liu
2021-05-26 13:04   ` Patrick Rudolph
2021-05-24  7:12 ` [PATCH 6/9] UefiPayloadPkg: Creat gPldSmbiosTableGuid Hob Zhiguang Liu
2021-06-02  3:39   ` Guo Dong
2021-05-24  7:12 ` [PATCH 7/9] MdePkg: Add new structure for the Universal Payload ACPI Table Info Hob Zhiguang Liu
2021-05-24  7:12 ` [PATCH 8/9] MdeModulePkg/ACPI: Install ACPI table from HOB Zhiguang Liu
2021-05-27  0:42   ` Wu, Hao A
2021-05-24  7:12 ` [PATCH 9/9] UefiPayloadPkg: Creat gPldAcpiTableGuid Hob Zhiguang Liu
2021-05-26 13:50   ` [edk2-devel] " Patrick Rudolph
2021-06-02  3:47     ` Guo Dong
2021-05-28  3:00 ` 回复: [edk2-devel] [PATCH 0/9] Create multiple Hobs for Universal Payload gaoliming

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=BN8PR11MB3666AE93F9F181964CD42342CA249@BN8PR11MB3666.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