+++ /dev/null
-/** @file\r
- SMM Control2 Protocol on SMM Control Protocol Thunk driver.\r
-\r
- Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
- This program and the accompanying materials\r
- are licensed and made available under the terms and conditions of the BSD License\r
- which accompanies this distribution. The full text of the license may be found at\r
- http://opensource.org/licenses/bsd-license.php\r
-\r
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include "SmmControl2OnSmmControlThunk.h"\r
-\r
-EFI_SMM_CONTROL2_PROTOCOL gSmmControl2 = {\r
- SmmControl2Trigger,\r
- SmmControl2Clear,\r
- 0\r
-};\r
-\r
-EFI_SMM_CONTROL_PROTOCOL *mSmmControl;\r
-UINT8 mDataPort;\r
-\r
-/**\r
- Invokes SMI activation from either the preboot or runtime environment.\r
-\r
- This function generates an SMI.\r
-\r
- @param[in] This The EFI_SMM_CONTROL2_PROTOCOL instance.\r
- @param[in, out] CommandPort The value written to the command port.\r
- @param[in, out] DataPort The value written to the data port.\r
- @param[in] Periodic Optional mechanism to engender a periodic stream.\r
- @param[in] ActivationInterval Optional parameter to repeat at this period one\r
- time or, if the Periodic Boolean is set, periodically.\r
-\r
- @retval EFI_SUCCESS The SMI/PMI has been engendered.\r
- @retval EFI_DEVICE_ERROR The timing is unsupported.\r
- @retval EFI_INVALID_PARAMETER The activation period is unsupported.\r
- @retval EFI_INVALID_PARAMETER The last periodic activation has not been cleared. \r
- @retval EFI_NOT_STARTED The SMM base service has not been initialized.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-SmmControl2Trigger (\r
- IN CONST EFI_SMM_CONTROL2_PROTOCOL *This,\r
- IN OUT UINT8 *CommandPort OPTIONAL,\r
- IN OUT UINT8 *DataPort OPTIONAL,\r
- IN BOOLEAN Periodic OPTIONAL,\r
- IN UINTN ActivationInterval OPTIONAL\r
- )\r
-{\r
- UINTN ArgumentBufferSize;\r
-\r
- ArgumentBufferSize = 0;\r
- if (CommandPort != NULL) {\r
- ArgumentBufferSize = 1;\r
- }\r
- if (DataPort != NULL) {\r
- IoWrite8 (mDataPort, *DataPort);\r
- }\r
- return mSmmControl->Trigger (mSmmControl, (INT8 *)CommandPort, &ArgumentBufferSize, Periodic, ActivationInterval);\r
-}\r
-\r
-/**\r
- Clears any system state that was created in response to the Trigger() call.\r
-\r
- This function acknowledges and causes the deassertion of the SMI activation source.\r
-\r
- @param[in] This The EFI_SMM_CONTROL2_PROTOCOL instance.\r
- @param[in] Periodic Optional parameter to repeat at this period one time\r
-\r
- @retval EFI_SUCCESS The SMI/PMI has been engendered.\r
- @retval EFI_DEVICE_ERROR The source could not be cleared.\r
- @retval EFI_INVALID_PARAMETER The service did not support the Periodic input argument.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-SmmControl2Clear (\r
- IN CONST EFI_SMM_CONTROL2_PROTOCOL *This,\r
- IN BOOLEAN Periodic OPTIONAL\r
- )\r
-{\r
- return mSmmControl->Clear (mSmmControl, Periodic);\r
-}\r
-\r
-/**\r
- Notification function of EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE.\r
-\r
- This is a notification function registered on EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE event.\r
- It convers pointer to new virtual address.\r
-\r
- @param[in] Event Event whose notification function is being invoked.\r
- @param[in] Context Pointer to the notification function's context.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-SetVirtualAddressNotify (\r
- IN EFI_EVENT Event,\r
- IN VOID *Context\r
- )\r
-{\r
- EfiConvertPointer (0x0, (VOID **)&mSmmControl);\r
-}\r
-\r
-/**\r
- Entry Point for this thunk driver.\r
-\r
- @param[in] ImageHandle Image handle of this driver.\r
- @param[in] SystemTable A Pointer to the EFI System Table.\r
-\r
- @retval EFI_SUCCESS The entry point is executed successfully.\r
- @retval other Some error occurred when executing this entry point.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-SmmControl2ThunkMain (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_EVENT Event;\r
- EFI_SMM_CONTROL_REGISTER RegisterInfo;\r
-\r
- ///\r
- /// Locate Framework SMM Control Protocol\r
- ///\r
- Status = gBS->LocateProtocol (&gEfiSmmControlProtocolGuid, NULL, (VOID **)&mSmmControl);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- gSmmControl2.MinimumTriggerPeriod = mSmmControl->MinimumTriggerPeriod;\r
-\r
- Status = mSmmControl->GetRegisterInfo (mSmmControl, &RegisterInfo);\r
- ASSERT_EFI_ERROR (Status);\r
- mDataPort = RegisterInfo.SmiDataRegister;\r
-\r
- ///\r
- /// Create event on SetVirtualAddressMap() to convert mSmmControl from a physical address to a virtual address\r
- ///\r
- Status = gBS->CreateEventEx (\r
- EVT_NOTIFY_SIGNAL,\r
- TPL_NOTIFY,\r
- SetVirtualAddressNotify,\r
- NULL,\r
- &gEfiEventVirtualAddressChangeGuid,\r
- &Event\r
- );\r
- \r
- ASSERT_EFI_ERROR (Status);\r
-\r
- ///\r
- /// Publish framework SMM Control Protocol\r
- ///\r
- Status = gBS->InstallProtocolInterface (\r
- &ImageHandle,\r
- &gEfiSmmControl2ProtocolGuid,\r
- EFI_NATIVE_INTERFACE,\r
- &gSmmControl2\r
- );\r
- return Status;\r
-}\r
-\r