From nobody Tue Jan 7 01:37:44 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1525466519531734.3619161310954; Fri, 4 May 2018 13:41:59 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id BCB23203BEA40; Fri, 4 May 2018 13:41:58 -0700 (PDT) Received: from foss.arm.com (foss.arm.com [217.140.101.70]) by ml01.01.org (Postfix) with ESMTP id B0CBB203BEA33 for ; Fri, 4 May 2018 13:41:57 -0700 (PDT) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 8F9941435; Fri, 4 May 2018 13:41:57 -0700 (PDT) Received: from u201365.usa.Arm.com (bc-c3-3-14.eu.iaas.arm.com [10.6.43.238]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id A1F7F3F487; Fri, 4 May 2018 13:41:55 -0700 (PDT) X-Original-To: edk2-devel@lists.01.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=217.140.101.70; helo=foss.arm.com; envelope-from=supreeth.venkatesh@arm.com; receiver=edk2-devel@lists.01.org From: Supreeth Venkatesh To: edk2-devel@lists.01.org Date: Fri, 4 May 2018 21:41:01 +0100 Message-Id: <20180504204109.3354-10-supreeth.venkatesh@arm.com> X-Mailer: git-send-email 2.16.2 In-Reply-To: <20180504204109.3354-1-supreeth.venkatesh@arm.com> References: <20180504204109.3354-1-supreeth.venkatesh@arm.com> Subject: [edk2] [PATCH v2 09/17] 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: , Cc: ard.biesheuvel@linaro.org, leif.lindholm@linaro.org, jiewen.yao@intel.com, liming.gao@intel.com, michael.d.kinney@intel.com MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" This patch implements management mode memory allocation services. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Supreeth Venkatesh Reviewed-by: Achin Gupta Reviewed-by: Jiewen Yao --- StandaloneMmPkg/Include/Guid/MmCoreData.h | 133 +++ StandaloneMmPkg/Include/Guid/MmramMemoryReserve.h | 62 ++ .../StandaloneMmCoreMemoryAllocationLib.c | 907 +++++++++++++++++= ++++ .../StandaloneMmCoreMemoryAllocationLib.inf | 49 ++ .../StandaloneMmCoreMemoryAllocationServices.h | 38 + 5 files changed, 1189 insertions(+) create mode 100644 StandaloneMmPkg/Include/Guid/MmCoreData.h create mode 100644 StandaloneMmPkg/Include/Guid/MmramMemoryReserve.h create mode 100644 StandaloneMmPkg/Library/StandaloneMmCoreMemoryAllocatio= nLib/StandaloneMmCoreMemoryAllocationLib.c create mode 100644 StandaloneMmPkg/Library/StandaloneMmCoreMemoryAllocatio= nLib/StandaloneMmCoreMemoryAllocationLib.inf create mode 100644 StandaloneMmPkg/Library/StandaloneMmCoreMemoryAllocatio= nLib/StandaloneMmCoreMemoryAllocationServices.h diff --git a/StandaloneMmPkg/Include/Guid/MmCoreData.h b/StandaloneMmPkg/In= clude/Guid/MmCoreData.h new file mode 100644 index 0000000000..a1168f95f7 --- /dev/null +++ b/StandaloneMmPkg/Include/Guid/MmCoreData.h @@ -0,0 +1,133 @@ +/** @file + MM Core data. + +Copyright (c) 2015, Intel Corporation. All rights reserved.
+Copyright (c) 2018, ARM Limited. All rights reserved.
+This program and the accompanying materials are licensed and made availabl= e under +the terms and conditions of the BSD License that accompanies this distribu= tion. +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 IMPLI= ED. + +**/ + +#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 gEfiEventDxeDisp= atchGuid 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 M= M Core +/// if notified, so the MM Core can dispatch MM drivers. If COMM_BUFFER_M= M_DISPATCH_ERROR +/// is returned in the communication buffer, then an error occurred dispat= ching 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_RESTA= RT is +/// returned, then the MM Core just dispatched the MM Driver that register= ed +/// 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 EfiRunti= meServicesData. +/// Since runtime memory types are converted to available memory when a le= gacy 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 notif= ication +/// 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 access= es to +/// thos structure. +/// +typedef struct { + UINT64 Signature; + + /// + /// The number of MMRAM ranges passed from the MM IPL to the MM Core. T= he MM + /// Core uses these ranges of MMRAM to initialize the MM Core memory man= ager. + /// + 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 man= ager. + /// + 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 t= his entry + /// point with the MM Configuration Protocol. The MM Configuration Prot= ocol 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 Protoc= ol is + /// available. + /// + EFI_PHYSICAL_ADDRESS MmEntryPoint; + + /// + /// Boolean flag set to TRUE while an MMI is being processed by the MM C= ore. + /// + BOOLEAN MmEntryPointRegistered; + + /// + /// Boolean flag set to TRUE while an MMI is being processed by the MM C= ore. + /// + BOOLEAN InMm; + + /// + /// This field is set by the MM Core then the MM Core is initialized. T= his field is + /// used by the MM Base 2 Protocol and MM Communication Protocol impleme= ntations in + /// the MM IPL. + /// + EFI_PHYSICAL_ADDRESS Mmst; + + /// + /// This field is used by the MM Communicatioon Protocol to pass a buffe= r into + /// a software MMI handler and for the software MMI handler to pass a bu= ffer 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 siz= e of a buffer, + /// in bytes, into a software MMI handler and for the software MMI handl= er to pass the + /// size, in bytes, of a buffer back to the caller of the MM Communicati= on Protocol. + /// + UINT64 BufferSize; + + /// + /// This field is used by the MM Communication Protocol to pass the retu= rn status from + /// a software MMI handler back to the caller of the MM Communication Pr= otocol. + /// + 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/Standalone= MmPkg/Include/Guid/MmramMemoryReserve.h new file mode 100644 index 0000000000..15818b5a8a --- /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 reg= ions + * 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 reserva= tion and H-SEG usage + +Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.
+Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.
+ +This program and the accompanying materials are licensed and made availabl= e under +the terms and conditions of the BSD License that accompanies this distribu= tion. +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 IMPLI= ED. + + @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_DESCRIP= TOR_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 us= ed 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/StandaloneMmCoreMemoryAllocationLib/St= andaloneMmCoreMemoryAllocationLib.c b/StandaloneMmPkg/Library/StandaloneMmC= oreMemoryAllocationLib/StandaloneMmCoreMemoryAllocationLib.c new file mode 100644 index 0000000000..a2152beefd --- /dev/null +++ b/StandaloneMmPkg/Library/StandaloneMmCoreMemoryAllocationLib/Standalon= eMmCoreMemoryAllocationLib.c @@ -0,0 +1,907 @@ +/** @file + Support routines for memory allocation routines based on Standalone MM C= ore internal functions. + + Copyright (c) 2015, Intel Corporation. All rights reserved.
+ Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.
+ + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BS= D License + which accompanies this distribution. The full text of the license may b= e found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMP= LIED. + +**/ + +#include + +#include +#include +#include +#include +#include +#include "StandaloneMmCoreMemoryAllocationServices.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 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 NUL= L 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 return= s 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 req= uest, 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 +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 ret= urns 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 req= uest, 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 retu= rns 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 req= uest, 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 +AllocateReservedPages ( + IN UINTN Pages + ) +{ + return NULL; +} + +/** + Frees one or more 4KB pages that were previously allocated with one of t= he page allocation + functions in the Memory Allocation Library. + + Frees the number of 4KB pages specified by Pages from the buffer specifi= ed by Buffer. Buffer + must have been allocated on a previous call to the page allocation servi= ces 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 Memor= y 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, Pa= ges); + ASSERT_EFI_ERROR (Status); +} + +/** + Allocates one or more 4KB pages of a certain memory type at a specified = alignment. + + Allocates the number of 4KB pages specified by Pages of a certain memory= 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 to sa= tisfy the request, then + NULL is returned. + If Alignment is not a power of two and Alignment is not zero, then ASSER= T(). + 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 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 than = 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 ov= erflow. + // + ASSERT (RealPages > Pages); + + Status =3D gMmst->MmAllocatePages (AllocateAnyPages, MemoryTyp= e, 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_T= O_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 specifi= ed alignment. + + Allocates the number of 4KB pages specified by Pages of type EfiBootServ= icesData 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 rema= ining to satisfy the + request, then NULL is returned. + + If Alignment is not a power of two and Alignment is not zero, then ASSER= T(). + 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 fails. + +**/ +VOID * +EFIAPI +AllocateAlignedPages ( + IN UINTN Pages, + IN UINTN Alignment + ) +{ + return InternalAllocateAlignedPages (EfiRuntimeServicesData, Pages, Alig= nment); +} + +/** + Allocates one or more 4KB pages of type EfiRuntimeServicesData at a spec= ified alignment. + + Allocates the number of 4KB pages specified by Pages of type EfiRuntimeS= ervicesData 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 rema= ining to satisfy the + request, then NULL is returned. + + If Alignment is not a power of two and Alignment is not zero, then ASSER= T(). + 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 fails. + +**/ +VOID * +EFIAPI +AllocateAlignedRuntimePages ( + IN UINTN Pages, + IN UINTN Alignment + ) +{ + return InternalAllocateAlignedPages (EfiRuntimeServicesData, Pages, Alig= nment); +} + +/** + Allocates one or more 4KB pages of type EfiReservedMemoryType at a speci= fied alignment. + + Allocates the number of 4KB pages specified by Pages of type EfiReserved= MemoryType 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 rema= ining to satisfy the + request, then NULL is returned. + + If Alignment is not a power of two and Alignment is not zero, then ASSER= T(). + 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 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 t= he aligned page + allocation functions in the Memory Allocation Library. + + Frees the number of 4KB pages specified by Pages from the buffer specifi= ed by Buffer. Buffer + must have been allocated on a previous call to the aligned page allocati= on 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, Pa= ges); + 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 b= uffer of 0 size is + returned. If there is not enough memory remaining to satisfy the reques= t, 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 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 EfiBootSe= rvicesData and returns a + pointer to the allocated buffer. If AllocationSize is 0, then a valid b= uffer of 0 size is + returned. If there is not enough memory remaining to satisfy the reques= t, 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 EfiRuntim= eServicesData 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 reques= t, 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 EfiReserv= edMemoryType 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 reques= t, 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 Allocatio= nSize is 0, then a valid + buffer of 0 size is returned. If there is not enough memory remaining t= o 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 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 EfiBootSe= rvicesData, clears the + buffer with zeros, and returns a pointer to the allocated buffer. If Al= locationSize is 0, then a + valid buffer of 0 size is returned. If there is not enough memory remai= ning 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 EfiRuntim= eServicesData, clears the + buffer with zeros, and returns a pointer to the allocated buffer. If Al= locationSize is 0, then a + valid buffer of 0 size is returned. If there is not enough memory remai= ning 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 EfiReserv= edMemoryType, clears the + buffer with zeros, and returns a pointer to the allocated buffer. If Al= locationSize is 0, then a + valid buffer of 0 size is returned. If there is not enough memory remai= ning 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 retu= rns 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 retu= rned. + If Buffer is NULL, then ASSERT(). + If AllocationSize is greater than (MAX_ADDRESS - Buffer + 1), then ASSER= T(). + + @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 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 EfiBootSe= rvicesData, copies + AllocationSize bytes from Buffer to the newly allocated buffer, and retu= rns 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 retu= rned. + + If Buffer is NULL, then ASSERT(). + If AllocationSize is greater than (MAX_ADDRESS - Buffer + 1), then ASSER= T(). + + @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 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 EfiRuntim= eServicesData, copies + AllocationSize bytes from Buffer to the newly allocated buffer, and retu= rns 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 retu= rned. + + If Buffer is NULL, then ASSERT(). + If AllocationSize is greater than (MAX_ADDRESS - Buffer + 1), then ASSER= T(). + + @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 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 EfiReserv= edMemoryType, copies + AllocationSize bytes from Buffer to the newly allocated buffer, and retu= rns 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 retu= rned. + + If Buffer is NULL, then ASSERT(). + If AllocationSize is greater than (MAX_ADDRESS - Buffer + 1), then ASSER= T(). + + @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 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 Ol= dSize and + NewSize bytes are copied from OldBuffer to the newly allocated buffer, a= nd + OldBuffer is freed. A pointer to the newly allocated buffer is returned. + If NewSize is 0, then a valid buffer of 0 size is returned. If there i= s 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 New= Size 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. This= 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 OldS= ize and + NewSize bytes are copied from OldBuffer to the newly allocated buffer, a= nd + OldBuffer is freed. A pointer to the newly allocated buffer is returned. + If NewSize is 0, then a valid buffer of 0 size is returned. If there i= s 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 New= Size 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. This= 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 O= ldSize and + NewSize bytes are copied from OldBuffer to the newly allocated buffer, a= nd + OldBuffer is freed. A pointer to the newly allocated buffer is returned. + If NewSize is 0, then a valid buffer of 0 size is returned. If there i= s 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 New= Size 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. This= 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 Ol= dSize and + NewSize bytes are copied from OldBuffer to the newly allocated buffer, a= nd + OldBuffer is freed. A pointer to the newly allocated buffer is returned. + If NewSize is 0, then a valid buffer of 0 size is returned. If there i= s 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 New= Size 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. This= 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 alloca= tion functions in the + Memory Allocation Library. + + Frees the buffer specified by Buffer. Buffer must have been allocated o= n 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 Memor= y 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, H= obStart); + 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->Mmra= mRanges; + 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)Mmram= Ranges); + + // Initialize MM Services Table + gMmst =3D MmSystemTable; + return EFI_SUCCESS; +} diff --git a/StandaloneMmPkg/Library/StandaloneMmCoreMemoryAllocationLib/St= andaloneMmCoreMemoryAllocationLib.inf b/StandaloneMmPkg/Library/StandaloneM= mCoreMemoryAllocationLib/StandaloneMmCoreMemoryAllocationLib.inf new file mode 100644 index 0000000000..3958655cb4 --- /dev/null +++ b/StandaloneMmPkg/Library/StandaloneMmCoreMemoryAllocationLib/Standalon= eMmCoreMemoryAllocationLib.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 ind= irect 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 - 2018, ARM Limited. All rights reserved.
+# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the B= SD License +# which accompanies this distribution. The full text of the license may b= e found at +# http://opensource.org/licenses/bsd-license.php +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IM= PLIED. +# +## + +[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] + StandaloneMmCoreMemoryAllocationLib.c + StandaloneMmCoreMemoryAllocationServices.h + +[Packages] + MdePkg/MdePkg.dec + StandaloneMmPkg/StandaloneMmPkg.dec + +[LibraryClasses] + BaseMemoryLib + DebugLib + HobLib + +[Guids] + gEfiMmPeiMmramMemoryReserveGuid diff --git a/StandaloneMmPkg/Library/StandaloneMmCoreMemoryAllocationLib/St= andaloneMmCoreMemoryAllocationServices.h b/StandaloneMmPkg/Library/Standalo= neMmCoreMemoryAllocationLib/StandaloneMmCoreMemoryAllocationServices.h new file mode 100644 index 0000000000..07abaac2a8 --- /dev/null +++ b/StandaloneMmPkg/Library/StandaloneMmCoreMemoryAllocationLib/Standalon= eMmCoreMemoryAllocationServices.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 - 2018, ARM Limited. All rights reserved.
+ + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BS= D License + which accompanies this distribution. The full text of the license may b= e found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMP= LIED. + +**/ + +#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 --=20 2.16.2 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel