]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Variable/RuntimeDxe/VariableDxe.c
MdeModulePkg Variable: Align TPL level for (Smm)EndOfDxe callback
[mirror_edk2.git] / MdeModulePkg / Universal / Variable / RuntimeDxe / VariableDxe.c
index a95846a934e84681d81246c09dca909d8702007d..6b04f4f7b39451cbaff368919f8a0c27b1d0f911 100644 (file)
@@ -3,7 +3,8 @@
   and volatile storage space and install variable architecture protocol.\r
 \r
 Copyright (C) 2013, Red Hat, Inc.\r
-Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2018, 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,30 @@ 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
+  Some Secure Boot Policy Variable may update following other variable changes(SecureBoot follows PK change, etc).\r
+  Record their initial State when variable write service is ready.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+RecordSecureBootPolicyVarData(\r
+  VOID\r
+  );\r
 \r
 /**\r
   Return TRUE if ExitBootServices () has been called.\r
@@ -117,7 +128,7 @@ ReleaseLockOnlyAtBootTime (
 }\r
 \r
 /**\r
-  Retrive the Fault Tolerent Write protocol interface.\r
+  Retrieve the Fault Tolerent Write protocol interface.\r
 \r
   @param[out] FtwProtocol       The interface of Ftw protocol\r
 \r
@@ -145,7 +156,7 @@ GetFtwProtocol (
 }\r
 \r
 /**\r
-  Retrive the FVB protocol interface by HANDLE.\r
+  Retrieve the FVB protocol interface by HANDLE.\r
 \r
   @param[in]  FvBlockHandle     The handle of FVB protocol that provides services for\r
                                 reading, writing, and erasing the target block.\r
@@ -227,7 +238,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 +256,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 +290,18 @@ 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
+    MorLockInitAtEndOfDxe ();\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 +330,10 @@ OnEndOfDxe (
   VOID                                    *Context\r
   )\r
 {\r
+  DEBUG ((EFI_D_INFO, "[Variable]END_OF_DXE is signaled\n"));\r
+  MorLockInitAtEndOfDxe ();\r
   mEndOfDxe = TRUE;\r
+  mVarCheckAddressPointer = VarCheckLibInitializeAtEndOfDxe (&mVarCheckAddressPointerCount);\r
   //\r
   // The initialization for variable quota.\r
   //\r
@@ -413,6 +427,12 @@ FtwNotificationEvent (
     DEBUG ((DEBUG_ERROR, "Variable write service initialization failed. Status = %r\n", Status));\r
   }\r
 \r
+  //\r
+  // Some Secure Boot Policy Var (SecureBoot, etc) updates following other\r
+  // Secure Boot Policy Variable change. Record their initial value.\r
+  //\r
+  RecordSecureBootPolicyVarData();\r
+\r
   //\r
   // Install the Variable Write Architectural protocol.\r
   //\r
@@ -527,7 +547,7 @@ VariableServiceInitialize (
   //\r
   Status = gBS->CreateEventEx (\r
                   EVT_NOTIFY_SIGNAL,\r
-                  TPL_NOTIFY,\r
+                  TPL_CALLBACK,\r
                   OnEndOfDxe,\r
                   NULL,\r
                   &gEfiEndOfDxeEventGroupGuid,\r