https://bugzilla.tianocore.org/show_bug.cgi?id=1373 Replace BSD 2-Clause License with BSD+Patent License. This change is based on the following emails: https://lists.01.org/pipermail/edk2-devel/2019-February/036260.html https://lists.01.org/pipermail/edk2-devel/2018-October/030385.html RFCs with detailed process for the license change: V3: https://lists.01.org/pipermail/edk2-devel/2019-March/038116.html V2: https://lists.01.org/pipermail/edk2-devel/2019-March/037669.html V1: https://lists.01.org/pipermail/edk2-devel/2019-March/037500.html Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Hao Wu <hao.a.wu@intel.com> Reviewed-by: Jian J Wang <jian.j.wang@intel.com>
		
			
				
	
	
		
			1354 lines
		
	
	
		
			45 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			1354 lines
		
	
	
		
			45 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   The internal header file includes the common header files, defines
 | |
|   internal structure and functions used by SmmCore module.
 | |
| 
 | |
|   Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
 | |
|   SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| 
 | |
| **/
 | |
| 
 | |
| #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 <Protocol/SmmMemoryAttribute.h>
 | |
| #include <Protocol/SmmSxDispatch2.h>
 | |
| 
 | |
| #include <Guid/Apriori.h>
 | |
| #include <Guid/EventGroup.h>
 | |
| #include <Guid/EventLegacyBios.h>
 | |
| #include <Guid/MemoryProfile.h>
 | |
| #include <Guid/LoadModuleAtFixedAddress.h>
 | |
| #include <Guid/SmiHandlerProfile.h>
 | |
| #include <Guid/EndOfS3Resume.h>
 | |
| #include <Guid/S3SmmInitDone.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/HobLib.h>
 | |
| #include <Library/SmmMemLib.h>
 | |
| 
 | |
| #include "PiSmmCorePrivateData.h"
 | |
| #include "HeapGuard.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;
 | |
| 
 | |
| //
 | |
| // SMM_HANDLER - used for each SMM handler
 | |
| //
 | |
| 
 | |
| #define SMI_ENTRY_SIGNATURE  SIGNATURE_32('s','m','i','e')
 | |
| 
 | |
|  typedef struct {
 | |
|   UINTN       Signature;
 | |
|   LIST_ENTRY  AllEntries;  // All entries
 | |
| 
 | |
|   EFI_GUID    HandlerType; // Type of interrupt
 | |
|   LIST_ENTRY  SmiHandlers; // All handlers
 | |
| } SMI_ENTRY;
 | |
| 
 | |
| #define SMI_HANDLER_SIGNATURE  SIGNATURE_32('s','m','i','h')
 | |
| 
 | |
|  typedef struct {
 | |
|   UINTN                         Signature;
 | |
|   LIST_ENTRY                    Link;        // Link on SMI_ENTRY.SmiHandlers
 | |
|   EFI_SMM_HANDLER_ENTRY_POINT2  Handler;     // The smm handler's entry point
 | |
|   UINTN                         CallerAddr;  // The address of caller who register the SMI handler.
 | |
|   SMI_ENTRY                     *SmiEntry;
 | |
|   VOID                          *Context;    // for profile
 | |
|   UINTN                         ContextSize; // for profile
 | |
| } SMI_HANDLER;
 | |
| 
 | |
| //
 | |
| // 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
 | |
|   @param  NeedGuard              Flag to indicate Guard page is needed or not
 | |
| 
 | |
|   @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,
 | |
|   IN      BOOLEAN                   NeedGuard
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   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, Address is zero or NumberOfPages is zero.
 | |
|   @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
 | |
|   @param  IsGuarded              Flag to indicate if the memory is guarded
 | |
|                                  or not
 | |
| 
 | |
|   @retval EFI_NOT_FOUND          Could not find the entry that covers the range
 | |
|   @retval EFI_INVALID_PARAMETER  Address not aligned, Address is zero or NumberOfPages is zero.
 | |
