mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-11-03 21:17:23 +01:00 
			
		
		
		
	The reason is that we observe that a platform may use same Handler for different context. In order to support Unregister such handler, we have to input context information as well. Cc: Jeff Fan <jeff.fan@intel.com> Cc: Feng Tian <feng.tian@intel.com> Cc: Star Zeng <star.zeng@intel.com> Cc: Bret Barkelew <Bret.Barkelew@microsoft.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jiewen Yao <jiewen.yao@intel.com> Reviewed-by: Jeff Fan <jeff.fan@intel.com> Reviewed-by: Feng Tian <feng.tian@intel.com>
		
			
				
	
	
		
			1219 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			1219 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  The internal header file includes the common header files, defines
 | 
						|
  internal structure and functions used by SmmCore module.
 | 
						|
 | 
						|
  Copyright (c) 2009 - 2017, 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 <Guid/LoadModuleAtFixedAddress.h>
 | 
						|
#include <Guid/SmiHandlerProfile.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;
 | 
						|
 | 
						|
//
 | 
						|
// 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
 | 
						|
 | 
						|
  @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, 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
 | 
						|
 | 
						|
  @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
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  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
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  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)
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  UINTN           Size;
 | 
						|
  BOOLEAN         Available;
 | 
						|
  EFI_MEMORY_TYPE Type;
 | 
						|
} POOL_HEADER;
 | 
						|
 | 
						|
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];
 | 
						|
 | 
						|
#endif
 |