/** @file | |
Entrypoint of Extended SAL variable service module. | |
Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR> | |
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" | |
#include "AuthService.h" | |
// | |
// Don't use module globals after the SetVirtualAddress map is signaled | |
// | |
EFI_EVENT mEfiVirtualNotifyEvent; | |
/** | |
Common entry for Extended SAL Variable Services Class. | |
This is the common entry of all functions of Extended SAL Variable Services Class. | |
@param[in] FunctionId The Function ID of member function in Extended SAL Variable Services Class. | |
@param[in] Arg2 The 2nd parameter for SAL procedure call. | |
@param[in] Arg3 The 3rd parameter for SAL procedure call. | |
@param[in] Arg4 The 4th parameter for SAL procedure call. | |
@param[in] Arg5 The 5th parameter for SAL procedure call. | |
@param[in] Arg6 The 6th parameter for SAL procedure call. | |
@param[in] Arg7 The 7th parameter for SAL procedure call. | |
@param[in] Arg8 The 8th parameter for SAL procedure call. | |
@param[in] VirtualMode The current calling mode for this function. | |
@param[in] Global The context of this Extended SAL Variable Services Class call. | |
@return The register of SAL. | |
**/ | |
SAL_RETURN_REGS | |
EFIAPI | |
EsalVariableCommonEntry ( | |
IN UINT64 FunctionId, | |
IN UINT64 Arg2, | |
IN UINT64 Arg3, | |
IN UINT64 Arg4, | |
IN UINT64 Arg5, | |
IN UINT64 Arg6, | |
IN UINT64 Arg7, | |
IN UINT64 Arg8, | |
IN BOOLEAN VirtualMode, | |
IN ESAL_VARIABLE_GLOBAL *Global | |
) | |
{ | |
SAL_RETURN_REGS ReturnVal; | |
ReturnVal.r9 = 0; | |
ReturnVal.r10 = 0; | |
ReturnVal.r11 = 0; | |
switch (FunctionId) { | |
case EsalGetVariableFunctionId: | |
ReturnVal.Status = EsalGetVariable ( | |
(CHAR16 *) Arg2, | |
(EFI_GUID *) Arg3, | |
(UINT32 *) Arg4, | |
(UINTN *) Arg5, | |
(VOID *) Arg6, | |
VirtualMode, | |
Global | |
); | |
return ReturnVal; | |
case EsalGetNextVariableNameFunctionId: | |
ReturnVal.Status = EsalGetNextVariableName ( | |
(UINTN *) Arg2, | |
(CHAR16 *) Arg3, | |
(EFI_GUID *) Arg4, | |
VirtualMode, | |
Global | |
); | |
return ReturnVal; | |
case EsalSetVariableFunctionId: | |
ReturnVal.Status = EsalSetVariable ( | |
(CHAR16 *) Arg2, | |
(EFI_GUID *) Arg3, | |
(UINT32) Arg4, | |
(UINTN) Arg5, | |
(VOID *) Arg6, | |
VirtualMode, | |
Global | |
); | |
return ReturnVal; | |
case EsalQueryVariableInfoFunctionId: | |
ReturnVal.Status = EsalQueryVariableInfo ( | |
(UINT32) Arg2, | |
(UINT64 *) Arg3, | |
(UINT64 *) Arg4, | |
(UINT64 *) Arg5, | |
VirtualMode, | |
Global | |
); | |
return ReturnVal; | |
default: | |
ReturnVal.Status = EFI_SAL_INVALID_ARGUMENT; | |
return ReturnVal; | |
} | |
} | |
/** | |
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[in] Event The event whose notification function is being invoked. | |
@param[in] Context The pointer to the notification function's context. | |
**/ | |
VOID | |
EFIAPI | |
VariableClassAddressChangeEvent ( | |
IN EFI_EVENT Event, | |
IN VOID *Context | |
) | |
{ | |
UINTN Index; | |
CopyMem ( | |
&mVariableModuleGlobal->VariableGlobal[Virtual], | |
&mVariableModuleGlobal->VariableGlobal[Physical], | |
sizeof (VARIABLE_GLOBAL) | |
); | |
EfiConvertPointer ( | |
0x0, | |
(VOID **) &mVariableModuleGlobal->VariableGlobal[Virtual].NonVolatileVariableBase | |
); | |
EfiConvertPointer ( | |
0x0, | |
(VOID **) &mVariableModuleGlobal->VariableGlobal[Virtual].VolatileVariableBase | |
); | |
mVariableModuleGlobal->PlatformLangCodes[Virtual] = mVariableModuleGlobal->PlatformLangCodes[Physical]; | |
EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->PlatformLangCodes[Virtual]); | |
mVariableModuleGlobal->LangCodes[Virtual] = mVariableModuleGlobal->LangCodes[Physical]; | |
EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->LangCodes[Virtual]); | |
mVariableModuleGlobal->PlatformLang[Virtual] = mVariableModuleGlobal->PlatformLang[Physical]; | |
EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->PlatformLang[Virtual]); | |
CopyMem ( | |
mVariableModuleGlobal->VariableName[Virtual], | |
mVariableModuleGlobal->VariableName[Physical], | |
sizeof (mVariableModuleGlobal->VariableName[Physical]) | |
); | |
for (Index = 0; Index < NUM_VAR_NAME; Index++) { | |
EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->VariableName[Virtual][Index]); | |
} | |
mVariableModuleGlobal->GlobalVariableGuid[Virtual] = &gEfiGlobalVariableGuid; | |
EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->GlobalVariableGuid[Virtual]); | |
mVariableModuleGlobal->AuthenticatedVariableGuid[Virtual] = &gEfiAuthenticatedVariableGuid; | |
EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->AuthenticatedVariableGuid[Virtual]); | |
mVariableModuleGlobal->CertRsa2048Sha256Guid[Virtual] = &gEfiCertRsa2048Sha256Guid; | |
EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->CertRsa2048Sha256Guid[Virtual]); | |
mVariableModuleGlobal->ImageSecurityDatabaseGuid[Virtual] = &gEfiImageSecurityDatabaseGuid; | |
EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->ImageSecurityDatabaseGuid[Virtual]); | |
mVariableModuleGlobal->HashContext[Virtual] = mVariableModuleGlobal->HashContext[Physical]; | |
EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->HashContext[Virtual]); | |
} | |
/** | |
Entry point of Extended SAL Variable service module. | |
This function is the entry point of Extended SAL Variable service module. | |
It registers all functions of Extended SAL Variable class, initializes | |
variable store for non-volatile and volatile variables, and registers | |
notification function for EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE event. | |
@param[in] ImageHandle The Image handle of this driver. | |
@param[in] SystemTable The pointer of EFI_SYSTEM_TABLE. | |
@retval EFI_SUCCESS Extended SAL Variable Services Class successfully registered. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
VariableServiceInitialize ( | |
IN EFI_HANDLE ImageHandle, | |
IN EFI_SYSTEM_TABLE *SystemTable | |
) | |
{ | |
EFI_STATUS Status; | |
Status = gBS->CreateEventEx ( | |
EVT_NOTIFY_SIGNAL, | |
TPL_NOTIFY, | |
VariableClassAddressChangeEvent, | |
NULL, | |
&gEfiEventVirtualAddressChangeGuid, | |
&mEfiVirtualNotifyEvent | |
); | |
ASSERT_EFI_ERROR (Status); | |
Status = VariableCommonInitialize (ImageHandle, SystemTable); | |
ASSERT_EFI_ERROR (Status); | |
// | |
// Authenticated variable initialize | |
// | |
Status = AutenticatedVariableServiceInitialize (); | |
ASSERT_EFI_ERROR (Status); | |
FlushHob2Nv (); | |
// | |
// Register All the Functions with Extended SAL Variable Services Class | |
// | |
RegisterEsalClass ( | |
EFI_EXTENDED_SAL_VARIABLE_SERVICES_PROTOCOL_GUID_LO, | |
EFI_EXTENDED_SAL_VARIABLE_SERVICES_PROTOCOL_GUID_HI, | |
mVariableModuleGlobal, | |
EsalVariableCommonEntry, | |
EsalGetVariableFunctionId, | |
EsalVariableCommonEntry, | |
EsalGetNextVariableNameFunctionId, | |
EsalVariableCommonEntry, | |
EsalSetVariableFunctionId, | |
EsalVariableCommonEntry, | |
EsalQueryVariableInfoFunctionId, | |
NULL | |
); | |
return EFI_SUCCESS; | |
} |