OUT EFI_FTW_DEVICE **FtwData\r
)\r
{\r
- EFI_FTW_DEVICE *FtwDevice;\r
+ EFI_STATUS Status;\r
+ EFI_PHYSICAL_ADDRESS WorkSpaceAddress;\r
+ UINT64 Size;\r
+ UINTN FtwWorkingSize;\r
+ EFI_FTW_DEVICE *FtwDevice;\r
+\r
+ FtwWorkingSize = 0;\r
+\r
+ Status = GetVariableFlashFtwWorkingInfo (&WorkSpaceAddress, &Size);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ Status = SafeUint64ToUintn (Size, &FtwWorkingSize);\r
+ // This driver currently assumes the size will be UINTN so assert the value is safe for now.\r
+ ASSERT_EFI_ERROR (Status);\r
\r
//\r
// Allocate private data of this driver,\r
// Including the FtwWorkSpace[FTW_WORK_SPACE_SIZE].\r
//\r
- FtwDevice = AllocateZeroPool (sizeof (EFI_FTW_DEVICE) + PcdGet32 (PcdFlashNvStorageFtwWorkingSize));\r
+ FtwDevice = AllocateZeroPool (sizeof (EFI_FTW_DEVICE) + FtwWorkingSize);\r
if (FtwDevice == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
+ FtwDevice->WorkSpaceAddress = WorkSpaceAddress;\r
+ FtwDevice->WorkSpaceLength = FtwWorkingSize;\r
+\r
+ Status = GetVariableFlashFtwSpareInfo (&FtwDevice->SpareAreaAddress, &Size);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ Status = SafeUint64ToUintn (Size, &FtwDevice->SpareAreaLength);\r
+ // This driver currently assumes the size will be UINTN so assert the value is safe for now.\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
//\r
// Initialize other parameters, and set WorkSpace as FTW_ERASED_BYTE.\r
//\r
- FtwDevice->WorkSpaceLength = (UINTN)PcdGet32 (PcdFlashNvStorageFtwWorkingSize);\r
- FtwDevice->SpareAreaLength = (UINTN)PcdGet32 (PcdFlashNvStorageFtwSpareSize);\r
if ((FtwDevice->WorkSpaceLength == 0) || (FtwDevice->SpareAreaLength == 0)) {\r
DEBUG ((DEBUG_ERROR, "Ftw: Workspace or Spare block does not exist!\n"));\r
FreePool (FtwDevice);\r
FtwDevice->FtwWorkSpaceLba = (EFI_LBA)(-1);\r
FtwDevice->FtwSpareLba = (EFI_LBA)(-1);\r
\r
- FtwDevice->WorkSpaceAddress = (EFI_PHYSICAL_ADDRESS)PcdGet64 (PcdFlashNvStorageFtwWorkingBase64);\r
- if (FtwDevice->WorkSpaceAddress == 0) {\r
- FtwDevice->WorkSpaceAddress = (EFI_PHYSICAL_ADDRESS)PcdGet32 (PcdFlashNvStorageFtwWorkingBase);\r
- }\r
-\r
- FtwDevice->SpareAreaAddress = (EFI_PHYSICAL_ADDRESS)PcdGet64 (PcdFlashNvStorageFtwSpareBase64);\r
- if (FtwDevice->SpareAreaAddress == 0) {\r
- FtwDevice->SpareAreaAddress = (EFI_PHYSICAL_ADDRESS)PcdGet32 (PcdFlashNvStorageFtwSpareBase);\r
- }\r
-\r
*FtwData = FtwDevice;\r
return EFI_SUCCESS;\r
}\r
FtwDevice->FtwLastWriteHeader = NULL;\r
FtwDevice->FtwLastWriteRecord = NULL;\r
\r
- InitializeLocalWorkSpaceHeader ();\r
+ InitializeLocalWorkSpaceHeader (FtwDevice->WorkSpaceLength);\r
\r
//\r
// Refresh the working space data from working block\r