From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.20; helo=mga02.intel.com; envelope-from=jiewen.yao@intel.com; receiver=edk2-devel@lists.01.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) (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 051EC2035D6D9 for ; Thu, 26 Apr 2018 06:04:27 -0700 (PDT) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 26 Apr 2018 06:04:27 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.49,330,1520924400"; d="scan'208";a="51006915" Received: from fmsmsx103.amr.corp.intel.com ([10.18.124.201]) by orsmga001.jf.intel.com with ESMTP; 26 Apr 2018 06:04:27 -0700 Received: from fmsmsx113.amr.corp.intel.com (10.18.116.7) by FMSMSX103.amr.corp.intel.com (10.18.124.201) with Microsoft SMTP Server (TLS) id 14.3.319.2; Thu, 26 Apr 2018 06:04:26 -0700 Received: from shsmsx101.ccr.corp.intel.com (10.239.4.153) by FMSMSX113.amr.corp.intel.com (10.18.116.7) with Microsoft SMTP Server (TLS) id 14.3.319.2; Thu, 26 Apr 2018 06:04:26 -0700 Received: from shsmsx102.ccr.corp.intel.com ([169.254.2.79]) by SHSMSX101.ccr.corp.intel.com ([169.254.1.40]) with mapi id 14.03.0319.002; Thu, 26 Apr 2018 21:04:24 +0800 From: "Yao, Jiewen" To: Achin Gupta , Supreeth Venkatesh CC: "edk2-devel@lists.01.org" , "Kinney, Michael D" , "Gao, Liming" , "leif.lindholm@linaro.org" , "ard.biesheuvel@linaro.org" , "nd@arm.com" Thread-Topic: [PATCH v1 10/18] StandaloneMmPkg/HobLib: Add AARCH64 Specific HOB Library for management mode. Thread-Index: AQHTzbWisBGsYrmxGU+GqjtzKC3C1KQRJ+AAgAH6nzA= Date: Thu, 26 Apr 2018 13:04:23 +0000 Message-ID: <74D8A39837DF1E4DA445A8C0B3885C503AB81B1C@shsmsx102.ccr.corp.intel.com> References: <20180406144223.10931-1-supreeth.venkatesh@arm.com> <20180406144223.10931-11-supreeth.venkatesh@arm.com> <20180425145007.GP663@e104320-lin> In-Reply-To: <20180425145007.GP663@e104320-lin> Accept-Language: zh-CN, en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiZTJiY2NlN2MtZTg1Ni00MmVjLWE5OGEtMDQ3ZjMyYTQ2YzQyIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjIuNS4xOCIsIlRydXN0ZWRMYWJlbEhhc2giOiJaMGI1YVYwSEJQXC9cLzRCa1dVNGY3c25iU0kzUlVKVlh2Z3gyVElkaFwvVmtucCtlWmgyMUlxb3BXUGs5ZjBjcVF6In0= x-ctpclassification: CTP_NT dlp-product: dlpe-windows dlp-version: 11.0.200.100 dlp-reaction: no-action x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Subject: Re: [PATCH v1 10/18] StandaloneMmPkg/HobLib: Add AARCH64 Specific HOB Library for management mode. X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 26 Apr 2018 13:04:28 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Maybe we can use same layout as MmMemLib. It seems only HobConstructor() is Arm specific. Other functions are quite g= eneric. Thank you > -----Original Message----- > From: Achin Gupta [mailto:achin.gupta@arm.com] > Sent: Wednesday, April 25, 2018 7:50 AM > To: Supreeth Venkatesh > Cc: edk2-devel@lists.01.org; Kinney, Michael D ; > Gao, Liming ; Yao, Jiewen ; > leif.lindholm@linaro.org; ard.biesheuvel@linaro.org; nd@arm.com > Subject: Re: [PATCH v1 10/18] StandaloneMmPkg/HobLib: Add AARCH64 > Specific HOB Library for management mode. >=20 > Hi Supreeth, >=20 > On Fri, Apr 06, 2018 at 03:42:15PM +0100, Supreeth Venkatesh wrote: > > The Standalone MM environment is initialized during the SEC phase on AR= M > > Standard Platforms. The MM Core driver implements an entry point module > > which is architecture specific and runs prior to the generic core drive= r > > 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. >=20 > References to DXE core need to be removed and the copyright years needs t= o be > updated. >=20 > I think it is worth getting this hoblib reviewed by the ArmPkg maintainer= s. >=20 > Acked-by: Achin Gupta >=20 > > > > Contributed-under: TianoCore Contribution Agreement 1.1 > > Signed-off-by: Achin Gupta > > Signed-off-by: Supreeth Venkatesh > > --- > > 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.
> > +Copyright (c) 2017, ARM Limited. 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. > > + > > +**/ > > + > > +#include > > + > > +#include > > +#include > > +#include > > + > > +#include > > + > > +// > > +// Cache copy of HobList pointer. > > +// > > +VOID *gHobList =3D 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 ret= rieved > 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 th= e DXE > Core is > > + launched, the DXE Core uses a global variable from the DXE Core Entr= y > 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 !=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 sta= rting > 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 t= he > starting HOB pointer > > + unconditionally: it returns HobStart back if HobStart itself meets t= he > requirement; > > + caller is required to use GET_NEXT_HOB() if it wishes to skip curren= t > 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 wh= ole > HOB list. > > + If there does not exist such HOB type in the HOB list, it will retur= n 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= 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 t= he > starting HOB pointer > > + unconditionally: it returns HobStart back if HobStart itself meets t= he > requirement; > > + caller is required to use GET_NEXT_HOB() if it wishes to skip curren= t > 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 H= OB > list. > > + > > + This function searches the first instance of a HOB among the whole H= OB > 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 =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; > > +} > > + > > + > > +/** > > + > > + > > +**/ > > +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 =3D EfiFreeMemoryBottom; > > + HobEnd =3D (EFI_HOB_GENERIC_HEADER *)(Hob+1); > > + > > + Hob->Header.HobType =3D EFI_HOB_TYPE_HANDOFF; > > + Hob->Header.HobLength =3D sizeof(EFI_HOB_HANDOFF_INFO_TABLE); > > + Hob->Header.Reserved =3D 0; > > + > > + HobEnd->HobType =3D EFI_HOB_TYPE_END_OF_HOB_LIST; > > + HobEnd->HobLength =3D sizeof(EFI_HOB_GENERIC_HEADER); > > + HobEnd->Reserved =3D 0; > > + > > + Hob->Version =3D EFI_HOB_HANDOFF_TABLE_VERSION; > > + Hob->BootMode =3D BOOT_WITH_FULL_CONFIGURATION; > > + > > + Hob->EfiMemoryTop =3D (UINTN)EfiMemoryBegin + > EfiMemoryLength; > > + Hob->EfiMemoryBottom =3D (UINTN)EfiMemoryBegin; > > + Hob->EfiFreeMemoryTop =3D (UINTN)EfiFreeMemoryTop; > > + Hob->EfiFreeMemoryBottom =3D > (EFI_PHYSICAL_ADDRESS)(UINTN)(HobEnd+1); > > + Hob->EfiEndOfHobList =3D (EFI_PHYSICAL_ADDRESS)(UINTN)HobEnd; > > + > > + gHobList =3D 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 =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. > > + It can only be invoked during PEI phase; > > + for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE p= hase. > > + 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. > > + 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 =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 identif= ication > > + and returns the start address of GUID HOB data so that caller can fi= ll 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 p= hase. > > + 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 ASSE= RT(). > > + > > + @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 ad= dress 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 p= hase. > > + 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 ASSE= RT(). > > + > > + @param Guid The GUID to tag the customized HOB. > > + @param Data The data to be copied into the data field of t= he > 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. > > + 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 =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. > > + It can only be invoked during PEI phase; > > + for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE p= hase. > > + 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. > > + It can only be invoked during PEI phase; > > + for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE p= hase. > > + 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. > > + It can only be invoked during PEI phase; > > + for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE p= hase. > > + 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. > > + It can only be invoked during PEI phase; > > + for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE p= hase. > > + > > + 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 p= hase. > > + 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 constru= ctor. > > +# Uses gHobList defined in the DXE Core Entry Point Library. > > +# > > +# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved. > > +# Copyright (c) 2016 - 2017, ARM Limited. All rights reserved.
> > +# > > +# This program and the accompanying materials > > +# are licensed and made available under the terms and conditions of t= he > BSD License > > +# which accompanies this distribution. The full text of the license m= ay 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 0x0001001A > > + BASE_NAME =3D HobLib > > + FILE_GUID =3D > CF56EF2C-68D8-4BD5-9A8B-8A7BFCFF751C > > + MODULE_TYPE =3D MM_CORE_STANDALONE > > + VERSION_STRING =3D 1.0 > > + PI_SPECIFICATION_VERSION =3D 0x00010032 > > + LIBRARY_CLASS =3D HobLib|MM_CORE_STANDALONE > MM_STANDALONE > > + > > +# > > +# VALID_ARCHITECTURES =3D AARCH64 > > +# > > + > > +[Sources.AARCH64] > > + Arm/HobLib.c > > + > > +[Packages] > > + MdePkg/MdePkg.dec > > + > > + > > +[LibraryClasses] > > + BaseMemoryLib > > + DebugLib > > + > > +[Guids] > > + gEfiHobListGuid ## CONSUMES ## > SystemTable > > -- > > 2.16.2 > >