--- /dev/null
+/** @file\r
+ Entrypoint of Extended SAL variable service module.\r
+\r
+Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials \r
+are licensed and made available under the terms and conditions of the BSD License \r
+which accompanies this distribution. The full text of the license may be found at \r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "Variable.h"\r
+#include "AuthService.h"\r
+\r
+//\r
+// Don't use module globals after the SetVirtualAddress map is signaled\r
+//\r
+EFI_EVENT mEfiVirtualNotifyEvent;\r
+\r
+/**\r
+ Common entry for Extended SAL Variable Services Class.\r
+\r
+ This is the common entry of all functions of Extended SAL Variable Services Class.\r
+\r
+ @param[in] FunctionId The Function ID of member function in Extended SAL Variable Services Class.\r
+ @param[in] Arg2 The 2nd parameter for SAL procedure call.\r
+ @param[in] Arg3 The 3rd parameter for SAL procedure call.\r
+ @param[in] Arg4 The 4th parameter for SAL procedure call.\r
+ @param[in] Arg5 The 5th parameter for SAL procedure call.\r
+ @param[in] Arg6 The 6th parameter for SAL procedure call.\r
+ @param[in] Arg7 The 7th parameter for SAL procedure call.\r
+ @param[in] Arg8 The 8th parameter for SAL procedure call.\r
+ @param[in] VirtualMode The current calling mode for this function.\r
+ @param[in] Global The context of this Extended SAL Variable Services Class call.\r
+\r
+ @return The register of SAL.\r
+\r
+**/\r
+SAL_RETURN_REGS\r
+EFIAPI\r
+EsalVariableCommonEntry (\r
+ IN UINT64 FunctionId,\r
+ IN UINT64 Arg2,\r
+ IN UINT64 Arg3,\r
+ IN UINT64 Arg4,\r
+ IN UINT64 Arg5,\r
+ IN UINT64 Arg6,\r
+ IN UINT64 Arg7,\r
+ IN UINT64 Arg8,\r
+ IN BOOLEAN VirtualMode,\r
+ IN ESAL_VARIABLE_GLOBAL *Global\r
+ )\r
+{\r
+ SAL_RETURN_REGS ReturnVal;\r
+ \r
+ ReturnVal.r9 = 0;\r
+ ReturnVal.r10 = 0;\r
+ ReturnVal.r11 = 0;\r
+\r
+ switch (FunctionId) {\r
+ case EsalGetVariableFunctionId:\r
+ ReturnVal.Status = EsalGetVariable (\r
+ (CHAR16 *) Arg2,\r
+ (EFI_GUID *) Arg3,\r
+ (UINT32 *) Arg4,\r
+ (UINTN *) Arg5,\r
+ (VOID *) Arg6,\r
+ VirtualMode,\r
+ Global\r
+ );\r
+ return ReturnVal;\r
+\r
+ case EsalGetNextVariableNameFunctionId:\r
+ ReturnVal.Status = EsalGetNextVariableName (\r
+ (UINTN *) Arg2,\r
+ (CHAR16 *) Arg3,\r
+ (EFI_GUID *) Arg4,\r
+ VirtualMode,\r
+ Global\r
+ );\r
+ return ReturnVal;\r
+\r
+ case EsalSetVariableFunctionId:\r
+ ReturnVal.Status = EsalSetVariable (\r
+ (CHAR16 *) Arg2,\r
+ (EFI_GUID *) Arg3,\r
+ (UINT32) Arg4,\r
+ (UINTN) Arg5,\r
+ (VOID *) Arg6,\r
+ VirtualMode,\r
+ Global\r
+ );\r
+ return ReturnVal;\r
+\r
+ case EsalQueryVariableInfoFunctionId:\r
+ ReturnVal.Status = EsalQueryVariableInfo (\r
+ (UINT32) Arg2,\r
+ (UINT64 *) Arg3,\r
+ (UINT64 *) Arg4,\r
+ (UINT64 *) Arg5,\r
+ VirtualMode,\r
+ Global\r
+ );\r
+ return ReturnVal;\r
+\r
+ default:\r
+ ReturnVal.Status = EFI_SAL_INVALID_ARGUMENT;\r
+ return ReturnVal;\r
+ }\r
+}\r
+\r
+/**\r
+ Notification function of EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE.\r
+\r
+ This is a notification function registered on EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE event.\r
+ It convers pointer to new virtual address.\r
+\r
+ @param[in] Event The event whose notification function is being invoked.\r
+ @param[in] Context The pointer to the notification function's context.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+VariableClassAddressChangeEvent (\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
+ )\r
+{\r
+ UINTN Index;\r
+\r
+ CopyMem (\r
+ &mVariableModuleGlobal->VariableGlobal[Virtual],\r
+ &mVariableModuleGlobal->VariableGlobal[Physical],\r
+ sizeof (VARIABLE_GLOBAL)\r
+ );\r
+\r
+ EfiConvertPointer (\r
+ 0x0,\r
+ (VOID **) &mVariableModuleGlobal->VariableGlobal[Virtual].NonVolatileVariableBase\r
+ );\r
+ EfiConvertPointer (\r
+ 0x0,\r
+ (VOID **) &mVariableModuleGlobal->VariableGlobal[Virtual].VolatileVariableBase\r
+ );\r
+\r
+ mVariableModuleGlobal->PlatformLangCodes[Virtual] = mVariableModuleGlobal->PlatformLangCodes[Physical];\r
+ EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->PlatformLangCodes[Virtual]);\r
+\r
+ mVariableModuleGlobal->LangCodes[Virtual] = mVariableModuleGlobal->LangCodes[Physical];\r
+ EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->LangCodes[Virtual]);\r
+\r
+ mVariableModuleGlobal->PlatformLang[Virtual] = mVariableModuleGlobal->PlatformLang[Physical];\r
+ EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->PlatformLang[Virtual]);\r
+\r
+ CopyMem (\r
+ mVariableModuleGlobal->VariableName[Virtual],\r
+ mVariableModuleGlobal->VariableName[Physical],\r
+ sizeof (mVariableModuleGlobal->VariableName[Physical])\r
+ );\r
+ for (Index = 0; Index < NUM_VAR_NAME; Index++) {\r
+ EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->VariableName[Virtual][Index]);\r
+ }\r
+\r
+ mVariableModuleGlobal->GlobalVariableGuid[Virtual] = &gEfiGlobalVariableGuid;\r
+ EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->GlobalVariableGuid[Virtual]);\r
+\r
+ mVariableModuleGlobal->AuthenticatedVariableGuid[Virtual] = &gEfiAuthenticatedVariableGuid;\r
+ EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->AuthenticatedVariableGuid[Virtual]);\r
+\r
+ mVariableModuleGlobal->CertRsa2048Sha256Guid[Virtual] = &gEfiCertRsa2048Sha256Guid;\r
+ EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->CertRsa2048Sha256Guid[Virtual]);\r
+\r
+ mVariableModuleGlobal->ImageSecurityDatabaseGuid[Virtual] = &gEfiImageSecurityDatabaseGuid;\r
+ EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->ImageSecurityDatabaseGuid[Virtual]);\r
+\r
+ mVariableModuleGlobal->HashContext[Virtual] = mVariableModuleGlobal->HashContext[Physical];\r
+ EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->HashContext[Virtual]);\r
+}\r
+\r
+/**\r
+ Entry point of Extended SAL Variable service module.\r
+\r
+ This function is the entry point of Extended SAL Variable service module.\r
+ It registers all functions of Extended SAL Variable class, initializes\r
+ variable store for non-volatile and volatile variables, and registers\r
+ notification function for EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE event.\r
+\r
+ @param[in] ImageHandle The Image handle of this driver.\r
+ @param[in] SystemTable The pointer of EFI_SYSTEM_TABLE.\r
+\r
+ @retval EFI_SUCCESS Extended SAL Variable Services Class successfully registered.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+VariableServiceInitialize (\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+\r
+ Status = gBS->CreateEventEx (\r
+ EVT_NOTIFY_SIGNAL,\r
+ TPL_NOTIFY,\r
+ VariableClassAddressChangeEvent,\r
+ NULL,\r
+ &gEfiEventVirtualAddressChangeGuid,\r
+ &mEfiVirtualNotifyEvent\r
+ );\r
+\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ Status = VariableCommonInitialize (ImageHandle, SystemTable);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ //\r
+ // Authenticated variable initialize\r
+ //\r
+ Status = AutenticatedVariableServiceInitialize ();\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ //\r
+ // Register All the Functions with Extended SAL Variable Services Class\r
+ //\r
+ RegisterEsalClass (\r
+ EFI_EXTENDED_SAL_VARIABLE_SERVICES_PROTOCOL_GUID_LO,\r
+ EFI_EXTENDED_SAL_VARIABLE_SERVICES_PROTOCOL_GUID_HI,\r
+ mVariableModuleGlobal,\r
+ EsalVariableCommonEntry,\r
+ EsalGetVariableFunctionId,\r
+ EsalVariableCommonEntry,\r
+ EsalGetNextVariableNameFunctionId,\r
+ EsalVariableCommonEntry,\r
+ EsalSetVariableFunctionId,\r
+ EsalVariableCommonEntry,\r
+ EsalQueryVariableInfoFunctionId,\r
+ NULL\r
+ );\r
+\r
+ return EFI_SUCCESS;\r
+}\r