/** @file | |
The internal header file includes the common header files, defines | |
internal structure and functions used by SmmCore module. | |
Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR> | |
This program and the accompanying materials are licensed and made available | |
under the terms and conditions of the BSD License which accompanies this | |
distribution. The full text of the license may be found at | |
http://opensource.org/licenses/bsd-license.php | |
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
**/ | |
#ifndef _SMM_CORE_H_ | |
#define _SMM_CORE_H_ | |
#include <PiSmm.h> | |
#include <Protocol/DxeSmmReadyToLock.h> | |
#include <Protocol/SmmReadyToLock.h> | |
#include <Protocol/SmmEndOfDxe.h> | |
#include <Protocol/CpuIo2.h> | |
#include <Protocol/SmmCommunication.h> | |
#include <Protocol/SmmAccess2.h> | |
#include <Protocol/FirmwareVolume2.h> | |
#include <Protocol/LoadedImage.h> | |
#include <Protocol/DevicePath.h> | |
#include <Protocol/Security.h> | |
#include <Protocol/Security2.h> | |
#include <Protocol/SmmExitBootServices.h> | |
#include <Protocol/SmmLegacyBoot.h> | |
#include <Protocol/SmmReadyToBoot.h> | |
#include <Guid/Apriori.h> | |
#include <Guid/EventGroup.h> | |
#include <Guid/EventLegacyBios.h> | |
#include <Guid/MemoryProfile.h> | |
#include <Library/BaseLib.h> | |
#include <Library/BaseMemoryLib.h> | |
#include <Library/PeCoffLib.h> | |
#include <Library/PeCoffGetEntryPointLib.h> | |
#include <Library/CacheMaintenanceLib.h> | |
#include <Library/DebugLib.h> | |
#include <Library/ReportStatusCodeLib.h> | |
#include <Library/MemoryAllocationLib.h> | |
#include <Library/DevicePathLib.h> | |
#include <Library/UefiLib.h> | |
#include <Library/UefiBootServicesTableLib.h> | |
#include <Library/PcdLib.h> | |
#include <Library/SmmCorePlatformHookLib.h> | |
#include <Library/PerformanceLib.h> | |
#include <Library/TimerLib.h> | |
#include <Library/HobLib.h> | |
#include <Library/SmmMemLib.h> | |
#include "PiSmmCorePrivateData.h" | |
// | |
// Used to build a table of SMI Handlers that the SMM Core registers | |
// | |
typedef struct { | |
EFI_SMM_HANDLER_ENTRY_POINT2 Handler; | |
EFI_GUID *HandlerType; | |
EFI_HANDLE DispatchHandle; | |
BOOLEAN UnRegister; | |
} SMM_CORE_SMI_HANDLERS; | |
// | |
// Structure for recording the state of an SMM Driver | |
// | |
#define EFI_SMM_DRIVER_ENTRY_SIGNATURE SIGNATURE_32('s', 'd','r','v') | |
typedef struct { | |
UINTN Signature; | |
LIST_ENTRY Link; // mDriverList | |
LIST_ENTRY ScheduledLink; // mScheduledQueue | |
EFI_HANDLE FvHandle; | |
EFI_GUID FileName; | |
EFI_DEVICE_PATH_PROTOCOL *FvFileDevicePath; | |
EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv; | |
VOID *Depex; | |
UINTN DepexSize; | |
BOOLEAN Before; | |
BOOLEAN After; | |
EFI_GUID BeforeAfterGuid; | |
BOOLEAN Dependent; | |
BOOLEAN Scheduled; | |
BOOLEAN Initialized; | |
BOOLEAN DepexProtocolError; | |
EFI_HANDLE ImageHandle; | |
EFI_LOADED_IMAGE_PROTOCOL *LoadedImage; | |
// | |
// Image EntryPoint in SMRAM | |
// | |
PHYSICAL_ADDRESS ImageEntryPoint; | |
// | |
// Image Buffer in SMRAM | |
// | |
PHYSICAL_ADDRESS ImageBuffer; | |
// | |
// Image Page Number | |
// | |
UINTN NumberOfPage; | |
EFI_HANDLE SmmImageHandle; | |
EFI_LOADED_IMAGE_PROTOCOL SmmLoadedImage; | |
} EFI_SMM_DRIVER_ENTRY; | |
#define EFI_HANDLE_SIGNATURE SIGNATURE_32('h','n','d','l') | |
/// | |
/// IHANDLE - contains a list of protocol handles | |
/// | |
typedef struct { | |
UINTN Signature; | |
/// All handles list of IHANDLE | |
LIST_ENTRY AllHandles; | |
/// List of PROTOCOL_INTERFACE's for this handle | |
LIST_ENTRY Protocols; | |
UINTN LocateRequest; | |
} IHANDLE; | |
#define ASSERT_IS_HANDLE(a) ASSERT((a)->Signature == EFI_HANDLE_SIGNATURE) | |
#define PROTOCOL_ENTRY_SIGNATURE SIGNATURE_32('p','r','t','e') | |
/// | |
/// PROTOCOL_ENTRY - each different protocol has 1 entry in the protocol | |
/// database. Each handler that supports this protocol is listed, along | |
/// with a list of registered notifies. | |
/// | |
typedef struct { | |
UINTN Signature; | |
/// Link Entry inserted to mProtocolDatabase | |
LIST_ENTRY AllEntries; | |
/// ID of the protocol | |
EFI_GUID ProtocolID; | |
/// All protocol interfaces | |
LIST_ENTRY Protocols; | |
/// Registerd notification handlers | |
LIST_ENTRY Notify; | |
} PROTOCOL_ENTRY; | |
#define PROTOCOL_INTERFACE_SIGNATURE SIGNATURE_32('p','i','f','c') | |
/// | |
/// PROTOCOL_INTERFACE - each protocol installed on a handle is tracked | |
/// with a protocol interface structure | |
/// | |
typedef struct { | |
UINTN Signature; | |
/// Link on IHANDLE.Protocols | |
LIST_ENTRY Link; | |
/// Back pointer | |
IHANDLE *Handle; | |
/// Link on PROTOCOL_ENTRY.Protocols | |
LIST_ENTRY ByProtocol; | |
/// The protocol ID | |
PROTOCOL_ENTRY *Protocol; | |
/// The interface value | |
VOID *Interface; | |
} PROTOCOL_INTERFACE; | |
#define PROTOCOL_NOTIFY_SIGNATURE SIGNATURE_32('p','r','t','n') | |
/// | |
/// PROTOCOL_NOTIFY - used for each register notification for a protocol | |
/// | |
typedef struct { | |
UINTN Signature; | |
PROTOCOL_ENTRY *Protocol; | |
/// All notifications for this protocol | |
LIST_ENTRY Link; | |
/// Notification function | |
EFI_SMM_NOTIFY_FN Function; | |
/// Last position notified | |
LIST_ENTRY *Position; | |
} PROTOCOL_NOTIFY; | |
// | |
// SMM Core Global Variables | |
// | |
extern SMM_CORE_PRIVATE_DATA *gSmmCorePrivate; | |
extern EFI_SMM_SYSTEM_TABLE2 gSmmCoreSmst; | |
extern LIST_ENTRY gHandleList; | |
extern EFI_PHYSICAL_ADDRESS gLoadModuleAtFixAddressSmramBase; | |
/** | |
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 | |
); | |
/** | |
The SmmInstallConfigurationTable() function is used to maintain the list | |
of configuration tables that are stored in the System Management System | |
Table. The list is stored as an array of (GUID, Pointer) pairs. The list | |
must be allocated from pool memory with PoolType set to EfiRuntimeServicesData. | |
@param SystemTable A pointer to the SMM System Table (SMST). | |
@param Guid A pointer to the GUID for the entry to add, update, or remove. | |
@param Table A pointer to the buffer of the table to add. | |
@param TableSize The size of the table to install. | |
@retval EFI_SUCCESS The (Guid, Table) pair was added, updated, or removed. | |
@retval EFI_INVALID_PARAMETER Guid is not valid. | |
@retval EFI_NOT_FOUND An attempt was made to delete a non-existent entry. | |
@retval EFI_OUT_OF_RESOURCES There is not enough memory available to complete the operation. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
SmmInstallConfigurationTable ( | |
IN CONST EFI_SMM_SYSTEM_TABLE2 *SystemTable, | |
IN CONST EFI_GUID *Guid, | |
IN VOID *Table, | |
IN UINTN TableSize | |
); | |
/** | |
Wrapper function to SmmInstallProtocolInterfaceNotify. This is the public API which | |
Calls the private one which contains a BOOLEAN parameter for notifications | |
@param UserHandle The handle to install the protocol handler on, | |
or NULL if a new handle is to be allocated | |
@param Protocol The protocol to add to the handle | |
@param InterfaceType Indicates whether Interface is supplied in | |
native form. | |
@param Interface The interface for the protocol being added | |
@return Status code | |
**/ | |
EFI_STATUS | |
EFIAPI | |
SmmInstallProtocolInterface ( | |
IN OUT EFI_HANDLE *UserHandle, | |
IN EFI_GUID *Protocol, | |
IN EFI_INTERFACE_TYPE InterfaceType, | |
IN VOID *Interface | |
); | |
/** | |
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 | |
); | |
/** | |
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 | |
SmmInternalAllocatePages ( | |
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 | |
); | |
/** | |
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 | |
SmmInternalFreePages ( | |
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 | |
); | |
/** | |
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 | |
SmmInternalAllocatePool ( | |
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 | |
); | |
/** | |
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 | |
SmmInternalFreePool ( | |
IN VOID *Buffer | |
); | |
/** | |
Installs a protocol interface into the boot services environment. | |
@param UserHandle The handle to install the protocol handler on, | |
or NULL if a new handle is to be allocated | |
@param Protocol The protocol to add to the handle | |
@param InterfaceType Indicates whether Interface is supplied in | |
native form. | |
@param Interface The interface for the protocol being added | |
@param Notify indicates whether notify the notification list | |
for this protocol | |
@retval EFI_INVALID_PARAMETER Invalid parameter | |
@retval EFI_OUT_OF_RESOURCES No enough buffer to allocate | |
@retval EFI_SUCCESS Protocol interface successfully installed | |
**/ | |
EFI_STATUS | |
SmmInstallProtocolInterfaceNotify ( | |
IN OUT EFI_HANDLE *UserHandle, | |
IN EFI_GUID *Protocol, | |
IN EFI_INTERFACE_TYPE InterfaceType, | |
IN VOID *Interface, | |
IN BOOLEAN Notify | |
); | |
/** | |
Uninstalls all instances of a protocol:interfacer from a handle. | |
If the last protocol interface is remove from the handle, the | |
handle is freed. | |
@param UserHandle The handle to remove the protocol handler from | |
@param Protocol The protocol, of protocol:interface, to remove | |
@param Interface The interface, of protocol:interface, to remove | |
@retval EFI_INVALID_PARAMETER Protocol is NULL. | |
@retval EFI_SUCCESS Protocol interface successfully uninstalled. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
SmmUninstallProtocolInterface ( | |
IN EFI_HANDLE UserHandle, | |
IN EFI_GUID *Protocol, | |
IN VOID *Interface | |
); | |
/** | |
Queries a handle to determine if it supports a specified protocol. | |
@param UserHandle The handle being queried. | |
@param Protocol The published unique identifier of the protocol. | |
@param Interface Supplies the address where a pointer to the | |
corresponding Protocol Interface is returned. | |
@return The requested protocol interface for the handle | |
**/ | |
EFI_STATUS | |
EFIAPI | |
SmmHandleProtocol ( | |
IN EFI_HANDLE UserHandle, | |
IN EFI_GUID *Protocol, | |
OUT VOID **Interface | |
); | |
/** | |
Add a new protocol notification record for the request protocol. | |
@param Protocol The requested protocol to add the notify | |
registration | |
@param Function Points to the notification function | |
@param Registration Returns the registration record | |
@retval EFI_INVALID_PARAMETER Invalid parameter | |
@retval EFI_SUCCESS Successfully returned the registration record | |
that has been added | |
**/ | |
EFI_STATUS | |
EFIAPI | |
SmmRegisterProtocolNotify ( | |
IN CONST EFI_GUID *Protocol, | |
IN EFI_SMM_NOTIFY_FN Function, | |
OUT VOID **Registration | |
); | |
/** | |
Locates the requested handle(s) and returns them in Buffer. | |
@param SearchType The type of search to perform to locate the | |
handles | |
@param Protocol The protocol to search for | |
@param SearchKey Dependant on SearchType | |
@param BufferSize On input the size of Buffer. On output the | |
size of data returned. | |
@param Buffer The buffer to return the results in | |
@retval EFI_BUFFER_TOO_SMALL Buffer too small, required buffer size is | |
returned in BufferSize. | |
@retval EFI_INVALID_PARAMETER Invalid parameter | |
@retval EFI_SUCCESS Successfully found the requested handle(s) and | |
returns them in Buffer. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
SmmLocateHandle ( | |
IN EFI_LOCATE_SEARCH_TYPE SearchType, | |
IN EFI_GUID *Protocol OPTIONAL, | |
IN VOID *SearchKey OPTIONAL, | |
IN OUT UINTN *BufferSize, | |
OUT EFI_HANDLE *Buffer | |
); | |
/** | |
Return the first Protocol Interface that matches the Protocol GUID. If | |
Registration is pasased in return a Protocol Instance that was just add | |
to the system. If Retistration is NULL return the first Protocol Interface | |
you find. | |
@param Protocol The protocol to search for | |
@param Registration Optional Registration Key returned from | |
RegisterProtocolNotify() | |
@param Interface Return the Protocol interface (instance). | |
@retval EFI_SUCCESS If a valid Interface is returned | |
@retval EFI_INVALID_PARAMETER Invalid parameter | |
@retval EFI_NOT_FOUND Protocol interface not found | |
**/ | |
EFI_STATUS | |
EFIAPI | |
SmmLocateProtocol ( | |
IN EFI_GUID *Protocol, | |
IN VOID *Registration OPTIONAL, | |
OUT VOID **Interface | |
); | |
/** | |
Function returns an array of handles that support the requested protocol | |
in a buffer allocated from pool. This is a version of SmmLocateHandle() | |
that allocates a buffer for the caller. | |
@param SearchType Specifies which handle(s) are to be returned. | |
@param Protocol Provides the protocol to search by. This | |
parameter is only valid for SearchType | |
ByProtocol. | |
@param SearchKey Supplies the search key depending on the | |
SearchType. | |
@param NumberHandles The number of handles returned in Buffer. | |
@param Buffer A pointer to the buffer to return the requested | |
array of handles that support Protocol. | |
@retval EFI_SUCCESS The result array of handles was returned. | |
@retval EFI_NOT_FOUND No handles match the search. | |
@retval EFI_OUT_OF_RESOURCES There is not enough pool memory to store the | |
matching results. | |
@retval EFI_INVALID_PARAMETER One or more paramters are not valid. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
SmmLocateHandleBuffer ( | |
IN EFI_LOCATE_SEARCH_TYPE SearchType, | |
IN EFI_GUID *Protocol OPTIONAL, | |
IN VOID *SearchKey OPTIONAL, | |
IN OUT UINTN *NumberHandles, | |
OUT EFI_HANDLE **Buffer | |
); | |
/** | |
Manage SMI of a particular type. | |
@param HandlerType Points to the handler type or NULL for root SMI handlers. | |
@param Context Points to an optional context buffer. | |
@param CommBuffer Points to the optional communication buffer. | |
@param CommBufferSize Points to the size of the optional communication buffer. | |
@retval EFI_SUCCESS Interrupt source was processed successfully but not quiesced. | |
@retval EFI_INTERRUPT_PENDING One or more SMI sources could not be quiesced. | |
@retval EFI_WARN_INTERRUPT_SOURCE_PENDING Interrupt source was not handled or quiesced. | |
@retval EFI_WARN_INTERRUPT_SOURCE_QUIESCED Interrupt source was handled and quiesced. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
SmiManage ( | |
IN CONST EFI_GUID *HandlerType, | |
IN CONST VOID *Context OPTIONAL, | |
IN OUT VOID *CommBuffer OPTIONAL, | |
IN OUT UINTN *CommBufferSize OPTIONAL | |
); | |
/** | |
Registers a handler to execute within SMM. | |
@param Handler Handler service funtion pointer. | |
@param HandlerType Points to the handler type or NULL for root SMI handlers. | |
@param DispatchHandle On return, contains a unique handle which can be used to later unregister the handler function. | |
@retval EFI_SUCCESS Handler register success. | |
@retval EFI_INVALID_PARAMETER Handler or DispatchHandle is NULL. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
SmiHandlerRegister ( | |
IN EFI_SMM_HANDLER_ENTRY_POINT2 Handler, | |
IN CONST EFI_GUID *HandlerType OPTIONAL, | |
OUT EFI_HANDLE *DispatchHandle | |
); | |
/** | |
Unregister a handler in SMM. | |
@param DispatchHandle The handle that was specified when the handler was registered. | |
@retval EFI_SUCCESS Handler function was successfully unregistered. | |
@retval EFI_INVALID_PARAMETER DispatchHandle does not refer to a valid handle. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
SmiHandlerUnRegister ( | |
IN EFI_HANDLE DispatchHandle | |
); | |
/** | |
This function is the main entry point for an SMM handler dispatch | |
or communicate-based callback. | |
@param DispatchHandle The unique handle assigned to this handler by SmiHandlerRegister(). | |
@param Context Points to an optional handler context which was specified when the handler was registered. | |
@param CommBuffer A pointer to a collection of data in memory that will | |
be conveyed from a non-SMM environment into an SMM environment. | |
@param CommBufferSize The size of the CommBuffer. | |
@return Status Code | |
**/ | |
EFI_STATUS | |
EFIAPI | |
SmmDriverDispatchHandler ( | |
IN EFI_HANDLE DispatchHandle, | |
IN CONST VOID *Context, OPTIONAL | |
IN OUT VOID *CommBuffer, OPTIONAL | |
IN OUT UINTN *CommBufferSize OPTIONAL | |
); | |
/** | |
This function is the main entry point for an SMM handler dispatch | |
or communicate-based callback. | |
@param DispatchHandle The unique handle assigned to this handler by SmiHandlerRegister(). | |
@param Context Points to an optional handler context which was specified when the handler was registered. | |
@param CommBuffer A pointer to a collection of data in memory that will | |
be conveyed from a non-SMM environment into an SMM environment. | |
@param CommBufferSize The size of the CommBuffer. | |
@return Status Code | |
**/ | |
EFI_STATUS | |
EFIAPI | |
SmmLegacyBootHandler ( | |
IN EFI_HANDLE DispatchHandle, | |
IN CONST VOID *Context, OPTIONAL | |
IN OUT VOID *CommBuffer, OPTIONAL | |
IN OUT UINTN *CommBufferSize OPTIONAL | |
); | |
/** | |
This function is the main entry point for an SMM handler dispatch | |
or communicate-based callback. | |
@param DispatchHandle The unique handle assigned to this handler by SmiHandlerRegister(). | |
@param Context Points to an optional handler context which was specified when the handler was registered. | |
@param CommBuffer A pointer to a collection of data in memory that will | |
be conveyed from a non-SMM environment into an SMM environment. | |
@param CommBufferSize The size of the CommBuffer. | |
@return Status Code | |
**/ | |
EFI_STATUS | |
EFIAPI | |
SmmReadyToLockHandler ( | |
IN EFI_HANDLE DispatchHandle, | |
IN CONST VOID *Context, OPTIONAL | |
IN OUT VOID *CommBuffer, OPTIONAL | |
IN OUT UINTN *CommBufferSize OPTIONAL | |
); | |
/** | |
This function is the main entry point for an SMM handler dispatch | |
or communicate-based callback. | |
@param DispatchHandle The unique handle assigned to this handler by SmiHandlerRegister(). | |
@param Context Points to an optional handler context which was specified when the handler was registered. | |
@param CommBuffer A pointer to a collection of data in memory that will | |
be conveyed from a non-SMM environment into an SMM environment. | |
@param CommBufferSize The size of the CommBuffer. | |
@return Status Code | |
**/ | |
EFI_STATUS | |
EFIAPI | |
SmmEndOfDxeHandler ( | |
IN EFI_HANDLE DispatchHandle, | |
IN CONST VOID *Context, OPTIONAL | |
IN OUT VOID *CommBuffer, OPTIONAL | |
IN OUT UINTN *CommBufferSize OPTIONAL | |
); | |
/** | |
This function is the main entry point for an SMM handler dispatch | |
or communicate-based callback. | |
@param DispatchHandle The unique handle assigned to this handler by SmiHandlerRegister(). | |
@param Context Points to an optional handler context which was specified when the handler was registered. | |
@param CommBuffer A pointer to a collection of data in memory that will | |
be conveyed from a non-SMM environment into an SMM environment. | |
@param CommBufferSize The size of the CommBuffer. | |
@return Status Code | |
**/ | |
EFI_STATUS | |
EFIAPI | |
SmmExitBootServicesHandler ( | |
IN EFI_HANDLE DispatchHandle, | |
IN CONST VOID *Context, OPTIONAL | |
IN OUT VOID *CommBuffer, OPTIONAL | |
IN OUT UINTN *CommBufferSize OPTIONAL | |
); | |
/** | |
This function is the main entry point for an SMM handler dispatch | |
or communicate-based callback. | |
@param DispatchHandle The unique handle assigned to this handler by SmiHandlerRegister(). | |
@param Context Points to an optional handler context which was specified when the handler was registered. | |
@param CommBuffer A pointer to a collection of data in memory that will | |
be conveyed from a non-SMM environment into an SMM environment. | |
@param CommBufferSize The size of the CommBuffer. | |
@return Status Code | |
**/ | |
EFI_STATUS | |
EFIAPI | |
SmmReadyToBootHandler ( | |
IN EFI_HANDLE DispatchHandle, | |
IN CONST VOID *Context, OPTIONAL | |
IN OUT VOID *CommBuffer, OPTIONAL | |
IN OUT UINTN *CommBufferSize OPTIONAL | |
); | |
/** | |
Place holder function until all the SMM System Table Service are available. | |
@param Arg1 Undefined | |
@param Arg2 Undefined | |
@param Arg3 Undefined | |
@param Arg4 Undefined | |
@param Arg5 Undefined | |
@return EFI_NOT_AVAILABLE_YET | |
**/ | |
EFI_STATUS | |
EFIAPI | |
SmmEfiNotAvailableYetArg5 ( | |
UINTN Arg1, | |
UINTN Arg2, | |
UINTN Arg3, | |
UINTN Arg4, | |
UINTN Arg5 | |
); | |
// | |
//Functions used during debug buils | |
// | |
/** | |
Traverse the discovered list for any drivers that were discovered but not loaded | |
because the dependency experessions evaluated to false. | |
**/ | |
VOID | |
SmmDisplayDiscoveredNotDispatched ( | |
VOID | |
); | |
/** | |
Add free SMRAM region for use by memory service. | |
@param MemBase Base address of memory region. | |
@param MemLength Length of the memory region. | |
@param Type Memory type. | |
@param Attributes Memory region state. | |
**/ | |
VOID | |
SmmAddMemoryRegion ( | |
IN EFI_PHYSICAL_ADDRESS MemBase, | |
IN UINT64 MemLength, | |
IN EFI_MEMORY_TYPE Type, | |
IN UINT64 Attributes | |
); | |
/** | |
Finds the protocol entry for the requested protocol. | |
@param Protocol The ID of the protocol | |
@param Create Create a new entry if not found | |
@return Protocol entry | |
**/ | |
PROTOCOL_ENTRY * | |
SmmFindProtocolEntry ( | |
IN EFI_GUID *Protocol, | |
IN BOOLEAN Create | |
); | |
/** | |
Signal event for every protocol in protocol entry. | |
@param Prot Protocol interface | |
**/ | |
VOID | |
SmmNotifyProtocol ( | |
IN PROTOCOL_INTERFACE *Prot | |
); | |
/** | |
Finds the protocol instance for the requested handle and protocol. | |
Note: This function doesn't do parameters checking, it's caller's responsibility | |
to pass in valid parameters. | |
@param Handle The handle to search the protocol on | |
@param Protocol GUID of the protocol | |
@param Interface The interface for the protocol being searched | |
@return Protocol instance (NULL: Not found) | |
**/ | |
PROTOCOL_INTERFACE * | |
SmmFindProtocolInterface ( | |
IN IHANDLE *Handle, | |
IN EFI_GUID *Protocol, | |
IN VOID *Interface | |
); | |
/** | |
Removes Protocol from the protocol list (but not the handle list). | |
@param Handle The handle to remove protocol on. | |
@param Protocol GUID of the protocol to be moved | |
@param Interface The interface of the protocol | |
@return Protocol Entry | |
**/ | |
PROTOCOL_INTERFACE * | |
SmmRemoveInterfaceFromProtocol ( | |
IN IHANDLE *Handle, | |
IN EFI_GUID *Protocol, | |
IN VOID *Interface | |
); | |
/** | |
This is the POSTFIX version of the dependency evaluator. This code does | |
not need to handle Before or After, as it is not valid to call this | |
routine in this case. POSTFIX means all the math is done on top of the stack. | |
@param DriverEntry DriverEntry element to update. | |
@retval TRUE If driver is ready to run. | |
@retval FALSE If driver is not ready to run or some fatal error | |
was found. | |
**/ | |
BOOLEAN | |
SmmIsSchedulable ( | |
IN EFI_SMM_DRIVER_ENTRY *DriverEntry | |
); | |
// | |
// SmramProfile | |
// | |
/** | |
Initialize SMRAM profile. | |
**/ | |
VOID | |
SmramProfileInit ( | |
VOID | |
); | |
/** | |
Install SMRAM profile protocol. | |
**/ | |
VOID | |
SmramProfileInstallProtocol ( | |
VOID | |
); | |
/** | |
Register SMM image to SMRAM profile. | |
@param DriverEntry SMM image info. | |
@param RegisterToDxe Register image to DXE. | |
@return EFI_SUCCESS Register successfully. | |
@return EFI_UNSUPPORTED Memory profile unsupported, | |
or memory profile for the image is not required. | |
@return EFI_OUT_OF_RESOURCES No enough resource for this register. | |
**/ | |
EFI_STATUS | |
RegisterSmramProfileImage ( | |
IN EFI_SMM_DRIVER_ENTRY *DriverEntry, | |
IN BOOLEAN RegisterToDxe | |
); | |
/** | |
Unregister image from SMRAM profile. | |
@param DriverEntry SMM image info. | |
@param UnregisterToDxe Unregister image from DXE. | |
@return EFI_SUCCESS Unregister successfully. | |
@return EFI_UNSUPPORTED Memory profile unsupported, | |
or memory profile for the image is not required. | |
@return EFI_NOT_FOUND The image is not found. | |
**/ | |
EFI_STATUS | |
UnregisterSmramProfileImage ( | |
IN EFI_SMM_DRIVER_ENTRY *DriverEntry, | |
IN BOOLEAN UnregisterToDxe | |
); | |
/** | |
Update SMRAM profile information. | |
@param CallerAddress Address of caller who call Allocate or Free. | |
@param Action This Allocate or Free action. | |
@param MemoryType Memory type. | |
EfiMaxMemoryType means the MemoryType is unknown. | |
@param Size Buffer size. | |
@param Buffer Buffer address. | |
@param ActionString String for memory profile action. | |
Only needed for user defined allocate action. | |
@return EFI_SUCCESS Memory profile is updated. | |
@return EFI_UNSUPPORTED Memory profile is unsupported, | |
or memory profile for the image is not required, | |
or memory profile for the memory type is not required. | |
@return EFI_ACCESS_DENIED It is during memory profile data getting. | |
@return EFI_ABORTED Memory profile recording is not enabled. | |
@return EFI_OUT_OF_RESOURCES No enough resource to update memory profile for allocate action. | |
@return EFI_NOT_FOUND No matched allocate info found for free action. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
SmmCoreUpdateProfile ( | |
IN PHYSICAL_ADDRESS CallerAddress, | |
IN MEMORY_PROFILE_ACTION Action, | |
IN EFI_MEMORY_TYPE MemoryType, // Valid for AllocatePages/AllocatePool | |
IN UINTN Size, // Valid for AllocatePages/FreePages/AllocatePool | |
IN VOID *Buffer, | |
IN CHAR8 *ActionString OPTIONAL | |
); | |
/** | |
Register SMRAM profile handler. | |
**/ | |
VOID | |
RegisterSmramProfileHandler ( | |
VOID | |
); | |
/** | |
SMRAM profile ready to lock callback function. | |
**/ | |
VOID | |
SmramProfileReadyToLock ( | |
VOID | |
); | |
/** | |
Initialize MemoryAttributes support. | |
**/ | |
VOID | |
EFIAPI | |
SmmCoreInitializeMemoryAttributesTable ( | |
VOID | |
); | |
/** | |
This function returns a copy of the current memory map. The map is an array of | |
memory descriptors, each of which describes a contiguous block of memory. | |
@param[in, out] MemoryMapSize A pointer to the size, in bytes, of the | |
MemoryMap buffer. On input, this is the size of | |
the buffer allocated by the caller. On output, | |
it is the size of the buffer returned by the | |
firmware if the buffer was large enough, or the | |
size of the buffer needed to contain the map if | |
the buffer was too small. | |
@param[in, out] MemoryMap A pointer to the buffer in which firmware places | |
the current memory map. | |
@param[out] MapKey A pointer to the location in which firmware | |
returns the key for the current memory map. | |
@param[out] DescriptorSize A pointer to the location in which firmware | |
returns the size, in bytes, of an individual | |
EFI_MEMORY_DESCRIPTOR. | |
@param[out] DescriptorVersion A pointer to the location in which firmware | |
returns the version number associated with the | |
EFI_MEMORY_DESCRIPTOR. | |
@retval EFI_SUCCESS The memory map was returned in the MemoryMap | |
buffer. | |
@retval EFI_BUFFER_TOO_SMALL The MemoryMap buffer was too small. The current | |
buffer size needed to hold the memory map is | |
returned in MemoryMapSize. | |
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
SmmCoreGetMemoryMap ( | |
IN OUT UINTN *MemoryMapSize, | |
IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap, | |
OUT UINTN *MapKey, | |
OUT UINTN *DescriptorSize, | |
OUT UINT32 *DescriptorVersion | |
); | |
/// | |
/// For generic EFI machines make the default allocations 4K aligned | |
/// | |
#define EFI_ACPI_RUNTIME_PAGE_ALLOCATION_ALIGNMENT (EFI_PAGE_SIZE) | |
#define DEFAULT_PAGE_ALLOCATION (EFI_PAGE_SIZE) | |
extern UINTN mFullSmramRangeCount; | |
extern EFI_SMRAM_DESCRIPTOR *mFullSmramRanges; | |
extern EFI_SMM_DRIVER_ENTRY *mSmmCoreDriverEntry; | |
extern EFI_LOADED_IMAGE_PROTOCOL *mSmmCoreLoadedImage; | |
// | |
// Page management | |
// | |
typedef struct { | |
LIST_ENTRY Link; | |
UINTN NumberOfPages; | |
} FREE_PAGE_LIST; | |
extern LIST_ENTRY mSmmMemoryMap; | |
// | |
// Pool management | |
// | |
// | |
// MIN_POOL_SHIFT must not be less than 5 | |
// | |
#define MIN_POOL_SHIFT 6 | |
#define MIN_POOL_SIZE (1 << MIN_POOL_SHIFT) | |
// | |
// MAX_POOL_SHIFT must not be less than EFI_PAGE_SHIFT - 1 | |
// | |
#define MAX_POOL_SHIFT (EFI_PAGE_SHIFT - 1) | |
#define MAX_POOL_SIZE (1 << MAX_POOL_SHIFT) | |
// | |
// MAX_POOL_INDEX are calculated by maximum and minimum pool sizes | |
// | |
#define MAX_POOL_INDEX (MAX_POOL_SHIFT - MIN_POOL_SHIFT + 1) | |
typedef struct { | |
UINTN Size; | |
BOOLEAN Available; | |
} POOL_HEADER; | |
typedef struct { | |
POOL_HEADER Header; | |
LIST_ENTRY Link; | |
} FREE_POOL_HEADER; | |
extern LIST_ENTRY mSmmPoolLists[MAX_POOL_INDEX]; | |
#endif |