|   @return EFI_SUCCESS            Pages successfully freed.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| SmmInternalFreePages (
 | |
|   IN      EFI_PHYSICAL_ADDRESS      Memory,
 | |
|   IN      UINTN                     NumberOfPages,
 | |
|   IN      BOOLEAN                   IsGuarded
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   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
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Software SMI handler that is called when the S3SmmInitDone signal is triggered.
 | |
|   This function installs the SMM S3SmmInitDone Protocol so SMM Drivers are informed that
 | |
|   S3 SMM initialization has been done.
 | |
| 
 | |
|   @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
 | |
| SmmS3SmmInitDoneHandler (
 | |
|   IN     EFI_HANDLE  DispatchHandle,
 | |
|   IN     CONST VOID  *Context,        OPTIONAL
 | |
|   IN OUT VOID        *CommBuffer,     OPTIONAL
 | |
|   IN OUT UINTN       *CommBufferSize  OPTIONAL
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Software SMI handler that is called when the EndOfS3Resume event is trigged.
 | |
|   This function installs the SMM EndOfS3Resume Protocol so SMM Drivers are informed that
 | |
|   S3 resume has finished.
 | |
| 
 | |
|   @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
 | |
| SmmEndOfS3ResumeHandler (
 | |
|   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
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Initialize SmiHandler profile feature.
 | |
| **/
 | |
| VOID
 | |
| SmmCoreInitializeSmiHandlerProfile (
 | |
|   VOID
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is called by SmmChildDispatcher module to report
 | |
|   a new SMI handler is registered, to SmmCore.
 | |
| 
 | |
|   @param This            The protocol instance
 | |
|   @param HandlerGuid     The GUID to identify the type of the handler.
 | |
|                          For the SmmChildDispatch protocol, the HandlerGuid
 | |
|                          must be the GUID of SmmChildDispatch protocol.
 | |
|   @param Handler         The SMI handler.
 | |
|   @param CallerAddress   The address of the module who registers the SMI handler.
 | |
|   @param Context         The context of the SMI handler.
 | |
|                          For the SmmChildDispatch protocol, the Context
 | |
|                          must match the one defined for SmmChildDispatch protocol.
 | |
|   @param ContextSize     The size of the context in bytes.
 | |
|                          For the SmmChildDispatch protocol, the Context
 | |
|                          must match the one defined for SmmChildDispatch protocol.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The information is recorded.
 | |
|   @retval EFI_OUT_OF_RESOURCES  There is no enough resource to record the information.
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| SmiHandlerProfileRegisterHandler (
 | |
|   IN SMI_HANDLER_PROFILE_PROTOCOL   *This,
 | |
|   IN EFI_GUID                       *HandlerGuid,
 | |
|   IN EFI_SMM_HANDLER_ENTRY_POINT2   Handler,
 | |
|   IN PHYSICAL_ADDRESS               CallerAddress,
 | |
|   IN VOID                           *Context, OPTIONAL
 | |
|   IN UINTN                          ContextSize OPTIONAL
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is called by SmmChildDispatcher module to report
 | |
|   an existing SMI handler is unregistered, to SmmCore.
 | |
| 
 | |
|   @param This            The protocol instance
 | |
|   @param HandlerGuid     The GUID to identify the type of the handler.
 | |
|                          For the SmmChildDispatch protocol, the HandlerGuid
 | |
|                          must be the GUID of SmmChildDispatch protocol.
 | |
|   @param Handler         The SMI handler.
 | |
|   @param Context         The context of the SMI handler.
 | |
|                          If it is NOT NULL, it will be used to check what is registered.
 | |
|   @param ContextSize     The size of the context in bytes.
 | |
|                          If Context is NOT NULL, it will be used to check what is registered.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The original record is removed.
 | |
|   @retval EFI_NOT_FOUND         There is no record for the HandlerGuid and handler.
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| SmiHandlerProfileUnregisterHandler (
 | |
|   IN SMI_HANDLER_PROFILE_PROTOCOL   *This,
 | |
|   IN EFI_GUID                       *HandlerGuid,
 | |
|   IN EFI_SMM_HANDLER_ENTRY_POINT2   Handler,
 | |
|   IN VOID                           *Context, OPTIONAL
 | |
|   IN UINTN                          ContextSize OPTIONAL
 | |
|   );
 | |
| 
 | |
| 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)
 | |
| 
 | |
| #define POOL_HEAD_SIGNATURE   SIGNATURE_32('p','h','d','0')
 | |
| 
 | |
| typedef struct {
 | |
|   UINT32            Signature;
 | |
|   BOOLEAN           Available;
 | |
|   EFI_MEMORY_TYPE   Type;
 | |
|   UINTN             Size;
 | |
| } POOL_HEADER;
 | |
| 
 | |
| #define POOL_TAIL_SIGNATURE   SIGNATURE_32('p','t','a','l')
 | |
| 
 | |
| typedef struct {
 | |
|   UINT32            Signature;
 | |
|   UINT32            Reserved;
 | |
|   UINTN             Size;
 | |
| } POOL_TAIL;
 | |
| 
 | |
| #define POOL_OVERHEAD (sizeof(POOL_HEADER) + sizeof(POOL_TAIL))
 | |
| 
 | |
| #define HEAD_TO_TAIL(a)   \
 | |
|   ((POOL_TAIL *) (((CHAR8 *) (a)) + (a)->Size - sizeof(POOL_TAIL)));
 | |
| 
 | |
| typedef struct {
 | |
|   POOL_HEADER  Header;
 | |
|   LIST_ENTRY   Link;
 | |
| } FREE_POOL_HEADER;
 | |
| 
 | |
| typedef enum {
 | |
|   SmmPoolTypeCode,
 | |
|   SmmPoolTypeData,
 | |
|   SmmPoolTypeMax,
 | |
| } SMM_POOL_TYPE;
 | |
| 
 | |
| extern LIST_ENTRY  mSmmPoolLists[SmmPoolTypeMax][MAX_POOL_INDEX];
 | |
| 
 | |
| /**
 | |
|   Internal Function. Allocate n pages from given free page node.
 | |
| 
 | |
|   @param  Pages                  The free page node.
 | |
|   @param  NumberOfPages          Number of pages to be allocated.
 | |
|   @param  MaxAddress             Request to allocate memory below this address.
 | |
| 
 | |
|   @return Memory address of allocated pages.
 | |
| 
 | |
| **/
 | |
| UINTN
 | |
| InternalAllocPagesOnOneNode (
 | |
|   IN OUT FREE_PAGE_LIST   *Pages,
 | |
|   IN     UINTN            NumberOfPages,
 | |
|   IN     UINTN            MaxAddress
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Update SMM memory map entry.
 | |
| 
 | |
|   @param[in]  Type                   The type of allocation to perform.
 | |
|   @param[in]  Memory                 The base of memory address.
 | |
|   @param[in]  NumberOfPages          The number of pages to allocate.
 | |
|   @param[in]  AddRegion              If this memory is new added region.
 | |
| **/
 | |
| VOID
 | |
| ConvertSmmMemoryMapEntry (
 | |
|   IN EFI_MEMORY_TYPE       Type,
 | |
|   IN EFI_PHYSICAL_ADDRESS  Memory,
 | |
|   IN UINTN                 NumberOfPages,
 | |
|   IN BOOLEAN               AddRegion
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Internal function.  Moves any memory descriptors that are on the
 | |
|   temporary descriptor stack to heap.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| CoreFreeMemoryMapStack (
 | |
|   VOID
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Frees previous allocated pages.
 | |
| 
 | |
|   @param[in]  Memory                 Base address of memory being freed.
 | |
|   @param[in]  NumberOfPages          The number of pages to free.
 | |
|   @param[in]  AddRegion              If this memory is new added region.
 | |
| 
 | |
|   @retval EFI_NOT_FOUND          Could not find the entry that covers the range.
 | |
|   @retval EFI_INVALID_PARAMETER  Address not aligned, Address is zero or NumberOfPages is zero.
 | |
|   @return EFI_SUCCESS            Pages successfully freed.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| SmmInternalFreePagesEx (
 | |
|   IN EFI_PHYSICAL_ADDRESS  Memory,
 | |
|   IN UINTN                 NumberOfPages,
 | |
|   IN BOOLEAN               AddRegion
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Hook function used to set all Guard pages after entering SMM mode.
 | |
| **/
 | |
| VOID
 | |
| SmmEntryPointMemoryManagementHook (
 | |
|   VOID
 | |
|   );
 | |
| 
 | |
| #endif
 |