]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Variable/RuntimeDxe/VariableDxe.c
MdeModulePkg Variable: Enhance variable performance by reading from existed memory...
[mirror_edk2.git] / MdeModulePkg / Universal / Variable / RuntimeDxe / VariableDxe.c
index 314ffddef1ec10864aa04215aa59735200791881..dfed03133efec40a41f4a9f96a5c63b09b29ca82 100644 (file)
@@ -4,6 +4,7 @@
 \r
 Copyright (C) 2013, Red Hat, Inc.\r
 Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>\r
+(C) Copyright 2015 Hewlett Packard Enterprise Development LP<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
@@ -16,20 +17,19 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include "Variable.h"\r
 \r
-extern VARIABLE_STORE_HEADER   *mNvVariableCache;\r
-extern VARIABLE_INFO_ENTRY     *gVariableInfo;\r
-EFI_HANDLE                     mHandle                    = NULL;\r
-EFI_EVENT                      mVirtualAddressChangeEvent = NULL;\r
-EFI_EVENT                      mFtwRegistration           = NULL;\r
-extern LIST_ENTRY              mLockedVariableList;\r
-extern LIST_ENTRY              mVarCheckVariableList;\r
-extern UINT32                  mNumberOfHandler;\r
-extern VAR_CHECK_SET_VARIABLE_CHECK_HANDLER *mHandlerTable;\r
-extern BOOLEAN                 mEndOfDxe;\r
-EDKII_VARIABLE_LOCK_PROTOCOL   mVariableLock              = { VariableLockRequestToLock };\r
-EDKII_VAR_CHECK_PROTOCOL       mVarCheck                  = { VarCheckRegisterSetVariableCheckHandler,\r
-                                                              VarCheckVariablePropertySet,\r
-                                                              VarCheckVariablePropertyGet };\r
+extern VARIABLE_STORE_HEADER        *mNvVariableCache;\r
+extern EFI_FIRMWARE_VOLUME_HEADER   *mNvFvHeaderCache;\r
+extern VARIABLE_INFO_ENTRY          *gVariableInfo;\r
+EFI_HANDLE                          mHandle                    = NULL;\r
+EFI_EVENT                           mVirtualAddressChangeEvent = NULL;\r
+EFI_EVENT                           mFtwRegistration           = NULL;\r
+extern BOOLEAN                      mEndOfDxe;\r
+VOID                                ***mVarCheckAddressPointer = NULL;\r
+UINTN                               mVarCheckAddressPointerCount = 0;\r
+EDKII_VARIABLE_LOCK_PROTOCOL        mVariableLock              = { VariableLockRequestToLock };\r
+EDKII_VAR_CHECK_PROTOCOL            mVarCheck                  = { VarCheckRegisterSetVariableCheckHandler,\r
+                                                                    VarCheckVariablePropertySet,\r
+                                                                    VarCheckVariablePropertyGet };\r
 \r
 /**\r
   Return TRUE if ExitBootServices () has been called.\r
@@ -227,7 +227,6 @@ VariableClassAddressChangeEvent (
   IN VOID                                 *Context\r
   )\r
 {\r
-  EFI_STATUS     Status;\r
   UINTN          Index;\r
 \r
   EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->FvbInstance->GetBlockSize);\r
@@ -246,20 +245,17 @@ VariableClassAddressChangeEvent (
   EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->VariableGlobal.HobVariableBase);\r
   EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal);\r
   EfiConvertPointer (0x0, (VOID **) &mNvVariableCache);\r
-  EfiConvertPointer (0x0, (VOID **) &mHandlerTable);\r
-  for (Index = 0; Index < mNumberOfHandler; Index++) {\r
-    EfiConvertPointer (0x0, (VOID **) &mHandlerTable[Index]);\r
-  }\r
-\r
-  Status = EfiConvertList (0x0, &mLockedVariableList);\r
-  ASSERT_EFI_ERROR (Status);\r
+  EfiConvertPointer (0x0, (VOID **) &mNvFvHeaderCache);\r
 \r
-  Status = EfiConvertList (0x0, &mVarCheckVariableList);\r
-  ASSERT_EFI_ERROR (Status);\r
+  if (mAuthContextOut.AddressPointer != NULL) {\r
+    for (Index = 0; Index < mAuthContextOut.AddressPointerCount; Index++) {\r
+      EfiConvertPointer (0x0, (VOID **) mAuthContextOut.AddressPointer[Index]);\r
+    }\r
+  }\r
 \r
-  if (mContextOut.AddressPointer != NULL) {\r
-    for (Index = 0; Index < mContextOut.AddressPointerCount; Index++) {\r
-      EfiConvertPointer (0x0, (VOID **) mContextOut.AddressPointer[Index]);\r
+  if (mVarCheckAddressPointer != NULL) {\r
+    for (Index = 0; Index < mVarCheckAddressPointerCount; Index++) {\r
+      EfiConvertPointer (0x0, (VOID **) mVarCheckAddressPointer[Index]);\r
     }\r
   }\r
 }\r
@@ -283,14 +279,17 @@ OnReadyToBoot (
   VOID                                    *Context\r
   )\r
 {\r
-  //\r
-  // Set the End Of DXE bit in case the EFI_END_OF_DXE_EVENT_GROUP_GUID event is not signaled.\r
-  //\r
-  mEndOfDxe = TRUE;\r
-  //\r
-  // The initialization for variable quota.\r
-  //\r
-  InitializeVariableQuota ();\r
+  if (!mEndOfDxe) {\r
+    //\r
+    // Set the End Of DXE bit in case the EFI_END_OF_DXE_EVENT_GROUP_GUID event is not signaled.\r
+    //\r
+    mEndOfDxe = TRUE;\r
+    mVarCheckAddressPointer = VarCheckLibInitializeAtEndOfDxe (&mVarCheckAddressPointerCount);\r
+    //\r
+    // The initialization for variable quota.\r
+    //\r
+    InitializeVariableQuota ();\r
+  }\r
   ReclaimForOS ();\r
   if (FeaturePcdGet (PcdVariableCollectStatistics)) {\r
     if (mVariableModuleGlobal->VariableGlobal.AuthFormat) {\r
@@ -319,7 +318,9 @@ OnEndOfDxe (
   VOID                                    *Context\r
   )\r
 {\r
+  DEBUG ((EFI_D_INFO, "[Variable]END_OF_DXE is signaled\n"));\r
   mEndOfDxe = TRUE;\r
+  mVarCheckAddressPointer = VarCheckLibInitializeAtEndOfDxe (&mVarCheckAddressPointerCount);\r
   //\r
   // The initialization for variable quota.\r
   //\r