]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/SmmControl2OnSmmControlThunk/SmmControl2OnSmmControlThunk.c
PI 1.2 Errata C: A new return condition is added for the returned status code EFI_INV...
[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
787b2f1b 4 Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
584d5652 5 This program and the accompanying materials\r
9e620719 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
787b2f1b 41 @retval EFI_INVALID_PARAMETER The last periodic activation has not been cleared. \r
9e620719 42 @retval EFI_NOT_STARTED The SMM base service has not been initialized.\r
43**/\r
44EFI_STATUS\r
45EFIAPI\r
46SmmControl2Trigger (\r
47 IN CONST EFI_SMM_CONTROL2_PROTOCOL *This,\r
48 IN OUT UINT8 *CommandPort OPTIONAL,\r
49 IN OUT UINT8 *DataPort OPTIONAL,\r
50 IN BOOLEAN Periodic OPTIONAL,\r
51 IN UINTN ActivationInterval OPTIONAL\r
52 )\r
53{\r
26a76fbc 54 UINTN ArgumentBufferSize;\r
9e620719 55\r
26a76fbc 56 ArgumentBufferSize = 0;\r
9e620719 57 if (CommandPort != NULL) {\r
58 ArgumentBufferSize = 1;\r
59 }\r
60 if (DataPort != NULL) {\r
61 IoWrite8 (mDataPort, *DataPort);\r
62 }\r
63 return mSmmControl->Trigger (mSmmControl, (INT8 *)CommandPort, &ArgumentBufferSize, Periodic, ActivationInterval);\r
64}\r
65\r
66/**\r
67 Clears any system state that was created in response to the Trigger() call.\r
68\r
69 This function acknowledges and causes the deassertion of the SMI activation source.\r
70\r
71 @param[in] This The EFI_SMM_CONTROL2_PROTOCOL instance.\r
72 @param[in] Periodic Optional parameter to repeat at this period one time\r
73\r
74 @retval EFI_SUCCESS The SMI/PMI has been engendered.\r
75 @retval EFI_DEVICE_ERROR The source could not be cleared.\r
76 @retval EFI_INVALID_PARAMETER The service did not support the Periodic input argument.\r
77**/\r
78EFI_STATUS\r
79EFIAPI\r
80SmmControl2Clear (\r
81 IN CONST EFI_SMM_CONTROL2_PROTOCOL *This,\r
82 IN BOOLEAN Periodic OPTIONAL\r
83 )\r
84{\r
85 return mSmmControl->Clear (mSmmControl, Periodic);\r
86}\r
87\r
1fafcca8 88/**\r
89 Notification function of EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE.\r
90\r
91 This is a notification function registered on EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE event.\r
92 It convers pointer to new virtual address.\r
93\r
94 @param[in] Event Event whose notification function is being invoked.\r
95 @param[in] Context Pointer to the notification function's context.\r
96\r
97**/\r
98VOID\r
99EFIAPI\r
100SetVirtualAddressNotify (\r
101 IN EFI_EVENT Event,\r
102 IN VOID *Context\r
103 )\r
104{\r
105 EfiConvertPointer (0x0, (VOID **)&mSmmControl);\r
106}\r
107\r
9e620719 108/**\r
109 Entry Point for this thunk driver.\r
110\r
111 @param[in] ImageHandle Image handle of this driver.\r
112 @param[in] SystemTable A Pointer to the EFI System Table.\r
113\r
114 @retval EFI_SUCCESS The entry point is executed successfully.\r
115 @retval other Some error occurred when executing this entry point.\r
116**/\r
117EFI_STATUS\r
118EFIAPI\r
119SmmControl2ThunkMain (\r
120 IN EFI_HANDLE ImageHandle,\r
121 IN EFI_SYSTEM_TABLE *SystemTable\r
122 )\r
123{\r
124 EFI_STATUS Status;\r
1fafcca8 125 EFI_EVENT Event;\r
9e620719 126 EFI_SMM_CONTROL_REGISTER RegisterInfo;\r
127\r
128 ///\r
129 /// Locate Framework SMM Control Protocol\r
130 ///\r
131 Status = gBS->LocateProtocol (&gEfiSmmControlProtocolGuid, NULL, (VOID **)&mSmmControl);\r
132 ASSERT_EFI_ERROR (Status);\r
133\r
134 gSmmControl2.MinimumTriggerPeriod = mSmmControl->MinimumTriggerPeriod;\r
135\r
136 Status = mSmmControl->GetRegisterInfo (mSmmControl, &RegisterInfo);\r
137 ASSERT_EFI_ERROR (Status);\r
138 mDataPort = RegisterInfo.SmiDataRegister;\r
139\r
1fafcca8 140 ///\r
141 /// Create event on SetVirtualAddressMap() to convert mSmmControl from a physical address to a virtual address\r
142 ///\r
143 Status = gBS->CreateEventEx (\r
144 EVT_NOTIFY_SIGNAL,\r
145 TPL_NOTIFY,\r
146 SetVirtualAddressNotify,\r
147 NULL,\r
148 &gEfiEventVirtualAddressChangeGuid,\r
149 &Event\r
150 );\r
151 \r
152 ASSERT_EFI_ERROR (Status);\r
153\r
9e620719 154 ///\r
155 /// Publish framework SMM Control Protocol\r
156 ///\r
157 Status = gBS->InstallProtocolInterface (\r
158 &ImageHandle,\r
159 &gEfiSmmControl2ProtocolGuid,\r
160 EFI_NATIVE_INTERFACE,\r
161 &gSmmControl2\r
162 );\r
163 return Status;\r
164}\r
165\r