From 35dde2452d03227a02434e5fad70cd424ab1a274 Mon Sep 17 00:00:00 2001 From: Sean Rhodes Date: Thu, 31 Mar 2022 16:53:51 +0100 Subject: [PATCH] MdeModulePkg/FaultTolerantWriteDxe: Don't check for address alignment 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 Change-Id: Ia1c1f44b6a0e7f32cac0d7806e74d729e5d83a6d --- .../Universal/FaultTolerantWriteDxe/FtwMisc.c | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FtwMisc.c b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FtwMisc.c index f1335870e7..b342b353af 100644 --- a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FtwMisc.c +++ b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FtwMisc.c @@ -1119,8 +1119,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; // @@ -1132,12 +1132,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; @@ -1182,12 +1180,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.