blob: 6515a7cd4e9450774c37af13f455990694608713 [file] [log] [blame]
/*++
Copyright (c) 2013 Intel Corporation.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
* Neither the name of Intel Corporation nor the names of its
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Module Name:
SmmRuntime.c
Abstract:
SMM Runtime Infrastructutre for the IA32 Runtime drivers.
--*/
#include "SmmRuntime.h"
EFI_SMM_RT_GLOBAL *SmmRtGlobal;
EFI_SMM_RUNTIME_PROTOCOL *mSmmRT = NULL;
EFI_STATUS
CheckCallbacks (
IN EFI_GUID *Protocol
)
/*++
Routine Description:
GC_TODO: Add function description
Arguments:
Protocol - GC_TODO: add argument description
Returns:
EFI_SUCCESS - GC_TODO: Add description for return value
--*/
{
UINTN i;
//
// Check if any notifications are pending.
//
for (i = 0; i < MAX_CALLBACK; i++) {
if (SmmRtGlobal->Callback[i].Valid) {
if (CompareGuid (Protocol, &SmmRtGlobal->Callback[i].ProtocolGuid)) {
SmmRtGlobal->Callback[i].CallbackFunction (
&SmmRtGlobal->Callback[i],
SmmRtGlobal->Callback[i].Context
);
}
}
}
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
SmmSignalCallback (
IN EFI_EVENT Event
)
/*++
Routine Description:
GC_TODO: Add function description
Arguments:
Event - GC_TODO: add argument description
Returns:
EFI_SUCCESS - GC_TODO: Add description for return value
--*/
{
EFI_SMM_CALLBACK_SERVICES *Callback;
Callback = (EFI_SMM_CALLBACK_SERVICES *) Event;
if (Callback->CallbackFunction != NULL) {
Callback->CallbackFunction (Event, Callback->Context);
}
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
SmmEnableProtocolNotifyCallback (
EFI_EVENT_NOTIFY CallbackFunction,
VOID *Context,
EFI_GUID *ProtocolGuid,
EFI_EVENT *Event
)
/*++
Routine Description:
GC_TODO: Add function description
Arguments:
CallbackFunction - GC_TODO: add argument description
Context - GC_TODO: add argument description
ProtocolGuid - GC_TODO: add argument description
Event - GC_TODO: add argument description
Returns:
EFI_SUCCESS - GC_TODO: Add description for return value
EFI_OUT_OF_RESOURCES - GC_TODO: Add description for return value
--*/
{
UINTN i;
for (i = 0; i < MAX_CALLBACK; i++) {
if (!SmmRtGlobal->Callback[i].Valid) {
SmmRtGlobal->Callback[i].Context = Context;
SmmRtGlobal->Callback[i].CallbackFunction = CallbackFunction;
CopyMem (&SmmRtGlobal->Callback[i].ProtocolGuid, ProtocolGuid, sizeof (EFI_GUID));
SmmRtGlobal->Callback[i].Valid = TRUE;
*Event = (EFI_EVENT) & SmmRtGlobal->Callback[i];
return EFI_SUCCESS;
}
}
return EFI_OUT_OF_RESOURCES;
}
EFI_STATUS
EFIAPI
SmmDisableProtocolNotifyCallback (
IN EFI_EVENT Event
)
/*++
Routine Description:
GC_TODO: Add function description
Arguments:
Event - GC_TODO: add argument description
Returns:
EFI_SUCCESS - GC_TODO: Add description for return value
--*/
{
EFI_SMM_CALLBACK_SERVICES *Callback;
Callback = (EFI_SMM_CALLBACK_SERVICES *) Event;
Callback->Valid = FALSE;
return EFI_SUCCESS;
}
EFI_STATUS
CheckServiceIndex (
IN UINTN Index,
IN EFI_GUID *Protocol,
OUT VOID **Interface
)
/*++
Routine Description:
This Function gets the protocol interface related with the Index and updates the
internal data index when protocol match is found.
Arguments:
Index - Relative Index where protocol match should be done
Protocol - Protocol that should be matched with at the input Index.
Interface - Pointer to the Interface that matches with the protocol at a given Index.
Returns:
EFI_SUCCESS - Protocol Match done successfully.
EFI_NOT_FOUND - Protocol Match couldn't be done.
--*/
{
if (SmmRtGlobal->Services[Index].Valid) {
if (CompareGuid (Protocol, &SmmRtGlobal->Services[Index].ProtocolGuid)) {
*Interface = SmmRtGlobal->Services[Index].Protocol;
SmmRtGlobal->CurrentIndex = Index;
return EFI_SUCCESS;
}
}
return EFI_NOT_FOUND;
}
EFI_STATUS
EFIAPI
LocateSmmProtocol (
EFI_GUID *Protocol,
VOID *Registration, OPTIONAL
VOID **Interface
)
/*++
Routine Description:
This Function locates the protocol interrface that satisfy the protocol GUID defination
Arguments:
Protocol - Protocol GUID.
Registration - Optional per EFI specifications. Not required in SMM scope.
Interface - Pointer to the Interface that contains the protocol.
Returns:
EFI_SUCCESS - Protocol Interface located within SMM scope.
--*/
// GC_TODO: EFI_NOT_FOUND - add return value to function comment
{
UINTN i;
for (i = SmmRtGlobal->CurrentIndex; i < MAX_SMM_PROTOCOL; i++) {
if (CheckServiceIndex (i, Protocol, Interface) == EFI_SUCCESS) {
return EFI_SUCCESS;
}
}
for (i = 0; i < SmmRtGlobal->CurrentIndex; i++) {
if (CheckServiceIndex (i, Protocol, Interface) == EFI_SUCCESS) {
return EFI_SUCCESS;
}
}
return EFI_NOT_FOUND;
}
EFI_STATUS
EFIAPI
LocateSmmProtocolHandles (
IN EFI_GUID *Protocol,
OUT EFI_HANDLE **Handles,
OUT UINTN *HandlesCount
)
/*++
Routine Description:
This Function get the handles for a specific protocol.
Arguments:
Protocol - Protocol GUID.
Handles - Array of handles that satisfy the protocol defination.
HandlesCount - Number of handles found
Returns:
EFI_SUCCESS - Protocol handles located within SMM scope.
--*/
{
UINTN Index;
UINTN NumHandles;
UINTN Size;
EFI_HANDLE *Buffer;
EFI_STATUS Status;
NumHandles = 0;
Buffer = NULL;
for (Index = 0; Index < MAX_SMM_PROTOCOL; Index++) {
if (SmmRtGlobal->Services[Index].Valid) {
if (CompareGuid (Protocol, &SmmRtGlobal->Services[Index].ProtocolGuid)) {
SmmRtGlobal->HandleBuffer[NumHandles] = SmmRtGlobal->Services[Index].Handle;
NumHandles++;
}
}
}
Size = NumHandles * sizeof (EFI_HANDLE);
if (Size > 0) {
Status = gSmst->SmmAllocatePool (EfiRuntimeServicesData, Size, (VOID *)&Buffer);
CopyMem (Buffer, SmmRtGlobal->HandleBuffer, Size);
*Handles = Buffer;
*HandlesCount = NumHandles;
}
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
SmmHandleProtocol (
IN EFI_HANDLE Handle,
IN EFI_GUID *Protocol,
OUT VOID **Interface
)
/*++
Routine Description:
This Function gets the interface pointer based upon the handle
Arguments:
Handle - Protocol handle that is Installed within SMM space.
Protocol - Protocol GUID.
Interface - Interface pointer that points to a protocol.
Returns:
EFI_SUCCESS - Protocol Interface found within SMM scope.
EFI_NOT_FOUND - Protocol not found.
--*/
{
EFI_SMM_PROTO_SERVICES *SmmServices;
SmmServices = (EFI_SMM_PROTO_SERVICES *) Handle;
if (SmmServices->Valid) {
*Interface = SmmServices->Protocol;
return EFI_SUCCESS;
} else {
return EFI_NOT_FOUND;
}
}
EFI_STATUS
EFIAPI
InstallSmmProtocolInterface (
IN OUT EFI_HANDLE *Handle,
IN EFI_GUID *Protocol,
IN EFI_INTERFACE_TYPE InterfaceType,
IN VOID *Interface
)
/*++
Routine Description:
This Function Installs the protocol interface within SMM scope.
Arguments:
Handle - Protocol handle that is to be Installed within SMM space. On NULL we gat a new Protocol
Handle
Protocol - Protocol GUID that is to be Installed.
InterfaceType - Type of Interface per EFI specification.
Interface - Interface that needs to be Installed.
Returns:
EFI_SUCCESS - Protocol Installed within SMM scope.
EFI_OUT_OF_RESOURCES - No more resources available to install another interface.
--*/
{
UINTN i;
for (i = 0; i < MAX_SMM_PROTOCOL; i++) {
if (!SmmRtGlobal->Services[i].Valid) {
SmmRtGlobal->Services[i].InterfaceType = InterfaceType;
SmmRtGlobal->Services[i].Protocol = Interface;
CopyMem (&SmmRtGlobal->Services[i].ProtocolGuid, Protocol, sizeof (EFI_GUID));
SmmRtGlobal->Services[i].Valid = TRUE;
if (*Handle == NULL) {
SmmRtGlobal->Services[i].Handle = &SmmRtGlobal->Services[i];
*Handle = SmmRtGlobal->Services[i].Handle;
} else {
SmmRtGlobal->Services[i].Handle = *Handle;
}
CheckCallbacks (Protocol);
return EFI_SUCCESS;
}
}
return EFI_OUT_OF_RESOURCES;
}
EFI_STATUS
EFIAPI
ReinstallSmmProtocolInterface (
IN EFI_HANDLE SmmProtocolHandle,
IN EFI_GUID *Protocol,
IN VOID *OldInterface,
IN VOID *NewInterface
)
/*++
Routine Description:
This Function Re-Installs the protocol interface within SMM scope.
Arguments:
SmmProtocolHandle - Protocol handle that is to be Un-Installed.
Protocol - Protocol GUID that is to be Un-Installed.
OldInterface - Current Interface that needs to be Re-Installed.
NewInterface - New Interface that needs to be Re-Installed over OldInterface.
Returns:
EFI_SUCCESS - Protocol Re-Installed within SMM scope.
EFI_NOT_FOUND - Old Interface Not Found.
--*/
{
UINTN i;
for (i = 0; i < MAX_SMM_PROTOCOL; i++) {
if (SmmRtGlobal->Services[i].Valid) {
if (SmmProtocolHandle == SmmRtGlobal->Services[i].Handle) {
if (OldInterface == SmmRtGlobal->Services[i].Protocol) {
SmmRtGlobal->Services[i].Protocol = NewInterface;
CheckCallbacks (NewInterface);
return EFI_SUCCESS;
}
}
}
}
return EFI_NOT_FOUND;
}
EFI_STATUS
EFIAPI
UninstallSmmProtocolInterface (
IN EFI_HANDLE SmmProtocolHandle,
IN EFI_GUID *Protocol,
IN VOID *Interface
)
/*++
Routine Description:
This Function Un-Installs the protocol interface from within SMM scope.
Arguments:
SmmProtocolHandle - Protocol handle that is to be Un-Installed.
Protocol - Protocol GUID that is to be Un-Installed.
Interface - Interface Pointer that needs to be Un-Installed.
Returns:
EFI_SUCCESS - Protocol Uninstalled from within SMM scope.
EFI_NOT_FOUND - Protocol Not Found.
--*/
{
UINTN i;
for (i = 0; i < MAX_SMM_PROTOCOL; i++) {
if (SmmRtGlobal->Services[i].Valid) {
if (SmmProtocolHandle == SmmRtGlobal->Services[i].Handle) {
if (CompareGuid (Protocol, &SmmRtGlobal->Services[i].ProtocolGuid)) {
if (Interface == SmmRtGlobal->Services[i].Protocol) {
SmmRtGlobal->Services[i].Valid = FALSE;
return EFI_SUCCESS;
}
}
}
}
}
return EFI_NOT_FOUND;
}
EFI_STATUS
EFIAPI
InstallVendorConfigurationTable (
IN EFI_GUID *Guid,
IN VOID *Table
)
/*++
Routine Description:
This Function installs the configuration table within SMM scope.
Arguments:
Guid - Vandor GUID
Table - Pointer to the Table. This table should be located within SMM scope.
Returns:
EFI_SUCCESS - Vendor table Found
EFI_OUT_OF_RESOURCES - Vendor Table cannot be registered because no more SMM resources are there.
--*/
{
UINTN i;
//
// Check if the vendor GUID already exists.
//
for (i = 0; i < MAX_SMM_PROTOCOL; i++) {
if (SmmRtGlobal->ConfigTable[i].VendorTable != NULL) {
if (CompareGuid (&SmmRtGlobal->ConfigTable[i].VendorGuid, Guid)) {
SmmRtGlobal->ConfigTable[i].VendorTable = Table;
return EFI_SUCCESS;
}
}
}
//
// If the Vendor GUID don't exist, Find an empty slot.
//
for (i = 0; i < MAX_SMM_PROTOCOL; i++) {
if (SmmRtGlobal->ConfigTable[i].VendorTable == NULL) {
CopyMem (&SmmRtGlobal->ConfigTable[i].VendorGuid, Guid, sizeof (EFI_GUID));
SmmRtGlobal->ConfigTable[i].VendorTable = Table;
return EFI_SUCCESS;
}
}
return EFI_OUT_OF_RESOURCES;
}
EFI_STATUS
EFIAPI
GetVendorConfigurationTable (
IN EFI_GUID *Guid,
OUT VOID **Table
)
/*++
Routine Description:
This Function gets the configuration table that has been registered within SMM scope.
Arguments:
Guid - Vandor GUID
Table - Pointer to the Table. This table should be located within SMM scope.
Returns:
EFI_SUCCESS - Vendor table Found
EFI_NOT_FOUND - Vendor Table not found.
--*/
{
UINTN i;
//
// Check if the vendor GUID already exists.
//
for (i = 0; i < MAX_SMM_PROTOCOL; i++) {
if (SmmRtGlobal->ConfigTable[i].VendorTable != NULL) {
if (CompareGuid (&SmmRtGlobal->ConfigTable[i].VendorGuid, Guid)) {
*Table = SmmRtGlobal->ConfigTable[i].VendorTable;
return EFI_SUCCESS;
}
}
}
return EFI_NOT_FOUND;
}
EFI_STATUS
EFIAPI
EfiRegisterRuntimeCallback (
IN EFI_SMM_RUNTIME_CALLBACK SmmRuntimeCallback,
IN VOID *Context,
OUT EFI_HANDLE *SmmRuntimeCallHandle
)
/*++
Routine Description:
This Function Registers the Callback Function from executing.
Arguments:
SmmRuntimeCallback - Callback Function Name.
Context - Context, that is saved and restored when callback function is called.
ChildRuntimeBuffer - Returns the pointer to the messaging buffer that is to be used for SMM communication.
SmmRuntimeCallHandle - EFI Handle for the callback function. This handle is valid within SMM scope only.
Returns:
EFI_SUCCESS - Callback Function Registered Successfully.
EFI_OUT_OF_RESOURCES - All SMM resources have been used up. So more callback functions cannot
be registered.
--*/
{
UINTN i;
for (i = 0; i < MAX_SM_RT_CALLBACK; i++) {
if (SmmRtGlobal->RtCallback[i].CallbackFunction == NULL) {
SmmRtGlobal->RtCallback[i].CallbackFunction = SmmRuntimeCallback;
SmmRtGlobal->RtCallback[i].Context = Context;
*SmmRuntimeCallHandle = &SmmRtGlobal->RtCallback[i];
return EFI_SUCCESS;
}
}
return EFI_OUT_OF_RESOURCES;
}
EFI_STATUS
EFIAPI
EfiUnRegisterRuntimeCallback (
IN EFI_SMM_RUNTIME_CALLBACK SmmRuntimeCallback
)
/*++
Routine Description:
This Function Un-Registers the Callback Function from executing.
Arguments:
SmmRuntimeCallback - Callback Function Name.
Returns:
EFI_SUCCESS - Callback Function UnRegistered.
EFI_NOT_FOUND - Callback Function not found.
--*/
{
UINTN i;
for (i = 0; i < MAX_SM_RT_CALLBACK; i++) {
if (SmmRtGlobal->RtCallback[i].CallbackFunction == SmmRuntimeCallback) {
SmmRtGlobal->RtCallback[i].CallbackFunction = NULL;
return EFI_SUCCESS;
}
}
return EFI_NOT_FOUND;
}
EFI_STATUS
EFIAPI
SmmRuntimeManagementCallback (
IN EFI_HANDLE SmmImageHandle,
IN CONST VOID *Context OPTIONAL,
IN OUT VOID *CommunicationBuffer,
IN OUT UINTN *SourceSize
)
/*++
Routine Description:
This Function executes the Callback Function. This function is called at every SMI occurance.
At the SMI occurance, it investigates if somebody asked for the Runtime Service. On a valid
RT Service request, it executes the callback function.
Arguments:
SmmImageHandle - Handle for the smm image of this driver
Smst - Pointer to the SMM System Table
CommunicationBuffer - Pointer to the buffer that contains the communication Message
Source Size - Size of the memory image to be used for handler.
Returns:
EFI_SUCCESS - Callback Function Executed
--*/
// GC_TODO: SourceSize - add argument and description to function comment
{
SMM_RUNTIME_COMMUNICATION_STRUCTURE *SmmRtStruct;
EFI_SMM_RT_CALLBACK_SERVICES *RtServices;
RtServices = NULL;
SmmRtStruct = (SMM_RUNTIME_COMMUNICATION_STRUCTURE *) CommunicationBuffer;
RtServices = (EFI_SMM_RT_CALLBACK_SERVICES *) SmmRtStruct->PrivateData.SmmRuntimeCallHandle;
if (RtServices != NULL) {
RtServices->CallbackFunction (RtServices->Context, gSmst, (VOID *) &SmmRtStruct->PrivateData);
SmmRtStruct->PrivateData.SmmRuntimeCallHandle = NULL;
}
return EFI_SUCCESS;
}
UINTN
DevicePathSize (
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath
)
/*++
Routine Description:
GC_TODO: Add function description
Arguments:
DevicePath - GC_TODO: add argument description
Returns:
GC_TODO: add return values
--*/
{
EFI_DEVICE_PATH_PROTOCOL *Start;
if (DevicePath == NULL) {
return 0;
}
//
// Search for the end of the device path structure
//
Start = DevicePath;
while (!IsDevicePathEnd (DevicePath)) {
DevicePath = NextDevicePathNode (DevicePath);
}
//
// Compute the size and add back in the size of the end device path structure
//
return ((UINTN) DevicePath - (UINTN) Start) + sizeof (EFI_DEVICE_PATH_PROTOCOL);
}
EFI_STATUS
SmmRuntimeInitialize (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
/*++
Routine Description:
GC_TODO: Add function description
Arguments:
ImageHandle - GC_TODO: add argument description
SystemTable - GC_TODO: add argument description
Returns:
EFI_SUCCESS - GC_TODO: Add description for return value
EFI_SUCCESS - GC_TODO: Add description for return value
--*/
{
EFI_SMM_BASE2_PROTOCOL *SmmBase;
EFI_STATUS Status;
EFI_HANDLE Handle;
UINTN Size;
BOOLEAN InSmm;
EFI_SMM_COMMUNICATION_PROTOCOL *SmmCommunication;
EFI_SMM_RT_GLOBAL *RtGlobal;
RtGlobal = NULL;
Status = gBS->LocateProtocol (&gEfiSmmBase2ProtocolGuid, NULL, &SmmBase);
if (EFI_ERROR(Status)) {
return Status;
}
SmmBase->InSmm (SmmBase, &InSmm);
SmmBase->GetSmstLocation (SmmBase, &gSmst);
Status = gSmst->SmmAllocatePool (EfiRuntimeServicesData, sizeof (EFI_SMM_RT_GLOBAL), &SmmRtGlobal);
/****************************************************
** **
** EST override - begins here **
** **
****************************************************/
ASSERT_EFI_ERROR (Status);
/*+++++++++++++++++++++++++++++++++++++++++++++++++++
++ ++
++ EST override - ends here ++
++ ++
+++++++++++++++++++++++++++++++++++++++++++++++++++*/
if (Status == EFI_SUCCESS) {
ZeroMem (SmmRtGlobal, sizeof (EFI_SMM_RT_GLOBAL));
}
Status = gBS->AllocatePool (
EfiReservedMemoryType,
sizeof (SMM_RUNTIME_COMMUNICATION_STRUCTURE),
&SmmRtGlobal->SmmRtServices.ChildRuntimeBuffer
);
ASSERT_EFI_ERROR (Status);
ZeroMem (SmmRtGlobal->SmmRtServices.ChildRuntimeBuffer, sizeof (SMM_RUNTIME_COMMUNICATION_STRUCTURE));
Status = gBS->AllocatePool (EfiReservedMemoryType, sizeof (EFI_SMM_RT_GLOBAL), &RtGlobal);
ASSERT_EFI_ERROR (Status);
ZeroMem (RtGlobal, sizeof (EFI_SMM_RT_GLOBAL));
//
// Register the Callback function that acts as a parent dispatcher for all the Runtime Functions.
// Any RT function call should be a child of this callback.
//
SmmRtGlobal->SmmRtServices.ChildRuntimeBuffer->MessageLength = sizeof (SMM_RUNTIME_COMMUNICATION_STRUCTURE);
SmmRtGlobal->SmmRtServices.ChildRuntimeBuffer->HeaderGuid = gEfiSmmRuntimeProtocolGuid;
Status = gSmst->SmiHandlerRegister (
SmmRuntimeManagementCallback,
&gEfiSmmRuntimeProtocolGuid,
&ImageHandle
);
ASSERT_EFI_ERROR (Status);
SmmRtGlobal->CallbackEntryPoint = SmmRuntimeManagementCallback;
Size = sizeof (SMM_RUNTIME_COMMUNICATION_STRUCTURE);
Status = gBS->LocateProtocol (
&gEfiSmmCommunicationProtocolGuid,
NULL,
(VOID **)&SmmCommunication
);
ASSERT_EFI_ERROR (Status);
Status = SmmCommunication->Communicate (
SmmCommunication,
(VOID *) SmmRtGlobal->SmmRtServices.ChildRuntimeBuffer,
&Size
);
ASSERT_EFI_ERROR (Status);
//
// Install the services that are called within the SMM scope. All Runtime Libraries will use these
// functions to create the services required for driver bindings within the SMM space.
//
SmmRtGlobal->Signature = SMM_RT_SIGNATURE;
SmmRtGlobal->SmmRtServices.InstallProtocolInterface = InstallSmmProtocolInterface;
SmmRtGlobal->SmmRtServices.LocateProtocol = LocateSmmProtocol;
SmmRtGlobal->SmmRtServices.ReinstallProtocolInterface = ReinstallSmmProtocolInterface;
SmmRtGlobal->SmmRtServices.UninstallProtocolInterface = UninstallSmmProtocolInterface;
SmmRtGlobal->SmmRtServices.SignalProtocol = SmmSignalCallback;
SmmRtGlobal->SmmRtServices.EnableProtocolNotify = SmmEnableProtocolNotifyCallback;
SmmRtGlobal->SmmRtServices.DisableProtocolNotify = SmmDisableProtocolNotifyCallback;
SmmRtGlobal->SmmRtServices.LocateProtocolHandles = LocateSmmProtocolHandles;
SmmRtGlobal->SmmRtServices.HandleProtocol = SmmHandleProtocol;
SmmRtGlobal->SmmRtServices.InstallVendorConfigTable = InstallVendorConfigurationTable;
SmmRtGlobal->SmmRtServices.GetVendorConfigTable = GetVendorConfigurationTable;
SmmRtGlobal->SmmRtServices.RegisterSmmRuntimeChild = EfiRegisterRuntimeCallback;
SmmRtGlobal->SmmRtServices.UnRegisterSmmRuntimeChild = EfiUnRegisterRuntimeCallback;
SmmRtGlobal->SmmRtServices.SmmRuntime.Hdr.Signature = 0;
SmmRtGlobal->SmmRtServices.SmmRuntime.Hdr.Revision = EFI_RUNTIME_SERVICES_REVISION;
SmmRtGlobal->SmmRtServices.SmmRuntime.Hdr.HeaderSize = sizeof (EFI_TABLE_HEADER);
/****************************************************
** **
** EST override - begins here **
** **
****************************************************/
CopyMem (&SmmRtGlobal->SmmRtServices.SmmRuntime, SystemTable->RuntimeServices, sizeof (EFI_RUNTIME_SERVICES));
/****************************************************
** **
** EST override - ends here **
** **
****************************************************/
//
// Install the Driver within the SMM scope so that drivers created within the SMM scope can find it
// and use the functionality. Runtime Library searches the protocol for performing the above functions.
//
Handle = NULL;
Status = InstallSmmProtocolInterface (
&Handle,
&gEfiSmmRuntimeProtocolGuid,
EFI_NATIVE_INTERFACE,
&(SmmRtGlobal->SmmRtServices)
);
ASSERT_EFI_ERROR (Status);
mSmmRT = &SmmRtGlobal->SmmRtServices;
//
// Install the Protocol Interface in the Boot Time Space. This is requires to satisfy the
// dependency within the drivers that are dependent upon Smm Runtime Driver.
//
Handle = NULL;
CopyMem (RtGlobal, SmmRtGlobal, sizeof (EFI_SMM_RT_GLOBAL));
Status = gBS->InstallProtocolInterface (
&Handle,
&gEfiSmmRuntimeProtocolGuid,
EFI_NATIVE_INTERFACE,
&(RtGlobal->SmmRtServices)
);
ASSERT_EFI_ERROR (Status);
return EFI_SUCCESS;
}