Maybe we can use same layout as MmMemLib.

It seems only HobConstructor() is Arm specific. Other functions are quite 
generic.

Thank you

> -----Original Message-----
> From: Achin Gupta [mailto:achin.gu...@arm.com]
> Sent: Wednesday, April 25, 2018 7:50 AM
> To: Supreeth Venkatesh <supreeth.venkat...@arm.com>
> Cc: edk2-devel@lists.01.org; Kinney, Michael D <michael.d.kin...@intel.com>;
> Gao, Liming <liming....@intel.com>; Yao, Jiewen <jiewen....@intel.com>;
> leif.lindh...@linaro.org; ard.biesheu...@linaro.org; n...@arm.com
> Subject: Re: [PATCH v1 10/18] StandaloneMmPkg/HobLib: Add AARCH64
> Specific HOB Library for management mode.
> 
> Hi Supreeth,
> 
> On Fri, Apr 06, 2018 at 03:42:15PM +0100, Supreeth Venkatesh wrote:
> > The Standalone MM environment is initialized during the SEC phase on ARM
> > Standard Platforms. The MM Core driver implements an entry point module
> > which is architecture specific and runs prior to the generic core driver
> > code. The former creates a Hob list that the latter consumes. This
> > happens in the same phase.
> >
> > This patch implements a Hob library that can be used by the entry point
> > module to produce a Hob list and by the core driver code to consume it.
> 
> References to DXE core need to be removed and the copyright years needs to be
> updated.
> 
> I think it is worth getting this hoblib reviewed by the ArmPkg maintainers.
> 
> Acked-by: Achin Gupta <achin.gu...@arm.com>
> 
> >
> > Contributed-under: TianoCore Contribution Agreement 1.1
> > Signed-off-by: Achin Gupta <achin.gu...@arm.com>
> > Signed-off-by: Supreeth Venkatesh <supreeth.venkat...@arm.com>
> > ---
> >  StandaloneMmPkg/Library/HobLib/Arm/HobLib.c | 697
> ++++++++++++++++++++++++++++
> >  StandaloneMmPkg/Library/HobLib/HobLib.inf   |  45 ++
> >  2 files changed, 742 insertions(+)
> >  create mode 100644 StandaloneMmPkg/Library/HobLib/Arm/HobLib.c
> >  create mode 100644 StandaloneMmPkg/Library/HobLib/HobLib.inf
> >
> > diff --git a/StandaloneMmPkg/Library/HobLib/Arm/HobLib.c
> b/StandaloneMmPkg/Library/HobLib/Arm/HobLib.c
> > new file mode 100644
> > index 0000000000..62abf47f95
> > --- /dev/null
> > +++ b/StandaloneMmPkg/Library/HobLib/Arm/HobLib.c
> > @@ -0,0 +1,697 @@
> > +/** @file
> > +  HOB Library implementation for DxeCore driver.
> > +
> > +Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
> > +Copyright (c) 2017, ARM Limited. All rights reserved.<BR>
> > +
> > +This program and the accompanying materials
> > +are licensed and made available under the terms and conditions of the BSD
> License
> > +which accompanies this distribution.  The full text of the license may be
> found at
> > +http://opensource.org/licenses/bsd-license.php.
> > +
> > +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> > +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> > +
> > +**/
> > +
> > +#include <PiMm.h>
> > +
> > +#include <Library/HobLib.h>
> > +#include <Library/DebugLib.h>
> > +#include <Library/BaseMemoryLib.h>
> > +
> > +#include <Guid/MemoryAllocationHob.h>
> > +
> > +//
> > +// Cache copy of HobList pointer.
> > +//
> > +VOID *gHobList = NULL;
> > +
> > +/**
> > +  Returns the pointer to the HOB list.
> > +
> > +  This function returns the pointer to first HOB in the list.
> > +  For PEI phase, the PEI service GetHobList() can be used to retrieve the
> pointer
> > +  to the HOB list.  For the DXE phase, the HOB list pointer can be 
> > retrieved
> through
> > +  the EFI System Table by looking up theHOB list GUID in the System
> Configuration Table.
> > +  Since the System Configuration Table does not exist that the time the DXE
> Core is
> > +  launched, the DXE Core uses a global variable from the DXE Core Entry
> Point Library
> > +  to manage the pointer to the HOB list.
> > +
> > +  If the pointer to the HOB list is NULL, then ASSERT().
> > +
> > +  @return The pointer to the HOB list.
> > +
> > +**/
> > +VOID *
> > +EFIAPI
> > +GetHobList (
> > +  VOID
> > +  )
> > +{
> > +  ASSERT (gHobList != NULL);
> > +  return gHobList;
> > +}
> > +
> > +/**
> > +  Returns the next instance of a HOB type from the starting HOB.
> > +
> > +  This function searches the first instance of a HOB type from the starting
> HOB pointer.
> > +  If there does not exist such HOB type from the starting HOB pointer, it 
> > will
> return NULL.
> > +  In contrast with macro GET_NEXT_HOB(), this function does not skip the
> starting HOB pointer
> > +  unconditionally: it returns HobStart back if HobStart itself meets the
> requirement;
> > +  caller is required to use GET_NEXT_HOB() if it wishes to skip current
> HobStart.
> > +
> > +  If HobStart is NULL, then ASSERT().
> > +
> > +  @param  Type          The HOB type to return.
> > +  @param  HobStart      The starting HOB pointer to search from.
> > +
> > +  @return The next instance of a HOB type from the starting HOB.
> > +
> > +**/
> > +VOID *
> > +EFIAPI
> > +GetNextHob (
> > +  IN UINT16                 Type,
> > +  IN CONST VOID             *HobStart
> > +  )
> > +{
> > +  EFI_PEI_HOB_POINTERS  Hob;
> > +
> > +  ASSERT (HobStart != NULL);
> > +
> > +  Hob.Raw = (UINT8 *) HobStart;
> > +  //
> > +  // Parse the HOB list until end of list or matching type is found.
> > +  //
> > +  while (!END_OF_HOB_LIST (Hob)) {
> > +    if (Hob.Header->HobType == Type) {
> > +      return Hob.Raw;
> > +    }
> > +    Hob.Raw = GET_NEXT_HOB (Hob);
> > +  }
> > +  return NULL;
> > +}
> > +
> > +/**
> > +  Returns the first instance of a HOB type among the whole HOB list.
> > +
> > +  This function searches the first instance of a HOB type among the whole
> HOB list.
> > +  If there does not exist such HOB type in the HOB list, it will return 
> > NULL.
> > +
> > +  If the pointer to the HOB list is NULL, then ASSERT().
> > +
> > +  @param  Type          The HOB type to return.
> > +
> > +  @return The next instance of a HOB type from the starting HOB.
> > +
> > +**/
> > +VOID *
> > +EFIAPI
> > +GetFirstHob (
> > +  IN UINT16                 Type
> > +  )
> > +{
> > +  VOID      *HobList;
> > +
> > +  HobList = GetHobList ();
> > +  return GetNextHob (Type, HobList);
> > +}
> > +
> > +/**
> > +  Returns the next instance of the matched GUID HOB from the starting HOB.
> > +
> > +  This function searches the first instance of a HOB from the starting HOB
> pointer.
> > +  Such HOB should satisfy two conditions:
> > +  its HOB type is EFI_HOB_TYPE_GUID_EXTENSION, and its GUID Name
> equals to the input Guid.
> > +  If such a HOB from the starting HOB pointer does not exist, it will 
> > return
> NULL.
> > +  Caller is required to apply GET_GUID_HOB_DATA () and
> GET_GUID_HOB_DATA_SIZE ()
> > +  to extract the data section and its size information, respectively.
> > +  In contrast with macro GET_NEXT_HOB(), this function does not skip the
> starting HOB pointer
> > +  unconditionally: it returns HobStart back if HobStart itself meets the
> requirement;
> > +  caller is required to use GET_NEXT_HOB() if it wishes to skip current
> HobStart.
> > +
> > +  If Guid is NULL, then ASSERT().
> > +  If HobStart is NULL, then ASSERT().
> > +
> > +  @param  Guid          The GUID to match with in the HOB list.
> > +  @param  HobStart      A pointer to a Guid.
> > +
> > +  @return The next instance of the matched GUID HOB from the starting
> HOB.
> > +
> > +**/
> > +VOID *
> > +EFIAPI
> > +GetNextGuidHob (
> > +  IN CONST EFI_GUID         *Guid,
> > +  IN CONST VOID             *HobStart
> > +  )
> > +{
> > +  EFI_PEI_HOB_POINTERS  GuidHob;
> > +
> > +  GuidHob.Raw = (UINT8 *) HobStart;
> > +  while ((GuidHob.Raw = GetNextHob (EFI_HOB_TYPE_GUID_EXTENSION,
> GuidHob.Raw)) != NULL) {
> > +    if (CompareGuid (Guid, &GuidHob.Guid->Name)) {
> > +      break;
> > +    }
> > +    GuidHob.Raw = GET_NEXT_HOB (GuidHob);
> > +  }
> > +  return GuidHob.Raw;
> > +}
> > +
> > +/**
> > +  Returns the first instance of the matched GUID HOB among the whole HOB
> list.
> > +
> > +  This function searches the first instance of a HOB among the whole HOB
> list.
> > +  Such HOB should satisfy two conditions:
> > +  its HOB type is EFI_HOB_TYPE_GUID_EXTENSION and its GUID Name
> equals to the input Guid.
> > +  If such a HOB from the starting HOB pointer does not exist, it will 
> > return
> NULL.
> > +  Caller is required to apply GET_GUID_HOB_DATA () and
> GET_GUID_HOB_DATA_SIZE ()
> > +  to extract the data section and its size information, respectively.
> > +
> > +  If the pointer to the HOB list is NULL, then ASSERT().
> > +  If Guid is NULL, then ASSERT().
> > +
> > +  @param  Guid          The GUID to match with in the HOB list.
> > +
> > +  @return The first instance of the matched GUID HOB among the whole
> HOB list.
> > +
> > +**/
> > +VOID *
> > +EFIAPI
> > +GetFirstGuidHob (
> > +  IN CONST EFI_GUID         *Guid
> > +  )
> > +{
> > +  VOID      *HobList;
> > +
> > +  HobList = GetHobList ();
> > +  return GetNextGuidHob (Guid, HobList);
> > +}
> > +
> > +/**
> > +  Get the system boot mode from the HOB list.
> > +
> > +  This function returns the system boot mode information from the
> > +  PHIT HOB in HOB list.
> > +
> > +  If the pointer to the HOB list is NULL, then ASSERT().
> > +
> > +  @param  VOID
> > +
> > +  @return The Boot Mode.
> > +
> > +**/
> > +EFI_BOOT_MODE
> > +EFIAPI
> > +GetBootModeHob (
> > +  VOID
> > +  )
> > +{
> > +  EFI_HOB_HANDOFF_INFO_TABLE    *HandOffHob;
> > +
> > +  HandOffHob = (EFI_HOB_HANDOFF_INFO_TABLE *) GetHobList ();
> > +
> > +  return  HandOffHob->BootMode;
> > +}
> > +
> > +
> > +/**
> > +
> > +
> > +**/
> > +EFI_HOB_HANDOFF_INFO_TABLE*
> > +HobConstructor (
> > +  IN VOID   *EfiMemoryBegin,
> > +  IN UINTN  EfiMemoryLength,
> > +  IN VOID   *EfiFreeMemoryBottom,
> > +  IN VOID   *EfiFreeMemoryTop
> > +  )
> > +{
> > +  EFI_HOB_HANDOFF_INFO_TABLE  *Hob;
> > +  EFI_HOB_GENERIC_HEADER      *HobEnd;
> > +
> > +  Hob    = EfiFreeMemoryBottom;
> > +  HobEnd = (EFI_HOB_GENERIC_HEADER *)(Hob+1);
> > +
> > +  Hob->Header.HobType     = EFI_HOB_TYPE_HANDOFF;
> > +  Hob->Header.HobLength   = sizeof(EFI_HOB_HANDOFF_INFO_TABLE);
> > +  Hob->Header.Reserved    = 0;
> > +
> > +  HobEnd->HobType     = EFI_HOB_TYPE_END_OF_HOB_LIST;
> > +  HobEnd->HobLength   = sizeof(EFI_HOB_GENERIC_HEADER);
> > +  HobEnd->Reserved    = 0;
> > +
> > +  Hob->Version             = EFI_HOB_HANDOFF_TABLE_VERSION;
> > +  Hob->BootMode            = BOOT_WITH_FULL_CONFIGURATION;
> > +
> > +  Hob->EfiMemoryTop        = (UINTN)EfiMemoryBegin +
> EfiMemoryLength;
> > +  Hob->EfiMemoryBottom     = (UINTN)EfiMemoryBegin;
> > +  Hob->EfiFreeMemoryTop    = (UINTN)EfiFreeMemoryTop;
> > +  Hob->EfiFreeMemoryBottom =
> (EFI_PHYSICAL_ADDRESS)(UINTN)(HobEnd+1);
> > +  Hob->EfiEndOfHobList     = (EFI_PHYSICAL_ADDRESS)(UINTN)HobEnd;
> > +
> > +  gHobList = Hob;
> > +
> > +  return Hob;
> > +}
> > +
> > +VOID *
> > +CreateHob (
> > +  IN  UINT16    HobType,
> > +  IN  UINT16    HobLength
> > +  )
> > +{
> > +  EFI_HOB_HANDOFF_INFO_TABLE  *HandOffHob;
> > +  EFI_HOB_GENERIC_HEADER      *HobEnd;
> > +  EFI_PHYSICAL_ADDRESS        FreeMemory;
> > +  VOID                        *Hob;
> > +
> > +  HandOffHob = GetHobList ();
> > +
> > +  HobLength = (UINT16)((HobLength + 0x7) & (~0x7));
> > +
> > +  FreeMemory = HandOffHob->EfiFreeMemoryTop -
> HandOffHob->EfiFreeMemoryBottom;
> > +
> > +  if (FreeMemory < HobLength) {
> > +      return NULL;
> > +  }
> > +
> > +  Hob = (VOID*) (UINTN) HandOffHob->EfiEndOfHobList;
> > +  ((EFI_HOB_GENERIC_HEADER*) Hob)->HobType = HobType;
> > +  ((EFI_HOB_GENERIC_HEADER*) Hob)->HobLength = HobLength;
> > +  ((EFI_HOB_GENERIC_HEADER*) Hob)->Reserved = 0;
> > +
> > +  HobEnd = (EFI_HOB_GENERIC_HEADER*) ((UINTN)Hob + HobLength);
> > +  HandOffHob->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS) (UINTN)
> HobEnd;
> > +
> > +  HobEnd->HobType   = EFI_HOB_TYPE_END_OF_HOB_LIST;
> > +  HobEnd->HobLength = sizeof(EFI_HOB_GENERIC_HEADER);
> > +  HobEnd->Reserved  = 0;
> > +  HobEnd++;
> > +  HandOffHob->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS) (UINTN)
> HobEnd;
> > +
> > +  return Hob;
> > +}
> > +
> > +/**
> > +  Builds a HOB for a loaded PE32 module.
> > +
> > +  This function builds a HOB for a loaded PE32 module.
> > +  It can only be invoked during PEI phase;
> > +  for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
> > +  If ModuleName is NULL, then ASSERT().
> > +  If there is no additional space for HOB creation, then ASSERT().
> > +
> > +  @param  ModuleName              The GUID File Name of the
> module.
> > +  @param  MemoryAllocationModule  The 64 bit physical address of the
> module.
> > +  @param  ModuleLength            The length of the module in bytes.
> > +  @param  EntryPoint              The 64 bit physical address of the
> module entry point.
> > +
> > +**/
> > +VOID
> > +EFIAPI
> > +BuildModuleHob (
> > +  IN CONST EFI_GUID         *ModuleName,
> > +  IN EFI_PHYSICAL_ADDRESS   MemoryAllocationModule,
> > +  IN UINT64                 ModuleLength,
> > +  IN EFI_PHYSICAL_ADDRESS   EntryPoint
> > +  )
> > +{
> > +  EFI_HOB_MEMORY_ALLOCATION_MODULE  *Hob;
> > +
> > +  ASSERT (((MemoryAllocationModule & (EFI_PAGE_SIZE - 1)) == 0) &&
> > +          ((ModuleLength & (EFI_PAGE_SIZE - 1)) == 0));
> > +
> > +  Hob = CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof
> (EFI_HOB_MEMORY_ALLOCATION_MODULE));
> > +
> > +  CopyGuid (&(Hob->MemoryAllocationHeader.Name),
> &gEfiHobMemoryAllocModuleGuid);
> > +  Hob->MemoryAllocationHeader.MemoryBaseAddress =
> MemoryAllocationModule;
> > +  Hob->MemoryAllocationHeader.MemoryLength      = ModuleLength;
> > +  Hob->MemoryAllocationHeader.MemoryType        =
> EfiBootServicesCode;
> > +
> > +  //
> > +  // Zero the reserved space to match HOB spec
> > +  //
> > +  ZeroMem (Hob->MemoryAllocationHeader.Reserved, sizeof
> (Hob->MemoryAllocationHeader.Reserved));
> > +
> > +  CopyGuid (&Hob->ModuleName, ModuleName);
> > +  Hob->EntryPoint = EntryPoint;
> > +}
> > +
> > +/**
> > +  Builds a HOB that describes a chunk of system memory.
> > +
> > +  This function builds a HOB that describes a chunk of system memory.
> > +  It can only be invoked during PEI phase;
> > +  for DXE phase, it will ASSERT() because PEI HOB is read-only for DXE 
> > phase.
> > +
> > +  If there is no additional space for HOB creation, then ASSERT().
> > +
> > +  @param  ResourceType        The type of resource described by this
> HOB.
> > +  @param  ResourceAttribute   The resource attributes of the memory
> described by this HOB.
> > +  @param  PhysicalStart       The 64 bit physical address of memory
> described by this HOB.
> > +  @param  NumberOfBytes       The length of the memory described by
> this HOB in bytes.
> > +
> > +**/
> > +VOID
> > +EFIAPI
> > +BuildResourceDescriptorHob (
> > +  IN EFI_RESOURCE_TYPE            ResourceType,
> > +  IN EFI_RESOURCE_ATTRIBUTE_TYPE  ResourceAttribute,
> > +  IN EFI_PHYSICAL_ADDRESS         PhysicalStart,
> > +  IN UINT64                       NumberOfBytes
> > +  )
> > +{
> > +  EFI_HOB_RESOURCE_DESCRIPTOR  *Hob;
> > +
> > +  Hob = CreateHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, sizeof
> (EFI_HOB_RESOURCE_DESCRIPTOR));
> > +  ASSERT(Hob != NULL);
> > +
> > +  Hob->ResourceType      = ResourceType;
> > +  Hob->ResourceAttribute = ResourceAttribute;
> > +  Hob->PhysicalStart     = PhysicalStart;
> > +  Hob->ResourceLength    = NumberOfBytes;
> > +}
> > +
> > +/**
> > +  Builds a GUID HOB with a certain data length.
> > +
> > +  This function builds a customized HOB tagged with a GUID for 
> > identification
> > +  and returns the start address of GUID HOB data so that caller can fill 
> > the
> customized data.
> > +  The HOB Header and Name field is already stripped.
> > +  It can only be invoked during PEI phase;
> > +  for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
> > +  If Guid is NULL, then ASSERT().
> > +  If there is no additional space for HOB creation, then ASSERT().
> > +  If DataLength >= (0x10000 - sizeof (EFI_HOB_GUID_TYPE)), then ASSERT().
> > +
> > +  @param  Guid          The GUID to tag the customized HOB.
> > +  @param  DataLength    The size of the data payload for the GUID HOB.
> > +
> > +  @return The start address of GUID HOB data.
> > +
> > +**/
> > +VOID *
> > +EFIAPI
> > +BuildGuidHob (
> > +  IN CONST EFI_GUID              *Guid,
> > +  IN UINTN                       DataLength
> > +  )
> > +{
> > +  EFI_HOB_GUID_TYPE *Hob;
> > +
> > +  //
> > +  // Make sure that data length is not too long.
> > +  //
> > +  ASSERT (DataLength <= (0xffff - sizeof (EFI_HOB_GUID_TYPE)));
> > +
> > +  Hob = CreateHob (EFI_HOB_TYPE_GUID_EXTENSION, (UINT16) (sizeof
> (EFI_HOB_GUID_TYPE) + DataLength));
> > +  CopyGuid (&Hob->Name, Guid);
> > +  return Hob + 1;
> > +}
> > +
> > +
> > +/**
> > +  Copies a data buffer to a newly-built HOB.
> > +
> > +  This function builds a customized HOB tagged with a GUID for
> identification,
> > +  copies the input data to the HOB data field and returns the start 
> > address of
> the GUID HOB data.
> > +  The HOB Header and Name field is already stripped.
> > +  It can only be invoked during PEI phase;
> > +  for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
> > +  If Guid is NULL, then ASSERT().
> > +  If Data is NULL and DataLength > 0, then ASSERT().
> > +  If there is no additional space for HOB creation, then ASSERT().
> > +  If DataLength >= (0x10000 - sizeof (EFI_HOB_GUID_TYPE)), then ASSERT().
> > +
> > +  @param  Guid          The GUID to tag the customized HOB.
> > +  @param  Data          The data to be copied into the data field of the
> GUID HOB.
> > +  @param  DataLength    The size of the data payload for the GUID HOB.
> > +
> > +  @return The start address of GUID HOB data.
> > +
> > +**/
> > +VOID *
> > +EFIAPI
> > +BuildGuidDataHob (
> > +  IN CONST EFI_GUID              *Guid,
> > +  IN VOID                        *Data,
> > +  IN UINTN                       DataLength
> > +  )
> > +{
> > +  VOID  *HobData;
> > +
> > +  ASSERT (Data != NULL || DataLength == 0);
> > +
> > +  HobData = BuildGuidHob (Guid, DataLength);
> > +
> > +  return CopyMem (HobData, Data, DataLength);
> > +}
> > +
> > +/**
> > +  Builds a Firmware Volume HOB.
> > +
> > +  This function builds a Firmware Volume HOB.
> > +  It can only be invoked during PEI phase;
> > +  for DXE phase, it will ASSERT() because PEI HOB is read-only for DXE 
> > phase.
> > +
> > +  If there is no additional space for HOB creation, then ASSERT().
> > +
> > +  @param  BaseAddress   The base address of the Firmware Volume.
> > +  @param  Length        The size of the Firmware Volume in bytes.
> > +
> > +**/
> > +VOID
> > +EFIAPI
> > +BuildFvHob (
> > +  IN EFI_PHYSICAL_ADDRESS        BaseAddress,
> > +  IN UINT64                      Length
> > +  )
> > +{
> > +  EFI_HOB_FIRMWARE_VOLUME  *Hob;
> > +
> > +  Hob = CreateHob (EFI_HOB_TYPE_FV, sizeof
> (EFI_HOB_FIRMWARE_VOLUME));
> > +
> > +  Hob->BaseAddress = BaseAddress;
> > +  Hob->Length      = Length;
> > +}
> > +
> > +
> > +/**
> > +  Builds a EFI_HOB_TYPE_FV2 HOB.
> > +
> > +  This function builds a EFI_HOB_TYPE_FV2 HOB.
> > +  It can only be invoked during PEI phase;
> > +  for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
> > +  If there is no additional space for HOB creation, then ASSERT().
> > +
> > +  @param  BaseAddress   The base address of the Firmware Volume.
> > +  @param  Length        The size of the Firmware Volume in bytes.
> > +  @param  FvName       The name of the Firmware Volume.
> > +  @param  FileName      The name of the file.
> > +
> > +**/
> > +VOID
> > +EFIAPI
> > +BuildFv2Hob (
> > +  IN          EFI_PHYSICAL_ADDRESS        BaseAddress,
> > +  IN          UINT64                      Length,
> > +  IN CONST    EFI_GUID                    *FvName,
> > +  IN CONST    EFI_GUID                    *FileName
> > +  )
> > +{
> > +  EFI_HOB_FIRMWARE_VOLUME2  *Hob;
> > +
> > +  Hob = CreateHob (EFI_HOB_TYPE_FV2, sizeof
> (EFI_HOB_FIRMWARE_VOLUME2));
> > +
> > +  Hob->BaseAddress = BaseAddress;
> > +  Hob->Length      = Length;
> > +  CopyGuid (&Hob->FvName, FvName);
> > +  CopyGuid (&Hob->FileName, FileName);
> > +}
> > +
> > +
> > +/**
> > +  Builds a HOB for the CPU.
> > +
> > +  This function builds a HOB for the CPU.
> > +  It can only be invoked during PEI phase;
> > +  for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
> > +  If there is no additional space for HOB creation, then ASSERT().
> > +
> > +  @param  SizeOfMemorySpace   The maximum physical memory
> addressability of the processor.
> > +  @param  SizeOfIoSpace       The maximum physical I/O addressability
> of the processor.
> > +
> > +**/
> > +VOID
> > +EFIAPI
> > +BuildCpuHob (
> > +  IN UINT8                       SizeOfMemorySpace,
> > +  IN UINT8                       SizeOfIoSpace
> > +  )
> > +{
> > +  EFI_HOB_CPU  *Hob;
> > +
> > +  Hob = CreateHob (EFI_HOB_TYPE_CPU, sizeof (EFI_HOB_CPU));
> > +
> > +  Hob->SizeOfMemorySpace = SizeOfMemorySpace;
> > +  Hob->SizeOfIoSpace     = SizeOfIoSpace;
> > +
> > +  //
> > +  // Zero the reserved space to match HOB spec
> > +  //
> > +  ZeroMem (Hob->Reserved, sizeof (Hob->Reserved));
> > +}
> > +
> > +/**
> > +  Builds a HOB for the memory allocation.
> > +
> > +  This function builds a HOB for the memory allocation.
> > +  It can only be invoked during PEI phase;
> > +  for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
> > +  If there is no additional space for HOB creation, then ASSERT().
> > +
> > +  @param  BaseAddress   The 64 bit physical address of the memory.
> > +  @param  Length        The length of the memory allocation in bytes.
> > +  @param  MemoryType    Type of memory allocated by this HOB.
> > +
> > +**/
> > +VOID
> > +EFIAPI
> > +BuildMemoryAllocationHob (
> > +  IN EFI_PHYSICAL_ADDRESS        BaseAddress,
> > +  IN UINT64                      Length,
> > +  IN EFI_MEMORY_TYPE             MemoryType
> > +  )
> > +{
> > +  EFI_HOB_MEMORY_ALLOCATION  *Hob;
> > +
> > +  ASSERT (((BaseAddress & (EFI_PAGE_SIZE - 1)) == 0) &&
> > +          ((Length & (EFI_PAGE_SIZE - 1)) == 0));
> > +
> > +  Hob = CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof
> (EFI_HOB_MEMORY_ALLOCATION));
> > +
> > +  ZeroMem (&(Hob->AllocDescriptor.Name), sizeof (EFI_GUID));
> > +  Hob->AllocDescriptor.MemoryBaseAddress = BaseAddress;
> > +  Hob->AllocDescriptor.MemoryLength      = Length;
> > +  Hob->AllocDescriptor.MemoryType        = MemoryType;
> > +  //
> > +  // Zero the reserved space to match HOB spec
> > +  //
> > +  ZeroMem (Hob->AllocDescriptor.Reserved, sizeof
> (Hob->AllocDescriptor.Reserved));
> > +}
> > +
> > +/**
> > +  Builds a HOB that describes a chunk of system memory with Owner GUID.
> > +
> > +  This function builds a HOB that describes a chunk of system memory.
> > +  It can only be invoked during PEI phase;
> > +  for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
> > +
> > +  If there is no additional space for HOB creation, then ASSERT().
> > +
> > +  @param  ResourceType        The type of resource described by this
> HOB.
> > +  @param  ResourceAttribute   The resource attributes of the memory
> described by this HOB.
> > +  @param  PhysicalStart       The 64 bit physical address of memory
> described by this HOB.
> > +  @param  NumberOfBytes       The length of the memory described by
> this HOB in bytes.
> > +  @param  OwnerGUID           GUID for the owner of this resource.
> > +
> > +**/
> > +VOID
> > +EFIAPI
> > +BuildResourceDescriptorWithOwnerHob (
> > +  IN EFI_RESOURCE_TYPE            ResourceType,
> > +  IN EFI_RESOURCE_ATTRIBUTE_TYPE  ResourceAttribute,
> > +  IN EFI_PHYSICAL_ADDRESS         PhysicalStart,
> > +  IN UINT64                       NumberOfBytes,
> > +  IN EFI_GUID                     *OwnerGUID
> > +  )
> > +{
> > +  //
> > +  // PEI HOB is read only for DXE phase
> > +  //
> > +  ASSERT (FALSE);
> > +}
> > +
> > +/**
> > +  Builds a Capsule Volume HOB.
> > +
> > +  This function builds a Capsule Volume HOB.
> > +  It can only be invoked during PEI phase;
> > +  for DXE phase, it will ASSERT() because PEI HOB is read-only for DXE 
> > phase.
> > +
> > +  If the platform does not support Capsule Volume HOBs, then ASSERT().
> > +  If there is no additional space for HOB creation, then ASSERT().
> > +
> > +  @param  BaseAddress   The base address of the Capsule Volume.
> > +  @param  Length        The size of the Capsule Volume in bytes.
> > +
> > +**/
> > +VOID
> > +EFIAPI
> > +BuildCvHob (
> > +  IN EFI_PHYSICAL_ADDRESS        BaseAddress,
> > +  IN UINT64                      Length
> > +  )
> > +{
> > +  //
> > +  // PEI HOB is read only for DXE phase
> > +  //
> > +  ASSERT (FALSE);
> > +}
> > +
> > +
> > +/**
> > +  Builds a HOB for the BSP store.
> > +
> > +  This function builds a HOB for BSP store.
> > +  It can only be invoked during PEI phase;
> > +  for DXE phase, it will ASSERT() because PEI HOB is read-only for DXE 
> > phase.
> > +
> > +  If there is no additional space for HOB creation, then ASSERT().
> > +
> > +  @param  BaseAddress   The 64 bit physical address of the BSP.
> > +  @param  Length        The length of the BSP store in bytes.
> > +  @param  MemoryType    Type of memory allocated by this HOB.
> > +
> > +**/
> > +VOID
> > +EFIAPI
> > +BuildBspStoreHob (
> > +  IN EFI_PHYSICAL_ADDRESS        BaseAddress,
> > +  IN UINT64                      Length,
> > +  IN EFI_MEMORY_TYPE             MemoryType
> > +  )
> > +{
> > +  //
> > +  // PEI HOB is read only for DXE phase
> > +  //
> > +  ASSERT (FALSE);
> > +}
> > +
> > +/**
> > +  Builds a HOB for the Stack.
> > +
> > +  This function builds a HOB for the stack.
> > +  It can only be invoked during PEI phase;
> > +  for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
> > +  If there is no additional space for HOB creation, then ASSERT().
> > +
> > +  @param  BaseAddress   The 64 bit physical address of the Stack.
> > +  @param  Length        The length of the stack in bytes.
> > +
> > +**/
> > +VOID
> > +EFIAPI
> > +BuildStackHob (
> > +  IN EFI_PHYSICAL_ADDRESS        BaseAddress,
> > +  IN UINT64                      Length
> > +  )
> > +{
> > +  //
> > +  // PEI HOB is read only for DXE phase
> > +  //
> > +  ASSERT (FALSE);
> > +}
> > diff --git a/StandaloneMmPkg/Library/HobLib/HobLib.inf
> b/StandaloneMmPkg/Library/HobLib/HobLib.inf
> > new file mode 100644
> > index 0000000000..42273b6d66
> > --- /dev/null
> > +++ b/StandaloneMmPkg/Library/HobLib/HobLib.inf
> > @@ -0,0 +1,45 @@
> > +## @file
> > +# Instance of HOB Library for DXE Core.
> > +#
> > +# HOB Library implementation for the DXE Core. Does not have a constructor.
> > +#  Uses gHobList defined in the DXE Core Entry Point Library.
> > +#
> > +# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
> > +# Copyright (c) 2016 - 2017, ARM Limited. All rights reserved.<BR>
> > +#
> > +#  This program and the accompanying materials
> > +#  are licensed and made available under the terms and conditions of the
> BSD License
> > +#  which accompanies this distribution. The full text of the license may be
> found at
> > +#  http://opensource.org/licenses/bsd-license.php.
> > +#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> > +#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> > +#
> > +#
> > +##
> > +
> > +[Defines]
> > +  INF_VERSION                    = 0x0001001A
> > +  BASE_NAME                      = HobLib
> > +  FILE_GUID                      =
> CF56EF2C-68D8-4BD5-9A8B-8A7BFCFF751C
> > +  MODULE_TYPE                    = MM_CORE_STANDALONE
> > +  VERSION_STRING                 = 1.0
> > +  PI_SPECIFICATION_VERSION       = 0x00010032
> > +  LIBRARY_CLASS                  = HobLib|MM_CORE_STANDALONE
> MM_STANDALONE
> > +
> > +#
> > +#  VALID_ARCHITECTURES           = AARCH64
> > +#
> > +
> > +[Sources.AARCH64]
> > +  Arm/HobLib.c
> > +
> > +[Packages]
> > +  MdePkg/MdePkg.dec
> > +
> > +
> > +[LibraryClasses]
> > +  BaseMemoryLib
> > +  DebugLib
> > +
> > +[Guids]
> > +  gEfiHobListGuid                               ## CONSUMES  ##
> SystemTable
> > --
> > 2.16.2
> >
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to