diff mbox series

[edk2,v2,01/11] StandaloneMmPkg: add HobLib implementation for MM_STANDALONE modules

Message ID 20190116202236.6977-2-ard.biesheuvel@linaro.org
State Accepted
Commit 380148b685b7cd7b13333b52621789abf0f211de
Headers show
Series StandaloneMmPkg: assorted fixes and improvements | expand

Commit Message

Ard Biesheuvel Jan. 16, 2019, 8:22 p.m. UTC
This HobLib code is based on the staging implementation of
StandaloneMmPkg, with the following changes:
- drop the unused AArch64/StandaloneMmCoreHobLibInternal.c source file
- remove hack from HobLibConstructor()
- update code comments referring the MM core

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Jagadeesh Ujja <jagadeesh.ujja@arm.com>

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

---
 StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.c   | 649 ++++++++++++++++++++
 StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.inf |  45 ++
 2 files changed, 694 insertions(+)

-- 
2.17.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Comments

Yao, Jiewen Jan. 18, 2019, 3:24 p.m. UTC | #1
Reviewed-by: jiewen.yao@intel.com


> -----Original Message-----

> From: Ard Biesheuvel [mailto:ard.biesheuvel@linaro.org]

> Sent: Wednesday, January 16, 2019 12:22 PM

> To: edk2-devel@lists.01.org

> Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>; Achin Gupta

> <achin.gupta@arm.com>; Yao, Jiewen <jiewen.yao@intel.com>; Supreeth

> Venkatesh <supreeth.venkatesh@arm.com>; Leif Lindholm

> <leif.lindholm@linaro.org>; Jagadeesh Ujja <jagadeesh.ujja@arm.com>;

> Thomas Panakamattam Abraham <thomas.abraham@arm.com>; Sami

> Mujawar <Sami.Mujawar@arm.com>

> Subject: [PATCH v2 01/11] StandaloneMmPkg: add HobLib implementation

> for MM_STANDALONE modules

> 

> This HobLib code is based on the staging implementation of

> StandaloneMmPkg, with the following changes:

> - drop the unused AArch64/StandaloneMmCoreHobLibInternal.c source file

> - remove hack from HobLibConstructor()

> - update code comments referring the MM core

> 

> Contributed-under: TianoCore Contribution Agreement 1.1

> Signed-off-by: Jagadeesh Ujja <jagadeesh.ujja@arm.com>

> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

> ---

>  StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.c

> | 649 ++++++++++++++++++++

> 

> StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.inf

> |  45 ++

>  2 files changed, 694 insertions(+)

> 

> diff --git

> a/StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.c

> b/StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.c

> new file mode 100644

> index 000000000000..cc1a08166470

> --- /dev/null

> +++

> b/StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.c

> @@ -0,0 +1,649 @@

> +/** @file

> +  HOB Library implementation for Standalone MM Core.

> +

> +Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>

> +Copyright (c) 2017 - 2018, ARM Limited. All rights reserved.<BR>

> +Copyright (c) 2018, Linaro, Ltd. 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 <Library/MmServicesTableLib.h>

> +

> +//

> +// Cache copy of HobList pointer.

> +//

> +STATIC VOID *gHobList = NULL;

> +

> +/**

> +  The constructor function caches the pointer to HOB list.

> +

> +  The constructor function gets the start address of HOB list from system

> configuration table.

> +  It will ASSERT() if that operation fails and it will always return

> EFI_SUCCESS.

> +

> +  @param  ImageHandle     The firmware allocated handle for the

> image.

> +  @param  MmSystemTable   A pointer to the MM System Table.

> +

> +  @retval EFI_SUCCESS     The constructor successfully gets HobList.

> +  @retval Other value     The constructor can't get HobList.

> +

> +**/

> +EFI_STATUS

> +EFIAPI

> +HobLibConstructor (

> +  IN EFI_HANDLE             ImageHandle,

> +  IN EFI_MM_SYSTEM_TABLE    *MmSystemTable

> +  )

