]> git.proxmox.com Git - mirror_edk2.git/commitdiff
The list of locked variables is traversed at runtime, hence we must
authorLaszlo Ersek <lersek@redhat.com>
Mon, 17 Jun 2013 02:30:42 +0000 (02:30 +0000)
committerniruiyu <niruiyu@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 17 Jun 2013 02:30:42 +0000 (02:30 +0000)
convert the list when transferring from physical to virtual mode.

Contributed-under: TianoCore Contribution Agreement 1.0

Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14425 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/Variable/RuntimeDxe/VariableDxe.c
SecurityPkg/VariableAuthenticated/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
index a2e764cf610c5d4046e6c947fc2e2d46006fdd69..ef53a96144de0a37f0158332438538cc0bd03545 100644 (file)
@@ -2,6 +2,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) 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
@@ -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
@@ -238,6 +244,23 @@ VariableClassAddressChangeEvent (
   EfiConvertPointer (0x0, (VOID **) &mStorageArea);\r
   EfiConvertPointer (0x0, (VOID **) &mSerializationRuntimeBuffer);\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