Revision: 19577
          http://sourceforge.net/p/edk2/code/19577
Author:   lzeng14
Date:     2015-12-30 05:09:16 +0000 (Wed, 30 Dec 2015)
Log Message:
-----------
MdeModulePkg Variable:  Handle ftw driver executes prior to variable driver

Variable driver uses gEdkiiFaultTolerantWriteGuid hob and copies  data to 
NvStorageData if hob exists.
But if ftw driver executes prior to variable driver then spare block is erased.

So the patch is to enhance the code to do not check FTW last write data hob if 
FTW protocol has been installed.

Cc: Liming Gao <[email protected]>
Reported-by: Baraneedharan Anbazhagan <[email protected]>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Star Zeng <[email protected]>
Reviewed-by: Baraneedharan Anbazhagan <[email protected]>
Reviewed-by: Liming Gao <[email protected]>

Modified Paths:
--------------
    trunk/edk2/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c

Modified: trunk/edk2/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c    
2015-12-30 02:22:30 UTC (rev 19576)
+++ trunk/edk2/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c    
2015-12-30 05:09:16 UTC (rev 19577)
@@ -3626,6 +3626,8 @@
   UINT32                                HwErrStorageSize;
   UINT32                                MaxUserNvVariableSpaceSize;
   UINT32                                BoottimeReservedNvVariableSpaceSize;
+  EFI_STATUS                            Status;
+  VOID                                  *FtwProtocol;
 
   mVariableModuleGlobal->FvbInstance = NULL;
 
@@ -3648,30 +3650,36 @@
   //
   CopyMem (NvStorageData, (UINT8 *) (UINTN) NvStorageBase, NvStorageSize);
 
+  Status = GetFtwProtocol ((VOID **)&FtwProtocol);
   //
-  // Check the FTW last write data hob.
+  // If FTW protocol has been installed, no need to check FTW last write data 
hob.
   //
-  GuidHob = GetFirstGuidHob (&gEdkiiFaultTolerantWriteGuid);
-  if (GuidHob != NULL) {
-    FtwLastWriteData = (FAULT_TOLERANT_WRITE_LAST_WRITE_DATA *) 
GET_GUID_HOB_DATA (GuidHob);
-    if (FtwLastWriteData->TargetAddress == NvStorageBase) {
-      DEBUG ((EFI_D_INFO, "Variable: NV storage is backed up in spare block: 
0x%x\n", (UINTN) FtwLastWriteData->SpareAddress));
-      //
-      // Copy the backed up NV storage data to the memory buffer from spare 
block.
-      //
-      CopyMem (NvStorageData, (UINT8 *) (UINTN) 
(FtwLastWriteData->SpareAddress), NvStorageSize);
-    } else if ((FtwLastWriteData->TargetAddress > NvStorageBase) &&
-               (FtwLastWriteData->TargetAddress < (NvStorageBase + 
NvStorageSize))) {
-      //
-      // Flash NV storage from the Offset is backed up in spare block.
-      //
-      BackUpOffset = (UINT32) (FtwLastWriteData->TargetAddress - 
NvStorageBase);
-      BackUpSize = NvStorageSize - BackUpOffset;
-      DEBUG ((EFI_D_INFO, "Variable: High partial NV storage from offset: %x 
is backed up in spare block: 0x%x\n", BackUpOffset, (UINTN) 
FtwLastWriteData->SpareAddress));
-      //
-      // Copy the partial backed up NV storage data to the memory buffer from 
spare block.
-      //
-      CopyMem (NvStorageData + BackUpOffset, (UINT8 *) (UINTN) 
FtwLastWriteData->SpareAddress, BackUpSize);
+  if (EFI_ERROR (Status)) {
+    //
+    // Check the FTW last write data hob.
+    //
+    GuidHob = GetFirstGuidHob (&gEdkiiFaultTolerantWriteGuid);
+    if (GuidHob != NULL) {
+      FtwLastWriteData = (FAULT_TOLERANT_WRITE_LAST_WRITE_DATA *) 
GET_GUID_HOB_DATA (GuidHob);
+      if (FtwLastWriteData->TargetAddress == NvStorageBase) {
+        DEBUG ((EFI_D_INFO, "Variable: NV storage is backed up in spare block: 
0x%x\n", (UINTN) FtwLastWriteData->SpareAddress));
+        //
+        // Copy the backed up NV storage data to the memory buffer from spare 
block.
+        //
+        CopyMem (NvStorageData, (UINT8 *) (UINTN) 
(FtwLastWriteData->SpareAddress), NvStorageSize);
+      } else if ((FtwLastWriteData->TargetAddress > NvStorageBase) &&
+                 (FtwLastWriteData->TargetAddress < (NvStorageBase + 
NvStorageSize))) {
+        //
+        // Flash NV storage from the Offset is backed up in spare block.
+        //
+        BackUpOffset = (UINT32) (FtwLastWriteData->TargetAddress - 
NvStorageBase);
+        BackUpSize = NvStorageSize - BackUpOffset;
+        DEBUG ((EFI_D_INFO, "Variable: High partial NV storage from offset: %x 
is backed up in spare block: 0x%x\n", BackUpOffset, (UINTN) 
FtwLastWriteData->SpareAddress));
+        //
+        // Copy the partial backed up NV storage data to the memory buffer 
from spare block.
+        //
+        CopyMem (NvStorageData + BackUpOffset, (UINT8 *) (UINTN) 
FtwLastWriteData->SpareAddress, BackUpSize);
+      }
     }
   }
 


------------------------------------------------------------------------------
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to