> +{

> +  UINTN       Index;

> +

> +  for (Index = 0; Index < gMmst->NumberOfTableEntries; Index++) {

> +    if (CompareGuid (&gEfiHobListGuid,

> &gMmst->MmConfigurationTable[Index].VendorGuid)) {

> +      gHobList = gMmst->MmConfigurationTable[Index].VendorTable;

> +      break;

> +    }

> +  }

> +  return EFI_SUCCESS;

> +}

> +

> +/**

> +  Returns the pointer to the HOB list.

> +

> +  This function returns the pointer to first HOB in the list.

> +  If the pointer to the HOB list is NULL, then ASSERT().

> +

> +  @return The pointer to the HOB list.

> +

> +**/

> +VOID *

> +EFIAPI

> +GetHobList (

> +  VOID

> +  )

> +{

> +  UINTN       Index;

> +

> +  if (gHobList == NULL) {

> +    for (Index = 0; Index < gMmst->NumberOfTableEntries; Index++) {

> +      if (CompareGuid (&gEfiHobListGuid,

> &gMmst->MmConfigurationTable[Index].VendorGuid)) {

> +        gHobList = gMmst->MmConfigurationTable[Index].VendorTable;

> +        break;

> +      }

> +    }

> +  }

> +  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;

> +}

> +

> +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.

> +  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.

> +  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.

> +  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.

> +  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.

> +  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.

> +  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.

> +  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.

> +  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.

> +  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

> +  )

> +{

> +  ASSERT (FALSE);

> +}

> +

