WorkSpaceAddress and SpareAreaAddress point into MMIO, which isn't always aligned. Remove the check for block alignment to avoid false assertions.
Signed-off-by: Sean Rhodes <sean@starlabs.systems> Change-Id: Ia1c1f44b6a0e7f32cac0d7806e74d729e5d83a6d --- MdeModulePkg/MdeModulePkg.dec | 2 -- MdeModulePkg/MdeModulePkg.uni | 4 ++-- .../Universal/FaultTolerantWriteDxe/FtwMisc.c | 20 ++++++++----------- 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index cf79292ec8..b7e2f48028 100644 --- a/MdeModulePkg/MdeModulePkg.dec +++ b/MdeModulePkg/MdeModulePkg.dec @@ -1649,7 +1649,6 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize|0x0|UINT32|0x30000014 ## Base address of the FTW working block range in flash device. - # If PcdFlashNvStorageFtwWorkingSize is larger than one block size, this value should be block size aligned. # @Prompt Base address of flash FTW working block range. gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase|0x0|UINT32|0x30000010 @@ -1668,7 +1667,6 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64|0x0|UINT64|0x80000013 ## 64-bit Base address of the FTW working block range in flash device. - # If PcdFlashNvStorageFtwWorkingSize is larger than one block size, this value should be block size aligned. # @Prompt 64-bit Base address of flash FTW working block range. gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64|0x0|UINT64|0x80000010 diff --git a/MdeModulePkg/MdeModulePkg.uni b/MdeModulePkg/MdeModulePkg.uni index b070f15ff2..9f916506f7 100644 --- a/MdeModulePkg/MdeModulePkg.uni +++ b/MdeModulePkg/MdeModulePkg.uni @@ -374,7 +374,7 @@ #string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdFlashNvStorageFtwWorkingBase_PROMPT #language en-US "Base address of flash FTW working block range" -#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdFlashNvStorageFtwWorkingBase_HELP #language en-US "Base address of the FTW working block range in flash device. If PcdFlashNvStorageFtwWorkingSize is larger than one block size, this value should be block size aligned." +#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdFlashNvStorageFtwWorkingBase_HELP #language en-US "Base address of the FTW working block range in flash device." #string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdFlashNvStorageFtwWorkingSize_PROMPT #language en-US "Size of flash FTW working block range" @@ -390,7 +390,7 @@ #string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdFlashNvStorageFtwWorkingBase64_PROMPT #language en-US "64-bit Base address of flash FTW working block range" -#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdFlashNvStorageFtwWorkingBase64_HELP #language en-US "64-bit Base address of the FTW working block range in flash device. If PcdFlashNvStorageFtwWorkingSize is larger than one block size, this value should be block size aligned." +#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdFlashNvStorageFtwWorkingBase64_HELP #language en-US "64-bit Base address of the FTW working block range in flash device." #string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdEmuVariableNvModeEnable_PROMPT #language en-US "EMU variable NV mode enable" diff --git a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FtwMisc.c b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FtwMisc.c index 661e148767..2fce694f22 100644 --- a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FtwMisc.c +++ b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FtwMisc.c @@ -1108,8 +1108,8 @@ FindFvbForFtw ( // To get the LBA of work space // for (LbaIndex = 1; LbaIndex <= NumberOfBlocks; LbaIndex += 1) { - if ( (FtwDevice->WorkSpaceAddress >= (FvbBaseAddress + BlockSize * (LbaIndex - 1))) - && (FtwDevice->WorkSpaceAddress < (FvbBaseAddress + BlockSize * LbaIndex))) + if ((FtwDevice->WorkSpaceAddress - FvbBaseAddress >= BlockSize * (LbaIndex - 1)) && + ((FtwDevice->WorkSpaceAddress - FvbBaseAddress) / BlockSize >= LbaIndex - 1)) { FtwDevice->FtwWorkSpaceLba = LbaIndex - 1; // @@ -1121,12 +1121,10 @@ FindFvbForFtw ( FtwDevice->NumberOfWorkSpaceBlock = FTW_BLOCKS (FtwDevice->FtwWorkSpaceBase + FtwDevice->FtwWorkSpaceSize, FtwDevice->WorkBlockSize); if (FtwDevice->FtwWorkSpaceSize >= FtwDevice->WorkBlockSize) { // - // Check the alignment of work space address and length, they should be block size aligned when work space size is larger than one block size. + // Check the alignment of work space length, it should be block size aligned when work space size is larger than one block size. // - if (((FtwDevice->WorkSpaceAddress & (FtwDevice->WorkBlockSize - 1)) != 0) || - ((FtwDevice->WorkSpaceLength & (FtwDevice->WorkBlockSize - 1)) != 0)) - { - DEBUG ((DEBUG_ERROR, "Ftw: Work space address or length is not block size aligned when work space size is larger than one block size\n")); + if ((FtwDevice->WorkSpaceLength & (FtwDevice->WorkBlockSize - 1)) != 0) { + DEBUG ((EFI_D_ERROR, "Ftw: Work space length is not block size aligned when work space size is larger than one block size\n")); FreePool (HandleBuffer); ASSERT (FALSE); return EFI_ABORTED; @@ -1171,12 +1169,10 @@ FindFvbForFtw ( } // - // Check the alignment of spare area address and length, they should be block size aligned + // Check the alignment of spare area length, it should be block size aligned // - if (((FtwDevice->SpareAreaAddress & (FtwDevice->SpareBlockSize - 1)) != 0) || - ((FtwDevice->SpareAreaLength & (FtwDevice->SpareBlockSize - 1)) != 0)) - { - DEBUG ((DEBUG_ERROR, "Ftw: Spare area address or length is not block size aligned\n")); + if ((FtwDevice->SpareAreaLength & (FtwDevice->SpareBlockSize - 1)) != 0) { + DEBUG ((EFI_D_ERROR, "Ftw: Spare area address or length is not block size aligned\n")); FreePool (HandleBuffer); // // Report Status Code EFI_SW_EC_ABORTED. -- 2.34.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#89742): https://edk2.groups.io/g/devel/message/89742 Mute This Topic: https://groups.io/mt/91134149/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-