]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/VariableRuntimeDxe/Variable.c
Use Hob to get the variable base address in NV storage, but this need to be changed...
[mirror_edk2.git] / MdeModulePkg / Universal / VariableRuntimeDxe / Variable.c
index 4322961630c595dabf8f58e919da0a76e561f474..6f663d4fe1ec4b7456b2bd5a58ca71462898375c 100644 (file)
@@ -1299,13 +1299,15 @@ Returns:
   EFI_PHYSICAL_ADDRESS            FvVolHdr;\r
 \r
   UINT64                          TempVariableStoreHeader;\r
-\r
+  UINT64                          TempVariableStoreLen;\r
   EFI_GCD_MEMORY_SPACE_DESCRIPTOR GcdDescriptor;\r
   EFI_FLASH_SUBAREA_ENTRY         VariableStoreEntry;\r
   UINT64                          BaseAddress;\r
   UINT64                          Length;\r
   UINTN                           Index;\r
   UINT8                           Data;\r
+  EFI_PEI_HOB_POINTERS            FvHob;\r
+  EFI_FLASH_MAP_ENTRY_DATA        *FlashMapEntry;\r
 \r
   mVariableModuleGlobal = AllocateRuntimePool (sizeof (ESAL_VARIABLE_GLOBAL));\r
   if (mVariableModuleGlobal == NULL) {\r
@@ -1341,11 +1343,29 @@ Returns:
   //\r
   // Get non volatile varaible store\r
   //\r
+  // BUGBUG: Here should use dynamic PCD to get NvStorageVariableBase when build tools is ready.\r
+  TempVariableStoreHeader = 0;\r
+  TempVariableStoreLen    = 0;\r
+  FvHob.Raw = GetHobList ();\r
+  while ((FvHob.Raw = GetNextGuidHob (&gEfiFlashMapHobGuid, FvHob.Raw)) != NULL) {\r
+\r
+    FlashMapEntry = (EFI_FLASH_MAP_ENTRY_DATA *) GET_GUID_HOB_DATA (FvHob.Guid);\r
+      \r
+    //\r
+    // Get the FTW work space Flash Map SUB area\r
+    //\r
+    if ((FlashMapEntry->AreaType == EFI_FLASH_AREA_EFI_VARIABLES) && (FlashMapEntry->NumEntries == 1)) {\r
+      TempVariableStoreHeader = FlashMapEntry->Entries[0].Base;\r
+           TempVariableStoreLen    = FlashMapEntry->Entries[0].Length;\r
+    }\r
+    FvHob.Raw = GET_NEXT_HOB (FvHob);\r
+  }\r
+  ASSERT ((TempVariableStoreHeader != 0) && (TempVariableStoreLen != 0));\r
 \r
-  TempVariableStoreHeader = (UINT64) PcdGet32 (PcdFlashNvStorageVariableBase);\r
+  //TempVariableStoreHeader = (UINT64) PcdGet32 (PcdFlashNvStorageVariableBase);\r
   VariableStoreEntry.Base = TempVariableStoreHeader + \\r
                               (((EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) (TempVariableStoreHeader)) -> HeaderLength);\r
-  VariableStoreEntry.Length = (UINT64) PcdGet32 (PcdFlashNvStorageVariableSize) - \\r
+  VariableStoreEntry.Length = TempVariableStoreLen - \\r
                                 (((EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) (TempVariableStoreHeader)) -> HeaderLength);\r
   //\r
   // Mark the variable storage region of the FLASH as RUNTIME\r