]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/FaultTolerantWriteDxe/UpdateWorkingBlock.c
Initialize a local work space header to be used by IsValidWorkSpace() and InitWorkSpa...
[mirror_edk2.git] / MdeModulePkg / Universal / FaultTolerantWriteDxe / UpdateWorkingBlock.c
index 340e167ac9df6a00170b2e335d1cda2f365dab25..bd8285d00e1a842ebb74119ab6a919f83991a603 100644 (file)
@@ -16,77 +16,90 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include "FaultTolerantWrite.h"\r
 \r
-/**\r
-  Check to see if it is a valid work space.\r
-\r
-\r
-  @param WorkingHeader   Pointer of working block header\r
+EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER mWorkingBlockHeader = {ZERO_GUID, 0, 0, 0, 0, {0, 0, 0}, 0};\r
 \r
-  @retval TRUE          The work space is valid.\r
-  @retval FALSE         The work space is invalid.\r
+/**\r
+  Initialize a local work space header.\r
 \r
+  Since Signature and WriteQueueSize have been known, Crc can be calculated out,\r
+  then the work space header will be fixed.\r
 **/\r
-BOOLEAN\r
-IsValidWorkSpace (\r
-  IN EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER *WorkingHeader\r
+VOID\r
+InitializeLocalWorkSpaceHeader (\r
+  VOID\r
   )\r
 {\r
   EFI_STATUS                              Status;\r
-  EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER WorkingBlockHeader;\r
-\r
-  if (WorkingHeader == NULL) {\r
-    return FALSE;\r
-  }\r
 \r
-  if (WorkingHeader->WorkingBlockValid != FTW_VALID_STATE) {\r
-    DEBUG ((EFI_D_ERROR, "Ftw: Work block header valid bit check error\n"));\r
-    return FALSE;\r
-  }\r
   //\r
-  // Check signature with gEfiSystemNvDataFvGuid\r
+  // Check signature with gEfiSystemNvDataFvGuid.\r
   //\r
-  if (!CompareGuid (&gEfiSystemNvDataFvGuid, &WorkingHeader->Signature)) {\r
-    DEBUG ((EFI_D_ERROR, "Ftw: Work block header signature check error\n"));\r
-    return FALSE;\r
+  if (CompareGuid (&gEfiSystemNvDataFvGuid, &mWorkingBlockHeader.Signature)) {\r
+    //\r
+    // The local work space header has been initialized.\r
+    //\r
+    return;\r
   }\r
+\r
+  SetMem (\r
+    &mWorkingBlockHeader,\r
+    sizeof (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER),\r
+    FTW_ERASED_BYTE\r
+    );\r
+\r
   //\r
-  // Check the CRC of header\r
+  // Here using gEfiSystemNvDataFvGuid as the signature.\r
   //\r
   CopyMem (\r
-    &WorkingBlockHeader,\r
-    WorkingHeader,\r
-    sizeof (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER)\r
+    &mWorkingBlockHeader.Signature,\r
+    &gEfiSystemNvDataFvGuid,\r
+    sizeof (EFI_GUID)\r
     );\r
+  mWorkingBlockHeader.WriteQueueSize = (UINT64) (PcdGet32 (PcdFlashNvStorageFtwWorkingSize) - sizeof (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER));\r
 \r
   //\r
-  // Filter out the Crc and State fields\r
+  // Crc is calculated with all the fields except Crc and STATE, so leave them as FTW_ERASED_BYTE.\r
   //\r
-  SetMem (\r
-    &WorkingBlockHeader.Crc,\r
-    sizeof (UINT32),\r
-    FTW_ERASED_BYTE\r
-    );\r
-  WorkingBlockHeader.WorkingBlockValid    = FTW_ERASE_POLARITY;\r
-  WorkingBlockHeader.WorkingBlockInvalid  = FTW_ERASE_POLARITY;\r
 \r
   //\r
   // Calculate the Crc of woking block header\r
   //\r
   Status = gBS->CalculateCrc32 (\r
-                  (UINT8 *) &WorkingBlockHeader,\r
+                  &mWorkingBlockHeader,\r
                   sizeof (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER),\r
-                  &WorkingBlockHeader.Crc\r
+                  &mWorkingBlockHeader.Crc\r
                   );\r
-  if (EFI_ERROR (Status)) {\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  mWorkingBlockHeader.WorkingBlockValid    = FTW_VALID_STATE;\r
+  mWorkingBlockHeader.WorkingBlockInvalid  = FTW_INVALID_STATE;\r
+}\r
+\r
+/**\r
+  Check to see if it is a valid work space.\r
+\r
+\r
+  @param WorkingHeader   Pointer of working block header\r
+\r
+  @retval TRUE          The work space is valid.\r
+  @retval FALSE         The work space is invalid.\r
+\r
+**/\r
+BOOLEAN\r
+IsValidWorkSpace (\r
+  IN EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER *WorkingHeader\r
+  )\r
+{\r
+  if (WorkingHeader == NULL) {\r
     return FALSE;\r
   }\r
 \r
-  if (WorkingBlockHeader.Crc != WorkingHeader->Crc) {\r
-    DEBUG ((EFI_D_ERROR, "Ftw: Work block header CRC check error\n"));\r
-    return FALSE;\r
+  if (CompareMem (WorkingHeader, &mWorkingBlockHeader, sizeof (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER)) == 0) {\r
+    return TRUE;\r
   }\r
 \r
-  return TRUE;\r
+  DEBUG ((EFI_D_ERROR, "Ftw: Work block header check error\n"));\r
+  return FALSE;\r
 }\r
 \r
 /**\r
@@ -103,49 +116,11 @@ InitWorkSpaceHeader (
   IN EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER *WorkingHeader\r
   )\r
 {\r
-  EFI_STATUS  Status;\r
-\r
   if (WorkingHeader == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
-  //\r
-  // Here using gEfiSystemNvDataFvGuid as the signature.\r
-  //\r
-  CopyMem (\r
-    &WorkingHeader->Signature,\r
-    &gEfiSystemNvDataFvGuid,\r
-    sizeof (EFI_GUID)\r
-    );\r
-  WorkingHeader->WriteQueueSize = (UINT64) (PcdGet32 (PcdFlashNvStorageFtwWorkingSize) - sizeof (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER));\r
-\r
-  //\r
-  // Crc is calculated with all the fields except Crc and STATE\r
-  //\r
-  WorkingHeader->WorkingBlockValid    = FTW_ERASE_POLARITY;\r
-  WorkingHeader->WorkingBlockInvalid  = FTW_ERASE_POLARITY;\r
 \r
-  SetMem (\r
-    &WorkingHeader->Crc,\r
-    sizeof (UINT32),\r
-    FTW_ERASED_BYTE\r
-    );\r
-\r
-  //\r
-  // Calculate the CRC value\r
-  //\r
-  Status = gBS->CalculateCrc32 (\r
-                  (UINT8 *) WorkingHeader,\r
-                  sizeof (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER),\r
-                  &WorkingHeader->Crc\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return EFI_ABORTED;\r
-  }\r
-  //\r
-  // Restore the WorkingBlockValid flag to VALID state\r
-  //\r
-  WorkingHeader->WorkingBlockValid    = FTW_VALID_STATE;\r
-  WorkingHeader->WorkingBlockInvalid  = FTW_INVALID_STATE;\r
+  CopyMem (WorkingHeader, &mWorkingBlockHeader, sizeof (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER));\r
 \r
   return EFI_SUCCESS;\r
 }\r