]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Variable/RuntimeDxe/VariableDxe.c
1. Invoke InstallConfigurationTable () in OnReadyToBoot() to avoid the new registered...
[mirror_edk2.git] / MdeModulePkg / Universal / Variable / RuntimeDxe / VariableDxe.c
index f9f20bdf6da1c4d21882ec684fc2e1d730c40ed0..86028beca9fc962de7f99e794390888c6b4e5564 100644 (file)
@@ -20,12 +20,12 @@ extern VARIABLE_STORE_HEADER   *mNvVariableCache;
 VARIABLE_INFO_ENTRY            *gVariableInfo;\r
 EFI_HANDLE                     mHandle                    = NULL;\r
 EFI_EVENT                      mVirtualAddressChangeEvent = NULL;\r
-EFI_EVENT                           mFtwRegistration           = NULL;\r
+EFI_EVENT                      mFtwRegistration           = NULL;\r
 \r
 /**\r
-  Return TRUE if ExitBootServices () has been called\r
+  Return TRUE if ExitBootServices () has been called.\r
   \r
-  @retval TRUE If ExitBootServices () has been called\r
+  @retval TRUE If ExitBootServices () has been called.\r
 **/\r
 BOOLEAN\r
 AtRuntime (\r
@@ -255,6 +255,9 @@ OnReadyToBoot (
   )\r
 {\r
   ReclaimForOS ();\r
+  if (FeaturePcdGet (PcdVariableCollectStatistics)) {\r
+    gBS->InstallConfigurationTable (&gEfiVariableGuid, gVariableInfo);\r
+  }\r
 }\r
 \r
 \r
@@ -279,11 +282,16 @@ FtwNotificationEvent (
   EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL      *FvbProtocol;\r
   EFI_FAULT_TOLERANT_WRITE_PROTOCOL       *FtwProtocol;\r
   EFI_PHYSICAL_ADDRESS                    NvStorageVariableBase;\r
+  EFI_GCD_MEMORY_SPACE_DESCRIPTOR         GcdDescriptor;\r
+  EFI_PHYSICAL_ADDRESS                    BaseAddress;\r
+  UINT64                                  Length;\r
+  EFI_PHYSICAL_ADDRESS                    VariableStoreBase;\r
+  UINT64                                  VariableStoreLength;\r
 \r
   //\r
   // Ensure FTW protocol is installed.\r
   //\r
-  Status = GetFtwProtocol (&FtwProtocol);\r
+  Status = GetFtwProtocol ((VOID**) &FtwProtocol);\r
   if (EFI_ERROR (Status)) {\r
     return ;\r
   }\r
@@ -300,12 +308,36 @@ FtwNotificationEvent (
     return ;\r
   }\r
   mVariableModuleGlobal->FvbInstance = FvbProtocol;\r
+\r
+  //\r
+  // Mark the variable storage region of the FLASH as RUNTIME.\r
+  //\r
+  VariableStoreBase   = mVariableModuleGlobal->VariableGlobal.NonVolatileVariableBase;\r
+  VariableStoreLength = ((VARIABLE_STORE_HEADER *)(UINTN)VariableStoreBase)->Size;\r
+  BaseAddress = VariableStoreBase & (~EFI_PAGE_MASK);\r
+  Length      = VariableStoreLength + (VariableStoreBase - BaseAddress);\r
+  Length      = (Length + EFI_PAGE_SIZE - 1) & (~EFI_PAGE_MASK);\r
+\r
+  Status      = gDS->GetMemorySpaceDescriptor (BaseAddress, &GcdDescriptor);\r
+  if (EFI_ERROR (Status)) {\r
+    DEBUG ((DEBUG_WARN, "Variable driver failed to add EFI_MEMORY_RUNTIME attribute to Flash.\n"));\r
+  } else {\r
+    Status = gDS->SetMemorySpaceAttributes (\r
+                    BaseAddress,\r
+                    Length,\r
+                    GcdDescriptor.Attributes | EFI_MEMORY_RUNTIME\r
+                    );\r
+    if (EFI_ERROR (Status)) {\r
+      DEBUG ((DEBUG_WARN, "Variable driver failed to add EFI_MEMORY_RUNTIME attribute to Flash.\n"));\r
+    }\r
+  }\r
   \r
   Status = VariableWriteServiceInitialize ();\r
   ASSERT_EFI_ERROR (Status);\r
  \r
   //\r
-  // Install the Variable Write Architectural protocol.\r  //\r
+  // Install the Variable Write Architectural protocol.\r
+  //\r
   Status = gBS->InstallProtocolInterface (\r
                   &mHandle,\r
                   &gEfiVariableWriteArchProtocolGuid, \r
@@ -394,9 +426,6 @@ VariableServiceInitialize (
              &ReadyToBootEvent\r
              );\r
 \r
-  if (FeaturePcdGet (PcdVariableCollectStatistics)) {\r
-    gBS->InstallConfigurationTable (&gEfiVariableGuid, gVariableInfo);\r
-  }\r
   return EFI_SUCCESS;\r
 }\r
 \r