]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Fix the issue that accessing for unaligned address break IPF
authorklu2 <klu2@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 25 Jan 2010 09:56:20 +0000 (09:56 +0000)
committerklu2 <klu2@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 25 Jan 2010 09:56:20 +0000 (09:56 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9809 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Core/Pei/FwVol/FwVol.c

index cab1cdb001a1e83e67e63e9de8182f197f2f66ff..d2bd6c493ef45e17877bfac9cb7d53243f51deac 100644 (file)
@@ -853,6 +853,7 @@ ProcessFvFile (
   EFI_PEI_FV_HANDLE             ParentFvHandle;\r
   EFI_FIRMWARE_VOLUME_HEADER    *FvHeader;\r
   EFI_FV_FILE_INFO              FileInfo;\r
   EFI_PEI_FV_HANDLE             ParentFvHandle;\r
   EFI_FIRMWARE_VOLUME_HEADER    *FvHeader;\r
   EFI_FV_FILE_INFO              FileInfo;\r
+  UINT64                        FvLength;\r
   \r
   //\r
   // Check if this EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE file has already\r
   \r
   //\r
   // Check if this EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE file has already\r
@@ -890,7 +891,7 @@ ProcessFvFile (
   //\r
   // FvAlignment must be more than 8 bytes required by FvHeader structure.\r
   //\r
   //\r
   // FvAlignment must be more than 8 bytes required by FvHeader structure.\r
   //\r
-  FvAlignment = 1 << ((FvHeader->Attributes & EFI_FVB2_ALIGNMENT) >> 16);\r
+  FvAlignment = 1 << ((ReadUnaligned32 (&FvHeader->Attributes) & EFI_FVB2_ALIGNMENT) >> 16);\r
   if (FvAlignment < 8) {\r
     FvAlignment = 8;\r
   }\r
   if (FvAlignment < 8) {\r
     FvAlignment = 8;\r
   }\r
@@ -899,11 +900,12 @@ ProcessFvFile (
   // Check FvImage\r
   //\r
   if ((UINTN) FvHeader % FvAlignment != 0) {\r
   // Check FvImage\r
   //\r
   if ((UINTN) FvHeader % FvAlignment != 0) {\r
-    NewFvBuffer = AllocateAlignedPages (EFI_SIZE_TO_PAGES ((UINT32) FvHeader->FvLength), FvAlignment);\r
+    FvLength    = ReadUnaligned64 (&FvHeader->FvLength);\r
+    NewFvBuffer = AllocateAlignedPages (EFI_SIZE_TO_PAGES ((UINT32) FvLength), FvAlignment);\r
     if (NewFvBuffer == NULL) {\r
       return EFI_OUT_OF_RESOURCES;\r
     }\r
     if (NewFvBuffer == NULL) {\r
       return EFI_OUT_OF_RESOURCES;\r
     }\r
-    CopyMem (NewFvBuffer, FvHeader, (UINTN) FvHeader->FvLength);\r
+    CopyMem (NewFvBuffer, FvHeader, (UINTN) FvLength);\r
     FvHeader = (EFI_FIRMWARE_VOLUME_HEADER*) NewFvBuffer;\r
   }\r
   \r
     FvHeader = (EFI_FIRMWARE_VOLUME_HEADER*) NewFvBuffer;\r
   }\r
   \r