From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=104.47.2.77; helo=eur01-db5-obe.outbound.protection.outlook.com; envelope-from=supreeth.venkatesh@arm.com; receiver=edk2-devel@lists.01.org Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-db5eur01on0077.outbound.protection.outlook.com [104.47.2.77]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id D8574203BEA3A for ; Fri, 4 May 2018 16:21:50 -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=8EBdmUyIab+h91MwITwRidhwFriy0ouP8YRyzjyvJBs=; b=QGJvDRlqu/LIJqo81e71rx9Evmnj4XD3Zv+2pfoVbrmKd2BURELv75XBugmoZD7sPa4pyBBGxZ3Cm8/dosaSWRoa/31zcmLI76WhHUT+A4aDy+dJJscATehIN6EIRg5bsm0PbMLjoantQk05cMXGcFQD1U53Nb4GA2BkjQEQCVE= Received: from AM4PR0802MB2306.eurprd08.prod.outlook.com (10.172.218.15) by AM4PR0802MB2196.eurprd08.prod.outlook.com (10.172.217.22) 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:21:47 +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:21:47 +0000 From: Supreeth Venkatesh To: Achin Gupta CC: "edk2-devel@lists.01.org" Thread-Topic: [PATCH v1 09/18] StandaloneMmPkg/MemoryAllocationLib: Add MM memory allocation library. Thread-Index: AQHTzbWfosDbLAtNfE+jrCJc9+/y8KQRqXWAgA5pGvA= Date: Fri, 4 May 2018 23:21:47 +0000 Message-ID: References: <20180406144223.10931-1-supreeth.venkatesh@arm.com> <20180406144223.10931-10-supreeth.venkatesh@arm.com> <20180425143354.GO663@e104320-lin> In-Reply-To: <20180425143354.GO663@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; AM4PR0802MB2196; 7:Jo+VaRONo+UKlazo5XJAOUWpisDAPkBbk0Ib5qJEhXVdyXe32iTbbCwG/Ae1rGFh0KcpfsHdD93+wGkT6VFfM3cfIaChYoJcyUdFJr822pGYd8hVooLB2mIAQSLyd620fwCJHlEzUVgRIo8lpW7igYj8By7St6dEt2xGj0psjAMiWFsc69vnfsfjfBMYhFtaYJNIxGfZrxcPk+w2kJjNpnARJsGb+vQC1DIIp+aMvKiTsUC+1OTr18NspirMC5iA 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:AM4PR0802MB2196; x-ms-traffictypediagnostic: AM4PR0802MB2196: 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)(5005006)(8121501046)(3231254)(944501410)(52105095)(10201501046)(93006095)(93001095)(3002001)(6055026)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123564045)(20161123560045)(20161123562045)(20161123558120)(6072148)(201708071742011); SRVR:AM4PR0802MB2196; BCL:0; PCL:0; RULEID:; SRVR:AM4PR0802MB2196; x-forefront-prvs: 06628F7CA4 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(6029001)(39860400002)(346002)(39380400002)(396003)(376002)(366004)(13464003)(199004)(189003)(40434004)(105586002)(446003)(8936002)(106356001)(4326008)(11346002)(476003)(486006)(966005)(72206003)(5660300001)(6116002)(478600001)(305945005)(7736002)(3846002)(25786009)(81156014)(81166006)(8676002)(66066001)(14454004)(97736004)(316002)(5250100002)(3280700002)(99286004)(6246003)(575784001)(86362001)(3660700001)(16200700003)(53946003)(74316002)(6306002)(9686003)(55016002)(6436002)(229853002)(102836004)(6862004)(2906002)(6636002)(6506007)(68736007)(59450400001)(53546011)(15188155005)(16799955002)(53376002)(33656002)(26005)(2900100001)(76176011)(7696005)(53936002)(5890100001)(579004)(569006); DIR:OUT; SFP:1101; SCL:1; SRVR:AM4PR0802MB2196; H:AM4PR0802MB2306.eurprd08.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; received-spf: None (protection.outlook.com: arm.com does not designate permitted sender hosts) x-microsoft-antispam-message-info: 5OgyoCh6N3XqFylRB7VlAc5DzGPGgRGzLa7/GTvXb48mZhSQBgmbaJbNore4Y7XWaGFNfBGTThGiZdihfF7GEPUgSEQwMGAdn68Z63AsU1+Hu3LlgZqkDP3YKbFvgPXajuDmiCYuy2f6dDIn0O3KCsE+E6cRXyCFOYWuv5UZnjQy98zWSAefFw9rN5jgHuPQ spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: 29dfb33c-ee20-44e5-ae81-08d5b215cef7 X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-Network-Message-Id: 29dfb33c-ee20-44e5-ae81-08d5b215cef7 X-MS-Exchange-CrossTenant-originalarrivaltime: 04 May 2018 23:21:47.7939 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM4PR0802MB2196 Subject: Re: [PATCH v1 09/18] StandaloneMmPkg/MemoryAllocationLib: Add MM memory allocation library. 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:21:51 -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:34 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 09/18] StandaloneMmPkg/MemoryAllocationLib: Add MM m= emory allocation library. Hi Supreeth, On Fri, Apr 06, 2018 at 03:42:14PM +0100, Supreeth Venkatesh wrote: > This patch implements management mode memory allocation services.The > implementation borrows the MM Core Memory Allocation services as the > primitive for memory allocation instead of using MM System Table > services. The commit message did not really register with me. Once the MMRAM ranges h= ave been conveyed to the MMST memory allocation services (through MemoryAll= ocationLibConstructor()), all functions in MemoryAllocationLib.c use the MM= ST services. The message seems to indicate otherwise. On Arm, the gEfiMmPeiMmramMemoryReserveGuid HOB is used to convey the MMRAM= ranges. It seems x86 uses gMmCoreDataHobGuid HOB. So it worth getting this= reviewed by Jiewen. The copyright years in the files need to be updated. [Supreeth] Ok. Done. With that in mind.. Acked-by: Achin Gupta > > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Achin Gupta > Signed-off-by: Supreeth Venkatesh > --- > StandaloneMmPkg/Include/Guid/MmCoreData.h | 132 +++ > StandaloneMmPkg/Include/Guid/MmramMemoryReserve.h | 62 ++ > .../MemoryAllocationLib/MemoryAllocationLib.c | 907 +++++++++++++++= ++++++ > .../MemoryAllocationLib/MemoryAllocationLib.inf | 49 ++ > .../MemoryAllocationLib/MemoryAllocationServices.h | 38 + > 5 files changed, 1188 insertions(+) > create mode 100644 StandaloneMmPkg/Include/Guid/MmCoreData.h > create mode 100644 StandaloneMmPkg/Include/Guid/MmramMemoryReserve.h > create mode 100644 > StandaloneMmPkg/Library/MemoryAllocationLib/MemoryAllocationLib.c > create mode 100644 > StandaloneMmPkg/Library/MemoryAllocationLib/MemoryAllocationLib.inf > create mode 100644 > StandaloneMmPkg/Library/MemoryAllocationLib/MemoryAllocationServices.h > > diff --git a/StandaloneMmPkg/Include/Guid/MmCoreData.h > b/StandaloneMmPkg/Include/Guid/MmCoreData.h > new file mode 100644 > index 0000000000..c0ac772014 > --- /dev/null > +++ b/StandaloneMmPkg/Include/Guid/MmCoreData.h > @@ -0,0 +1,132 @@ > +/** @file > + MM Core data. > + > +Copyright (c) 2015, Intel Corporation. All rights reserved.
This > +program and the accompanying materials are licensed and made > +available under the terms and conditions of the BSD License that accompa= nies 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. > + > +**/ > + > +#ifndef __MM_CORE_DATA_H__ > +#define __MM_CORE_DATA_H__ > + > +#define MM_CORE_DATA_HOB_GUID \ > + { 0xa160bf99, 0x2aa4, 0x4d7d, { 0x99, 0x93, 0x89, 0x9c, 0xb1, 0x2d, > +0xf3, 0x76 }} > + > +extern EFI_GUID gMmCoreDataHobGuid; > + > +typedef struct { > + // > + // Address pointer to MM_CORE_PRIVATE_DATA > + // > + EFI_PHYSICAL_ADDRESS Address; > +} MM_CORE_DATA_HOB_DATA; > + > + > +/// > +/// Define values for the communications buffer used when > +gEfiEventDxeDispatchGuid is /// event signaled. This event is > +signaled by the DXE Core each time the DXE Core /// dispatcher has > +completed its work. When this event is signaled, the MM Core /// if > +notified, so the MM Core can dispatch MM drivers. If > +COMM_BUFFER_MM_DISPATCH_ERROR /// is returned in the communication > +buffer, then an error occurred dispatching MM /// Drivers. If > +COMM_BUFFER_MM_DISPATCH_SUCCESS is returned, then the MM Core /// > +dispatched all the drivers it could. If > +COMM_BUFFER_MM_DISPATCH_RESTART is /// returned, then the MM Core just d= ispatched the MM Driver that registered /// the MM Entry Point enabling the= use of MM Mode. In this case, the MM Core /// should be notified again to= dispatch more MM Drivers using MM Mode. > +/// > +#define COMM_BUFFER_MM_DISPATCH_ERROR 0x00 > +#define COMM_BUFFER_MM_DISPATCH_SUCCESS 0x01 #define > +COMM_BUFFER_MM_DISPATCH_RESTART 0x02 > + > +/// > +/// Signature for the private structure shared between the MM IPL and > +the MM Core /// #define MM_CORE_PRIVATE_DATA_SIGNATURE SIGNATURE_32 > +('m', 'm', 'i', 'c') > + > +/// > +/// Private structure that is used to share information between the > +MM IPL and /// the MM Core. This structure is allocated from memory of = type EfiRuntimeServicesData. > +/// Since runtime memory types are converted to available memory when > +a legacy boot /// is performed, the MM Core must not access any > +fields of this structure if a legacy /// boot is performed. As a > +result, the MM IPL must create an event notification /// for the > +Legacy Boot event and notify the MM Core that a legacy boot is being > +/// performed. The MM Core can then use this information to filter acce= sses to /// thos structure. > +/// > +typedef struct { > + UINT64 Signature; > + > + /// > + /// The number of MMRAM ranges passed from the MM IPL to the MM > + Core. The MM /// Core uses these ranges of MMRAM to initialize the MM= Core memory manager. > + /// > + UINT64 MmramRangeCount; > + > + /// > + /// A table of MMRAM ranges passed from the MM IPL to the MM Core. > + The MM /// Core uses these ranges of MMRAM to initialize the MM Core m= emory manager. > + /// > + EFI_PHYSICAL_ADDRESS MmramRanges; > + > + /// > + /// The MM Foundation Entry Point. The MM Core fills in this field > + when the /// MM Core is initialized. The MM IPL is responsbile for > + registering this entry /// point with the MM Configuration > + Protocol. The MM Configuration Protocol may /// not be available > + at the time the MM IPL and MM Core are started, so the MM IPL /// > + sets up a protocol notification on the MM Configuration Protocol and > + registers /// the MM Foundation Entry Point as soon as the MM Configur= ation Protocol is /// available. > + /// > + EFI_PHYSICAL_ADDRESS MmEntryPoint; > + > + /// > + /// Boolean flag set to TRUE while an MMI is being processed by the MM= Core. > + /// > + BOOLEAN MmEntryPointRegistered; > + > + /// > + /// Boolean flag set to TRUE while an MMI is being processed by the MM= Core. > + /// > + BOOLEAN InMm; > + > + /// > + /// This field is set by the MM Core then the MM Core is > + initialized. This field is /// used by the MM Base 2 Protocol and > + MM Communication Protocol implementations in /// the MM IPL. > + /// > + EFI_PHYSICAL_ADDRESS Mmst; > + > + /// > + /// This field is used by the MM Communicatioon Protocol to pass a > + buffer into /// a software MMI handler and for the software MMI > + handler to pass a buffer back to /// the caller of the MM Communicatio= n Protocol. > + /// > + EFI_PHYSICAL_ADDRESS CommunicationBuffer; > + > + /// > + /// This field is used by the MM Communicatioon Protocol to pass > + the size of a buffer, /// in bytes, into a software MMI handler and > + for the software MMI handler to pass the /// size, in bytes, of a buff= er back to the caller of the MM Communication Protocol. > + /// > + UINT64 BufferSize; > + > + /// > + /// This field is used by the MM Communication Protocol to pass the > + return status from /// a software MMI handler back to the caller of th= e MM Communication Protocol. > + /// > + UINT64 ReturnStatus; > + > + EFI_PHYSICAL_ADDRESS MmCoreImageBase; > + UINT64 MmCoreImageSize; > + EFI_PHYSICAL_ADDRESS MmCoreEntryPoint; > + > + EFI_PHYSICAL_ADDRESS StandaloneBfvAddress; > +} MM_CORE_PRIVATE_DATA; > + > +#endif > diff --git a/StandaloneMmPkg/Include/Guid/MmramMemoryReserve.h > b/StandaloneMmPkg/Include/Guid/MmramMemoryReserve.h > new file mode 100644 > index 0000000000..c4104b755d > --- /dev/null > +++ b/StandaloneMmPkg/Include/Guid/MmramMemoryReserve.h > @@ -0,0 +1,62 @@ > +/** @file > + Definition of GUIDed HOB for reserving MMRAM regions. > + > + This file defines: > + * the GUID used to identify the GUID HOB for reserving MMRAM regions. > + * the data structure of MMRAM descriptor to describe MMRAM > + candidate regions > + * values of state of MMRAM candidate regions > + * the GUID specific data structure of HOB for reserving MMRAM regions. > + This GUIDed HOB can be used to convey the existence of the T-SEG > + reservation and H-SEG usage > + > +Copyright (c) 2007 - 2010, 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 that accompa= nies 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. > + > + @par Revision Reference: > + GUIDs defined in MmCis spec version 0.9. > + > +**/ > + > +#ifndef _EFI_MM_PEI_MMRAM_MEMORY_RESERVE_H_ > +#define _EFI_MM_PEI_MMRAM_MEMORY_RESERVE_H_ > + > +#define EFI_MM_PEI_MMRAM_MEMORY_RESERVE \ > + { \ > + 0x0703f912, 0xbf8d, 0x4e2a, {0xbe, 0x07, 0xab, 0x27, 0x25, 0x25, > +0xc5, 0x92 } \ > + } > + > +/** > +* GUID specific data structure of HOB for reserving MMRAM regions. > +* > +* Inconsistent with specification here: > +* EFI_HOB_MMRAM_DESCRIPTOR_BLOCK has been changed to EFI_MMRAM_HOB_DESCR= IPTOR_BLOCK. > +* This inconsistency is kept in code in order for backward compatibility= . > +**/ > +typedef struct { > + /// > + /// Designates the number of possible regions in the system > + /// that can be usable for MMRAM. > + /// > + /// Inconsistent with specification here: > + /// In Framework MM CIS 0.91 specification, it defines the field type = as UINTN. > + /// However, HOBs are supposed to be CPU neutral, so UINT32 should be = used instead. > + /// > + UINT32 NumberOfMmReservedRegions; > + /// > + /// Used throughout this protocol to describe the candidate > + /// regions for MMRAM that are supported by this platform. > + /// > + EFI_MMRAM_DESCRIPTOR Descriptor[1]; } > +EFI_MMRAM_HOB_DESCRIPTOR_BLOCK; > + > +extern EFI_GUID gEfiMmPeiSmramMemoryReserveGuid; > + > +#endif > + > diff --git > a/StandaloneMmPkg/Library/MemoryAllocationLib/MemoryAllocationLib.c > b/StandaloneMmPkg/Library/MemoryAllocationLib/MemoryAllocationLib.c > new file mode 100644 > index 0000000000..c177a8f538 > --- /dev/null > +++ b/StandaloneMmPkg/Library/MemoryAllocationLib/MemoryAllocationLib. > +++ c > @@ -0,0 +1,907 @@ > +/** @file > + Support routines for memory allocation routines based on Standalone MM= Core internal functions. > + > + Copyright (c) 2015, 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.php > + > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > + BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRE= SS OR IMPLIED. > + > +**/ > + > +#include > + > +#include > +#include #include > + #include #include > + #include "MemoryAllocationServices.h" > + > +EFI_MM_SYSTEM_TABLE *gMmst =3D NULL; > + > +/** > + Allocates one or more 4KB pages of a certain memory type. > + > + Allocates the number of 4KB pages of a certain memory type and > + returns a pointer to the allocated buffer. The buffer returned is ali= gned on a 4KB boundary. If Pages is 0, then NULL is returned. > + If there is not enough memory remaining to satisfy the request, then N= ULL is returned. > + > + @param MemoryType The type of memory to allocate. > + @param Pages The number of 4 KB pages to allocate. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +InternalAllocatePages ( > + IN EFI_MEMORY_TYPE MemoryType, > + IN UINTN Pages > + ) > +{ > + EFI_STATUS Status; > + EFI_PHYSICAL_ADDRESS Memory; > + > + if (Pages =3D=3D 0) { > + return NULL; > + } > + > + Status =3D gMmst->MmAllocatePages (AllocateAnyPages, MemoryType, > +Pages, &Memory); > + if (EFI_ERROR (Status)) { > + return NULL; > + } > + return (VOID *) (UINTN) Memory; > +} > + > +/** > + Allocates one or more 4KB pages of type EfiBootServicesData. > + > + Allocates the number of 4KB pages of type EfiBootServicesData and > + returns a pointer to the allocated buffer. The buffer returned is > + aligned on a 4KB boundary. If Pages is 0, then NULL is returned. > + If there is not enough memory remaining to satisfy the request, then NU= LL is returned. > + > + @param Pages The number of 4 KB pages to allocate. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocatePages ( > + IN UINTN Pages > + ) > +{ > + return InternalAllocatePages (EfiRuntimeServicesData, Pages); } > + > +/** > + Allocates one or more 4KB pages of type EfiRuntimeServicesData. > + > + Allocates the number of 4KB pages of type EfiRuntimeServicesData > + and returns a pointer to the allocated buffer. The buffer returned > + is aligned on a 4KB boundary. If Pages is 0, then NULL is > + returned. If there is not enough memory remaining to satisfy the reque= st, then NULL is returned. > + > + @param Pages The number of 4 KB pages to allocate. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocateRuntimePages ( > + IN UINTN Pages > + ) > +{ > + return InternalAllocatePages (EfiRuntimeServicesData, Pages); } > + > +/** > + Allocates one or more 4KB pages of type EfiReservedMemoryType. > + > + Allocates the number of 4KB pages of type EfiReservedMemoryType and > + returns a pointer to the allocated buffer. The buffer returned is > + aligned on a 4KB boundary. If Pages is 0, then NULL is returned. > + If there is not enough memory remaining to satisfy the request, then NU= LL is returned. > + > + @param Pages The number of 4 KB pages to allocate. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocateReservedPages ( > + IN UINTN Pages > + ) > +{ > + return NULL; > +} > + > +/** > + Frees one or more 4KB pages that were previously allocated with one > +of the page allocation > + functions in the Memory Allocation Library. > + > + Frees the number of 4KB pages specified by Pages from the buffer > + specified by Buffer. Buffer must have been allocated on a previous > + call to the page allocation services of the Memory Allocation > + Library. If it is not possible to free allocated pages, then this func= tion will perform no actions. > + > + If Buffer was not allocated with a page allocation function in the > + Memory Allocation Library, then ASSERT(). > + If Pages is zero, then ASSERT(). > + > + @param Buffer Pointer to the buffer of pages to free. > + @param Pages The number of 4 KB pages to free. > + > +**/ > +VOID > +EFIAPI > +FreePages ( > + IN VOID *Buffer, > + IN UINTN Pages > + ) > +{ > + EFI_STATUS Status; > + > + ASSERT (Pages !=3D 0); > + Status =3D gMmst->MmFreePages ((EFI_PHYSICAL_ADDRESS) (UINTN) Buffer, > +Pages); > + ASSERT_EFI_ERROR (Status); > +} > + > +/** > + Allocates one or more 4KB pages of a certain memory type at a specifie= d alignment. > + > + Allocates the number of 4KB pages specified by Pages of a certain > + memory type with an alignment specified by Alignment. The allocated b= uffer is returned. If Pages is 0, then NULL is returned. > + If there is not enough memory at the specified alignment remaining > + to satisfy the request, then NULL is returned. > + If Alignment is not a power of two and Alignment is not zero, then ASS= ERT(). > + If Pages plus EFI_SIZE_TO_PAGES (Alignment) overflows, then ASSERT(). > + > + @param MemoryType The type of memory to allocate. > + @param Pages The number of 4 KB pages to allocate. > + @param Alignment The requested alignment of the allocatio= n. Must be a power of two. > + If Alignment is zero, then byte alignmen= t is used. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +InternalAllocateAlignedPages ( > + IN EFI_MEMORY_TYPE MemoryType, > + IN UINTN Pages, > + IN UINTN Alignment > + ) > +{ > + EFI_STATUS Status; > + EFI_PHYSICAL_ADDRESS Memory; > + UINTN AlignedMemory; > + UINTN AlignmentMask; > + UINTN UnalignedPages; > + UINTN RealPages; > + > + // > + // Alignment must be a power of two or zero. > + // > + ASSERT ((Alignment & (Alignment - 1)) =3D=3D 0); > + > + if (Pages =3D=3D 0) { > + return NULL; > + } > + if (Alignment > EFI_PAGE_SIZE) { > + // > + // Calculate the total number of pages since alignment is larger tha= n page size. > + // > + AlignmentMask =3D Alignment - 1; > + RealPages =3D Pages + EFI_SIZE_TO_PAGES (Alignment); > + // > + // Make sure that Pages plus EFI_SIZE_TO_PAGES (Alignment) does not = overflow. > + // > + ASSERT (RealPages > Pages); > + > + Status =3D gMmst->MmAllocatePages (AllocateAnyPages, MemoryT= ype, RealPages, &Memory); > + if (EFI_ERROR (Status)) { > + return NULL; > + } > + AlignedMemory =3D ((UINTN) Memory + AlignmentMask) & ~AlignmentMask= ; > + UnalignedPages =3D EFI_SIZE_TO_PAGES (AlignedMemory - (UINTN) Memory= ); > + if (UnalignedPages > 0) { > + // > + // Free first unaligned page(s). > + // > + Status =3D gMmst->MmFreePages (Memory, UnalignedPages); > + ASSERT_EFI_ERROR (Status); > + } > + Memory =3D (EFI_PHYSICAL_ADDRESS) (AlignedMemory + EFI_PAGES= _TO_SIZE (Pages)); > + UnalignedPages =3D RealPages - Pages - UnalignedPages; > + if (UnalignedPages > 0) { > + // > + // Free last unaligned page(s). > + // > + Status =3D gMmst->MmFreePages (Memory, UnalignedPages); > + ASSERT_EFI_ERROR (Status); > + } > + } else { > + // > + // Do not over-allocate pages in this case. > + // > + Status =3D gMmst->MmAllocatePages (AllocateAnyPages, MemoryType, Pag= es, &Memory); > + if (EFI_ERROR (Status)) { > + return NULL; > + } > + AlignedMemory =3D (UINTN) Memory; > + } > + return (VOID *) AlignedMemory; > +} > + > +/** > + Allocates one or more 4KB pages of type EfiBootServicesData at a speci= fied alignment. > + > + Allocates the number of 4KB pages specified by Pages of type > + EfiBootServicesData with an alignment specified by Alignment. The > + allocated buffer is returned. If Pages is 0, then NULL is > + returned. If there is not enough memory at the specified alignment rem= aining to satisfy the request, then NULL is returned. > + > + If Alignment is not a power of two and Alignment is not zero, then ASS= ERT(). > + If Pages plus EFI_SIZE_TO_PAGES (Alignment) overflows, then ASSERT(). > + > + @param Pages The number of 4 KB pages to allocate. > + @param Alignment The requested alignment of the allocatio= n. Must be a power of two. > + If Alignment is zero, then byte alignmen= t is used. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocateAlignedPages ( > + IN UINTN Pages, > + IN UINTN Alignment > + ) > +{ > + return InternalAllocateAlignedPages (EfiRuntimeServicesData, Pages, > +Alignment); } > + > +/** > + Allocates one or more 4KB pages of type EfiRuntimeServicesData at a sp= ecified alignment. > + > + Allocates the number of 4KB pages specified by Pages of type > + EfiRuntimeServicesData with an alignment specified by Alignment. > + The allocated buffer is returned. If Pages is 0, then NULL is > + returned. If there is not enough memory at the specified alignment rem= aining to satisfy the request, then NULL is returned. > + > + If Alignment is not a power of two and Alignment is not zero, then ASS= ERT(). > + If Pages plus EFI_SIZE_TO_PAGES (Alignment) overflows, then ASSERT(). > + > + @param Pages The number of 4 KB pages to allocate. > + @param Alignment The requested alignment of the allocatio= n. Must be a power of two. > + If Alignment is zero, then byte alignmen= t is used. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocateAlignedRuntimePages ( > + IN UINTN Pages, > + IN UINTN Alignment > + ) > +{ > + return InternalAllocateAlignedPages (EfiRuntimeServicesData, Pages, > +Alignment); } > + > +/** > + Allocates one or more 4KB pages of type EfiReservedMemoryType at a spe= cified alignment. > + > + Allocates the number of 4KB pages specified by Pages of type > + EfiReservedMemoryType with an alignment specified by Alignment. > + The allocated buffer is returned. If Pages is 0, then NULL is > + returned. If there is not enough memory at the specified alignment rem= aining to satisfy the request, then NULL is returned. > + > + If Alignment is not a power of two and Alignment is not zero, then ASS= ERT(). > + If Pages plus EFI_SIZE_TO_PAGES (Alignment) overflows, then ASSERT(). > + > + @param Pages The number of 4 KB pages to allocate. > + @param Alignment The requested alignment of the allocatio= n. Must be a power of two. > + If Alignment is zero, then byte alignmen= t is used. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocateAlignedReservedPages ( > + IN UINTN Pages, > + IN UINTN Alignment > + ) > +{ > + return NULL; > +} > + > +/** > + Frees one or more 4KB pages that were previously allocated with one > +of the aligned page > + allocation functions in the Memory Allocation Library. > + > + Frees the number of 4KB pages specified by Pages from the buffer > + specified by Buffer. Buffer must have been allocated on a previous > + call to the aligned page allocation services of the Memory > + Allocation Library. If it is not possible to free allocated pages, the= n this function will perform no actions. > + > + If Buffer was not allocated with an aligned page allocation > + function in the Memory Allocation Library, then ASSERT(). > + If Pages is zero, then ASSERT(). > + > + @param Buffer Pointer to the buffer of pages to free. > + @param Pages The number of 4 KB pages to free. > + > +**/ > +VOID > +EFIAPI > +FreeAlignedPages ( > + IN VOID *Buffer, > + IN UINTN Pages > + ) > +{ > + EFI_STATUS Status; > + > + ASSERT (Pages !=3D 0); > + Status =3D gMmst->MmFreePages ((EFI_PHYSICAL_ADDRESS) (UINTN) Buffer, > +Pages); > + ASSERT_EFI_ERROR (Status); > +} > + > +/** > + Allocates a buffer of a certain pool type. > + > + Allocates the number bytes specified by AllocationSize of a certain > + pool type and returns a pointer to the allocated buffer. If > + AllocationSize is 0, then a valid buffer of 0 size is returned. If th= ere is not enough memory remaining to satisfy the request, then NULL is ret= urned. > + > + @param MemoryType The type of memory to allocate. > + @param AllocationSize The number of bytes to allocate. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +InternalAllocatePool ( > + IN EFI_MEMORY_TYPE MemoryType, > + IN UINTN AllocationSize > + ) > +{ > + EFI_STATUS Status; > + VOID *Memory; > + > + Memory =3D NULL; > + > + Status =3D gMmst->MmAllocatePool (MemoryType, AllocationSize, > +&Memory); > + if (EFI_ERROR (Status)) { > + Memory =3D NULL; > + } > + return Memory; > +} > + > +/** > + Allocates a buffer of type EfiBootServicesData. > + > + Allocates the number bytes specified by AllocationSize of type > + EfiBootServicesData and returns a pointer to the allocated buffer. > + If AllocationSize is 0, then a valid buffer of 0 size is returned. If= there is not enough memory remaining to satisfy the request, then NULL is = returned. > + > + @param AllocationSize The number of bytes to allocate. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocatePool ( > + IN UINTN AllocationSize > + ) > +{ > + return InternalAllocatePool (EfiRuntimeServicesData, > +AllocationSize); } > + > +/** > + Allocates a buffer of type EfiRuntimeServicesData. > + > + Allocates the number bytes specified by AllocationSize of type > + EfiRuntimeServicesData and returns a pointer to the allocated > + buffer. If AllocationSize is 0, then a valid buffer of 0 size is retu= rned. If there is not enough memory remaining to satisfy the request, then= NULL is returned. > + > + @param AllocationSize The number of bytes to allocate. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocateRuntimePool ( > + IN UINTN AllocationSize > + ) > +{ > + return InternalAllocatePool (EfiRuntimeServicesData, > +AllocationSize); } > + > +/** > + Allocates a buffer of type EfiReservedMemoryType. > + > + Allocates the number bytes specified by AllocationSize of type > + EfiReservedMemoryType and returns a pointer to the allocated > + buffer. If AllocationSize is 0, then a valid buffer of 0 size is retu= rned. If there is not enough memory remaining to satisfy the request, then= NULL is returned. > + > + @param AllocationSize The number of bytes to allocate. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocateReservedPool ( > + IN UINTN AllocationSize > + ) > +{ > + return NULL; > +} > + > +/** > + Allocates and zeros a buffer of a certain pool type. > + > + Allocates the number bytes specified by AllocationSize of a certain > + pool type, clears the buffer with zeros, and returns a pointer to > + the allocated buffer. If AllocationSize is 0, then a valid buffer > + of 0 size is returned. If there is not enough memory remaining to sati= sfy the request, then NULL is returned. > + > + @param PoolType The type of memory to allocate. > + @param AllocationSize The number of bytes to allocate and zero= . > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +InternalAllocateZeroPool ( > + IN EFI_MEMORY_TYPE PoolType, > + IN UINTN AllocationSize > + ) > +{ > + VOID *Memory; > + > + Memory =3D InternalAllocatePool (PoolType, AllocationSize); > + if (Memory !=3D NULL) { > + Memory =3D ZeroMem (Memory, AllocationSize); > + } > + return Memory; > +} > + > +/** > + Allocates and zeros a buffer of type EfiBootServicesData. > + > + Allocates the number bytes specified by AllocationSize of type > + EfiBootServicesData, clears the buffer with zeros, and returns a > + pointer to the allocated buffer. If AllocationSize is 0, then a > + valid buffer of 0 size is returned. If there is not enough memory rema= ining to satisfy the request, then NULL is returned. > + > + @param AllocationSize The number of bytes to allocate and zero= . > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocateZeroPool ( > + IN UINTN AllocationSize > + ) > +{ > + return InternalAllocateZeroPool (EfiRuntimeServicesData, > +AllocationSize); } > + > +/** > + Allocates and zeros a buffer of type EfiRuntimeServicesData. > + > + Allocates the number bytes specified by AllocationSize of type > + EfiRuntimeServicesData, clears the buffer with zeros, and returns a > + pointer to the allocated buffer. If AllocationSize is 0, then a > + valid buffer of 0 size is returned. If there is not enough memory rema= ining to satisfy the request, then NULL is returned. > + > + @param AllocationSize The number of bytes to allocate and zero= . > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocateRuntimeZeroPool ( > + IN UINTN AllocationSize > + ) > +{ > + return InternalAllocateZeroPool (EfiRuntimeServicesData, > +AllocationSize); } > + > +/** > + Allocates and zeros a buffer of type EfiReservedMemoryType. > + > + Allocates the number bytes specified by AllocationSize of type > + EfiReservedMemoryType, clears the buffer with zeros, and returns a > + pointer to the allocated buffer. If AllocationSize is 0, then a > + valid buffer of 0 size is returned. If there is not enough memory rema= ining to satisfy the request, then NULL is returned. > + > + @param AllocationSize The number of bytes to allocate and zero= . > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocateReservedZeroPool ( > + IN UINTN AllocationSize > + ) > +{ > + return NULL; > +} > + > +/** > + Copies a buffer to an allocated buffer of a certain pool type. > + > + Allocates the number bytes specified by AllocationSize of a certain > + pool type, copies AllocationSize bytes from Buffer to the newly > + allocated buffer, and returns a pointer to the allocated buffer. > + If AllocationSize is 0, then a valid buffer of 0 size is returned. If = there is not enough memory remaining to satisfy the request, then NULL is = returned. > + If Buffer is NULL, then ASSERT(). > + If AllocationSize is greater than (MAX_ADDRESS - Buffer + 1), then ASS= ERT(). > + > + @param PoolType The type of pool to allocate. > + @param AllocationSize The number of bytes to allocate and zero= . > + @param Buffer The buffer to copy to the allocated buff= er. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +InternalAllocateCopyPool ( > + IN EFI_MEMORY_TYPE PoolType, > + IN UINTN AllocationSize, > + IN CONST VOID *Buffer > + ) > +{ > + VOID *Memory; > + > + ASSERT (Buffer !=3D NULL); > + ASSERT (AllocationSize <=3D (MAX_ADDRESS - (UINTN) Buffer + 1)); > + > + Memory =3D InternalAllocatePool (PoolType, AllocationSize); > + if (Memory !=3D NULL) { > + Memory =3D CopyMem (Memory, Buffer, AllocationSize); > + } > + return Memory; > +} > + > +/** > + Copies a buffer to an allocated buffer of type EfiBootServicesData. > + > + Allocates the number bytes specified by AllocationSize of type > + EfiBootServicesData, copies AllocationSize bytes from Buffer to the > + newly allocated buffer, and returns a pointer to the allocated > + buffer. If AllocationSize is 0, then a valid buffer of 0 size is retur= ned. If there is not enough memory remaining to satisfy the request, then= NULL is returned. > + > + If Buffer is NULL, then ASSERT(). > + If AllocationSize is greater than (MAX_ADDRESS - Buffer + 1), then ASS= ERT(). > + > + @param AllocationSize The number of bytes to allocate and zero= . > + @param Buffer The buffer to copy to the allocated buff= er. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocateCopyPool ( > + IN UINTN AllocationSize, > + IN CONST VOID *Buffer > + ) > +{ > + return InternalAllocateCopyPool (EfiRuntimeServicesData, > +AllocationSize, Buffer); } > + > +/** > + Copies a buffer to an allocated buffer of type EfiRuntimeServicesData. > + > + Allocates the number bytes specified by AllocationSize of type > + EfiRuntimeServicesData, copies AllocationSize bytes from Buffer to > + the newly allocated buffer, and returns a pointer to the allocated > + buffer. If AllocationSize is 0, then a valid buffer of 0 size is retur= ned. If there is not enough memory remaining to satisfy the request, then= NULL is returned. > + > + If Buffer is NULL, then ASSERT(). > + If AllocationSize is greater than (MAX_ADDRESS - Buffer + 1), then ASS= ERT(). > + > + @param AllocationSize The number of bytes to allocate and zero= . > + @param Buffer The buffer to copy to the allocated buff= er. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocateRuntimeCopyPool ( > + IN UINTN AllocationSize, > + IN CONST VOID *Buffer > + ) > +{ > + return InternalAllocateCopyPool (EfiRuntimeServicesData, > +AllocationSize, Buffer); } > + > +/** > + Copies a buffer to an allocated buffer of type EfiReservedMemoryType. > + > + Allocates the number bytes specified by AllocationSize of type > + EfiReservedMemoryType, copies AllocationSize bytes from Buffer to > + the newly allocated buffer, and returns a pointer to the allocated > + buffer. If AllocationSize is 0, then a valid buffer of 0 size is retur= ned. If there is not enough memory remaining to satisfy the request, then= NULL is returned. > + > + If Buffer is NULL, then ASSERT(). > + If AllocationSize is greater than (MAX_ADDRESS - Buffer + 1), then ASS= ERT(). > + > + @param AllocationSize The number of bytes to allocate and zero= . > + @param Buffer The buffer to copy to the allocated buff= er. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocateReservedCopyPool ( > + IN UINTN AllocationSize, > + IN CONST VOID *Buffer > + ) > +{ > + return NULL; > +} > + > +/** > + Reallocates a buffer of a specified memory type. > + > + Allocates and zeros the number bytes specified by NewSize from > + memory of the type specified by PoolType. If OldBuffer is not > + NULL, then the smaller of OldSize and NewSize bytes are copied from > + OldBuffer to the newly allocated buffer, and OldBuffer is freed. A po= inter to the newly allocated buffer is returned. > + If NewSize is 0, then a valid buffer of 0 size is returned. If > + there is not enough memory remaining to satisfy the request, then NULL= is returned. > + > + If the allocation of the new buffer is successful and the smaller > + of NewSize and OldSize is greater than (MAX_ADDRESS - OldBuffer + 1), = then ASSERT(). > + > + @param PoolType The type of pool to allocate. > + @param OldSize The size, in bytes, of OldBuffer. > + @param NewSize The size, in bytes, of the buffer to reallocate= . > + @param OldBuffer The buffer to copy to the allocated buffer. Th= is is an optional > + parameter that may be NULL. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +InternalReallocatePool ( > + IN EFI_MEMORY_TYPE PoolType, > + IN UINTN OldSize, > + IN UINTN NewSize, > + IN VOID *OldBuffer OPTIONAL > + ) > +{ > + VOID *NewBuffer; > + > + NewBuffer =3D InternalAllocateZeroPool (PoolType, NewSize); > + if (NewBuffer !=3D NULL && OldBuffer !=3D NULL) { > + CopyMem (NewBuffer, OldBuffer, MIN (OldSize, NewSize)); > + FreePool (OldBuffer); > + } > + return NewBuffer; > +} > + > +/** > + Reallocates a buffer of type EfiBootServicesData. > + > + Allocates and zeros the number bytes specified by NewSize from > + memory of type EfiBootServicesData. If OldBuffer is not NULL, then > + the smaller of OldSize and NewSize bytes are copied from OldBuffer > + to the newly allocated buffer, and OldBuffer is freed. A pointer to t= he newly allocated buffer is returned. > + If NewSize is 0, then a valid buffer of 0 size is returned. If > + there is not enough memory remaining to satisfy the request, then NULL= is returned. > + > + If the allocation of the new buffer is successful and the smaller > + of NewSize and OldSize is greater than (MAX_ADDRESS - OldBuffer + 1), = then ASSERT(). > + > + @param OldSize The size, in bytes, of OldBuffer. > + @param NewSize The size, in bytes, of the buffer to reallocate= . > + @param OldBuffer The buffer to copy to the allocated buffer. Th= is is an optional > + parameter that may be NULL. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +ReallocatePool ( > + IN UINTN OldSize, > + IN UINTN NewSize, > + IN VOID *OldBuffer OPTIONAL > + ) > +{ > + return InternalReallocatePool (EfiRuntimeServicesData, OldSize, > +NewSize, OldBuffer); } > + > +/** > + Reallocates a buffer of type EfiRuntimeServicesData. > + > + Allocates and zeros the number bytes specified by NewSize from > + memory of type EfiRuntimeServicesData. If OldBuffer is not NULL, > + then the smaller of OldSize and NewSize bytes are copied from > + OldBuffer to the newly allocated buffer, and OldBuffer is freed. A po= inter to the newly allocated buffer is returned. > + If NewSize is 0, then a valid buffer of 0 size is returned. If > + there is not enough memory remaining to satisfy the request, then NULL= is returned. > + > + If the allocation of the new buffer is successful and the smaller > + of NewSize and OldSize is greater than (MAX_ADDRESS - OldBuffer + 1), = then ASSERT(). > + > + @param OldSize The size, in bytes, of OldBuffer. > + @param NewSize The size, in bytes, of the buffer to reallocate= . > + @param OldBuffer The buffer to copy to the allocated buffer. Th= is is an optional > + parameter that may be NULL. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +ReallocateRuntimePool ( > + IN UINTN OldSize, > + IN UINTN NewSize, > + IN VOID *OldBuffer OPTIONAL > + ) > +{ > + return InternalReallocatePool (EfiRuntimeServicesData, OldSize, > +NewSize, OldBuffer); } > + > +/** > + Reallocates a buffer of type EfiReservedMemoryType. > + > + Allocates and zeros the number bytes specified by NewSize from > + memory of type EfiReservedMemoryType. If OldBuffer is not NULL, > + then the smaller of OldSize and NewSize bytes are copied from > + OldBuffer to the newly allocated buffer, and OldBuffer is freed. A po= inter to the newly allocated buffer is returned. > + If NewSize is 0, then a valid buffer of 0 size is returned. If > + there is not enough memory remaining to satisfy the request, then NULL= is returned. > + > + If the allocation of the new buffer is successful and the smaller > + of NewSize and OldSize is greater than (MAX_ADDRESS - OldBuffer + 1), = then ASSERT(). > + > + @param OldSize The size, in bytes, of OldBuffer. > + @param NewSize The size, in bytes, of the buffer to reallocate= . > + @param OldBuffer The buffer to copy to the allocated buffer. Th= is is an optional > + parameter that may be NULL. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +ReallocateReservedPool ( > + IN UINTN OldSize, > + IN UINTN NewSize, > + IN VOID *OldBuffer OPTIONAL > + ) > +{ > + return NULL; > +} > + > +/** > + Frees a buffer that was previously allocated with one of the pool > +allocation functions in the > + Memory Allocation Library. > + > + Frees the buffer specified by Buffer. Buffer must have been > + allocated on a previous call to the pool allocation services of the > + Memory Allocation Library. If it is not possible to free pool resourc= es, then this function will perform no actions. > + > + If Buffer was not allocated with a pool allocation function in the > + Memory Allocation Library, then ASSERT(). > + > + @param Buffer Pointer to the buffer to free. > + > +**/ > +VOID > +EFIAPI > +FreePool ( > + IN VOID *Buffer > + ) > +{ > + EFI_STATUS Status; > + > + Status =3D gMmst->MmFreePool (Buffer); > + ASSERT_EFI_ERROR (Status); > +} > + > +/** > + The constructor function calls MmInitializeMemoryServices to > +initialize > + memory in MMRAM and caches EFI_MM_SYSTEM_TABLE pointer. > + > + @param ImageHandle The firmware allocated handle for the EFI image. > + @param SystemTable A pointer to the Management mode System Table. > + > + @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. > + > +**/ > +EFI_STATUS > +EFIAPI > +MemoryAllocationLibConstructor ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_MM_SYSTEM_TABLE *MmSystemTable > + ) > +{ > + MM_CORE_PRIVATE_DATA *MmCorePrivate; > + EFI_HOB_GUID_TYPE *GuidHob; > + MM_CORE_DATA_HOB_DATA *DataInHob; > + VOID *HobStart; > + EFI_MMRAM_HOB_DESCRIPTOR_BLOCK *MmramRangesHobData; > + EFI_MMRAM_DESCRIPTOR *MmramRanges; > + UINT32 MmramRangeCount; > + EFI_HOB_GUID_TYPE *MmramRangesHob; > + > + HobStart =3D GetHobList (); > + DEBUG ((DEBUG_INFO, "StandaloneMmCoreMemoryAllocationLibConstructor > + - 0x%x\n", HobStart)); > + > + // > + // Extract MM Core Private context from the Hob. If absent search > + for // a Hob containing the MMRAM ranges // GuidHob =3D > + GetNextGuidHob (&gMmCoreDataHobGuid, HobStart); if (GuidHob =3D=3D > + NULL) { > + MmramRangesHob =3D GetNextGuidHob (&gEfiMmPeiMmramMemoryReserveGuid,= HobStart); > + if (MmramRangesHob =3D=3D NULL) { > + return EFI_UNSUPPORTED; > + } > + > + MmramRangesHobData =3D GET_GUID_HOB_DATA (MmramRangesHob); > + if (MmramRangesHobData =3D=3D NULL) { > + return EFI_UNSUPPORTED; > + } > + > + MmramRanges =3D MmramRangesHobData->Descriptor; > + if (MmramRanges =3D=3D NULL) { > + return EFI_UNSUPPORTED; > + } > + > + MmramRangeCount =3D MmramRangesHobData->NumberOfMmReservedRegions; > + if (MmramRanges =3D=3D NULL) { > + return EFI_UNSUPPORTED; > + } > + > + } else { > + DataInHob =3D GET_GUID_HOB_DATA (GuidHob); > + MmCorePrivate =3D (MM_CORE_PRIVATE_DATA *)(UINTN)DataInHob->Address; > + MmramRanges =3D (EFI_MMRAM_DESCRIPTOR *)(UINTN)MmCorePrivate->Mm= ramRanges; > + MmramRangeCount =3D MmCorePrivate->MmramRangeCount; } > + > + { > + UINTN Index; > + > + DEBUG ((DEBUG_INFO, "MmramRangeCount - 0x%x\n", MmramRangeCount)); > + for (Index =3D 0; Index < MmramRangeCount; Index++) { > + DEBUG ((DEBUG_INFO, "MmramRanges[%d]: 0x%016lx - 0x%016lx\n", Inde= x, MmramRanges[Index].CpuStart, MmramRanges[Index].PhysicalSize)); > + } > + } > + > + // > + // Initialize memory service using free MMRAM // DEBUG > + ((DEBUG_INFO, "MmInitializeMemoryServices\n")); > + MmInitializeMemoryServices ((UINTN)MmramRangeCount, (VOID > + *)(UINTN)MmramRanges); > + > + // Initialize MM Services Table > + gMmst =3D MmSystemTable; > + return EFI_SUCCESS; > +} > diff --git > a/StandaloneMmPkg/Library/MemoryAllocationLib/MemoryAllocationLib.inf > b/StandaloneMmPkg/Library/MemoryAllocationLib/MemoryAllocationLib.inf > new file mode 100644 > index 0000000000..068607f90e > --- /dev/null > +++ b/StandaloneMmPkg/Library/MemoryAllocationLib/MemoryAllocationLib. > +++ inf > @@ -0,0 +1,49 @@ > +## @file > +# Memory Allocation Library instance dedicated to MM Core. > +# The implementation borrows the MM Core Memory Allocation services > +as the primitive # for memory allocation instead of using MM System Tabl= e servces in an indirect way. > +# It is assumed that this library instance must be linked with MM Core i= n this package. > +# > +# Copyright (c) 2010 - 2015, 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.php > +# 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 MemoryAllocationLib > + FILE_GUID =3D DCDCBE1D-E760-4E1D-85B4-96E3F0439C4= 1 > + MODULE_TYPE =3D MM_CORE_STANDALONE > + VERSION_STRING =3D 1.0 > + PI_SPECIFICATION_VERSION =3D 0x00010032 > + LIBRARY_CLASS =3D MemoryAllocationLib|MM_CORE_STANDAL= ONE > + CONSTRUCTOR =3D MemoryAllocationLibConstructor > + > +# > +# The following information is for reference only and not required by th= e build tools. > +# > +# VALID_ARCHITECTURES =3D IA32 X64 > +# > + > +[Sources] > + MemoryAllocationLib.c > + MemoryAllocationServices.h > + > +[Packages] > + MdePkg/MdePkg.dec > + StandaloneMmPkg/StandaloneMmPkg.dec > + > +[LibraryClasses] > + BaseMemoryLib > + DebugLib > + HobLib > + > +[Guids] > + gEfiMmPeiMmramMemoryReserveGuid > diff --git > a/StandaloneMmPkg/Library/MemoryAllocationLib/MemoryAllocationServices > .h > b/StandaloneMmPkg/Library/MemoryAllocationLib/MemoryAllocationServices > .h > new file mode 100644 > index 0000000000..eb4f4c3984 > --- /dev/null > +++ b/StandaloneMmPkg/Library/MemoryAllocationLib/MemoryAllocationServ > +++ ices.h > @@ -0,0 +1,38 @@ > +/** @file > + Contains function prototypes for Memory Services in the MM Core. > + > + This header file borrows the StandaloneMmCore Memory Allocation > + services as the primitive for memory allocation. > + > + Copyright (c) 2008 - 2015, 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.php > + > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > + BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRE= SS OR IMPLIED. > + > +**/ > + > +#ifndef _PI_MM_CORE_MEMORY_ALLOCATION_SERVICES_H_ > +#define _PI_MM_CORE_MEMORY_ALLOCATION_SERVICES_H_ > + > +#include > + > +/** > + Called to initialize the memory service. > + > + @param MmramRangeCount Number of MMRAM Regions > + @param MmramRanges Pointer to MMRAM Descriptors > + > +**/ > +VOID > +MmInitializeMemoryServices ( > + IN UINTN MmramRangeCount, > + IN EFI_MMRAM_DESCRIPTOR *MmramRanges > + ); > + > +#endif > -- > 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.