]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/FaultTolerantWriteDxe/FtwMisc.c
MdeModulePkg: Variable drivers robustly handle crashes during Reclaim().
[mirror_edk2.git] / MdeModulePkg / Universal / FaultTolerantWriteDxe / FtwMisc.c
index 2e4052c1ead0001b98fab73613c0b428f7074511..fdd9dfa0c17a30f5c146dac3516ee49361323250 100644 (file)
@@ -689,6 +689,7 @@ FlushSpareBlockToWorkingBlock (
     return EFI_ABORTED;\r
   }\r
 \r
+  FtwDevice->FtwWorkSpaceHeader->WorkingBlockInvalid = FTW_INVALID_STATE;\r
   FtwDevice->FtwWorkSpaceHeader->WorkingBlockValid = FTW_VALID_STATE;\r
 \r
   return EFI_SUCCESS;\r
@@ -775,7 +776,7 @@ FtwGetLastWriteHeader (
   Offset          = sizeof (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER);\r
 \r
   while (FtwHeader->Complete == FTW_VALID_STATE) {\r
-    Offset += WRITE_TOTAL_SIZE (FtwHeader->NumberOfWrites, FtwHeader->PrivateDataSize);\r
+    Offset += FTW_WRITE_TOTAL_SIZE (FtwHeader->NumberOfWrites, FtwHeader->PrivateDataSize);\r
     //\r
     // If Offset exceed the FTW work space boudary, return error.\r
     //\r
@@ -834,7 +835,7 @@ FtwGetLastWriteRecord (
     FtwRecord++;\r
 \r
     if (FtwWriteHeader->PrivateDataSize != 0) {\r
-      FtwRecord = (EFI_FAULT_TOLERANT_WRITE_RECORD *) ((UINTN) FtwRecord + FtwWriteHeader->PrivateDataSize);\r
+      FtwRecord = (EFI_FAULT_TOLERANT_WRITE_RECORD *) ((UINTN) FtwRecord + (UINTN) FtwWriteHeader->PrivateDataSize);\r
     }\r
   }\r
   //\r
@@ -844,7 +845,7 @@ FtwGetLastWriteRecord (
   //  also return the last record.\r
   //\r
   if (Index == FtwWriteHeader->NumberOfWrites) {\r
-    *FtwWriteRecord = (EFI_FAULT_TOLERANT_WRITE_RECORD *) ((UINTN) FtwRecord - RECORD_SIZE (FtwWriteHeader->PrivateDataSize));\r
+    *FtwWriteRecord = (EFI_FAULT_TOLERANT_WRITE_RECORD *) ((UINTN) FtwRecord - FTW_RECORD_SIZE (FtwWriteHeader->PrivateDataSize));\r
     return EFI_SUCCESS;\r
   }\r
 \r
@@ -901,7 +902,7 @@ IsLastRecordOfWrites (
   Head  = (UINT8 *) FtwHeader;\r
   Ptr   = (UINT8 *) FtwRecord;\r
 \r
-  Head += WRITE_TOTAL_SIZE (FtwHeader->NumberOfWrites - 1, FtwHeader->PrivateDataSize);\r
+  Head += FTW_WRITE_TOTAL_SIZE (FtwHeader->NumberOfWrites - 1, FtwHeader->PrivateDataSize);\r
   return (BOOLEAN) (Head == Ptr);\r
 }\r
 \r
@@ -929,7 +930,7 @@ GetPreviousRecordOfWrites (
   }\r
 \r
   Ptr = (UINT8 *) (*FtwRecord);\r
-  Ptr -= RECORD_SIZE (FtwHeader->PrivateDataSize);\r
+  Ptr -= FTW_RECORD_SIZE (FtwHeader->PrivateDataSize);\r
   *FtwRecord = (EFI_FAULT_TOLERANT_WRITE_RECORD *) Ptr;\r
   return EFI_SUCCESS;\r
 }\r
@@ -1259,7 +1260,7 @@ InitFtwProtocol (
   FtwHeader = FtwDevice->FtwLastWriteHeader;\r
   Offset    = (UINT8 *) FtwHeader - FtwDevice->FtwWorkSpace;\r
   if (FtwDevice->FtwWorkSpace[Offset] != FTW_ERASED_BYTE) {\r
-    Offset += WRITE_TOTAL_SIZE (FtwHeader->NumberOfWrites, FtwHeader->PrivateDataSize);\r
+    Offset += FTW_WRITE_TOTAL_SIZE (FtwHeader->NumberOfWrites, FtwHeader->PrivateDataSize);\r
   }\r
   \r
   if (!IsErasedFlashBuffer (FtwDevice->FtwWorkSpace + Offset, FtwDevice->FtwWorkSpaceSize - Offset)) {\r
@@ -1283,7 +1284,7 @@ InitFtwProtocol (
       // if (SpareCompleted) THEN  Restart to fault tolerant write.\r
       //\r
       FvbHandle = NULL;\r
-      FvbHandle = GetFvbByAddress (FtwDevice->FtwLastWriteRecord->FvBaseAddress, &Fvb);\r
+      FvbHandle = GetFvbByAddress ((EFI_PHYSICAL_ADDRESS) (UINTN) ((INT64) FtwDevice->SpareAreaAddress + FtwDevice->FtwLastWriteRecord->RelativeOffset), &Fvb);\r
       if (FvbHandle != NULL) {\r
         Status = FtwRestart (&FtwDevice->FtwInstance, FvbHandle);\r
         DEBUG ((EFI_D_ERROR, "FtwLite: Restart last write - %r\n", Status));\r