> +/**

> +  Builds a Capsule Volume HOB.

> +

> +  This function builds a Capsule Volume HOB.

> +  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

> +  )

> +{

> +  ASSERT (FALSE);

> +}

> +

> +

> +/**

> +  Builds a HOB for the BSP store.

> +

> +  This function builds a HOB for BSP store.

> +  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

> +  )

> +{

> +  ASSERT (FALSE);

> +}

> +

> +/**

> +  Builds a HOB for the Stack.

> +

> +  This function builds a HOB for the stack.

> +  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

> +  )

> +{

> +  ASSERT (FALSE);

> +}

> diff --git

> a/StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.i

> nf

> b/StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.i

> nf

> new file mode 100644

> index 000000000000..542a19cc4bec

> --- /dev/null

> +++

> b/StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.i

> nf

> @@ -0,0 +1,45 @@

> +## @file

> +# Instance of HOB Library for Standalone MM modules.

> +#

> +# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>

> +# Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.<BR>

> +# Copyright (c) 2018, Linaro, Ltd. 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                    = 0x0001001B

> +  BASE_NAME                      = HobLib

> +  FILE_GUID                      =

> 8262551B-AB2D-4E76-99FC-5EBB83F4988E

> +  MODULE_TYPE                    = MM_STANDALONE

> +  VERSION_STRING                 = 1.0

> +  PI_SPECIFICATION_VERSION       = 0x00010032

> +  LIBRARY_CLASS                  = HobLib|MM_STANDALONE

> +  CONSTRUCTOR                    = HobLibConstructor

> +

> +#

> +#  VALID_ARCHITECTURES           = IA32 X64 ARM AARCH64

> +#

> +

> +[Sources]

> +  StandaloneMmHobLib.c

> +

> +[Packages]

> +  MdePkg/MdePkg.dec

> +

> +[LibraryClasses]

> +  BaseMemoryLib

> +  DebugLib

> +  MmServicesTableLib

> +

> +[Guids]

> +  gEfiHobListGuid                               ## CONSUMES

> ## SystemTable

> +  gEfiHobMemoryAllocModuleGuid                  ## CONSUMES

> --

> 2.17.1


_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
diff mbox series

Patch

diff --git a/StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.c b/StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.c
new file mode 100644
index 000000000000..cc1a08166470
--- /dev/null
+++ b/StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.c
@@ -0,0 +1,649 @@ 
+/** @file
+  HOB Library implementation for Standalone MM Core.
+
+Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2017 - 2018, ARM Limited. All rights reserved.<BR>
+Copyright (c) 2018, Linaro, Ltd. 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 <Library/MmServicesTableLib.h>
+
+//
+// Cache copy of HobList pointer.
+//
+STATIC VOID *gHobList = NULL;
+
+/**
+  The constructor function caches the pointer to HOB list.
+
+  The constructor function gets the start address of HOB list from system configuration table.
+  It will ASSERT() if that operation fails and it will always return EFI_SUCCESS.
+
+  @param  ImageHandle     The firmware allocated handle for the image.
+  @param  MmSystemTable   A pointer to the MM System Table.
+
+  @retval EFI_SUCCESS     The constructor successfully gets HobList.
+  @retval Other value     The constructor can't get HobList.
+
+**/
+EFI_STATUS
+EFIAPI
+HobLibConstructor (
+  IN EFI_HANDLE             ImageHandle,
+  IN EFI_MM_SYSTEM_TABLE    *MmSystemTable
+  )
+{
+  UINTN       Index;
+
+  for (Index = 0; Index < gMmst->NumberOfTableEntries; Index++) {
+    if (CompareGuid (&gEfiHobListGuid, &gMmst->MmConfigurationTable[Index].VendorGuid)) {
+      gHobList = gMmst->MmConfigurationTable[Index].VendorTable;
+      break;
+    }
+  }
+  return EFI_SUCCESS;
+}
+
+/**
+  Returns the pointer to the HOB list.
+
+  This function returns the pointer to first HOB in the list.
+  If the pointer to the HOB list is NULL, then ASSERT().
+
+  @return The pointer to the HOB list.
+
+**/
+VOID *
+EFIAPI
+GetHobList (
+  VOID
+  )
+{
+  UINTN       Index;
+
+  if (gHobList == NULL) {
+    for (Index = 0; Index < gMmst->NumberOfTableEntries; Index++) {
+      if (CompareGuid (&gEfiHobListGuid, &gMmst->MmConfigurationTable[Index].VendorGuid)) {
+        gHobList = gMmst->MmConfigurationTable[Index].VendorTable;
+        break;
+      }
+    }
+  }
+  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;
+}
+
+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.
+  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.
+  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.
+  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.
+  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.
+  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.
+  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.
+  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.
+  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.
+  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
+  )
+{
+  ASSERT (FALSE);
+}
+
+/**
+  Builds a Capsule Volume HOB.
+
+  This function builds a Capsule Volume HOB.
+  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
+  )
+{
+  ASSERT (FALSE);
+}
+
+
+/**
+  Builds a HOB for the BSP store.
+
+  This function builds a HOB for BSP store.
+  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
+  )
+{
+  ASSERT (FALSE);
+}
+
+/**
+  Builds a HOB for the Stack.
+
+  This function builds a HOB for the stack.
+  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
+  )
+{
+  ASSERT (FALSE);
+}
diff --git a/StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.inf b/StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.inf
new file mode 100644
index 000000000000..542a19cc4bec
--- /dev/null
+++ b/StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.inf
@@ -0,0 +1,45 @@ 
+## @file
+# Instance of HOB Library for Standalone MM modules.
+#
+# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.<BR>
+# Copyright (c) 2018, Linaro, Ltd. 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                    = 0x0001001B
+  BASE_NAME                      = HobLib
+  FILE_GUID                      = 8262551B-AB2D-4E76-99FC-5EBB83F4988E
+  MODULE_TYPE                    = MM_STANDALONE
+  VERSION_STRING                 = 1.0
+  PI_SPECIFICATION_VERSION       = 0x00010032
+  LIBRARY_CLASS                  = HobLib|MM_STANDALONE
+  CONSTRUCTOR                    = HobLibConstructor
+
+#
+#  VALID_ARCHITECTURES           = IA32 X64 ARM AARCH64
+#
+
+[Sources]
+  StandaloneMmHobLib.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+
+[LibraryClasses]
+  BaseMemoryLib
+  DebugLib
+  MmServicesTableLib
+
+[Guids]
+  gEfiHobListGuid                               ## CONSUMES  ## SystemTable
+  gEfiHobMemoryAllocModuleGuid                  ## CONSUMES