/** @file Contains function prototypes for Memory Services in the SMM Core. This header file borrows the PiSmmCore Memory Allocation services as the primitive for memory allocation. Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef _PI_SMM_CORE_MEMORY_ALLOCATION_SERVICES_H_ #define _PI_SMM_CORE_MEMORY_ALLOCATION_SERVICES_H_ // // It should be aligned with the definition in PiSmmCore. // typedef struct { UINTN Signature; /// /// The ImageHandle passed into the entry point of the SMM IPL. This ImageHandle /// is used by the SMM Core to fill in the ParentImageHandle field of the Loaded /// Image Protocol for each SMM Driver that is dispatched by the SMM Core. /// EFI_HANDLE SmmIplImageHandle; /// /// The number of SMRAM ranges passed from the SMM IPL to the SMM Core. The SMM /// Core uses these ranges of SMRAM to initialize the SMM Core memory manager. /// UINTN SmramRangeCount; /// /// A table of SMRAM ranges passed from the SMM IPL to the SMM Core. The SMM /// Core uses these ranges of SMRAM to initialize the SMM Core memory manager. /// EFI_SMRAM_DESCRIPTOR *SmramRanges; /// /// The SMM Foundation Entry Point. The SMM Core fills in this field when the /// SMM Core is initialized. The SMM IPL is responsbile for registering this entry /// point with the SMM Configuration Protocol. The SMM Configuration Protocol may /// not be available at the time the SMM IPL and SMM Core are started, so the SMM IPL /// sets up a protocol notification on the SMM Configuration Protocol and registers /// the SMM Foundation Entry Point as soon as the SMM Configuration Protocol is /// available. /// EFI_SMM_ENTRY_POINT SmmEntryPoint; /// /// Boolean flag set to TRUE while an SMI is being processed by the SMM Core. /// BOOLEAN SmmEntryPointRegistered; /// /// Boolean flag set to TRUE while an SMI is being processed by the SMM Core. /// BOOLEAN InSmm; /// /// This field is set by the SMM Core then the SMM Core is initialized. This field is /// used by the SMM Base 2 Protocol and SMM Communication Protocol implementations in /// the SMM IPL. /// EFI_SMM_SYSTEM_TABLE2 *Smst; /// /// This field is used by the SMM Communicatioon Protocol to pass a buffer into /// a software SMI handler and for the software SMI handler to pass a buffer back to /// the caller of the SMM Communication Protocol. /// VOID *CommunicationBuffer; /// /// This field is used by the SMM Communicatioon Protocol to pass the size of a buffer, /// in bytes, into a software SMI handler and for the software SMI handler to pass the /// size, in bytes, of a buffer back to the caller of the SMM Communication Protocol. /// UINTN BufferSize; /// /// This field is used by the SMM Communication Protocol to pass the return status from /// a software SMI handler back to the caller of the SMM Communication Protocol. /// EFI_STATUS ReturnStatus; EFI_PHYSICAL_ADDRESS PiSmmCoreImageBase; UINT64 PiSmmCoreImageSize; EFI_PHYSICAL_ADDRESS PiSmmCoreEntryPoint; } SMM_CORE_PRIVATE_DATA; /** Called to initialize the memory service. @param SmramRangeCount Number of SMRAM Regions @param SmramRanges Pointer to SMRAM Descriptors **/ VOID SmmInitializeMemoryServices ( IN UINTN SmramRangeCount, IN EFI_SMRAM_DESCRIPTOR *SmramRanges ); /** Allocates pages from the memory map. @param Type The type of allocation to perform @param MemoryType The type of memory to turn the allocated pages into @param NumberOfPages The number of pages to allocate @param Memory A pointer to receive the base allocated memory address @retval EFI_INVALID_PARAMETER Parameters violate checking rules defined in spec. @retval EFI_NOT_FOUND Could not allocate pages match the requirement. @retval EFI_OUT_OF_RESOURCES No enough pages to allocate. @retval EFI_SUCCESS Pages successfully allocated. **/ EFI_STATUS EFIAPI SmmAllocatePages ( IN EFI_ALLOCATE_TYPE Type, IN EFI_MEMORY_TYPE MemoryType, IN UINTN NumberOfPages, OUT EFI_PHYSICAL_ADDRESS *Memory ); /** Frees previous allocated pages. @param Memory Base address of memory being freed @param NumberOfPages The number of pages to free @retval EFI_NOT_FOUND Could not find the entry that covers the range @retval EFI_INVALID_PARAMETER Address not aligned @return EFI_SUCCESS Pages successfully freed. **/ EFI_STATUS EFIAPI SmmFreePages ( IN EFI_PHYSICAL_ADDRESS Memory, IN UINTN NumberOfPages ); /** Allocate pool of a particular type. @param PoolType Type of pool to allocate @param Size The amount of pool to allocate @param Buffer The address to return a pointer to the allocated pool @retval EFI_INVALID_PARAMETER PoolType not valid @retval EFI_OUT_OF_RESOURCES Size exceeds max pool size or allocation failed. @retval EFI_SUCCESS Pool successfully allocated. **/ EFI_STATUS EFIAPI SmmAllocatePool ( IN EFI_MEMORY_TYPE PoolType, IN UINTN Size, OUT VOID **Buffer ); /** Frees pool. @param Buffer The allocated pool entry to free @retval EFI_INVALID_PARAMETER Buffer is not a valid value. @retval EFI_SUCCESS Pool successfully freed. **/ EFI_STATUS EFIAPI SmmFreePool ( IN VOID *Buffer ); #endif