\r
**/\r
\r
-\r
#include "FaultTolerantWrite.h"\r
\r
-EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER mWorkingBlockHeader = {ZERO_GUID, 0, 0, 0, 0, {0, 0, 0}, 0};\r
+EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER mWorkingBlockHeader = { ZERO_GUID, 0, 0, 0, 0, { 0, 0, 0 }, 0 };\r
\r
/**\r
Initialize a local work space header.\r
//\r
// Calculate the Crc of woking block header\r
//\r
- mWorkingBlockHeader.Crc = FtwCalculateCrc32 (&mWorkingBlockHeader,\r
- sizeof (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER));\r
+ mWorkingBlockHeader.Crc = FtwCalculateCrc32 (\r
+ &mWorkingBlockHeader,\r
+ sizeof (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER)\r
+ );\r
\r
- mWorkingBlockHeader.WorkingBlockValid = FTW_VALID_STATE;\r
- mWorkingBlockHeader.WorkingBlockInvalid = FTW_INVALID_STATE;\r
+ mWorkingBlockHeader.WorkingBlockValid = FTW_VALID_STATE;\r
+ mWorkingBlockHeader.WorkingBlockInvalid = FTW_INVALID_STATE;\r
}\r
\r
/**\r
**/\r
BOOLEAN\r
IsValidWorkSpace (\r
- IN EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER *WorkingHeader\r
+ IN EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER *WorkingHeader\r
)\r
{\r
if (WorkingHeader == NULL) {\r
**/\r
EFI_STATUS\r
InitWorkSpaceHeader (\r
- IN EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER *WorkingHeader\r
+ IN EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER *WorkingHeader\r
)\r
{\r
if (WorkingHeader == NULL) {\r
**/\r
EFI_STATUS\r
ReadWorkSpaceData (\r
- IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *FvBlock,\r
- IN UINTN BlockSize,\r
- IN EFI_LBA Lba,\r
- IN UINTN Offset,\r
- IN UINTN Length,\r
- OUT UINT8 *Buffer\r
+ IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *FvBlock,\r
+ IN UINTN BlockSize,\r
+ IN EFI_LBA Lba,\r
+ IN UINTN Offset,\r
+ IN UINTN Length,\r
+ OUT UINT8 *Buffer\r
)\r
{\r
- EFI_STATUS Status;\r
- UINT8 *Ptr;\r
- UINTN MyLength;\r
+ EFI_STATUS Status;\r
+ UINT8 *Ptr;\r
+ UINTN MyLength;\r
\r
//\r
// Calculate the real Offset and Lba to write.\r
if (EFI_ERROR (Status)) {\r
return EFI_ABORTED;\r
}\r
- Offset = 0;\r
+\r
+ Offset = 0;\r
Length -= MyLength;\r
- Ptr += MyLength;\r
+ Ptr += MyLength;\r
Lba++;\r
}\r
\r
**/\r
EFI_STATUS\r
WriteWorkSpaceData (\r
- IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *FvBlock,\r
- IN UINTN BlockSize,\r
- IN EFI_LBA Lba,\r
- IN UINTN Offset,\r
- IN UINTN Length,\r
- IN UINT8 *Buffer\r
+ IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *FvBlock,\r
+ IN UINTN BlockSize,\r
+ IN EFI_LBA Lba,\r
+ IN UINTN Offset,\r
+ IN UINTN Length,\r
+ IN UINT8 *Buffer\r
)\r
{\r
- EFI_STATUS Status;\r
- UINT8 *Ptr;\r
- UINTN MyLength;\r
+ EFI_STATUS Status;\r
+ UINT8 *Ptr;\r
+ UINTN MyLength;\r
\r
//\r
// Calculate the real Offset and Lba to write.\r
if (EFI_ERROR (Status)) {\r
return EFI_ABORTED;\r
}\r
- Offset = 0;\r
+\r
+ Offset = 0;\r
Length -= MyLength;\r
- Ptr += MyLength;\r
+ Ptr += MyLength;\r
Lba++;\r
}\r
+\r
return EFI_SUCCESS;\r
}\r
\r
IN EFI_FTW_DEVICE *FtwDevice\r
)\r
{\r
- EFI_STATUS Status;\r
- UINTN RemainingSpaceSize;\r
+ EFI_STATUS Status;\r
+ UINTN RemainingSpaceSize;\r
\r
//\r
// Initialize WorkSpace as FTW_ERASED_BYTE\r
if (EFI_ERROR (Status)) {\r
return EFI_ABORTED;\r
}\r
+\r
//\r
// Refresh the FtwLastWriteHeader\r
//\r
Status = FtwGetLastWriteHeader (\r
- FtwDevice->FtwWorkSpaceHeader,\r
- FtwDevice->FtwWorkSpaceSize,\r
- &FtwDevice->FtwLastWriteHeader\r
- );\r
- RemainingSpaceSize = FtwDevice->FtwWorkSpaceSize - ((UINTN) FtwDevice->FtwLastWriteHeader - (UINTN) FtwDevice->FtwWorkSpace);\r
+ FtwDevice->FtwWorkSpaceHeader,\r
+ FtwDevice->FtwWorkSpaceSize,\r
+ &FtwDevice->FtwLastWriteHeader\r
+ );\r
+ RemainingSpaceSize = FtwDevice->FtwWorkSpaceSize - ((UINTN)FtwDevice->FtwLastWriteHeader - (UINTN)FtwDevice->FtwWorkSpace);\r
DEBUG ((DEBUG_INFO, "Ftw: Remaining work space size - %x\n", RemainingSpaceSize));\r
//\r
// If FtwGetLastWriteHeader() returns error, or the remaining space size is even not enough to contain\r
// pointed by FtwDevice->FtwLastWriteHeader or record pointed by FtwDevice->FtwLastWriteRecord may contain invalid data),\r
// it needs to reclaim work space.\r
//\r
- if (EFI_ERROR (Status) || RemainingSpaceSize < sizeof (EFI_FAULT_TOLERANT_WRITE_HEADER) + sizeof (EFI_FAULT_TOLERANT_WRITE_RECORD)) {\r
+ if (EFI_ERROR (Status) || (RemainingSpaceSize < sizeof (EFI_FAULT_TOLERANT_WRITE_HEADER) + sizeof (EFI_FAULT_TOLERANT_WRITE_RECORD))) {\r
//\r
// reclaim work space in working block.\r
//\r
DEBUG ((DEBUG_ERROR, "Ftw: Reclaim workspace - %r\n", Status));\r
return EFI_ABORTED;\r
}\r
+\r
//\r
// Read from working block again\r
//\r
}\r
\r
Status = FtwGetLastWriteHeader (\r
- FtwDevice->FtwWorkSpaceHeader,\r
- FtwDevice->FtwWorkSpaceSize,\r
- &FtwDevice->FtwLastWriteHeader\r
- );\r
+ FtwDevice->FtwWorkSpaceHeader,\r
+ FtwDevice->FtwWorkSpaceSize,\r
+ &FtwDevice->FtwLastWriteHeader\r
+ );\r
if (EFI_ERROR (Status)) {\r
return EFI_ABORTED;\r
}\r
}\r
+\r
//\r
// Refresh the FtwLastWriteRecord\r
//\r
Status = FtwGetLastWriteRecord (\r
- FtwDevice->FtwLastWriteHeader,\r
- &FtwDevice->FtwLastWriteRecord\r
- );\r
+ FtwDevice->FtwLastWriteHeader,\r
+ &FtwDevice->FtwLastWriteRecord\r
+ );\r
if (EFI_ERROR (Status)) {\r
return EFI_ABORTED;\r
}\r
IN BOOLEAN PreserveRecord\r
)\r
{\r
- EFI_STATUS Status;\r
- UINTN Length;\r
- EFI_FAULT_TOLERANT_WRITE_HEADER *Header;\r
- UINT8 *TempBuffer;\r
- UINTN TempBufferSize;\r
- UINTN SpareBufferSize;\r
- UINT8 *SpareBuffer;\r
- EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER *WorkingBlockHeader;\r
- UINTN Index;\r
- UINT8 *Ptr;\r
- EFI_LBA WorkSpaceLbaOffset;\r
+ EFI_STATUS Status;\r
+ UINTN Length;\r
+ EFI_FAULT_TOLERANT_WRITE_HEADER *Header;\r
+ UINT8 *TempBuffer;\r
+ UINTN TempBufferSize;\r
+ UINTN SpareBufferSize;\r
+ UINT8 *SpareBuffer;\r
+ EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER *WorkingBlockHeader;\r
+ UINTN Index;\r
+ UINT8 *Ptr;\r
+ EFI_LBA WorkSpaceLbaOffset;\r
\r
DEBUG ((DEBUG_INFO, "Ftw: start to reclaim work space\n"));\r
\r
for (Index = 0; Index < FtwDevice->NumberOfWorkBlock; Index += 1) {\r
Length = FtwDevice->WorkBlockSize;\r
Status = FtwDevice->FtwFvBlock->Read (\r
- FtwDevice->FtwFvBlock,\r
- FtwDevice->FtwWorkBlockLba + Index,\r
- 0,\r
- &Length,\r
- Ptr\r
- );\r
+ FtwDevice->FtwFvBlock,\r
+ FtwDevice->FtwWorkBlockLba + Index,\r
+ 0,\r
+ &Length,\r
+ Ptr\r
+ );\r
if (EFI_ERROR (Status)) {\r
FreePool (TempBuffer);\r
return EFI_ABORTED;\r
\r
Ptr += Length;\r
}\r
+\r
//\r
// Clean up the workspace, remove all the completed records.\r
//\r
Ptr = TempBuffer +\r
- (UINTN) WorkSpaceLbaOffset * FtwDevice->WorkBlockSize +\r
+ (UINTN)WorkSpaceLbaOffset * FtwDevice->WorkBlockSize +\r
FtwDevice->FtwWorkSpaceBase;\r
\r
//\r
//\r
// Set the WorkingBlockValid and WorkingBlockInvalid as INVALID\r
//\r
- WorkingBlockHeader = (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER *) (TempBuffer +\r
- (UINTN) WorkSpaceLbaOffset * FtwDevice->WorkBlockSize +\r
- FtwDevice->FtwWorkSpaceBase);\r
+ WorkingBlockHeader = (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER *)(TempBuffer +\r
+ (UINTN)WorkSpaceLbaOffset * FtwDevice->WorkBlockSize +\r
+ FtwDevice->FtwWorkSpaceBase);\r
WorkingBlockHeader->WorkingBlockValid = FTW_INVALID_STATE;\r
WorkingBlockHeader->WorkingBlockInvalid = FTW_INVALID_STATE;\r
\r
\r
Ptr += Length;\r
}\r
+\r
//\r
// Write the memory buffer to spare block\r
//\r
- Status = FtwEraseSpareBlock (FtwDevice);\r
+ Status = FtwEraseSpareBlock (FtwDevice);\r
if (EFI_ERROR (Status)) {\r
FreePool (TempBuffer);\r
FreePool (SpareBuffer);\r
return EFI_ABORTED;\r
}\r
- Ptr = TempBuffer;\r
+\r
+ Ptr = TempBuffer;\r
for (Index = 0; TempBufferSize > 0; Index += 1) {\r
if (TempBufferSize > FtwDevice->SpareBlockSize) {\r
Length = FtwDevice->SpareBlockSize;\r
} else {\r
Length = TempBufferSize;\r
}\r
+\r
Status = FtwDevice->FtwBackupFvb->Write (\r
- FtwDevice->FtwBackupFvb,\r
- FtwDevice->FtwSpareLba + Index,\r
- 0,\r
- &Length,\r
- Ptr\r
- );\r
+ FtwDevice->FtwBackupFvb,\r
+ FtwDevice->FtwSpareLba + Index,\r
+ 0,\r
+ &Length,\r
+ Ptr\r
+ );\r
if (EFI_ERROR (Status)) {\r
FreePool (TempBuffer);\r
FreePool (SpareBuffer);\r
return EFI_ABORTED;\r
}\r
\r
- Ptr += Length;\r
+ Ptr += Length;\r
TempBufferSize -= Length;\r
}\r
+\r
//\r
// Free TempBuffer\r
//\r
// Set the WorkingBlockValid in spare block\r
//\r
Status = FtwUpdateFvState (\r
- FtwDevice->FtwBackupFvb,\r
- FtwDevice->SpareBlockSize,\r
- FtwDevice->FtwSpareLba + FtwDevice->FtwWorkSpaceLbaInSpare,\r
- FtwDevice->FtwWorkSpaceBaseInSpare + sizeof (EFI_GUID) + sizeof (UINT32),\r
- WORKING_BLOCK_VALID\r
- );\r
+ FtwDevice->FtwBackupFvb,\r
+ FtwDevice->SpareBlockSize,\r
+ FtwDevice->FtwSpareLba + FtwDevice->FtwWorkSpaceLbaInSpare,\r
+ FtwDevice->FtwWorkSpaceBaseInSpare + sizeof (EFI_GUID) + sizeof (UINT32),\r
+ WORKING_BLOCK_VALID\r
+ );\r
if (EFI_ERROR (Status)) {\r
FreePool (SpareBuffer);\r
return EFI_ABORTED;\r
}\r
+\r
//\r
// Before erase the working block, set WorkingBlockInvalid in working block.\r
//\r
// WorkingBlockInvalid);\r
//\r
Status = FtwUpdateFvState (\r
- FtwDevice->FtwFvBlock,\r
- FtwDevice->WorkBlockSize,\r
- FtwDevice->FtwWorkSpaceLba,\r
- FtwDevice->FtwWorkSpaceBase + sizeof (EFI_GUID) + sizeof (UINT32),\r
- WORKING_BLOCK_INVALID\r
- );\r
+ FtwDevice->FtwFvBlock,\r
+ FtwDevice->WorkBlockSize,\r
+ FtwDevice->FtwWorkSpaceLba,\r
+ FtwDevice->FtwWorkSpaceBase + sizeof (EFI_GUID) + sizeof (UINT32),\r
+ WORKING_BLOCK_INVALID\r
+ );\r
if (EFI_ERROR (Status)) {\r
FreePool (SpareBuffer);\r
return EFI_ABORTED;\r
FreePool (SpareBuffer);\r
return Status;\r
}\r
+\r
//\r
// Restore spare backup buffer into spare block , if no failure happened during FtwWrite.\r
//\r
- Status = FtwEraseSpareBlock (FtwDevice);\r
+ Status = FtwEraseSpareBlock (FtwDevice);\r
if (EFI_ERROR (Status)) {\r
FreePool (SpareBuffer);\r
return EFI_ABORTED;\r
}\r
- Ptr = SpareBuffer;\r
+\r
+ Ptr = SpareBuffer;\r
for (Index = 0; Index < FtwDevice->NumberOfSpareBlock; Index += 1) {\r
Length = FtwDevice->SpareBlockSize;\r
Status = FtwDevice->FtwBackupFvb->Write (\r