| /** @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 |