/** @file | |
Header file for SMI handler profile definition. | |
Copyright (c) 2017, Intel Corporation. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#ifndef _SMI_HANDLER_PROFILE_H_ | |
#define _SMI_HANDLER_PROFILE_H_ | |
#include <PiSmm.h> | |
#include <Protocol/SmmGpiDispatch2.h> | |
#include <Protocol/SmmIoTrapDispatch2.h> | |
#include <Protocol/SmmPeriodicTimerDispatch2.h> | |
#include <Protocol/SmmPowerButtonDispatch2.h> | |
#include <Protocol/SmmStandbyButtonDispatch2.h> | |
#include <Protocol/SmmSwDispatch2.h> | |
#include <Protocol/SmmSxDispatch2.h> | |
#include <Protocol/SmmUsbDispatch2.h> | |
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 |