]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Fix the issue that FTW driver fail to reclaim WorkSpace.
authorlzeng14 <lzeng14@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 14 Sep 2012 06:54:35 +0000 (06:54 +0000)
committerlzeng14 <lzeng14@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 14 Sep 2012 06:54:35 +0000 (06:54 +0000)
Signed-off-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
Reviewed-by: Hengyan Tao <hengyan.tao@intel.com>
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13732 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWrite.c
MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.c
MdeModulePkg/Universal/FaultTolerantWriteDxe/FtwMisc.c
MdeModulePkg/Universal/FaultTolerantWriteDxe/UpdateWorkingBlock.c

index 625737eac018affcae37b9f9e6843d9e93bfc1f7..2f110167d7cc19cc46f89447d757bea0a0f8c859 100644 (file)
@@ -3,7 +3,7 @@
   These are the common Fault Tolerant Write (FTW) functions that are shared \r
   by DXE FTW driver and SMM FTW driver.\r
 \r
-Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2012, 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
 which accompanies this distribution.  The full text of the license may be found at        \r
@@ -193,9 +193,12 @@ FtwWriteRecord (
   EFI_FAULT_TOLERANT_WRITE_HEADER *Header;\r
   EFI_FAULT_TOLERANT_WRITE_RECORD *Record;\r
   UINTN                           Offset;\r
+  EFI_LBA                         WorkSpaceLbaOffset;\r
 \r
   FtwDevice = FTW_CONTEXT_FROM_THIS (This);\r
 \r
+  WorkSpaceLbaOffset = FtwDevice->FtwWorkSpaceLba - FtwDevice->FtwWorkBlockLba;\r
+\r
   //\r
   // Spare Complete but Destination not complete,\r
   // Recover the target block with the spare block.\r
@@ -215,7 +218,7 @@ FtwWriteRecord (
     Offset = (UINT8 *) Record - FtwDevice->FtwWorkSpace;\r
     Status = FtwUpdateFvState (\r
               FtwDevice->FtwBackupFvb,\r
-              FtwDevice->FtwWorkSpaceLba,\r
+              FtwDevice->FtwSpareLba + WorkSpaceLbaOffset,\r
               FtwDevice->FtwWorkSpaceBase + Offset,\r
               SPARE_COMPLETED\r
               );\r
index 47ec11859220da87204ae377741d089c91fca460..2537d22e2c2a7431ceddc14e7a4d39789d8d9175 100644 (file)
@@ -209,6 +209,8 @@ GetFvbCountAndBuffer (
   *NumberHandles = BufferSize / sizeof(EFI_HANDLE);\r
   if (EFI_ERROR(Status)) {\r
     *NumberHandles = 0;\r
+    FreePool (*Buffer);\r
+    *Buffer = NULL;\r
   }\r
 \r
   return Status;\r
index 482753f62cbb5fad9d59b32b92448347ec95f79c..f1d64942b47c294cfad2fe5ad19e55f85ccaeced 100644 (file)
@@ -572,6 +572,9 @@ FlushSpareBlockToWorkingBlock (
   if (Buffer == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
+\r
+  WorkSpaceLbaOffset = FtwDevice->FtwWorkSpaceLba - FtwDevice->FtwWorkBlockLba;\r
+\r
   //\r
   // To guarantee that the WorkingBlockValid is set on spare block\r
   //\r
@@ -581,7 +584,7 @@ FlushSpareBlockToWorkingBlock (
   //\r
   FtwUpdateFvState (\r
     FtwDevice->FtwBackupFvb,\r
-    FtwDevice->FtwWorkSpaceLba,\r
+    FtwDevice->FtwSpareLba + WorkSpaceLbaOffset,\r
     FtwDevice->FtwWorkSpaceBase + sizeof (EFI_GUID) + sizeof (UINT32),\r
     WORKING_BLOCK_VALID\r
     );\r
@@ -608,7 +611,6 @@ FlushSpareBlockToWorkingBlock (
   //\r
   // Clear the CRC and STATE, copy data from spare to working block.\r
   //\r
-  WorkSpaceLbaOffset = FtwDevice->FtwWorkSpaceLba - FtwDevice->FtwWorkBlockLba;\r
   WorkingBlockHeader = (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER *) (Buffer + (UINTN) WorkSpaceLbaOffset * FtwDevice->BlockSize + FtwDevice->FtwWorkSpaceBase);\r
   InitWorkSpaceHeader (WorkingBlockHeader);\r
   WorkingBlockHeader->WorkingBlockValid   = FTW_ERASE_POLARITY;\r
index 425aa403c3b520c569a06f56c8c0f8021928294b..bbe5fb63b57947f31cfbf602a595de10f8f32e8e 100644 (file)
@@ -2,7 +2,7 @@
 \r
    Internal functions to operate Working Block Space.\r
 \r
-Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2012, 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
 which accompanies this distribution.  The full text of the license may be found at        \r
@@ -22,8 +22,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
   @param WorkingHeader   Pointer of working block header\r
 \r
-  @retval  EFI_SUCCESS    The function completed successfully\r
-  @retval  EFI_ABORTED    The function could not complete successfully.\r
+  @retval TRUE          The work space is valid.\r
+  @retval FALSE         The work space is invalid.\r
 \r
 **/\r
 BOOLEAN\r
@@ -166,8 +166,6 @@ WorkSpaceRefresh (
 {\r
   EFI_STATUS                      Status;\r
   UINTN                           Length;\r
-  UINTN                           Offset;\r
-  EFI_FAULT_TOLERANT_WRITE_HEADER *FtwHeader;\r
 \r
   //\r
   // Initialize WorkSpace as FTW_ERASED_BYTE\r
@@ -200,14 +198,7 @@ WorkSpaceRefresh (
             FtwDevice->FtwWorkSpaceSize,\r
             &FtwDevice->FtwLastWriteHeader\r
             );\r
-\r
-  FtwHeader = FtwDevice->FtwLastWriteHeader;\r
-  Offset    = (UINTN) (UINT8 *) FtwHeader - (UINTN) FtwDevice->FtwWorkSpace;\r
-\r
-  //\r
-  // if the Header is out of the workspace limit, call reclaim.\r
-  //\r
-  if (EFI_ERROR (Status) && (Offset >= FtwDevice->FtwWorkSpaceSize)) {\r
+  if (EFI_ERROR (Status)) {\r
     //\r
     // reclaim work space in working block.\r
     //\r
@@ -236,6 +227,9 @@ WorkSpaceRefresh (
               FtwDevice->FtwWorkSpaceSize,\r
               &FtwDevice->FtwLastWriteHeader\r
               );\r
+    if (EFI_ERROR (Status)) {\r
+      return EFI_ABORTED;\r
+    }\r
   }\r
   //\r
   // Refresh the FtwLastWriteRecord\r
@@ -278,9 +272,12 @@ FtwReclaimWorkSpace (
   EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER *WorkingBlockHeader;\r
   UINTN                                   Index;\r
   UINT8                                   *Ptr;\r
+  EFI_LBA                                 WorkSpaceLbaOffset;\r
 \r
   DEBUG ((EFI_D_ERROR, "Ftw: start to reclaim work space\n"));\r
 \r
+  WorkSpaceLbaOffset = FtwDevice->FtwWorkSpaceLba - FtwDevice->FtwWorkBlockLba;\r
+\r
   //\r
   // Read all original data from working block to a memory buffer\r
   //\r
@@ -311,7 +308,7 @@ FtwReclaimWorkSpace (
   // Clean up the workspace, remove all the completed records.\r
   //\r
   Ptr = TempBuffer +\r
-        ((UINTN) (FtwDevice->FtwWorkSpaceLba - FtwDevice->FtwWorkBlockLba)) * FtwDevice->BlockSize + \r
+        (UINTN) WorkSpaceLbaOffset * FtwDevice->BlockSize +\r
         FtwDevice->FtwWorkSpaceBase;\r
 \r
   //\r
@@ -358,10 +355,17 @@ FtwReclaimWorkSpace (
     &FtwDevice->FtwLastWriteHeader\r
     );\r
 \r
+  FtwGetLastWriteRecord (\r
+    FtwDevice->FtwLastWriteHeader,\r
+    &FtwDevice->FtwLastWriteRecord\r
+    );\r
+\r
   //\r
   // Set the WorkingBlockValid and WorkingBlockInvalid as INVALID\r
   //\r
-  WorkingBlockHeader                      = (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER *) (TempBuffer + FtwDevice->FtwWorkSpaceBase);\r
+  WorkingBlockHeader                      = (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER *) (TempBuffer +\r
+                                            (UINTN) WorkSpaceLbaOffset * FtwDevice->BlockSize +\r
+                                            FtwDevice->FtwWorkSpaceBase);\r
   WorkingBlockHeader->WorkingBlockValid   = FTW_INVALID_STATE;\r
   WorkingBlockHeader->WorkingBlockInvalid = FTW_INVALID_STATE;\r
 \r
@@ -426,7 +430,7 @@ FtwReclaimWorkSpace (
   //\r
   Status = FtwUpdateFvState (\r
             FtwDevice->FtwBackupFvb,\r
-            FtwDevice->FtwWorkSpaceLba,\r
+            FtwDevice->FtwSpareLba + WorkSpaceLbaOffset,\r
             FtwDevice->FtwWorkSpaceBase + sizeof (EFI_GUID) + sizeof (UINT32),\r
             WORKING_BLOCK_VALID\r
             );\r