]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Variable/RuntimeDxe/VariableDxe.c
The list of locked variables is traversed at runtime, hence we must
[mirror_edk2.git] / MdeModulePkg / Universal / Variable / RuntimeDxe / VariableDxe.c
index 3cb2c6bcf309dcc6d632017fbafc1ac9c838117c..a697ae1c3a39414ab3600ff53aa5e005673a9cb6 100644 (file)
@@ -3,6 +3,7 @@
   Implement all four UEFI Runtime Variable services for the nonvolatile\r
   and volatile storage space and install variable architecture protocol.\r
   \r
+Copyright (C) 2013, Red Hat, Inc.\r
 Copyright (c) 2006 - 2013, 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
@@ -21,6 +22,7 @@ extern VARIABLE_INFO_ENTRY     *gVariableInfo;
 EFI_HANDLE                     mHandle                    = NULL;\r
 EFI_EVENT                      mVirtualAddressChangeEvent = NULL;\r
 EFI_EVENT                      mFtwRegistration           = NULL;\r
+extern LIST_ENTRY              mLockedVariableList;\r
 extern BOOLEAN                 mEndOfDxe;\r
 EDKII_VARIABLE_LOCK_PROTOCOL   mVariableLock              = { VariableLockRequestToLock };\r
 \r
@@ -220,6 +222,10 @@ VariableClassAddressChangeEvent (
   IN VOID                                 *Context\r
   )\r
 {\r
+  LIST_ENTRY     *Link;\r
+  VARIABLE_ENTRY *Entry;\r
+  EFI_STATUS     Status;\r
+\r
   EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->FvbInstance->GetBlockSize);\r
   EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->FvbInstance->GetPhysicalAddress);\r
   EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->FvbInstance->GetAttributes);\r
@@ -236,6 +242,23 @@ VariableClassAddressChangeEvent (
   EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->VariableGlobal.HobVariableBase);\r
   EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal);\r
   EfiConvertPointer (0x0, (VOID **) &mNvVariableCache);  \r
+\r
+  //\r
+  // in the list of locked variables, convert the name pointers first\r
+  //\r
+  for ( Link = GetFirstNode (&mLockedVariableList)\r
+      ; !IsNull (&mLockedVariableList, Link)\r
+      ; Link = GetNextNode (&mLockedVariableList, Link)\r
+      ) {\r
+    Entry = BASE_CR (Link, VARIABLE_ENTRY, Link);\r
+    Status = EfiConvertPointer (0x0, (VOID **) &Entry->Name);\r
+    ASSERT_EFI_ERROR (Status);\r
+  }\r
+  //\r
+  // second, convert the list itself using UefiRuntimeLib\r
+  //\r
+  Status = EfiConvertList (0x0, &mLockedVariableList);\r
+  ASSERT_EFI_ERROR (Status);\r
 }\r
 \r
 \r