From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=192.55.52.88; helo=mga01.intel.com; envelope-from=jiewen.yao@intel.com; receiver=edk2-devel@lists.01.org Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 9983321962301 for ; Fri, 18 Jan 2019 07:24:31 -0800 (PST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 18 Jan 2019 07:24:31 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,491,1539673200"; d="scan'208";a="312953541" Received: from fmsmsx107.amr.corp.intel.com ([10.18.124.205]) by fmsmga005.fm.intel.com with ESMTP; 18 Jan 2019 07:24:30 -0800 Received: from fmsmsx118.amr.corp.intel.com (10.18.116.18) by fmsmsx107.amr.corp.intel.com (10.18.124.205) with Microsoft SMTP Server (TLS) id 14.3.408.0; Fri, 18 Jan 2019 07:24:31 -0800 Received: from shsmsx103.ccr.corp.intel.com (10.239.4.69) by fmsmsx118.amr.corp.intel.com (10.18.116.18) with Microsoft SMTP Server (TLS) id 14.3.408.0; Fri, 18 Jan 2019 07:24:29 -0800 Received: from shsmsx102.ccr.corp.intel.com ([169.254.2.63]) by SHSMSX103.ccr.corp.intel.com ([169.254.4.150]) with mapi id 14.03.0415.000; Fri, 18 Jan 2019 23:24:28 +0800 From: "Yao, Jiewen" To: Ard Biesheuvel , "edk2-devel@lists.01.org" Thread-Topic: [PATCH v2 01/11] StandaloneMmPkg: add HobLib implementation for MM_STANDALONE modules Thread-Index: AQHUrdlCbHUiwhSjqkGFodQnT14uHKW1KBOQ Date: Fri, 18 Jan 2019 15:24:27 +0000 Message-ID: <74D8A39837DF1E4DA445A8C0B3885C503F4B1918@shsmsx102.ccr.corp.intel.com> References: <20190116202236.6977-1-ard.biesheuvel@linaro.org> <20190116202236.6977-2-ard.biesheuvel@linaro.org> In-Reply-To: <20190116202236.6977-2-ard.biesheuvel@linaro.org> Accept-Language: zh-CN, en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiZjcyMTg0MzYtNDg4NC00NWJkLTk2NzQtODgyYjEyYzdlYzJjIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoiYlJGMjRMQ0NpSjdFYWM5aG90STFwSEpxb09obW1NaWZXd2RTVEJReDVyNkQ5dFwvY08zQllLVVRiczJmR0xvMEoifQ== x-ctpclassification: CTP_NT dlp-product: dlpe-windows dlp-version: 11.0.400.15 dlp-reaction: no-action x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Subject: Re: [PATCH v2 01/11] StandaloneMmPkg: add HobLib implementation for MM_STANDALONE modules X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 18 Jan 2019 15:24:31 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable 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 ; Achin Gupta > ; Yao, Jiewen ; Supreeth > Venkatesh ; Leif Lindholm > ; Jagadeesh Ujja ; > Thomas Panakamattam Abraham ; Sami > Mujawar > Subject: [PATCH v2 01/11] StandaloneMmPkg: add HobLib implementation > for MM_STANDALONE modules >=20 > 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 >=20 > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Jagadeesh Ujja > Signed-off-by: Ard Biesheuvel > --- > StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.c > | 649 ++++++++++++++++++++ >=20 > StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.inf > | 45 ++ > 2 files changed, 694 insertions(+) >=20 > 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.
> +Copyright (c) 2017 - 2018, ARM Limited. All rights reserved.
> +Copyright (c) 2018, Linaro, Ltd. All rights reserved.
> + > +This program and the accompanying materials > +are licensed and made available under the terms and conditions of the BS= D > License > +which accompanies this distribution. The full text of the license may b= e > 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 > + > +#include > +#include > +#include > +#include > + > +// > +// Cache copy of HobList pointer. > +// > +STATIC VOID *gHobList =3D NULL; > + > +/** > + The constructor function caches the pointer to HOB list. > + > + The constructor function gets the start address of HOB list from syste= m > 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 =3D 0; Index < gMmst->NumberOfTableEntries; Index++) { > + if (CompareGuid (&gEfiHobListGuid, > &gMmst->MmConfigurationTable[Index].VendorGuid)) { > + gHobList =3D 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 =3D=3D NULL) { > + for (Index =3D 0; Index < gMmst->NumberOfTableEntries; Index++) { > + if (CompareGuid (&gEfiHobListGuid, > &gMmst->MmConfigurationTable[Index].VendorGuid)) { > + gHobList =3D gMmst->MmConfigurationTable[Index].VendorTable; > + break; > + } > + } > + } > + ASSERT (gHobList !=3D 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 start= ing > HOB pointer. > + If there does not exist such HOB type from the starting HOB pointer, i= t > 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 !=3D NULL); > + > + Hob.Raw =3D (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 =3D=3D Type) { > + return Hob.Raw; > + } > + Hob.Raw =3D 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 whol= e > 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 =3D 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 H= OB > 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 re= turn > 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 =3D (UINT8 *) HobStart; > + while ((GuidHob.Raw =3D GetNextHob (EFI_HOB_TYPE_GUID_EXTENSION, > GuidHob.Raw)) !=3D NULL) { > + if (CompareGuid (Guid, &GuidHob.Guid->Name)) { > + break; > + } > + GuidHob.Raw =3D 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 re= turn > 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 =3D 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 =3D (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 =3D GetHobList (); > + > + HobLength =3D (UINT16)((HobLength + 0x7) & (~0x7)); > + > + FreeMemory =3D HandOffHob->EfiFreeMemoryTop - > HandOffHob->EfiFreeMemoryBottom; > + > + if (FreeMemory < HobLength) { > + return NULL; > + } > + > + Hob =3D (VOID*) (UINTN) HandOffHob->EfiEndOfHobList; > + ((EFI_HOB_GENERIC_HEADER*) Hob)->HobType =3D HobType; > + ((EFI_HOB_GENERIC_HEADER*) Hob)->HobLength =3D HobLength; > + ((EFI_HOB_GENERIC_HEADER*) Hob)->Reserved =3D 0; > + > + HobEnd =3D (EFI_HOB_GENERIC_HEADER*) ((UINTN)Hob + HobLength); > + HandOffHob->EfiEndOfHobList =3D (EFI_PHYSICAL_ADDRESS) (UINTN) > HobEnd; > + > + HobEnd->HobType =3D EFI_HOB_TYPE_END_OF_HOB_LIST; > + HobEnd->HobLength =3D sizeof(EFI_HOB_GENERIC_HEADER); > + HobEnd->Reserved =3D 0; > + HobEnd++; > + HandOffHob->EfiFreeMemoryBottom =3D (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)) =3D=3D 0) && > + ((ModuleLength & (EFI_PAGE_SIZE - 1)) =3D=3D 0)); > + > + Hob =3D CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof > (EFI_HOB_MEMORY_ALLOCATION_MODULE)); > + > + CopyGuid (&(Hob->MemoryAllocationHeader.Name), > &gEfiHobMemoryAllocModuleGuid); > + Hob->MemoryAllocationHeader.MemoryBaseAddress =3D > MemoryAllocationModule; > + Hob->MemoryAllocationHeader.MemoryLength =3D ModuleLength; > + Hob->MemoryAllocationHeader.MemoryType =3D > EfiBootServicesCode; > + > + // > + // Zero the reserved space to match HOB spec > + // > + ZeroMem (Hob->MemoryAllocationHeader.Reserved, sizeof > (Hob->MemoryAllocationHeader.Reserved)); > + > + CopyGuid (&Hob->ModuleName, ModuleName); > + Hob->EntryPoint =3D 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 =3D CreateHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, sizeof > (EFI_HOB_RESOURCE_DESCRIPTOR)); > + ASSERT(Hob !=3D NULL); > + > + Hob->ResourceType =3D ResourceType; > + Hob->ResourceAttribute =3D ResourceAttribute; > + Hob->PhysicalStart =3D PhysicalStart; > + Hob->ResourceLength =3D 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 >=3D (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 <=3D (0xffff - sizeof (EFI_HOB_GUID_TYPE))); > + > + Hob =3D 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 addr= ess > 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 >=3D (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 !=3D NULL || DataLength =3D=3D 0); > + > + HobData =3D 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 =3D CreateHob (EFI_HOB_TYPE_FV, sizeof > (EFI_HOB_FIRMWARE_VOLUME)); > + > + Hob->BaseAddress =3D BaseAddress; > + Hob->Length =3D 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 =3D CreateHob (EFI_HOB_TYPE_FV2, sizeof > (EFI_HOB_FIRMWARE_VOLUME2)); > + > + Hob->BaseAddress =3D BaseAddress; > + Hob->Length =3D 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 =3D CreateHob (EFI_HOB_TYPE_CPU, sizeof (EFI_HOB_CPU)); > + > + Hob->SizeOfMemorySpace =3D SizeOfMemorySpace; > + Hob->SizeOfIoSpace =3D 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)) =3D=3D 0) && > + ((Length & (EFI_PAGE_SIZE - 1)) =3D=3D 0)); > + > + Hob =3D CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof > (EFI_HOB_MEMORY_ALLOCATION)); > + > + ZeroMem (&(Hob->AllocDescriptor.Name), sizeof (EFI_GUID)); > + Hob->AllocDescriptor.MemoryBaseAddress =3D BaseAddress; > + Hob->AllocDescriptor.MemoryLength =3D Length; > + Hob->AllocDescriptor.MemoryType =3D 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.
> +# Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.
> +# Copyright (c) 2018, Linaro, Ltd. All rights reserved.
> +# > +# 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 =3D 0x0001001B > + BASE_NAME =3D HobLib > + FILE_GUID =3D > 8262551B-AB2D-4E76-99FC-5EBB83F4988E > + MODULE_TYPE =3D MM_STANDALONE > + VERSION_STRING =3D 1.0 > + PI_SPECIFICATION_VERSION =3D 0x00010032 > + LIBRARY_CLASS =3D HobLib|MM_STANDALONE > + CONSTRUCTOR =3D HobLibConstructor > + > +# > +# VALID_ARCHITECTURES =3D IA32 X64 ARM AARCH64 > +# > + > +[Sources] > + StandaloneMmHobLib.c > + > +[Packages] > + MdePkg/MdePkg.dec > + > +[LibraryClasses] > + BaseMemoryLib > + DebugLib > + MmServicesTableLib > + > +[Guids] > + gEfiHobListGuid ## CONSUMES > ## SystemTable > + gEfiHobMemoryAllocModuleGuid ## CONSUMES > -- > 2.17.1