/** @file | |
Implment all four UEFI runtime variable services and | |
install variable architeture protocol. | |
Copyright (c) 2006 - 2012, Intel Corporation | |
All rights reserved. This program and the accompanying materials | |
are licensed and made available under the terms and conditions of the BSD License | |
which accompanies this distribution. The full text of the license may be found at | |
http://opensource.org/licenses/bsd-license.php | |
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
**/ | |
#include "Variable.h" | |
EFI_EVENT mVirtualAddressChangeEvent = NULL; | |
/** | |
This code finds variable in storage blocks (Volatile or Non-Volatile). | |
@param VariableName Name of Variable to be found. | |
@param VendorGuid Variable vendor GUID. | |
@param Attributes Attribute value of the variable found. | |
@param DataSize Size of Data found. If size is less than the | |
data, this value contains the required size. | |
@param Data Data pointer. | |
@return EFI_INVALID_PARAMETER Invalid parameter | |
@return EFI_SUCCESS Find the specified variable | |
@return EFI_NOT_FOUND Not found | |
@return EFI_BUFFER_TO_SMALL DataSize is too small for the result | |
**/ | |
EFI_STATUS | |
EFIAPI | |
RuntimeServiceGetVariable ( | |
IN CHAR16 *VariableName, | |
IN EFI_GUID *VendorGuid, | |
OUT UINT32 *Attributes OPTIONAL, | |
IN OUT UINTN *DataSize, | |
OUT VOID *Data | |
) | |
{ | |
return EmuGetVariable ( | |
VariableName, | |
VendorGuid, | |
Attributes OPTIONAL, | |
DataSize, | |
Data, | |
&mVariableModuleGlobal->VariableGlobal[Physical] | |
); | |
} | |
/** | |
This code Finds the Next available variable. | |
@param VariableNameSize Size of the variable name | |
@param VariableName Pointer to variable name | |
@param VendorGuid Variable Vendor Guid | |
@return EFI_INVALID_PARAMETER Invalid parameter | |
@return EFI_SUCCESS Find the specified variable | |
@return EFI_NOT_FOUND Not found | |
@return EFI_BUFFER_TO_SMALL DataSize is too small for the result | |
**/ | |
EFI_STATUS | |
EFIAPI | |
RuntimeServiceGetNextVariableName ( | |
IN OUT UINTN *VariableNameSize, | |
IN OUT CHAR16 *VariableName, | |
IN OUT EFI_GUID *VendorGuid | |
) | |
{ | |
return EmuGetNextVariableName ( | |
VariableNameSize, | |
VariableName, | |
VendorGuid, | |
&mVariableModuleGlobal->VariableGlobal[Physical] | |
); | |
} | |
/** | |
This code sets variable in storage blocks (Volatile or Non-Volatile). | |
@param VariableName Name of Variable to be found | |
@param VendorGuid Variable vendor GUID | |
@param Attributes Attribute value of the variable found | |
@param DataSize Size of Data found. If size is less than the | |
data, this value contains the required size. | |
@param Data Data pointer | |
@return EFI_INVALID_PARAMETER Invalid parameter | |
@return EFI_SUCCESS Set successfully | |
@return EFI_OUT_OF_RESOURCES Resource not enough to set variable | |
@return EFI_NOT_FOUND Not found | |
@return EFI_WRITE_PROTECTED Variable is read-only | |
**/ | |
EFI_STATUS | |
EFIAPI | |
RuntimeServiceSetVariable ( | |
IN CHAR16 *VariableName, | |
IN EFI_GUID *VendorGuid, | |
IN UINT32 Attributes, | |
IN UINTN DataSize, | |
IN VOID *Data | |
) | |
{ | |
return EmuSetVariable ( | |
VariableName, | |
VendorGuid, | |
Attributes, | |
DataSize, | |
Data, | |
&mVariableModuleGlobal->VariableGlobal[Physical], | |
&mVariableModuleGlobal->VolatileLastVariableOffset, | |
&mVariableModuleGlobal->NonVolatileLastVariableOffset | |
); | |
} | |
/** | |
This code returns information about the EFI variables. | |
@param Attributes Attributes bitmask to specify the type of variables | |
on which to return information. | |
@param MaximumVariableStorageSize Pointer to the maximum size of the storage space available | |
for the EFI variables associated with the attributes specified. | |
@param RemainingVariableStorageSize Pointer to the remaining size of the storage space available | |
for EFI variables associated with the attributes specified. | |
@param MaximumVariableSize Pointer to the maximum size of an individual EFI variables | |
associated with the attributes specified. | |
@return EFI_INVALID_PARAMETER An invalid combination of attribute bits was supplied. | |
@return EFI_SUCCESS Query successfully. | |
@return EFI_UNSUPPORTED The attribute is not supported on this platform. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
RuntimeServiceQueryVariableInfo ( | |
IN UINT32 Attributes, | |
OUT UINT64 *MaximumVariableStorageSize, | |
OUT UINT64 *RemainingVariableStorageSize, | |
OUT UINT64 *MaximumVariableSize | |
) | |
{ | |
return EmuQueryVariableInfo ( | |
Attributes, | |
MaximumVariableStorageSize, | |
RemainingVariableStorageSize, | |
MaximumVariableSize, | |
&mVariableModuleGlobal->VariableGlobal[Physical] | |
); | |
} | |
/** | |
Notification function of EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE. | |
This is a notification function registered on EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE event. | |
It convers pointer to new virtual address. | |
@param Event Event whose notification function is being invoked. | |
@param Context Pointer to the notification function's context. | |
**/ | |
VOID | |
EFIAPI | |
VariableClassAddressChangeEvent ( | |
IN EFI_EVENT Event, | |
IN VOID *Context | |
) | |
{ | |
EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->PlatformLangCodes); | |
EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->LangCodes); | |
EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->PlatformLang); | |
EfiConvertPointer ( | |
0x0, | |
(VOID **) &mVariableModuleGlobal->VariableGlobal[Physical].NonVolatileVariableBase | |
); | |
EfiConvertPointer ( | |
0x0, | |
(VOID **) &mVariableModuleGlobal->VariableGlobal[Physical].VolatileVariableBase | |
); | |
EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal); | |
} | |
/** | |
EmuVariable Driver main entry point. The Variable driver places the 4 EFI | |
runtime services in the EFI System Table and installs arch protocols | |
for variable read and write services being availible. It also registers | |
notification function for EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE event. | |
@param[in] ImageHandle The firmware allocated handle for the EFI image. | |
@param[in] SystemTable A pointer to the EFI System Table. | |
@retval EFI_SUCCESS Variable service successfully initialized. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
VariableServiceInitialize ( | |
IN EFI_HANDLE ImageHandle, | |
IN EFI_SYSTEM_TABLE *SystemTable | |
) | |
{ | |
EFI_HANDLE NewHandle; | |
EFI_STATUS Status; | |
Status = VariableCommonInitialize (ImageHandle, SystemTable); | |
ASSERT_EFI_ERROR (Status); | |
SystemTable->RuntimeServices->GetVariable = RuntimeServiceGetVariable; | |
SystemTable->RuntimeServices->GetNextVariableName = RuntimeServiceGetNextVariableName; | |
SystemTable->RuntimeServices->SetVariable = RuntimeServiceSetVariable; | |
SystemTable->RuntimeServices->QueryVariableInfo = RuntimeServiceQueryVariableInfo; | |
// | |
// Now install the Variable Runtime Architectural Protocol on a new handle | |
// | |
NewHandle = NULL; | |
Status = gBS->InstallMultipleProtocolInterfaces ( | |
&NewHandle, | |
&gEfiVariableArchProtocolGuid, | |
NULL, | |
&gEfiVariableWriteArchProtocolGuid, | |
NULL, | |
NULL | |
); | |
ASSERT_EFI_ERROR (Status); | |
Status = gBS->CreateEventEx ( | |
EVT_NOTIFY_SIGNAL, | |
TPL_NOTIFY, | |
VariableClassAddressChangeEvent, | |
NULL, | |
&gEfiEventVirtualAddressChangeGuid, | |
&mVirtualAddressChangeEvent | |
); | |
ASSERT_EFI_ERROR (Status); | |
return EFI_SUCCESS; | |
} |