\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
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