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.82; 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-ve1eur01on0082.outbound.protection.outlook.com [104.47.1.82]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 01D0D203BEA3F for ; Fri, 4 May 2018 16:23:08 -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=/K8Ecpuv9klv0H6jByjk9oIjsPEEEbYOFYvlvB9Msjg=; b=Np5hcONURZCL/emKpJXwD0ZBGWHHYE6xjSDGP6t50zX0jBs48MGxXBs603z17qfDrB0UkjX1Ki2mjXMqji6hPStkIWvh01Ac3hIA4FN+WmpV7ZV79j3rmfP+eIaTHBTK1bFeCN8TWcgdGEqxmQn4POmBPyKltJbQxSC6RrHvV14= 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:23:05 +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:23:05 +0000 From: Supreeth Venkatesh To: "Yao, Jiewen" , Achin Gupta CC: "edk2-devel@lists.01.org" Thread-Topic: [edk2] [PATCH v1 09/18] StandaloneMmPkg/MemoryAllocationLib: Add MM memory allocation library. Thread-Index: AQHTzbWfosDbLAtNfE+jrCJc9+/y8KQRqXWAgAF5vICACcARwA== Date: Fri, 4 May 2018 23:23:05 +0000 Message-ID: References: <20180406144223.10931-1-supreeth.venkatesh@arm.com> <20180406144223.10931-10-supreeth.venkatesh@arm.com> <20180425143354.GO663@e104320-lin> <74D8A39837DF1E4DA445A8C0B3885C503AB81B6B@shsmsx102.ccr.corp.intel.com> In-Reply-To: <74D8A39837DF1E4DA445A8C0B3885C503AB81B6B@shsmsx102.ccr.corp.intel.com> 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:B9czhIs+tpfC/Ug8K8vKExeMFimDxYfasD2RruhVHCP2BT62omg1guFiEgvqWTb9D1O8YRWAdsgHM1c4eb1lmSLSsEyfcMAg3MkgWPFdDIC8j0igj1kjcqYf6zhEC1SdSnK/xm7YVr7+5SzYW1vP9O6Tq6zGBGDYU1oOCWkoVECCrt87yg8MGYM5XVnZ8FI1IioaAfqLRGT4W6tV7t452wUAiA40nRZ7RuZIgC57aLa5GnJwXNYc9r2euV8sMOct 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)(4534165)(4627221)(201703031133081)(201702281549075)(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)(15188155005)(16799955002)(446003)(486006)(53946003)(2906002)(14454004)(5660300001)(110136005)(53546011)(16200700003)(476003)(316002)(99286004)(81156014)(74316002)(9686003)(6306002)(93886005)(2900100001)(3846002)(8936002)(6116002)(4326008)(53376002)(6636002)(53936002)(81166006)(7736002)(55016002)(8676002)(575784001)(72206003)(86362001)(966005)(25786009)(229853002)(97736004)(5250100002)(186003)(5890100001)(6246003)(68736007)(569006); 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: vTQOvAJBlpZKxvfqF9zeFg7nwkIjnNUJ3L/vzc5mTtEvejI46Q9vy3Gre+50yXq5HlWMGmg2uuS//Shx9SxJnWsNqQ3WcLiTFUZRIVKC+YK1PD2OLAgBslbJJXFpByycDfKW2jocetpaVGeXnc+3polJu8DurgIAMDPDKdLCVqWkC6X1X/I5ej+5YPc1eL9b spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: 276612df-8783-48d3-8c2f-08d5b215fd62 X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-Network-Message-Id: 276612df-8783-48d3-8c2f-08d5b215fd62 X-MS-Exchange-CrossTenant-originalarrivaltime: 04 May 2018 23:23:05.6694 (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 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:23:09 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Jiewen, It checks for HOB by GUID gMmCoreDataHobGuid first, if it's not present, then it checks for HOB by GUID gEfiMmPeiMmramMemoryRes= erveGuid. (which is the case for Arm and intel won't be affected by this) So it is as generic as possible and hence I think there is no need for ARM = specific and intel specific funtions. Please review it and let me know if you see issues. Thanks, Supreeth -----Original Message----- From: Yao, Jiewen Sent: Thursday, April 26, 2018 8:06 AM To: Achin Gupta ; Supreeth Venkatesh Cc: ard.biesheuvel@linaro.org; edk2-devel@lists.01.org; leif.lindholm@linar= o.org; Gao, Liming ; Kinney, Michael D ; nd Subject: RE: [edk2] [PATCH v1 09/18] StandaloneMmPkg/MemoryAllocationLib: A= dd MM memory allocation library. Same comment as previous 2. Maybe to separate ARM specific function from generic function. Thank you > -----Original Message----- > From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Ac= hin > Gupta > Sent: Wednesday, April 25, 2018 7:34 AM > To: Supreeth Venkatesh > Cc: ard.biesheuvel@linaro.org; edk2-devel@lists.01.org; > leif.lindholm@linaro.org; Yao, Jiewen ; Gao, Liming > ; Kinney, Michael D ; > nd@arm.com > Subject: Re: [edk2] [PATCH v1 09/18] StandaloneMmPkg/MemoryAllocationLib: > Add MM memory 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 > have > been conveyed to the MMST memory allocation services (through > MemoryAllocationLibConstructor()), all functions in MemoryAllocationLib.c= use > the MMST 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 thi= s > reviewed by Jiewen. > > The copyright years in the files need to be updated. > > 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 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. > > + > > +**/ > > + > > +#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, t= he 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 dispatched 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 struc= ture 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 boo= t is > being > > +/// performed. The MM Core can then use this information to filter ac= cesses > 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 memory > 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 registeri= ng 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 Configuration > 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 b= uffer > into > > + /// a software MMI handler and for the software MMI handler to pass = a > buffer back to > > + /// the caller of the MM Communication 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 buffer back to the caller of the MM Communi= cation > 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 the MM Communicatio= n > 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 region= s. > > + 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 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. > > + > > + @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, 0= xc5, > 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_DESCRIPTOR_BLOCK. > > +* This inconsistency is kept in code in order for backward compatibili= ty. > > +**/ > > +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 typ= e as > UINTN. > > + /// However, HOBs are supposed to be CPU neutral, so UINT32 should b= e > 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 th= e 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. > > + > > +**/ > > + > > +#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 retur= ns 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= NULL > 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 fail= s. > > + > > +**/ > > +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 re= turns > 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 NULL is > > + returned. > > + > > + @param Pages The number of 4 KB pages to allocate. > > + > > + @return A pointer to the allocated buffer or NULL if allocation fail= s. > > + > > +**/ > > +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 > request, 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 fail= s. > > + > > +**/ > > +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 NULL is > > + returned. > > + > > + @param Pages The number of 4 KB pages to allocate. > > + > > + @return A pointer to the allocated buffer or NULL if allocation fail= s. > > + > > +**/ > > +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 spe= cified > by Buffer. Buffer > > + must have been allocated on a previous call to the page allocation s= ervices > of the Memory > > + Allocation Library. If it is not possible to free allocated pages, = then this > function will > > + perform no actions. > > + > > + If Buffer was not allocated with a page allocation function in the M= emory > 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 specif= ied > alignment. > > + > > + Allocates the number of 4KB pages specified by Pages of a certain me= mory > type 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 remaining t= o > satisfy the request, then > > + NULL is returned. > > + If Alignment is not a power of two and Alignment is not zero, then > ASSERT(). > > + 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 > allocation. Must be a power of two. > > + If Alignment is zero, then byte > alignment is used. > > + > > + @return A pointer to the allocated buffer or NULL if allocation fail= s. > > + > > +**/ > > +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 t= han 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 no= t > overflow. > > + // > > + ASSERT (RealPages > Pages); > > + > > + Status =3D gMmst->MmAllocatePages (AllocateAnyPages, > MemoryType, 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, > Pages, &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 spe= cified > 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 > remaining to satisfy the > > + request, then NULL is returned. > > + > > + If Alignment is not a power of two and Alignment is not zero, then > ASSERT(). > > + 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 > allocation. Must be a power of two. > > + If Alignment is zero, then byte > alignment is used. > > + > > + @return A pointer to the allocated buffer or NULL if allocation fail= s. > > + > > +**/ > > +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 > specified 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 > remaining to satisfy the > > + request, then NULL is returned. > > + > > + If Alignment is not a power of two and Alignment is not zero, then > ASSERT(). > > + 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 > allocation. Must be a power of two. > > + If Alignment is zero, then byte > alignment is used. > > + > > + @return A pointer to the allocated buffer or NULL if allocation fail= s. > > + > > +**/ > > +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 > specified 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 > remaining to satisfy the > > + request, then NULL is returned. > > + > > + If Alignment is not a power of two and Alignment is not zero, then > ASSERT(). > > + 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 > allocation. Must be a power of two. > > + If Alignment is zero, then byte > alignment is used. > > + > > + @return A pointer to the allocated buffer or NULL if allocation fail= s. > > + > > +**/ > > +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 spe= cified > by Buffer. Buffer > > + must have been allocated on a previous call to the aligned page allo= cation > services of the Memory > > + Allocation Library. If it is not possible to free allocated pages, = then 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 val= id buffer of > 0 size is > > + returned. If there is not enough memory remaining to satisfy the re= quest, > then NULL is returned. > > + > > + @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 fail= s. > > + > > +**/ > > +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 val= id buffer of > 0 size is > > + returned. If there is not enough memory remaining to satisfy the re= quest, > then NULL is returned. > > + > > + @param AllocationSize The number of bytes to allocate. > > + > > + @return A pointer to the allocated buffer or NULL if allocation fail= s. > > + > > +**/ > > +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 v= alid buffer > of 0 size is > > + returned. If there is not enough memory remaining to satisfy the re= quest, > then NULL is returned. > > + > > + @param AllocationSize The number of bytes to allocate. > > + > > + @return A pointer to the allocated buffer or NULL if allocation fail= s. > > + > > +**/ > > +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 v= alid buffer > of 0 size is > > + returned. If there is not enough memory remaining to satisfy the re= quest, > then NULL is returned. > > + > > + @param AllocationSize The number of bytes to allocate. > > + > > + @return A pointer to the allocated buffer or NULL if allocation fail= s. > > + > > +**/ > > +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 Alloc= ationSize > is 0, then a valid > > + buffer of 0 size is returned. If there is not enough memory remaini= ng to > satisfy 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 fail= s. > > + > > +**/ > > +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. I= f > 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 and > zero. > > + > > + @return A pointer to the allocated buffer or NULL if allocation fail= s. > > + > > +**/ > > +VOID * > > +EFIAPI > > +AllocateZeroPool ( > > + IN UINTN AllocationSize > > + ) > > +{ > > + return InternalAllocateZeroPool (EfiRuntimeServicesData, AllocationS= ize); > > +} > > + > > +/** > > + 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. I= f > 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 and > zero. > > + > > + @return A pointer to the allocated buffer or NULL if allocation fail= s. > > + > > +**/ > > +VOID * > > +EFIAPI > > +AllocateRuntimeZeroPool ( > > + IN UINTN AllocationSize > > + ) > > +{ > > + return InternalAllocateZeroPool (EfiRuntimeServicesData, AllocationS= ize); > > +} > > + > > +/** > > + 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. I= f > 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 and > zero. > > + > > + @return A pointer to the allocated buffer or NULL if allocation fail= s. > > + > > +**/ > > +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 > ASSERT(). > > + > > + @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 > buffer. > > + > > + @return A pointer to the allocated buffer or NULL if allocation fail= s. > > + > > +**/ > > +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 > 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 > ASSERT(). > > + > > + @param AllocationSize The number of bytes to allocate and > zero. > > + @param Buffer The buffer to copy to the allocated > buffer. > > + > > + @return A pointer to the allocated buffer or NULL if allocation fail= s. > > + > > +**/ > > +VOID * > > +EFIAPI > > +AllocateCopyPool ( > > + IN UINTN AllocationSize, > > + IN CONST VOID *Buffer > > + ) > > +{ > > + return InternalAllocateCopyPool (EfiRuntimeServicesData, AllocationS= ize, > Buffer); > > +} > > + > > +/** > > + Copies a buffer to an allocated buffer of type EfiRuntimeServicesDat= a. > > + > > + 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 > 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 > ASSERT(). > > + > > + @param AllocationSize The number of bytes to allocate and > zero. > > + @param Buffer The buffer to copy to the allocated > buffer. > > + > > + @return A pointer to the allocated buffer or NULL if allocation fail= s. > > + > > +**/ > > +VOID * > > +EFIAPI > > +AllocateRuntimeCopyPool ( > > + IN UINTN AllocationSize, > > + IN CONST VOID *Buffer > > + ) > > +{ > > + return InternalAllocateCopyPool (EfiRuntimeServicesData, AllocationS= ize, > 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 > 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 > ASSERT(). > > + > > + @param AllocationSize The number of bytes to allocate and > zero. > > + @param Buffer The buffer to copy to the allocated > buffer. > > + > > + @return A pointer to the allocated buffer or NULL if allocation fail= s. > > + > > +**/ > > +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 memor= y > of the type > > + specified by PoolType. If OldBuffer is not NULL, then the smaller o= f > OldSize and > > + NewSize bytes are copied from OldBuffer to the newly allocated buffe= r, and > > + OldBuffer is freed. A pointer to the newly allocated buffer is retu= rned. > > + If NewSize is 0, then a valid buffer of 0 size is returned. If the= re is not > > + enough memory remaining to satisfy the request, then NULL is returne= d. > > + > > + 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 realloca= te. > > + @param OldBuffer The buffer to copy to the allocated buffer. > This is an optional > > + parameter that may be NULL. > > + > > + @return A pointer to the allocated buffer or NULL if allocation fail= s. > > + > > +**/ > > +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 memor= y > of type > > + EfiBootServicesData. If OldBuffer is not NULL, then the smaller of = OldSize > and > > + NewSize bytes are copied from OldBuffer to the newly allocated buffe= r, and > > + OldBuffer is freed. A pointer to the newly allocated buffer is retu= rned. > > + If NewSize is 0, then a valid buffer of 0 size is returned. If the= re is not > > + enough memory remaining to satisfy the request, then NULL is returne= d. > > + > > + 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 realloca= te. > > + @param OldBuffer The buffer to copy to the allocated buffer. > This is an optional > > + parameter that may be NULL. > > + > > + @return A pointer to the allocated buffer or NULL if allocation fail= s. > > + > > +**/ > > +VOID * > > +EFIAPI > > +ReallocatePool ( > > + IN UINTN OldSize, > > + IN UINTN NewSize, > > + IN VOID *OldBuffer OPTIONAL > > + ) > > +{ > > + return InternalReallocatePool (EfiRuntimeServicesData, OldSize, NewS= ize, > OldBuffer); > > +} > > + > > +/** > > + Reallocates a buffer of type EfiRuntimeServicesData. > > + > > + Allocates and zeros the number bytes specified by NewSize from memor= y > of type > > + EfiRuntimeServicesData. If OldBuffer is not NULL, then the smaller = of > OldSize and > > + NewSize bytes are copied from OldBuffer to the newly allocated buffe= r, and > > + OldBuffer is freed. A pointer to the newly allocated buffer is retu= rned. > > + If NewSize is 0, then a valid buffer of 0 size is returned. If the= re is not > > + enough memory remaining to satisfy the request, then NULL is returne= d. > > + > > + 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 realloca= te. > > + @param OldBuffer The buffer to copy to the allocated buffer. > This is an optional > > + parameter that may be NULL. > > + > > + @return A pointer to the allocated buffer or NULL if allocation fail= s. > > + > > +**/ > > +VOID * > > +EFIAPI > > +ReallocateRuntimePool ( > > + IN UINTN OldSize, > > + IN UINTN NewSize, > > + IN VOID *OldBuffer OPTIONAL > > + ) > > +{ > > + return InternalReallocatePool (EfiRuntimeServicesData, OldSize, NewS= ize, > OldBuffer); > > +} > > + > > +/** > > + Reallocates a buffer of type EfiReservedMemoryType. > > + > > + Allocates and zeros the number bytes specified by NewSize from memor= y > of type > > + EfiReservedMemoryType. If OldBuffer is not NULL, then the smaller o= f > OldSize and > > + NewSize bytes are copied from OldBuffer to the newly allocated buffe= r, and > > + OldBuffer is freed. A pointer to the newly allocated buffer is retu= rned. > > + If NewSize is 0, then a valid buffer of 0 size is returned. If the= re is not > > + enough memory remaining to satisfy the request, then NULL is returne= d. > > + > > + 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 realloca= te. > > + @param OldBuffer The buffer to copy to the allocated buffer. > This is an optional > > + parameter that may be NULL. > > + > > + @return A pointer to the allocated buffer or NULL if allocation fail= s. > > + > > +**/ > > +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 al= location > functions in the > > + Memory Allocation Library. > > + > > + Frees the buffer specified by Buffer. Buffer must have been allocat= ed on a > previous call to the > > + pool allocation services of the Memory Allocation Library. If it is= not > possible to free pool > > + resources, then this function will perform no actions. > > + > > + If Buffer was not allocated with a pool allocation function in the M= emory > 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 initial= ize > > + 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 fo= r > > + // 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->MmramRanges; > > + 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", Index, 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 Table servces in an > indirect way. > > +# It is assumed that this library instance must be linked with MM Core= in 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 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 MemoryAllocationLib > > + FILE_GUID =3D > DCDCBE1D-E760-4E1D-85B4-96E3F0439C41 > > + MODULE_TYPE =3D MM_CORE_STANDALONE > > + VERSION_STRING =3D 1.0 > > + PI_SPECIFICATION_VERSION =3D 0x00010032 > > + LIBRARY_CLASS =3D > MemoryAllocationLib|MM_CORE_STANDALONE > > + CONSTRUCTOR =3D MemoryAllocationLibConstructor > > + > > +# > > +# The following information is for reference only and not required by = the > 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/MemoryAllocationServices. > 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 th= e 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. > > + > > +**/ > > + > > +#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 > > > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel 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.