Revision: 13910
          http://edk2.svn.sourceforge.net/edk2/?rev=13910&view=rev
Author:   vanjeff
Date:     2012-11-01 07:57:24 +0000 (Thu, 01 Nov 2012)
Log Message:
-----------
Sync patch r13879 from main trunk.
Use ReadUnaligned16 function to access the buffer which is pointed by a 
possible unaligned pointer.

Revision Links:
--------------
    http://edk2.svn.sourceforge.net/edk2/?rev=13879&view=rev

Modified Paths:
--------------
    
branches/UDK2010.SR1/IntelFrameworkModulePkg/Csm/BiosThunk/VideoDxe/BiosVideo.c

Modified: 
branches/UDK2010.SR1/IntelFrameworkModulePkg/Csm/BiosThunk/VideoDxe/BiosVideo.c
===================================================================
--- 
branches/UDK2010.SR1/IntelFrameworkModulePkg/Csm/BiosThunk/VideoDxe/BiosVideo.c 
    2012-11-01 06:59:25 UTC (rev 13909)
+++ 
branches/UDK2010.SR1/IntelFrameworkModulePkg/Csm/BiosThunk/VideoDxe/BiosVideo.c 
    2012-11-01 07:57:24 UTC (rev 13910)
@@ -1262,6 +1262,7 @@
   EFI_STATUS                             Status;
   EFI_IA32_REGISTER_SET                  Regs;
   UINT16                                 *ModeNumberPtr;
+  UINT16                                 VbeModeNumber;
   BOOLEAN                                ModeFound;
   BOOLEAN                                EdidFound;
   BIOS_VIDEO_MODE_DATA                   *ModeBuffer;
@@ -1477,12 +1478,17 @@
 
   PreferMode = 0;
   ModeNumber = 0;
-
-  for (; *ModeNumberPtr != VESA_BIOS_EXTENSIONS_END_OF_MODE_LIST; 
ModeNumberPtr++) {
+  
+  //
+  // ModeNumberPtr may be not 16-byte aligned, so ReadUnaligned16 is used to 
access the buffer pointed by ModeNumberPtr.
+  //
+  for (VbeModeNumber = ReadUnaligned16 (ModeNumberPtr);
+       VbeModeNumber != VESA_BIOS_EXTENSIONS_END_OF_MODE_LIST;
+       VbeModeNumber = ReadUnaligned16 (++ModeNumberPtr)) {
     //
     // Make sure this is a mode number defined by the VESA VBE specification.  
If it isn'tm then skip this mode number.
     //
-    if ((*ModeNumberPtr & VESA_BIOS_EXTENSIONS_MODE_NUMBER_VESA) == 0) {
+    if ((VbeModeNumber & VESA_BIOS_EXTENSIONS_MODE_NUMBER_VESA) == 0) {
       continue;
     }
     //
@@ -1490,7 +1496,7 @@
     //
     gBS->SetMem (&Regs, sizeof (Regs), 0);
     Regs.X.AX = VESA_BIOS_EXTENSIONS_RETURN_MODE_INFORMATION;
-    Regs.X.CX = *ModeNumberPtr;
+    Regs.X.CX = VbeModeNumber;
     gBS->SetMem (BiosVideoPrivate->VbeModeInformationBlock, sizeof 
(VESA_BIOS_EXTENSIONS_MODE_INFORMATION_BLOCK), 0);
     Regs.X.ES = EFI_SEGMENT ((UINTN) 
BiosVideoPrivate->VbeModeInformationBlock);
     Regs.X.DI = EFI_OFFSET ((UINTN) BiosVideoPrivate->VbeModeInformationBlock);
@@ -1619,7 +1625,7 @@
     }
 
     CurrentModeData = &ModeBuffer[ModeNumber - 1];
-    CurrentModeData->VbeModeNumber = *ModeNumberPtr;
+    CurrentModeData->VbeModeNumber = VbeModeNumber;
     if (BiosVideoPrivate->VbeInformationBlock->VESAVersion >= 
VESA_BIOS_EXTENSIONS_VERSION_3_0) {
       CurrentModeData->BytesPerScanLine = 
BiosVideoPrivate->VbeModeInformationBlock->LinBytesPerScanLine;
       CurrentModeData->Red.Position = 
BiosVideoPrivate->VbeModeInformationBlock->LinRedFieldPosition;

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_sfd2d_oct
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to