/** @file
Header file for SMI handler profile definition.
Copyright (c) 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef _SMI_HANDLER_PROFILE_H_
#define _SMI_HANDLER_PROFILE_H_
#include
#include
#include
#include
#include
#include
#include
#include
#include
typedef struct {
UINT32 Signature;
UINT32 Length;
UINT32 Revision;
UINT8 Reserved[4];
} SMM_CORE_DATABASE_COMMON_HEADER;
#define SMM_CORE_IMAGE_DATABASE_SIGNATURE SIGNATURE_32 ('S','C','I','D')
#define SMM_CORE_IMAGE_DATABASE_REVISION 0x0001
typedef struct {
SMM_CORE_DATABASE_COMMON_HEADER Header;
EFI_GUID FileGuid;
PHYSICAL_ADDRESS EntryPoint;
PHYSICAL_ADDRESS ImageBase;
UINT64 ImageSize;
UINT32 ImageRef;
UINT16 PdbStringOffset;
UINT8 Reserved[2];
// CHAR8 PdbString[];
} SMM_CORE_IMAGE_DATABASE_STRUCTURE;
#define SMM_CORE_SMI_DATABASE_SIGNATURE SIGNATURE_32 ('S','C','S','D')
#define SMM_CORE_SMI_DATABASE_REVISION 0x0001
typedef enum {
SmmCoreSmiHandlerCategoryRootHandler,
SmmCoreSmiHandlerCategoryGuidHandler,
SmmCoreSmiHandlerCategoryHardwareHandler,
} SMM_CORE_SMI_HANDLER_CATEGORY;
//
// Context for SmmCoreSmiHandlerCategoryRootHandler:
// NULL
// Context for SmmCoreSmiHandlerCategoryGuidHandler:
// NULL
// Context for SmmCoreSmiHandlerCategoryHardwareHandler:
// (NOTE: The context field should NOT include any data pointer.)
// gEfiSmmSwDispatch2ProtocolGuid: (EFI_SMM_SW_REGISTER_CONTEXT => SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT)
// gEfiSmmSxDispatch2ProtocolGuid: EFI_SMM_SX_REGISTER_CONTEXT
// gEfiSmmPowerButtonDispatch2ProtocolGuid: EFI_SMM_POWER_BUTTON_REGISTER_CONTEXT
// gEfiSmmStandbyButtonDispatch2ProtocolGuid: EFI_SMM_STANDBY_BUTTON_REGISTER_CONTEXT
// gEfiSmmPeriodicTimerDispatch2ProtocolGuid: EFI_SMM_PERIODIC_TIMER_CONTEXT
// gEfiSmmGpiDispatch2ProtocolGuid: EFI_SMM_GPI_REGISTER_CONTEXT
// gEfiSmmIoTrapDispatch2ProtocolGuid: EFI_SMM_IO_TRAP_REGISTER_CONTEXT
// gEfiSmmUsbDispatch2ProtocolGuid: (EFI_SMM_USB_REGISTER_CONTEXT => SMI_HANDLER_PROFILE_USB_REGISTER_CONTEXT)
// Other: GUID specific
typedef struct {
EFI_USB_SMI_TYPE Type;
UINT32 DevicePathSize;
// UINT8 DevicePath[DevicePathSize];
} SMI_HANDLER_PROFILE_USB_REGISTER_CONTEXT;
typedef struct {
UINT64 SwSmiInputValue;
} SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT;
typedef struct {
UINT32 Length;
UINT32 ImageRef;
PHYSICAL_ADDRESS CallerAddr;
PHYSICAL_ADDRESS Handler;
UINT16 ContextBufferOffset;
UINT8 Reserved[2];
UINT32 ContextBufferSize;
// UINT8 ContextBuffer[];
} SMM_CORE_SMI_HANDLER_STRUCTURE;
typedef struct {
SMM_CORE_DATABASE_COMMON_HEADER Header;
EFI_GUID HandlerType;
UINT32 HandlerCategory;
UINT32 HandlerCount;
// SMM_CORE_SMI_HANDLER_STRUCTURE Handler[HandlerCount];
} SMM_CORE_SMI_DATABASE_STRUCTURE;
//
// Layout:
// +-------------------------------------+
// | SMM_CORE_IMAGE_DATABASE_STRUCTURE |
// +-------------------------------------+
// | SMM_CORE_SMI_DATABASE_STRUCTURE |
// +-------------------------------------+
//
//
// SMM_CORE dump command
//
#define SMI_HANDLER_PROFILE_COMMAND_GET_INFO 0x1
#define SMI_HANDLER_PROFILE_COMMAND_GET_DATA_BY_OFFSET 0x2
typedef struct {
UINT32 Command;
UINT32 DataLength;
UINT64 ReturnStatus;
} SMI_HANDLER_PROFILE_PARAMETER_HEADER;
typedef struct {
SMI_HANDLER_PROFILE_PARAMETER_HEADER Header;
UINT64 DataSize;
} SMI_HANDLER_PROFILE_PARAMETER_GET_INFO;
typedef struct {
SMI_HANDLER_PROFILE_PARAMETER_HEADER Header;
//
// On input, data buffer size.
// On output, actual data buffer size copied.
//
UINT64 DataSize;
PHYSICAL_ADDRESS DataBuffer;
//
// On input, data buffer offset to copy.
// On output, next time data buffer offset to copy.
//
UINT64 DataOffset;
} SMI_HANDLER_PROFILE_PARAMETER_GET_DATA_BY_OFFSET;
#define SMI_HANDLER_PROFILE_GUID {0x49174342, 0x7108, 0x409b, {0x8b, 0xbe, 0x65, 0xfd, 0xa8, 0x53, 0x89, 0xf5}}
extern EFI_GUID gSmiHandlerProfileGuid;
typedef struct _SMI_HANDLER_PROFILE_PROTOCOL SMI_HANDLER_PROFILE_PROTOCOL;
/**
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.
**/
typedef
EFI_STATUS
(EFIAPI *SMI_HANDLER_PROFILE_REGISTER_HANDLER)(
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.
**/
typedef
EFI_STATUS
(EFIAPI *SMI_HANDLER_PROFILE_UNREGISTER_HANDLER)(
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
);
struct _SMI_HANDLER_PROFILE_PROTOCOL {
SMI_HANDLER_PROFILE_REGISTER_HANDLER RegisterHandler;
SMI_HANDLER_PROFILE_UNREGISTER_HANDLER UnregisterHandler;
};
#endif