\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
\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
{\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
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
FtwDevice->FtwWorkSpaceSize,\r
&FtwDevice->FtwLastWriteHeader\r
);\r
+ if (EFI_ERROR (Status)) {\r
+ return EFI_ABORTED;\r
+ }\r
}\r
//\r
// Refresh the FtwLastWriteRecord\r
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
// 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
&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
&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
//\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