signed-off-by: rsun3 reviewed-by: lgao4 git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12743 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			166 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  SMM Control2 Protocol on SMM Control Protocol Thunk driver.
 | 
						|
 | 
						|
  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.
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#include "SmmControl2OnSmmControlThunk.h"
 | 
						|
 | 
						|
EFI_SMM_CONTROL2_PROTOCOL gSmmControl2 = {
 | 
						|
  SmmControl2Trigger,
 | 
						|
  SmmControl2Clear,
 | 
						|
  0
 | 
						|
};
 | 
						|
 | 
						|
EFI_SMM_CONTROL_PROTOCOL  *mSmmControl;
 | 
						|
UINT8                      mDataPort;
 | 
						|
 | 
						|
/**
 | 
						|
  Invokes SMI activation from either the preboot or runtime environment.
 | 
						|
 | 
						|
  This function generates an SMI.
 | 
						|
 | 
						|
  @param[in]     This                The EFI_SMM_CONTROL2_PROTOCOL instance.
 | 
						|
  @param[in, out] CommandPort         The value written to the command port.
 | 
						|
  @param[in, out] DataPort            The value written to the data port.
 | 
						|
  @param[in]     Periodic            Optional mechanism to engender a periodic stream.
 | 
						|
  @param[in]     ActivationInterval  Optional parameter to repeat at this period one
 | 
						|
                                     time or, if the Periodic Boolean is set, periodically.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS            The SMI/PMI has been engendered.
 | 
						|
  @retval EFI_DEVICE_ERROR       The timing is unsupported.
 | 
						|
  @retval EFI_INVALID_PARAMETER  The activation period is unsupported.
 | 
						|
  @retval EFI_INVALID_PARAMETER  The last periodic activation has not been cleared. 
 | 
						|
  @retval EFI_NOT_STARTED        The SMM base service has not been initialized.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
SmmControl2Trigger (
 | 
						|
  IN CONST EFI_SMM_CONTROL2_PROTOCOL  *This,
 | 
						|
  IN OUT UINT8                        *CommandPort       OPTIONAL,
 | 
						|
  IN OUT UINT8                        *DataPort          OPTIONAL,
 | 
						|
  IN BOOLEAN                          Periodic           OPTIONAL,
 | 
						|
  IN UINTN                            ActivationInterval OPTIONAL
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINTN  ArgumentBufferSize;
 | 
						|
 | 
						|
  ArgumentBufferSize = 0;
 | 
						|
  if (CommandPort != NULL) {
 | 
						|
    ArgumentBufferSize = 1;
 | 
						|
  }
 | 
						|
  if (DataPort != NULL) {
 | 
						|
    IoWrite8 (mDataPort, *DataPort);
 | 
						|
  }
 | 
						|
  return mSmmControl->Trigger (mSmmControl, (INT8 *)CommandPort, &ArgumentBufferSize, Periodic, ActivationInterval);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Clears any system state that was created in response to the Trigger() call.
 | 
						|
 | 
						|
  This function acknowledges and causes the deassertion of the SMI activation source.
 | 
						|
 | 
						|
  @param[in] This                The EFI_SMM_CONTROL2_PROTOCOL instance.
 | 
						|
  @param[in] Periodic            Optional parameter to repeat at this period one time
 | 
						|
 | 
						|
  @retval EFI_SUCCESS            The SMI/PMI has been engendered.
 | 
						|
  @retval EFI_DEVICE_ERROR       The source could not be cleared.
 | 
						|
  @retval EFI_INVALID_PARAMETER  The service did not support the Periodic input argument.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
SmmControl2Clear (
 | 
						|
  IN CONST EFI_SMM_CONTROL2_PROTOCOL  *This,
 | 
						|
  IN BOOLEAN                          Periodic OPTIONAL
 | 
						|
  )
 | 
						|
{
 | 
						|
  return mSmmControl->Clear (mSmmControl, Periodic);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Notification function of EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE.
 | 
						|
 | 
						|
  This is a notification function registered on EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE event.
 | 
						|
  It convers pointer to new virtual address.
 | 
						|
 | 
						|
  @param[in]  Event        Event whose notification function is being invoked.
 | 
						|
  @param[in]  Context      Pointer to the notification function's context.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
SetVirtualAddressNotify (
 | 
						|
  IN EFI_EVENT  Event,
 | 
						|
  IN VOID       *Context
 | 
						|
  )
 | 
						|
{
 | 
						|
  EfiConvertPointer (0x0, (VOID **)&mSmmControl);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Entry Point for this thunk driver.
 | 
						|
 | 
						|
  @param[in] ImageHandle  Image handle of this driver.
 | 
						|
  @param[in] SystemTable  A Pointer to the EFI System Table.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS  The entry point is executed successfully.
 | 
						|
  @retval other        Some error occurred when executing this entry point.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
SmmControl2ThunkMain (
 | 
						|
  IN EFI_HANDLE        ImageHandle,
 | 
						|
  IN EFI_SYSTEM_TABLE  *SystemTable
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS               Status;
 | 
						|
  EFI_EVENT                Event;
 | 
						|
  EFI_SMM_CONTROL_REGISTER RegisterInfo;
 | 
						|
 | 
						|
  ///
 | 
						|
  /// Locate Framework SMM Control Protocol
 | 
						|
  ///
 | 
						|
  Status = gBS->LocateProtocol (&gEfiSmmControlProtocolGuid, NULL, (VOID **)&mSmmControl);
 | 
						|
  ASSERT_EFI_ERROR (Status);
 | 
						|
 | 
						|
  gSmmControl2.MinimumTriggerPeriod = mSmmControl->MinimumTriggerPeriod;
 | 
						|
 | 
						|
  Status = mSmmControl->GetRegisterInfo (mSmmControl, &RegisterInfo);
 | 
						|
  ASSERT_EFI_ERROR (Status);
 | 
						|
  mDataPort = RegisterInfo.SmiDataRegister;
 | 
						|
 | 
						|
  ///
 | 
						|
  /// Create event on SetVirtualAddressMap() to convert mSmmControl from a physical address to a virtual address
 | 
						|
  ///
 | 
						|
  Status = gBS->CreateEventEx (
 | 
						|
                  EVT_NOTIFY_SIGNAL,
 | 
						|
                  TPL_NOTIFY,
 | 
						|
                  SetVirtualAddressNotify,
 | 
						|
                  NULL,
 | 
						|
                  &gEfiEventVirtualAddressChangeGuid,
 | 
						|
                  &Event
 | 
						|
                  );
 | 
						|
                  
 | 
						|
  ASSERT_EFI_ERROR (Status);
 | 
						|
 | 
						|
  ///
 | 
						|
  /// Publish framework SMM Control Protocol
 | 
						|
  ///
 | 
						|
  Status = gBS->InstallProtocolInterface (
 | 
						|
                  &ImageHandle,
 | 
						|
                  &gEfiSmmControl2ProtocolGuid,
 | 
						|
                  EFI_NATIVE_INTERFACE,
 | 
						|
                  &gSmmControl2
 | 
						|
                  );
 | 
						|
  return Status;
 | 
						|
}
 | 
						|
 |