[edk2] [PATCH 3/4] MdeModulePkg DxeCore: Check FvImage alignment

Star Zeng posted 4 patches 7 years ago
[edk2] [PATCH 3/4] MdeModulePkg DxeCore: Check FvImage alignment
Posted by Star Zeng 7 years ago
No need to allocate aligned buffer if FvImage has been
at required alignment.

Then the code logic will be aligned with ProcessFvFile() in
MdeModulePkg/Core/Pei/FwVol/FwVol.c.

Cc: Liming Gao <liming.gao@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Star Zeng <star.zeng@intel.com>
---
 MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c | 32 ++++++++++++++++-----------
 1 file changed, 19 insertions(+), 13 deletions(-)

diff --git a/MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c b/MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c
index 5eee71bb2cd3..c7b9224c0e33 100644
--- a/MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c
+++ b/MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c
@@ -1023,32 +1023,38 @@ CoreProcessFvImageFile (
     // can be aligned on any power-of-two boundary. A weakly aligned volume can not be moved from
     // its initial linked location and maintain its alignment.
     //
-    if ((FvHeader->Attributes & EFI_FVB2_WEAK_ALIGNMENT) != EFI_FVB2_WEAK_ALIGNMENT) {
+    if ((ReadUnaligned32 (&FvHeader->Attributes) & EFI_FVB2_WEAK_ALIGNMENT) != EFI_FVB2_WEAK_ALIGNMENT) {
       //
       // Get FvHeader alignment
       //
-      FvAlignment = 1 << ((FvHeader->Attributes & EFI_FVB2_ALIGNMENT) >> 16);
+      FvAlignment = 1 << ((ReadUnaligned32 (&FvHeader->Attributes) & EFI_FVB2_ALIGNMENT) >> 16);
       //
       // FvAlignment must be greater than or equal to 8 bytes of the minimum FFS alignment value.
       //
       if (FvAlignment < 8) {
         FvAlignment = 8;
       }
+
       //
-      // Allocate the aligned buffer for the FvImage.
+      // Check FvImage alignment.
       //
-      AlignedBuffer = AllocateAlignedPages (EFI_SIZE_TO_PAGES (BufferSize), (UINTN) FvAlignment);
-      if (AlignedBuffer == NULL) {
-        FreePool (Buffer);
-        return EFI_OUT_OF_RESOURCES;
-      } else {
+      if ((UINTN) FvHeader % FvAlignment != 0) {
         //
-        // Move FvImage into the aligned buffer and release the original buffer.
+        // Allocate the aligned buffer for the FvImage.
         //
-        CopyMem (AlignedBuffer, Buffer, BufferSize);
-        FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) AlignedBuffer;
-        CoreFreePool (Buffer);
-        Buffer = NULL;
+        AlignedBuffer = AllocateAlignedPages (EFI_SIZE_TO_PAGES (BufferSize), (UINTN) FvAlignment);
+        if (AlignedBuffer == NULL) {
+          FreePool (Buffer);
+          return EFI_OUT_OF_RESOURCES;
+        } else {
+          //
+          // Move FvImage into the aligned buffer and release the original buffer.
+          //
+          CopyMem (AlignedBuffer, Buffer, BufferSize);
+          FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) AlignedBuffer;
+          CoreFreePool (Buffer);
+          Buffer = NULL;
+        }
       }
     }
     //
-- 
2.7.0.windows.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel