]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Enhance FtwReclaimWorkSpace() so that it can be called when the working space header...
authorlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 17 Jul 2008 02:18:13 +0000 (02:18 +0000)
committerlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 17 Jul 2008 02:18:13 +0000 (02:18 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5510 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/FirmwareVolume/FaultTolerantWriteDxe/FtwLite.c
MdeModulePkg/Universal/FirmwareVolume/FaultTolerantWriteDxe/FtwLite.h
MdeModulePkg/Universal/FirmwareVolume/FaultTolerantWriteDxe/FtwWorkSpace.c
MdeModulePkg/Universal/FirmwareVolume/FaultTolerantWriteDxe/Ia32/Ia32FtwMisc.c

index 264ef4ba5c3a33d14f8710bf54f1021dba19375a..fd974d5d700c17033248cce0d8da1d3823d1c85a 100644 (file)
@@ -119,7 +119,7 @@ FtwLiteWrite (
   // Check if there is enough free space for allocate a record\r
   //\r
   if ((MyOffset + WRITE_TOTAL_SIZE) > FtwLiteDevice->FtwWorkSpaceSize) {\r
-    Status = FtwReclaimWorkSpace (FtwLiteDevice);\r
+    Status = FtwReclaimWorkSpace (FtwLiteDevice, TRUE);\r
     if (EFI_ERROR (Status)) {\r
       DEBUG ((EFI_D_ERROR, "FtwLite: Reclaim work space - %r", Status));\r
       return EFI_ABORTED;\r
@@ -827,16 +827,10 @@ InitializeFtwLite (
         );\r
       InitWorkSpaceHeader (FtwLiteDevice->FtwWorkSpaceHeader);\r
       //\r
-      // Write to work space on the working block\r
+      // Initialize the work space\r
       //\r
-      Length = FtwLiteDevice->FtwWorkSpaceSize;\r
-      Status = FtwLiteDevice->FtwFvBlock->Write (\r
-                                            FtwLiteDevice->FtwFvBlock,\r
-                                            FtwLiteDevice->FtwWorkSpaceLba,\r
-                                            FtwLiteDevice->FtwWorkSpaceBase,\r
-                                            &Length,\r
-                                            FtwLiteDevice->FtwWorkSpace\r
-                                            );\r
+      Status = FtwReclaimWorkSpace (FtwLiteDevice, FALSE);\r
+\r
       if (EFI_ERROR (Status)) {\r
         return EFI_ABORTED;\r
       }\r
@@ -897,7 +891,7 @@ InitializeFtwLite (
         FtwLiteDevice->FtwWorkSpaceSize - Offset\r
         )) {\r
     DEBUG ((EFI_D_FTW_LITE, "FtwLite: Workspace is dirty, call reclaim...\n"));\r
-    Status = FtwReclaimWorkSpace (FtwLiteDevice);\r
+    Status = FtwReclaimWorkSpace (FtwLiteDevice, TRUE);\r
     if (EFI_ERROR (Status)) {\r
       DEBUG ((EFI_D_FTW_LITE, "FtwLite: Workspace reclaim - %r\n", Status));\r
       return EFI_ABORTED;\r
index 6199952e94d8ec331aa4330a1875bb4d875386f7..90a9fd85d2e20f10b44e06e98849b90dde49bb64 100644 (file)
@@ -568,34 +568,12 @@ IsValidWorkSpace (
   )\r
 ;\r
 \r
-/**\r
-  Reclaim the work space. Get rid of all the completed write records\r
-  and write records in the Fault Tolerant work space.\r
-\r
-\r
-  @param FtwLiteDevice   Point to private data of FTW driver\r
-                         FtwSpaceBuffer  - Buffer to contain the reclaimed clean data\r
-  @param BlockBuffer     The data buffer for the block.\r
-  @param BufferSize      Size of the FtwSpaceBuffer\r
-\r
-  @retval  EFI_SUCCESS            The function completed successfully\r
-  @retval  EFI_BUFFER_TOO_SMALL   The FtwSpaceBuffer is too small\r
-  @retval  EFI_ABORTED            The function could not complete successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-CleanupWorkSpace (\r
-  IN EFI_FTW_LITE_DEVICE  *FtwLiteDevice,\r
-  IN OUT UINT8            *BlockBuffer,\r
-  IN UINTN                BufferSize\r
-  )\r
-;\r
-\r
 /**\r
   Reclaim the work space on the working block.\r
 \r
 \r
   @param FtwLiteDevice   Point to private data of FTW driver\r
+  @param PreserveRecord  Whether to preserve the working record is needed\r
 \r
   @retval  EFI_SUCCESS            The function completed successfully\r
   @retval  EFI_OUT_OF_RESOURCES   Allocate memory error\r
@@ -604,7 +582,8 @@ CleanupWorkSpace (
 **/\r
 EFI_STATUS\r
 FtwReclaimWorkSpace (\r
-  IN EFI_FTW_LITE_DEVICE  *FtwLiteDevice\r
+  IN EFI_FTW_LITE_DEVICE  *FtwLiteDevice,\r
+  IN BOOLEAN              PreserveRecord\r
   )\r
 ;\r
 \r
index 3da4d42cd338061d519bd33b5318b56a9f258a04..5583518e528ae1b3157f9867e89a604f9cd0f6e8 100644 (file)
@@ -210,6 +210,7 @@ FtwGetLastRecord (
 {\r
   EFI_FTW_LITE_RECORD *Record;\r
 \r
+  *FtwLastRecord = NULL;\r
   Record = (EFI_FTW_LITE_RECORD *) (FtwLiteDevice->FtwWorkSpaceHeader + 1);\r
   while (Record->WriteCompleted == FTW_VALID_STATE) {\r
     //\r
@@ -287,7 +288,7 @@ WorkSpaceRefresh (
     //\r
     // reclaim work space in working block.\r
     //\r
-    Status = FtwReclaimWorkSpace (FtwLiteDevice);\r
+    Status = FtwReclaimWorkSpace (FtwLiteDevice, TRUE);\r
     if (EFI_ERROR (Status)) {\r
       DEBUG ((EFI_D_FTW_LITE, "FtwLite: Reclaim workspace - %r\n", Status));\r
       return EFI_ABORTED;\r
@@ -297,66 +298,6 @@ WorkSpaceRefresh (
   return EFI_SUCCESS;\r
 }\r
 \r
-/**\r
-  Reclaim the work space. Get rid of all the completed write records\r
-  and write records in the Fault Tolerant work space.\r
-\r
-\r
-  @param FtwLiteDevice   Point to private data of FTW driver\r
-  @param FtwSpaceBuffer  Buffer to contain the reclaimed clean data\r
-  @param BufferSize      Size of the FtwSpaceBuffer\r
-\r
-  @retval  EFI_SUCCESS            The function completed successfully\r
-  @retval  EFI_BUFFER_TOO_SMALL   The FtwSpaceBuffer is too small\r
-  @retval  EFI_ABORTED            The function could not complete successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-CleanupWorkSpace (\r
-  IN EFI_FTW_LITE_DEVICE  *FtwLiteDevice,\r
-  IN OUT UINT8            *FtwSpaceBuffer,\r
-  IN UINTN                BufferSize\r
-  )\r
-{\r
-  UINTN               Length;\r
-  EFI_FTW_LITE_RECORD *Record;\r
-\r
-  //\r
-  // To check if the buffer is large enough\r
-  //\r
-  Length = FtwLiteDevice->FtwWorkSpaceSize;\r
-  if (BufferSize < Length) {\r
-    return EFI_BUFFER_TOO_SMALL;\r
-  }\r
-  //\r
-  // Clear the content of buffer that will save the new work space data\r
-  //\r
-  SetMem (FtwSpaceBuffer, Length, FTW_ERASED_BYTE);\r
-\r
-  //\r
-  // Copy EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER to buffer\r
-  //\r
-  CopyMem (\r
-    FtwSpaceBuffer,\r
-    FtwLiteDevice->FtwWorkSpaceHeader,\r
-    sizeof (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER)\r
-    );\r
-\r
-  //\r
-  // Get the last record\r
-  //\r
-  Record = FtwLiteDevice->FtwLastRecord;\r
-  if ((Record != NULL) && (Record->WriteAllocated == FTW_VALID_STATE) && (Record->WriteCompleted != FTW_VALID_STATE)) {\r
-    CopyMem (\r
-      (UINT8 *) FtwSpaceBuffer + sizeof (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER),\r
-      Record,\r
-      WRITE_TOTAL_SIZE\r
-      );\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
 /**\r
   Reclaim the work space on the working block.\r
 \r
@@ -370,7 +311,8 @@ CleanupWorkSpace (
 **/\r
 EFI_STATUS\r
 FtwReclaimWorkSpace (\r
-  IN EFI_FTW_LITE_DEVICE  *FtwLiteDevice\r
+  IN EFI_FTW_LITE_DEVICE  *FtwLiteDevice,\r
+  IN BOOLEAN              PreserveRecord\r
   )\r
 {\r
   EFI_STATUS                              Status;\r
@@ -382,6 +324,7 @@ FtwReclaimWorkSpace (
   UINTN                                   SpareBufferSize;\r
   UINT8                                   *SpareBuffer;\r
   EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER *WorkingBlockHeader;\r
+  EFI_FTW_LITE_RECORD                     *Record;\r
 \r
   DEBUG ((EFI_D_FTW_LITE, "FtwLite: start to reclaim work space\n"));\r
 \r
@@ -390,7 +333,7 @@ FtwReclaimWorkSpace (
   //\r
   TempBufferSize = FtwLiteDevice->SpareAreaLength;\r
   TempBuffer     = AllocateZeroPool (TempBufferSize);\r
-  if (TempBuffer != NULL) {\r
+  if (TempBuffer == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
@@ -418,11 +361,36 @@ FtwReclaimWorkSpace (
     ((UINTN) (FtwLiteDevice->FtwWorkSpaceLba - FtwLiteDevice->FtwWorkBlockLba)) *\r
     FtwLiteDevice->SizeOfSpareBlock + FtwLiteDevice->FtwWorkSpaceBase;\r
 \r
-  Status = CleanupWorkSpace (\r
-            FtwLiteDevice,\r
-            Ptr,\r
-            FtwLiteDevice->FtwWorkSpaceSize\r
-            );\r
+  //\r
+  // Clear the content of buffer that will save the new work space data\r
+  //\r
+  SetMem (Ptr, FtwLiteDevice->FtwWorkSpaceSize, FTW_ERASED_BYTE);\r
+\r
+  //\r
+  // Copy EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER to buffer\r
+  //\r
+  CopyMem (\r
+    Ptr,\r
+    FtwLiteDevice->FtwWorkSpaceHeader,\r
+    sizeof (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER)\r
+    );\r
+  if (PreserveRecord) {\r
+    //\r
+    // Get the last record\r
+    //\r
+    Status = FtwGetLastRecord (FtwLiteDevice, &FtwLiteDevice->FtwLastRecord);\r
+    Record = FtwLiteDevice->FtwLastRecord;\r
+    if (!EFI_ERROR (Status)                       &&\r
+        Record                 != NULL            &&\r
+        Record->WriteAllocated == FTW_VALID_STATE &&\r
+        Record->WriteCompleted != FTW_VALID_STATE) {\r
+      CopyMem (\r
+        (UINT8 *) Ptr + sizeof (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER),\r
+        Record,\r
+        WRITE_TOTAL_SIZE\r
+        );\r
+    }\r
+  }\r
 \r
   CopyMem (\r
     FtwLiteDevice->FtwWorkSpace,\r
index e626f1da65dae7f22d29a65b70e7da09dfe7b3c1..2c359b231c31c96a704e056c6a5787e03e0f483c 100644 (file)
@@ -258,6 +258,7 @@ FlushSpareBlockToBootBlock (
   Length  = FtwLiteDevice->SpareAreaLength;\r
   Buffer  = AllocatePool (Length);\r
   if (Buffer == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
   }\r
   //\r
   // Get TopSwap bit state\r