1 /** @file 2 SMM Control2 Protocol on SMM Control Protocol Thunk driver. 3 4 Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR> 5 This program and the accompanying materials 6 are licensed and made available under the terms and conditions of the BSD License 7 which accompanies this distribution. The full text of the license may be found at 8 http://opensource.org/licenses/bsd-license.php 9 10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 13 **/ 14 15 #include "SmmControl2OnSmmControlThunk.h" 16 17 EFI_SMM_CONTROL2_PROTOCOL gSmmControl2 = { 18 SmmControl2Trigger, 19 SmmControl2Clear, 20 0 21 }; 22 23 EFI_SMM_CONTROL_PROTOCOL *mSmmControl; 24 UINT8 mDataPort; 25 26 /** 27 Invokes SMI activation from either the preboot or runtime environment. 28 29 This function generates an SMI. 30 31 @param[in] This The EFI_SMM_CONTROL2_PROTOCOL instance. 32 @param[in, out] CommandPort The value written to the command port. 33 @param[in, out] DataPort The value written to the data port. 34 @param[in] Periodic Optional mechanism to engender a periodic stream. 35 @param[in] ActivationInterval Optional parameter to repeat at this period one 36 time or, if the Periodic Boolean is set, periodically. 37 38 @retval EFI_SUCCESS The SMI/PMI has been engendered. 39 @retval EFI_DEVICE_ERROR The timing is unsupported. 40 @retval EFI_INVALID_PARAMETER The activation period is unsupported. 41 @retval EFI_INVALID_PARAMETER The last periodic activation has not been cleared. 42 @retval EFI_NOT_STARTED The SMM base service has not been initialized. 43 **/ 44 EFI_STATUS 45 EFIAPI 46 SmmControl2Trigger ( 47 IN CONST EFI_SMM_CONTROL2_PROTOCOL *This, 48 IN OUT UINT8 *CommandPort OPTIONAL, 49 IN OUT UINT8 *DataPort OPTIONAL, 50 IN BOOLEAN Periodic OPTIONAL, 51 IN UINTN ActivationInterval OPTIONAL 52 ) 53 { 54 UINTN ArgumentBufferSize; 55 56 ArgumentBufferSize = 0; 57 if (CommandPort != NULL) { 58 ArgumentBufferSize = 1; 59 } 60 if (DataPort != NULL) { 61 IoWrite8 (mDataPort, *DataPort); 62 } 63 return mSmmControl->Trigger (mSmmControl, (INT8 *)CommandPort, &ArgumentBufferSize, Periodic, ActivationInterval); 64 } 65 66 /** 67 Clears any system state that was created in response to the Trigger() call. 68 69 This function acknowledges and causes the deassertion of the SMI activation source. 70 71 @param[in] This The EFI_SMM_CONTROL2_PROTOCOL instance. 72 @param[in] Periodic Optional parameter to repeat at this period one time 73 74 @retval EFI_SUCCESS The SMI/PMI has been engendered. 75 @retval EFI_DEVICE_ERROR The source could not be cleared. 76 @retval EFI_INVALID_PARAMETER The service did not support the Periodic input argument. 77 **/ 78 EFI_STATUS 79 EFIAPI 80 SmmControl2Clear ( 81 IN CONST EFI_SMM_CONTROL2_PROTOCOL *This, 82 IN BOOLEAN Periodic OPTIONAL 83 ) 84 { 85 return mSmmControl->Clear (mSmmControl, Periodic); 86 } 87 88 /** 89 Notification function of EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE. 90 91 This is a notification function registered on EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE event. 92 It convers pointer to new virtual address. 93 94 @param[in] Event Event whose notification function is being invoked. 95 @param[in] Context Pointer to the notification function's context. 96 97 **/ 98 VOID 99 EFIAPI 100 SetVirtualAddressNotify ( 101 IN EFI_EVENT Event, 102 IN VOID *Context 103 ) 104 { 105 EfiConvertPointer (0x0, (VOID **)&mSmmControl); 106 } 107 108 /** 109 Entry Point for this thunk driver. 110 111 @param[in] ImageHandle Image handle of this driver. 112 @param[in] SystemTable A Pointer to the EFI System Table. 113 114 @retval EFI_SUCCESS The entry point is executed successfully. 115 @retval other Some error occurred when executing this entry point. 116 **/ 117 EFI_STATUS 118 EFIAPI 119 SmmControl2ThunkMain ( 120 IN EFI_HANDLE ImageHandle, 121 IN EFI_SYSTEM_TABLE *SystemTable 122 ) 123 { 124 EFI_STATUS Status; 125 EFI_EVENT Event; 126 EFI_SMM_CONTROL_REGISTER RegisterInfo; 127 128 /// 129 /// Locate Framework SMM Control Protocol 130 /// 131 Status = gBS->LocateProtocol (&gEfiSmmControlProtocolGuid, NULL, (VOID **)&mSmmControl); 132 ASSERT_EFI_ERROR (Status); 133 134 gSmmControl2.MinimumTriggerPeriod = mSmmControl->MinimumTriggerPeriod; 135 136 Status = mSmmControl->GetRegisterInfo (mSmmControl, &RegisterInfo); 137 ASSERT_EFI_ERROR (Status); 138 mDataPort = RegisterInfo.SmiDataRegister; 139 140 /// 141 /// Create event on SetVirtualAddressMap() to convert mSmmControl from a physical address to a virtual address 142 /// 143 Status = gBS->CreateEventEx ( 144 EVT_NOTIFY_SIGNAL, 145 TPL_NOTIFY, 146 SetVirtualAddressNotify, 147 NULL, 148 &gEfiEventVirtualAddressChangeGuid, 149 &Event 150 ); 151 152 ASSERT_EFI_ERROR (Status); 153 154 /// 155 /// Publish framework SMM Control Protocol 156 /// 157 Status = gBS->InstallProtocolInterface ( 158 &ImageHandle, 159 &gEfiSmmControl2ProtocolGuid, 160 EFI_NATIVE_INTERFACE, 161 &gSmmControl2 162 ); 163 return Status; 164 } 165 166