]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Variable/RuntimeDxe/VariableDxe.c
Add pointer check for NULL before dereference it.
[mirror_edk2.git] / MdeModulePkg / Universal / Variable / RuntimeDxe / VariableDxe.c
index bde7b4486e08bcf3f24f1e51aa8f8a0d8d5cf3e0..3b6efac1bcfbc4f4d71419284edba865b7b140fb 100644 (file)
@@ -17,15 +17,15 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include "Variable.h"\r
 \r
 extern VARIABLE_STORE_HEADER   *mNvVariableCache;\r
-VARIABLE_INFO_ENTRY            *gVariableInfo;\r
+extern 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,6 +282,11 @@ 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
@@ -300,6 +308,29 @@ 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
@@ -395,9 +426,6 @@ VariableServiceInitialize (
              &ReadyToBootEvent\r
              );\r
 \r
-  if (FeaturePcdGet (PcdVariableCollectStatistics)) {\r
-    gBS->InstallConfigurationTable (&gEfiVariableGuid, gVariableInfo);\r
-  }\r
   return EFI_SUCCESS;\r
 }\r
 \r