]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/VariableRuntimeDxe/InitVariable.c
add English.inf, EdkFvbServiceLib.inf and Variable.inf
[mirror_edk2.git] / MdeModulePkg / Universal / VariableRuntimeDxe / InitVariable.c
diff --git a/MdeModulePkg/Universal/VariableRuntimeDxe/InitVariable.c b/MdeModulePkg/Universal/VariableRuntimeDxe/InitVariable.c
new file mode 100644 (file)
index 0000000..15e84e8
--- /dev/null
@@ -0,0 +1,234 @@
+/*++\r
+\r
+Copyright (c) 2006 - 2007, Intel Corporation\r
+All rights reserved. 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
+Module Name:\r
+\r
+  InitVariable.c\r
+\r
+Abstract:\r
+\r
+Revision History\r
+\r
+--*/\r
+\r
+//\r
+// Include common header file for this module.\r
+//\r
+#include "CommonHeader.h"\r
+\r
+#include "Variable.h"\r
+\r
+//\r
+// Event for Exit Boot Services Callback\r
+//\r
+STATIC EFI_EVENT mExitBootServicesEvent = NULL;\r
+\r
+\r
+//\r
+// Don't use module globals after the SetVirtualAddress map is signaled\r
+//\r
+extern ESAL_VARIABLE_GLOBAL *mVariableModuleGlobal;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+RuntimeServiceGetVariable (\r
+  IN CHAR16        *VariableName,\r
+  IN EFI_GUID      * VendorGuid,\r
+  OUT UINT32       *Attributes OPTIONAL,\r
+  IN OUT UINTN     *DataSize,\r
+  OUT VOID         *Data\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+Arguments:\r
+\r
+Returns:\r
+\r
+--*/\r
+{\r
+  return GetVariable (\r
+          VariableName,\r
+          VendorGuid,\r
+          Attributes OPTIONAL,\r
+          DataSize,\r
+          Data,\r
+          &mVariableModuleGlobal->VariableGlobal[Physical],\r
+          mVariableModuleGlobal->FvbInstance\r
+          );\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+RuntimeServiceGetNextVariableName (\r
+  IN OUT UINTN     *VariableNameSize,\r
+  IN OUT CHAR16    *VariableName,\r
+  IN OUT EFI_GUID  *VendorGuid\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+Arguments:\r
+\r
+Returns:\r
+\r
+--*/\r
+{\r
+  return GetNextVariableName (\r
+          VariableNameSize,\r
+          VariableName,\r
+          VendorGuid,\r
+          &mVariableModuleGlobal->VariableGlobal[Physical],\r
+          mVariableModuleGlobal->FvbInstance\r
+          );\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+RuntimeServiceSetVariable (\r
+  IN CHAR16        *VariableName,\r
+  IN EFI_GUID      *VendorGuid,\r
+  IN UINT32        Attributes,\r
+  IN UINTN         DataSize,\r
+  IN VOID          *Data\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+Arguments:\r
+\r
+Returns:\r
+\r
+--*/\r
+{\r
+  return SetVariable (\r
+          VariableName,\r
+          VendorGuid,\r
+          Attributes,\r
+          DataSize,\r
+          Data,\r
+          &mVariableModuleGlobal->VariableGlobal[Physical],\r
+          &mVariableModuleGlobal->VolatileLastVariableOffset,\r
+          &mVariableModuleGlobal->NonVolatileLastVariableOffset,\r
+          mVariableModuleGlobal->FvbInstance\r
+          );\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+RuntimeServiceQueryVariableInfo (\r
+  IN  UINT32                 Attributes,\r
+  OUT UINT64                 *MaximumVariableStorageSize,\r
+  OUT UINT64                 *RemainingVariableStorageSize,\r
+  OUT UINT64                 *MaximumVariableSize\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+Arguments:\r
+\r
+Returns:\r
+\r
+--*/\r
+{\r
+  return QueryVariableInfo (\r
+          Attributes,\r
+          MaximumVariableStorageSize,\r
+          RemainingVariableStorageSize,\r
+          MaximumVariableSize,\r
+          &mVariableModuleGlobal->VariableGlobal[Physical],\r
+          mVariableModuleGlobal->FvbInstance\r
+          );\r
+}\r
+\r
+VOID\r
+EFIAPI\r
+VariableClassAddressChangeEvent (\r
+  IN EFI_EVENT        Event,\r
+  IN VOID             *Context\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+Arguments:\r
+\r
+Returns:\r
+\r
+--*/\r
+{\r
+  EfiConvertPointer (\r
+    0x0,\r
+    (VOID **) &mVariableModuleGlobal->VariableGlobal[Physical].NonVolatileVariableBase\r
+    );\r
+  EfiConvertPointer (\r
+    0x0,\r
+    (VOID **) &mVariableModuleGlobal->VariableGlobal[Physical].VolatileVariableBase\r
+    );\r
+  EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal);\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+VariableServiceInitialize (\r
+  IN EFI_HANDLE         ImageHandle,\r
+  IN EFI_SYSTEM_TABLE   *SystemTable\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+Arguments:\r
+\r
+Returns:\r
+\r
+--*/\r
+{\r
+  EFI_HANDLE  NewHandle;\r
+  EFI_STATUS  Status;\r
+\r
+  Status = VariableCommonInitialize (ImageHandle, SystemTable);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  SystemTable->RuntimeServices->GetVariable         = RuntimeServiceGetVariable;\r
+  SystemTable->RuntimeServices->GetNextVariableName = RuntimeServiceGetNextVariableName;\r
+  SystemTable->RuntimeServices->SetVariable         = RuntimeServiceSetVariable;\r
+  SystemTable->RuntimeServices->QueryVariableInfo   = RuntimeServiceQueryVariableInfo;\r
+\r
+  //\r
+  // Now install the Variable Runtime Architectural Protocol on a new handle\r
+  //\r
+  NewHandle = NULL;\r
+  Status = gBS->InstallMultipleProtocolInterfaces (\r
+                  &NewHandle,\r
+                  &gEfiVariableArchProtocolGuid,\r
+                  NULL,\r
+                  &gEfiVariableWriteArchProtocolGuid,\r
+                  NULL,\r
+                  NULL\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  Status = gBS->CreateEvent (\r
+                  EVT_SIGNAL_EXIT_BOOT_SERVICES,\r
+                  TPL_NOTIFY,\r
+                  VariableClassAddressChangeEvent,\r
+                  NULL,\r
+                  &mExitBootServicesEvent\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  return EFI_SUCCESS;\r
+}\r