diff options
author | raywu <raywu0301@gmail.com> | 2018-06-15 00:00:50 +0800 |
---|---|---|
committer | raywu <raywu0301@gmail.com> | 2018-06-15 00:00:50 +0800 |
commit | b7c51c9cf4864df6aabb99a1ae843becd577237c (patch) | |
tree | eebe9b0d0ca03062955223097e57da84dd618b9a /CRB/CRBSmi.c | |
download | zprj-b7c51c9cf4864df6aabb99a1ae843becd577237c.tar.xz |
Diffstat (limited to 'CRB/CRBSmi.c')
-rw-r--r-- | CRB/CRBSmi.c | 418 |
1 files changed, 418 insertions, 0 deletions
diff --git a/CRB/CRBSmi.c b/CRB/CRBSmi.c new file mode 100644 index 0000000..208a0eb --- /dev/null +++ b/CRB/CRBSmi.c @@ -0,0 +1,418 @@ +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2013, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* + +//************************************************************************* +// $Header: /Alaska/Projects/Intel/Haswell/LynxPoint_SharkBay-DT_Crb_1AQQW/CRB/CRBSmi.c 2 4/16/13 5:29a Thomaschen $ +// +// $Revision: 2 $ +// +// $Date: 4/16/13 5:29a $ +//************************************************************************* +// Revision History +// ---------------- +// $Log: /Alaska/Projects/Intel/Haswell/LynxPoint_SharkBay-DT_Crb_1AQQW/CRB/CRBSmi.c $ +// +// 2 4/16/13 5:29a Thomaschen +// +// 1 2/12/12 10:38p Victortu +// Intel SharkBay CRB initially releases. +// +//************************************************************************* +//<AMI_FHDR_START> +// +// Name: CRBSMI.c +// +// Description: This file contains code for all CRB SMI events +// +//<AMI_FHDR_END> +//************************************************************************* + +//--------------------------------------------------------------------------- +// Include(s) +//--------------------------------------------------------------------------- + +#include <Token.h> +#include <AmiDxeLib.h> +#include <AmiCspLib.h> + +// Produced Protocols + +// Consumed Protocols +#if defined(PI_SPECIFICATION_VERSION)&&(PI_SPECIFICATION_VERSION>=0x0001000A) +#include <Protocol\S3SmmSaveState.h> +#include <Protocol\SmmBase2.h> +#include <Protocol\SmmSwDispatch2.h> +#include <Protocol\SmmSxDispatch2.h> +#else +#include <Protocol\SmmBase.h> +#include <Protocol\SmmSwDispatch.h> +#include <Protocol\SmmSxDispatch.h> +#endif + +//--------------------------------------------------------------------------- +// Constant, Macro and Type Definition(s) +//--------------------------------------------------------------------------- +// Constant Definition(s) + +#if defined(PI_SPECIFICATION_VERSION)&&(PI_SPECIFICATION_VERSION>=0x0001000A) +#define CRB_S3_SAVE_PROTOCOL EFI_S3_SAVE_STATE_PROTOCOL +#define CRB_SMM_SW_DISPATCH_PROTOCOL EFI_SMM_SW_DISPATCH2_PROTOCOL +#define CRB_SMM_SW_DISPATCH_CONTEXT EFI_SMM_SW_REGISTER_CONTEXT +#define CRB_SMM_SX_DISPATCH_PROTOCOL EFI_SMM_SX_DISPATCH2_PROTOCOL +#define CRB_SMM_SX_DISPATCH_CONTEXT EFI_SMM_SX_REGISTER_CONTEXT +#define SMM_CHILD_DISPATCH_SUCCESS EFI_SUCCESS +#else +#define CRB_S3_SAVE_PROTOCOL EFI_BOOT_SCRIPT_SAVE_PROTOCOL +#define CRB_SMM_SW_DISPATCH_PROTOCOL EFI_SMM_SW_DISPATCH_PROTOCOL +#define CRB_SMM_SW_DISPATCH_CONTEXT EFI_SMM_SW_DISPATCH_CONTEXT +#define CRB_SMM_SX_DISPATCH_PROTOCOL EFI_SMM_SX_DISPATCH_PROTOCOL +#define CRB_SMM_SX_DISPATCH_CONTEXT EFI_SMM_SX_DISPATCH_CONTEXT +#define SMM_CHILD_DISPATCH_SUCCESS +#endif + +// Macro Definition(s) + +// Type Definition(s) + +// Function Prototype(s) + +//--------------------------------------------------------------------------- +// Variable and External Declaration(s) +//--------------------------------------------------------------------------- +// Variable Declaration(s) + +CRB_S3_SAVE_PROTOCOL *gBootScriptSave = NULL; + +// GUID Definition(s) + +// Protocol Definition(s) + +// External Declaration(s) + +// Function Definition(s) + +//--------------------------------------------------------------------------- + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: GetCRBSmiContext +// +// Description: This is a template CRB SMI GetContext for Porting. +// +// Input: None +// +// Output: None +// +// Notes: Here is the control flow of this function: +// 1. Check if CRB Smi source. +// 2. If yes, return TRUE. +// 3. If not, return FALSE. +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +BOOLEAN GetCRBSmiContext (VOID) +{ + // Porting if needed + return FALSE; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: CRBSmiHandler +// +// Description: This is a template CRB SMI Handler for Porting. +// +// Input: None +// +// Output: None +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +VOID CRBSmiHandler (VOID) +{ + // Porting if needed +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: CRBSwSmiHandler +// +// Description: This is a template CRB software SMI Handler for Porting. +// +// Input: PI 0.91, 1.0 +// DispatchHandle - SMI dispatcher handle +// *DispatchContext - Pointer to the dispatch context +// PI 1.1, 1.2 +// DispatchHandle - SMI dispatcher handle +// *DispatchContext- Points to an optional S/W SMI context +// CommBuffer - Points to the optional communication +// buffer +// CommBufferSize - Points to the size of the optional +// communication buffer +// +// Output: EFI_STATUS if the new SMM PI is applied. +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +#if defined(PI_SPECIFICATION_VERSION)&&(PI_SPECIFICATION_VERSION>=0x0001000A) +EFI_STATUS CRBSwSmiHandler ( + IN EFI_HANDLE DispatchHandle, + IN CONST VOID *DispatchContext OPTIONAL, + IN OUT VOID *CommBuffer OPTIONAL, + IN OUT UINTN *CommBufferSize OPTIONAL ) +#else +VOID CRBSwSmiHandler ( + IN EFI_HANDLE DispatchHandle, + IN EFI_SMM_SW_DISPATCH_CONTEXT *DispatchContext ) +#endif +{ + // Porting if needed + return SMM_CHILD_DISPATCH_SUCCESS; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: CRBSxSmiHandler +// +// Description: This is a template CRB Sx SMI Handler for Porting. +// +// Input: PI 0.91, 1.0 +// DispatchHandle - SMI dispatcher handle +// *DispatchContext - Pointer to the dispatch context +// PI 1.1, 1.2 +// DispatchHandle - SMI dispatcher handle +// *DispatchContext- Points to an optional Sx SMI context +// CommBuffer - Points to the optional communication +// buffer +// CommBufferSize - Points to the size of the optional +// communication buffer +// +// Output: EFI_STATUS if the new SMM PI is applied. +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +#if defined(PI_SPECIFICATION_VERSION)&&(PI_SPECIFICATION_VERSION>=0x0001000A) +EFI_STATUS CRBSxSmiHandler ( + IN EFI_HANDLE DispatchHandle, + IN CONST VOID *DispatchContext OPTIONAL, + IN OUT VOID *CommBuffer OPTIONAL, + IN OUT UINTN *CommBufferSize OPTIONAL ) +#else +VOID CRBSxSmiHandler ( + IN EFI_HANDLE DispatchHandle, + IN EFI_SMM_SX_DISPATCH_CONTEXT *DispatchContext ) +#endif +{ + // Porting if needed + return SMM_CHILD_DISPATCH_SUCCESS; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: CRBChildDispatcher +// +// Description: This is an entry for CRB SMM Child Dispatcher Handler. +// +// Input: PI 0.91, 1.0 +// SmmImageHandle - SMI Image Hander +// *CommunicationBuffer - Pointer to optional communication +// buffer +// *SourceSize - Pointer to size of communication +// buffer +// PI 1.1, 1.2 +// DispatchHandle - SMI dispatcher handle +// *DispatchContext- Pointer to the dispatched context +// CommBuffer - Pointer to a collection of data in +// memory that will be conveyed from a +// non-SMM environment into an SMM +// environment +// CommBufferSize - Pointer to the size of the CommBuffer +// +// Output: EFI_STATUS +// EFI_HANDLER_SUCCESS +// +// Referrals: GetCRBSmiContext, CRBSmiHandler +// +// Notes: Here is the control flow of this function: +// 1. Read SMI source status registers. +// 2. If source, call handler. +// 3. Repeat #2 for all sources registered. +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +EFI_STATUS CRBChildDispatcher ( +#if defined(PI_SPECIFICATION_VERSION)&&(PI_SPECIFICATION_VERSION>=0x0001000A) + IN EFI_HANDLE DispatchHandle, + IN CONST VOID *DispatchContext OPTIONAL, + IN OUT VOID *CommBuffer OPTIONAL, + IN OUT UINTN *CommBufferSize OPTIONAL ) +#else + IN EFI_HANDLE SmmImageHandle, + IN OUT VOID *CommunicationBuffer OPTIONAL, + IN OUT UINTN *SourceSize OPTIONAL ) +#endif +{ + if (GetCRBSmiContext()) CRBSmiHandler(); + + return EFI_HANDLER_SUCCESS; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: InSmmFunction +// +// Description: Installs CRB SMM Child Dispatcher Handler. +// +// Input: ImageHandle - Image handle +// *SystemTable - Pointer to the system table +// +// Output: EFI_STATUS +// EFI_NOT_FOUND - The SMM Base protocol is not found. +// EFI_SUCCESS - Installs CRB SMM Child Dispatcher Handler +// successfully. +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +EFI_STATUS InSmmFunction ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable ) +{ + EFI_STATUS Status; + CRB_SMM_SW_DISPATCH_PROTOCOL *pSwDispatch; + CRB_SMM_SX_DISPATCH_PROTOCOL *pSxDispatch; + CRB_SMM_SW_DISPATCH_CONTEXT SwContext = {CRB_SWSMI}; + CRB_SMM_SX_DISPATCH_CONTEXT SxContext = {SxS3, SxEntry}; + EFI_HANDLE Handle; +#if defined(PI_SPECIFICATION_VERSION)&&(PI_SPECIFICATION_VERSION>=0x0001000A) + EFI_HANDLE RootHandle; +#else + EFI_SMM_BASE_PROTOCOL *SmmBaseProtocol; +#endif + +#if defined(PI_SPECIFICATION_VERSION)&&(PI_SPECIFICATION_VERSION>=0x0001000A) + Status = InitAmiSmmLib( ImageHandle, SystemTable ); + if (EFI_ERROR(Status)) return Status; + + Status = pSmst->SmmLocateProtocol( &gEfiSmmSwDispatch2ProtocolGuid, \ + NULL, \ + &pSwDispatch ); + if (!EFI_ERROR(Status)) { + Status = pSwDispatch->Register( pSwDispatch, \ + CRBSwSmiHandler, \ + &SwContext, \ + &Handle ); + } + + Status = pSmst->SmmLocateProtocol( &gEfiSmmSxDispatch2ProtocolGuid, \ + NULL, \ + &pSxDispatch ); + if (!EFI_ERROR(Status)) { + Status = pSxDispatch->Register( pSxDispatch, \ + CRBSxSmiHandler, \ + &SxContext, \ + &Handle ); + } + + Status = pSmst->SmmLocateProtocol( &gEfiS3SmmSaveStateProtocolGuid, \ + NULL, \ + &gBootScriptSave ); + ASSERT_EFI_ERROR(Status); + + Status = pSmst->SmiHandlerRegister( CRBChildDispatcher, \ + NULL, \ + &RootHandle ); +#else + Status = pBS->LocateProtocol( &gEfiSmmBaseProtocolGuid, \ + NULL, \ + &SmmBaseProtocol ); + if (EFI_ERROR(Status)) return Status; + + Status = pBS->LocateProtocol( &gEfiSmmSwDispatchProtocolGuid, \ + NULL, \ + &pSwDispatch ); + if (!EFI_ERROR(Status)) { + Status = pSwDispatch->Register( pSwDispatch, \ + CRBSwSmiHandler, \ + &SwContext, \ + &Handle ); + } + + Status = pBS->LocateProtocol( &gEfiSmmSxDispatchProtocolGuid, \ + NULL, \ + &pSxDispatch ); + if (!EFI_ERROR(Status)) { + Status = pSxDispatch->Register( pSxDispatch, \ + CRBSxSmiHandler, \ + &SxContext, \ + &Handle ); + } + + Status = pBS->LocateProtocol( &gEfiBootScriptSaveGuid, \ + NULL, \ + &gBootScriptSave ); + ASSERT_EFI_ERROR(Status); + + //Register call backs + Status = SmmBaseProtocol->RegisterCallback( SmmBaseProtocol, \ + ImageHandle, \ + CRBChildDispatcher, \ + FALSE, \ + FALSE ); +#endif + return Status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: InitializeCRBSmm +// +// Description: Installs CRB SMM Child Dispatcher Handler. +// +// Input: ImageHandle - Image handle +// *SystemTable - Pointer to the system table +// +// Output: EFI_STATUS +// EFI_NOT_FOUND - The SMM Base protocol is not found. +// EFI_SUCCESS - Installs CRB SMM Child Dispatcher Handler +// successfully. +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +EFI_STATUS InitializeCRBSmm ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable ) +{ + InitAmiLib(ImageHandle, SystemTable); + return InitSmmHandler(ImageHandle, SystemTable, InSmmFunction, NULL); +} + +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2013, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* |