]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/FaultTolerantWriteDxe/UpdateWorkingBlock.c
Add more exact SMM check in SmmFaultTolerantWriteHandler.
[mirror_edk2.git] / MdeModulePkg / Universal / FaultTolerantWriteDxe / UpdateWorkingBlock.c
index 4690a08d532f48ca270f4c205973dfb0f76bd815..bbe5fb63b57947f31cfbf602a595de10f8f32e8e 100644 (file)
@@ -2,7 +2,7 @@
 \r
    Internal functions to operate Working Block Space.\r
 \r
-Copyright (c) 2006 - 2008, 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
@@ -337,7 +334,7 @@ FtwReclaimWorkSpace (
                &FtwDevice->FtwLastWriteHeader\r
                );\r
     Header = FtwDevice->FtwLastWriteHeader;\r
-    if (!EFI_ERROR (Status) && (Header != NULL) && (Header->Complete != FTW_VALID_STATE)) {\r
+    if (!EFI_ERROR (Status) && (Header != NULL) && (Header->Complete != FTW_VALID_STATE) && (Header->HeaderAllocated == FTW_VALID_STATE)) {\r
       CopyMem (\r
         Ptr + sizeof (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER),\r
         FtwDevice->FtwLastWriteHeader,\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