/** @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.<BR> | |
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 |