From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=104.47.1.79; helo=eur01-ve1-obe.outbound.protection.outlook.com; envelope-from=supreeth.venkatesh@arm.com; receiver=edk2-devel@lists.01.org Received: from EUR01-VE1-obe.outbound.protection.outlook.com (mail-ve1eur01on0079.outbound.protection.outlook.com [104.47.1.79]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id B464A203B8CA9 for ; Fri, 4 May 2018 16:25:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector1-arm-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=atrweRPIyBKOtq5kzerwYQ39zb3cc862F+vUsTM/NrE=; b=QukrqQJvxLPHXLSPBYuJeVNLcrmwF9/DhEEtClsyqGEq5TM0H6SXsXXpPoAmKN3EfBSGJyNzj8R7tJKSyEpVlaZGNyLJJLfoFCTAX74BW+CRwHhwGlw0EI+3ufkJWx3TN8RAElz9ySW4WHEWvbsN2yn1QcQ+wOMMi0whJhVmklM= Received: from AM4PR0802MB2306.eurprd08.prod.outlook.com (10.172.218.15) by AM4PR0802MB2276.eurprd08.prod.outlook.com (10.172.218.9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.735.16; Fri, 4 May 2018 23:25:04 +0000 Received: from AM4PR0802MB2306.eurprd08.prod.outlook.com ([fe80::e117:6f62:6a9b:6be4]) by AM4PR0802MB2306.eurprd08.prod.outlook.com ([fe80::e117:6f62:6a9b:6be4%8]) with mapi id 15.20.0735.016; Fri, 4 May 2018 23:25:04 +0000 From: Supreeth Venkatesh To: Achin Gupta CC: "edk2-devel@lists.01.org" Thread-Topic: [PATCH v1 10/18] StandaloneMmPkg/HobLib: Add AARCH64 Specific HOB Library for management mode. Thread-Index: AQHTzbWgGBqTRELvBEGsHj9vUWz2G6QRrf0AgA5k7OA= Date: Fri, 4 May 2018 23:25:04 +0000 Message-ID: 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: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=Supreeth.Venkatesh@arm.com; x-originating-ip: [217.140.111.135] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; AM4PR0802MB2276; 7:rLDfhDThmo33h8L4bbyMZQRK0gSfbM6jK33KNDweS2TX0JYf9Q17c5MTWJKqEN4oDMj6K4KMtDNK8XQ4LPvAvIZ3F+TCLvE3qi1JQ2hn85rIjtNya0pXY8yjHK9eEgaARU9WxWNFJGqdDXIZ7pKXHC1DasBcFRPtTQOoyr7PUv/OY72MGZ/T1ms7OsUZfsU+OByHj2tAxPST969ZuXnkc2ti4cqhauK13tVUKr3Wq1Qsb3joDBMeykGp0rFGLG+1 x-ms-exchange-antispam-srfa-diagnostics: SOS;SOR; x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(48565401081)(5600026)(2017052603328)(7153060)(7193020); SRVR:AM4PR0802MB2276; x-ms-traffictypediagnostic: AM4PR0802MB2276: x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:(180628864354917)(162533806227266)(228905959029699); x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(10201501046)(93006095)(93001095)(3231254)(944501410)(52105095)(3002001)(6055026)(6041310)(20161123564045)(20161123562045)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(6072148)(201708071742011); SRVR:AM4PR0802MB2276; BCL:0; PCL:0; RULEID:; SRVR:AM4PR0802MB2276; x-forefront-prvs: 06628F7CA4 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(6029001)(376002)(39380400002)(346002)(366004)(39860400002)(396003)(13464003)(40434004)(189003)(199004)(6506007)(11346002)(26005)(105586002)(102836004)(305945005)(66066001)(33656002)(76176011)(7696005)(6436002)(3280700002)(3660700001)(478600001)(59450400001)(106356001)(446003)(486006)(53946003)(2906002)(14454004)(5660300001)(53546011)(476003)(316002)(99286004)(81156014)(74316002)(9686003)(6306002)(2900100001)(3846002)(8936002)(6116002)(4326008)(53376002)(6636002)(53936002)(81166006)(7736002)(55016002)(6862004)(8676002)(72206003)(86362001)(966005)(25786009)(229853002)(97736004)(5250100002)(5890100001)(6246003)(68736007)(579004)(559001); DIR:OUT; SFP:1101; SCL:1; SRVR:AM4PR0802MB2276; H:AM4PR0802MB2306.eurprd08.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; received-spf: None (protection.outlook.com: arm.com does not designate permitted sender hosts) x-microsoft-antispam-message-info: usoock0K8UM7I9EGqJqGu4xderyM+2RzH3RT38ud7nP7ZcbSMa4rN4holEXHwA8jOl9bgi+oAjs+giq/rXh4BzeVX03ObYTomgzaO3uWISiNrILM4FYDmF+tcYFCicReX5NsYGiTRNKOqj0QH7htd019BqjjndL2ZgN2P+Nwm7JCGxwb+1TL+5NFrLs4DXUC spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: c1099867-b219-4412-35b3-08d5b216442b X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-Network-Message-Id: c1099867-b219-4412-35b3-08d5b216442b X-MS-Exchange-CrossTenant-originalarrivaltime: 04 May 2018 23:25:04.4093 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM4PR0802MB2276 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: Fri, 04 May 2018 23:25:08 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable My response inline. -----Original Message----- From: Achin Gupta Sent: Wednesday, April 25, 2018 9:50 AM To: Supreeth Venkatesh Cc: edk2-devel@lists.01.org; michael.d.kinney@intel.com; liming.gao@intel.c= om; jiewen.yao@intel.com; leif.lindholm@linaro.org; ard.biesheuvel@linaro.o= rg; nd Subject: Re: [PATCH v1 10/18] StandaloneMmPkg/HobLib: Add AARCH64 Specific = HOB Library for management mode. Hi Supreeth, On Fri, Apr 06, 2018 at 03:42:15PM +0100, Supreeth Venkatesh wrote: > The Standalone MM environment is initialized during the SEC phase on > ARM Standard Platforms. The MM Core driver implements an entry point > module which is architecture specific and runs prior to the generic > core driver code. The former creates a Hob list that the latter > consumes. This happens in the same phase. > > This patch implements a Hob library that can be used by the entry > point module to produce a Hob list and by the core driver code to consume= it. References to DXE core need to be removed and the copyright years needs to = be updated. I think it is worth getting this hoblib reviewed by the ArmPkg maintainers. [Supreeth] I have modified it as Jiewen mentioned as it is StandaloneMmPkg = specific. However, More the merrier. Acked-by: Achin Gupta > > 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 IMP= LIED. > + > +**/ > + > +#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 retrieved through the EFI System Table by looking up th= eHOB list GUID in the System Configuration Table. > + Since the System Configuration Table does not exist that the time > + the DXE Core is launched, the DXE Core uses a global variable from > + the DXE Core Entry Point Library to manage the pointer to the HOB list= . > + > + If the pointer to the HOB list is NULL, then ASSERT(). > + > + @return The pointer to the HOB list. > + > +**/ > +VOID * > +EFIAPI > +GetHobList ( > + VOID > + ) > +{ > + ASSERT (gHobList !=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 HO= B. > + > + 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 inf= ormation, 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 HO= B. > + > +**/ > +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, GuidH= ob.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 t= o 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 inf= ormation, 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 phase. > + If ModuleName is NULL, then ASSERT(). > + If there is no additional space for HOB creation, then ASSERT(). > + > + @param ModuleName The GUID File Name of the module. > + @param MemoryAllocationModule The 64 bit physical address of the mod= ule. > + @param ModuleLength The length of the module in bytes. > + @param EntryPoint The 64 bit physical address of the mod= ule 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.MemoryBase= Address =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 desc= ribed by this HOB. > + @param PhysicalStart The 64 bit physical address of memory desc= ribed 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. > + It can only be invoked during PEI phase; for DXE phase, it will > + ASSERT() since PEI HOB is read-only for DXE phase. > + If Guid is NULL, then ASSERT(). > + If there is no additional space for HOB creation, then ASSERT(). > + If DataLength >=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 return= s the start address of the GUID HOB data. > + The HOB Header and Name field is already stripped. > + It can only be invoked during PEI phase; for DXE phase, it will > + ASSERT() since PEI HOB is read-only for DXE phase. > + If Guid is NULL, then ASSERT(). > + If Data is NULL and DataLength > 0, then ASSERT(). > + If there is no additional space for HOB creation, then ASSERT(). > + If DataLength >=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. > + 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 phase. > + If there is no additional space for HOB creation, then ASSERT(). > + > + @param BaseAddress The base address of the Firmware Volume. > + @param Length The size of the Firmware Volume in bytes. > + @param FvName The name of the Firmware Volume. > + @param FileName The name of the file. > + > +**/ > +VOID > +EFIAPI > +BuildFv2Hob ( > + IN EFI_PHYSICAL_ADDRESS BaseAddress, > + IN UINT64 Length, > + IN CONST EFI_GUID *FvName, > + IN CONST EFI_GUID *FileName > + ) > +{ > + EFI_HOB_FIRMWARE_VOLUME2 *Hob; > + > + Hob =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 phase. > + If there is no additional space for HOB creation, then ASSERT(). > + > + @param SizeOfMemorySpace The maximum physical memory addressability= of the processor. > + @param SizeOfIoSpace The maximum physical I/O addressability of= the processor. > + > +**/ > +VOID > +EFIAPI > +BuildCpuHob ( > + IN UINT8 SizeOfMemorySpace, > + IN UINT8 SizeOfIoSpace > + ) > +{ > + EFI_HOB_CPU *Hob; > + > + Hob =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 phase. > + If there is no additional space for HOB creation, then ASSERT(). > + > + @param BaseAddress The 64 bit physical address of the memory. > + @param Length The length of the memory allocation in bytes. > + @param MemoryType Type of memory allocated by this HOB. > + > +**/ > +VOID > +EFIAPI > +BuildMemoryAllocationHob ( > + IN EFI_PHYSICAL_ADDRESS BaseAddress, > + IN UINT64 Length, > + IN EFI_MEMORY_TYPE MemoryType > + ) > +{ > + EFI_HOB_MEMORY_ALLOCATION *Hob; > + > + ASSERT (((BaseAddress & (EFI_PAGE_SIZE - 1)) =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 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 desc= ribed by this HOB. > + @param PhysicalStart The 64 bit physical address of memory desc= ribed by this HOB. > + @param NumberOfBytes The length of the memory described by this= HOB in bytes. > + @param OwnerGUID GUID for the owner of this resource. > + > +**/ > +VOID > +EFIAPI > +BuildResourceDescriptorWithOwnerHob ( > + IN EFI_RESOURCE_TYPE ResourceType, > + IN EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttribute, > + IN EFI_PHYSICAL_ADDRESS PhysicalStart, > + IN UINT64 NumberOfBytes, > + IN EFI_GUID *OwnerGUID > + ) > +{ > + // > + // PEI HOB is read only for DXE phase > + // > + ASSERT (FALSE); > +} > + > +/** > + Builds a Capsule Volume HOB. > + > + This function builds a Capsule Volume HOB. > + It can only be invoked during PEI phase; for DXE phase, it will > + ASSERT() because PEI HOB is read-only for DXE phase. > + > + If the platform does not support Capsule Volume HOBs, then ASSERT(). > + If there is no additional space for HOB creation, then ASSERT(). > + > + @param BaseAddress The base address of the Capsule Volume. > + @param Length The size of the Capsule Volume in bytes. > + > +**/ > +VOID > +EFIAPI > +BuildCvHob ( > + IN EFI_PHYSICAL_ADDRESS BaseAddress, > + IN UINT64 Length > + ) > +{ > + // > + // PEI HOB is read only for DXE phase > + // > + ASSERT (FALSE); > +} > + > + > +/** > + Builds a HOB for the BSP store. > + > + This function builds a HOB for BSP store. > + It can only be invoked during PEI phase; for DXE phase, it will > + ASSERT() because PEI HOB is read-only for DXE phase. > + > + If there is no additional space for HOB creation, then ASSERT(). > + > + @param BaseAddress The 64 bit physical address of the BSP. > + @param Length The length of the BSP store in bytes. > + @param MemoryType Type of memory allocated by this HOB. > + > +**/ > +VOID > +EFIAPI > +BuildBspStoreHob ( > + IN EFI_PHYSICAL_ADDRESS BaseAddress, > + IN UINT64 Length, > + IN EFI_MEMORY_TYPE MemoryType > + ) > +{ > + // > + // PEI HOB is read only for DXE phase > + // > + ASSERT (FALSE); > +} > + > +/** > + Builds a HOB for the Stack. > + > + This function builds a HOB for the stack. > + It can only be invoked during PEI phase; for DXE phase, it will > + ASSERT() since PEI HOB is read-only for DXE phase. > + If there is no additional space for HOB creation, then ASSERT(). > + > + @param BaseAddress The 64 bit physical address of the Stack. > + @param Length The length of the stack in bytes. > + > +**/ > +VOID > +EFIAPI > +BuildStackHob ( > + IN EFI_PHYSICAL_ADDRESS BaseAddress, > + IN UINT64 Length > + ) > +{ > + // > + // PEI HOB is read only for DXE phase > + // > + ASSERT (FALSE); > +} > diff --git a/StandaloneMmPkg/Library/HobLib/HobLib.inf > b/StandaloneMmPkg/Library/HobLib/HobLib.inf > new file mode 100644 > index 0000000000..42273b6d66 > --- /dev/null > +++ b/StandaloneMmPkg/Library/HobLib/HobLib.inf > @@ -0,0 +1,45 @@ > +## @file > +# Instance of HOB Library for DXE Core. > +# > +# HOB Library implementation for the DXE Core. Does not have a construct= or. > +# 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 the BSD > +License # which accompanies this distribution. The full text of the > +license may be found at # http://opensource.org/licenses/bsd-license.ph= p. > +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > +BASIS, # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPR= ESS OR IMPLIED. > +# > +# > +## > + > +[Defines] > + INF_VERSION =3D 0x0001001A > + BASE_NAME =3D HobLib > + FILE_GUID =3D CF56EF2C-68D8-4BD5-9A8B-8A7BFCFF751= C > + MODULE_TYPE =3D MM_CORE_STANDALONE > + VERSION_STRING =3D 1.0 > + PI_SPECIFICATION_VERSION =3D 0x00010032 > + LIBRARY_CLASS =3D HobLib|MM_CORE_STANDALONE MM_STANDA= LONE > + > +# > +# VALID_ARCHITECTURES =3D AARCH64 > +# > + > +[Sources.AARCH64] > + Arm/HobLib.c > + > +[Packages] > + MdePkg/MdePkg.dec > + > + > +[LibraryClasses] > + BaseMemoryLib > + DebugLib > + > +[Guids] > + gEfiHobListGuid ## CONSUMES ## SystemTa= ble > -- > 2.16.2 > IMPORTANT NOTICE: The contents of this email and any attachments are confid= ential and may also be privileged. If you are not the intended recipient, p= lease notify the sender immediately and do not disclose the contents to any= other person, use it for any purpose, or store or copy the information in = any medium. Thank you.