mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-11-04 05:25:45 +01:00 
			
		
		
		
	2. Introduce SmmCorePlatformHookLib library class defining two platform hook points. Update PI Smm Core to call the hook points before and after invoking registered SMI handlers. A NULL instance of this library class is implemented. Note that after this check in, DSC files consuming the PiSmmCore.inf need to be updated to add a library instance for SmmCorePlatformHookLib library class. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12140 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			720 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			720 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  The internal header file includes the common header files, defines
 | 
						|
  internal structure and functions used by SmmCore module.
 | 
						|
 | 
						|
  Copyright (c) 2009 - 2011, 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/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 <Guid/Apriori.h>
 | 
						|
#include <Guid/EventGroup.h>
 | 
						|
#include <Guid/EventLegacyBios.h>
 | 
						|
 | 
						|
#include <Library/BaseLib.h>
 | 
						|
#include <Library/BaseMemoryLib.h>
 | 
						|
#include <Library/PeCoffLib.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 "PiSmmCorePrivateData.h"
 | 
						|
 | 
						|
//
 | 
						|
// Used to build a table of SMI Handlers that the SMM Core registers
 | 
						|
//
 | 
						|
typedef struct {
 | 
						|
  EFI_SMM_HANDLER_ENTRY_POINT2  Handler;
 | 
						|
  EFI_GUID                      *HandlerType;
 | 
						|
  EFI_HANDLE                    DispatchHandle;
 | 
						|
  BOOLEAN                       UnRegister;
 | 
						|
} SMM_CORE_SMI_HANDLERS;
 | 
						|
 | 
						|
//
 | 
						|
// Structure for recording the state of an SMM Driver
 | 
						|
//
 | 
						|
#define EFI_SMM_DRIVER_ENTRY_SIGNATURE SIGNATURE_32('s', 'd','r','v')
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  UINTN                           Signature;
 | 
						|
  LIST_ENTRY                      Link;             // mDriverList
 | 
						|
 | 
						|
  LIST_ENTRY                      ScheduledLink;    // mScheduledQueue
 | 
						|
 | 
						|
  EFI_HANDLE                      FvHandle;
 | 
						|
  EFI_GUID                        FileName;
 | 
						|
  EFI_DEVICE_PATH_PROTOCOL        *FvFileDevicePath;
 | 
						|
  EFI_FIRMWARE_VOLUME2_PROTOCOL   *Fv;
 | 
						|
 | 
						|
  VOID                            *Depex;
 | 
						|
  UINTN                           DepexSize;
 | 
						|
 | 
						|
  BOOLEAN                         Before;
 | 
						|
  BOOLEAN                         After;
 | 
						|
  EFI_GUID                        BeforeAfterGuid;
 | 
						|
 | 
						|
  BOOLEAN                         Dependent;
 | 
						|
  BOOLEAN                         Scheduled;
 | 
						|
  BOOLEAN                         Initialized;
 | 
						|
  BOOLEAN                         DepexProtocolError;
 | 
						|
 | 
						|
  EFI_HANDLE                      ImageHandle;
 | 
						|
  EFI_LOADED_IMAGE_PROTOCOL       *LoadedImage;
 | 
						|
  //
 | 
						|
  // Image EntryPoint in SMRAM
 | 
						|
  //
 | 
						|
  PHYSICAL_ADDRESS                ImageEntryPoint;
 | 
						|
  //
 | 
						|
  // Image Buffer in SMRAM  
 | 
						|
  //
 | 
						|
  PHYSICAL_ADDRESS                ImageBuffer;
 | 
						|
  //
 | 
						|
  // Image Page Number
 | 
						|
  //
 | 
						|
  UINTN                           NumberOfPage;
 | 
						|
} EFI_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
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Frees previous allocated pages.
 | 
						|
 | 
						|
  @param  Memory                 Base address of memory being freed
 | 
						|
  @param  NumberOfPages          The number of pages to free
 | 
						|
 | 
						|
  @retval EFI_NOT_FOUND          Could not find the entry that covers the range
 | 
						|
  @retval EFI_INVALID_PARAMETER  Address not aligned
 | 
						|
  @return EFI_SUCCESS            Pages successfully freed.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
SmmFreePages (
 | 
						|
  IN      EFI_PHYSICAL_ADDRESS      Memory,
 | 
						|
  IN      UINTN                     NumberOfPages
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Allocate pool of a particular type.
 | 
						|
 | 
						|
  @param  PoolType               Type of pool to allocate
 | 
						|
  @param  Size                   The amount of pool to allocate
 | 
						|
  @param  Buffer                 The address to return a pointer to the allocated
 | 
						|
                                 pool
 | 
						|
 | 
						|
  @retval EFI_INVALID_PARAMETER  PoolType not valid
 | 
						|
  @retval EFI_OUT_OF_RESOURCES   Size exceeds max pool size or allocation failed.
 | 
						|
  @retval EFI_SUCCESS            Pool successfully allocated.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
SmmAllocatePool (
 | 
						|
  IN      EFI_MEMORY_TYPE           PoolType,
 | 
						|
  IN      UINTN                     Size,
 | 
						|
  OUT     VOID                      **Buffer
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Frees pool.
 | 
						|
 | 
						|
  @param  Buffer                 The allocated pool entry to free
 | 
						|
 | 
						|
  @retval EFI_INVALID_PARAMETER  Buffer is not a valid value.
 | 
						|
  @retval EFI_SUCCESS            Pool successfully freed.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
SmmFreePool (
 | 
						|
  IN      VOID                      *Buffer
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  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
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  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
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  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
 | 
						|
  );
 | 
						|
 | 
						|
#endif
 |