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
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)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
SmmControl2Clear(IN CONST EFI_SMM_CONTROL2_PROTOCOL * This,IN BOOLEAN Periodic OPTIONAL)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
SetVirtualAddressNotify(IN EFI_EVENT Event,IN VOID * Context)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
SmmControl2ThunkMain(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE * SystemTable)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