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