]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Use ReadUnaligned16 function to access the buffer which is pointed by a possible...
authorli-elvin <li-elvin@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 24 Oct 2012 01:10:47 +0000 (01:10 +0000)
committerli-elvin <li-elvin@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 24 Oct 2012 01:10:47 +0000 (01:10 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13879 6f19259b-4bc3-4df7-8a09-765794883524

IntelFrameworkModulePkg/Csm/BiosThunk/VideoDxe/BiosVideo.c

index cc53355e75bd12bbda20413af135c5126577d3e0..83c7bf7d1cd01f4b936cb0839b6406d40dc9c6aa 100644 (file)
@@ -1262,6 +1262,7 @@ BiosVideoCheckForVbe (
   EFI_STATUS                             Status;\r
   EFI_IA32_REGISTER_SET                  Regs;\r
   UINT16                                 *ModeNumberPtr;\r
+  UINT16                                 VbeModeNumber;\r
   BOOLEAN                                ModeFound;\r
   BOOLEAN                                EdidFound;\r
   BIOS_VIDEO_MODE_DATA                   *ModeBuffer;\r
@@ -1477,12 +1478,17 @@ BiosVideoCheckForVbe (
 \r
   PreferMode = 0;\r
   ModeNumber = 0;\r
-\r
-  for (; *ModeNumberPtr != VESA_BIOS_EXTENSIONS_END_OF_MODE_LIST; ModeNumberPtr++) {\r
+  \r
+  //\r
+  // ModeNumberPtr may be not 16-byte aligned, so ReadUnaligned16 is used to access the buffer pointed by ModeNumberPtr.\r
+  //\r
+  for (VbeModeNumber = ReadUnaligned16 (ModeNumberPtr);\r
+       VbeModeNumber != VESA_BIOS_EXTENSIONS_END_OF_MODE_LIST;\r
+       VbeModeNumber = ReadUnaligned16 (++ModeNumberPtr)) {\r
     //\r
     // Make sure this is a mode number defined by the VESA VBE specification.  If it isn'tm then skip this mode number.\r
     //\r
-    if ((*ModeNumberPtr & VESA_BIOS_EXTENSIONS_MODE_NUMBER_VESA) == 0) {\r
+    if ((VbeModeNumber & VESA_BIOS_EXTENSIONS_MODE_NUMBER_VESA) == 0) {\r
       continue;\r
     }\r
     //\r
@@ -1490,7 +1496,7 @@ BiosVideoCheckForVbe (
     //\r
     gBS->SetMem (&Regs, sizeof (Regs), 0);\r
     Regs.X.AX = VESA_BIOS_EXTENSIONS_RETURN_MODE_INFORMATION;\r
-    Regs.X.CX = *ModeNumberPtr;\r
+    Regs.X.CX = VbeModeNumber;\r
     gBS->SetMem (BiosVideoPrivate->VbeModeInformationBlock, sizeof (VESA_BIOS_EXTENSIONS_MODE_INFORMATION_BLOCK), 0);\r
     Regs.X.ES = EFI_SEGMENT ((UINTN) BiosVideoPrivate->VbeModeInformationBlock);\r
     Regs.X.DI = EFI_OFFSET ((UINTN) BiosVideoPrivate->VbeModeInformationBlock);\r
@@ -1619,7 +1625,7 @@ BiosVideoCheckForVbe (
     }\r
 \r
     CurrentModeData = &ModeBuffer[ModeNumber - 1];\r
-    CurrentModeData->VbeModeNumber = *ModeNumberPtr;\r
+    CurrentModeData->VbeModeNumber = VbeModeNumber;\r
     if (BiosVideoPrivate->VbeInformationBlock->VESAVersion >= VESA_BIOS_EXTENSIONS_VERSION_3_0) {\r
       CurrentModeData->BytesPerScanLine = BiosVideoPrivate->VbeModeInformationBlock->LinBytesPerScanLine;\r
       CurrentModeData->Red.Position = BiosVideoPrivate->VbeModeInformationBlock->LinRedFieldPosition;\r