git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13879
6f19259b-4bc3-4df7-8a09-
765794883524
EFI_STATUS Status;\r
EFI_IA32_REGISTER_SET Regs;\r
UINT16 *ModeNumberPtr;\r
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
BOOLEAN ModeFound;\r
BOOLEAN EdidFound;\r
BIOS_VIDEO_MODE_DATA *ModeBuffer;\r
\r
PreferMode = 0;\r
ModeNumber = 0;\r
\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
//\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
//\r
gBS->SetMem (&Regs, sizeof (Regs), 0);\r
Regs.X.AX = VESA_BIOS_EXTENSIONS_RETURN_MODE_INFORMATION;\r
//\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
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
}\r
\r
CurrentModeData = &ModeBuffer[ModeNumber - 1];\r
}\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
if (BiosVideoPrivate->VbeInformationBlock->VESAVersion >= VESA_BIOS_EXTENSIONS_VERSION_3_0) {\r
CurrentModeData->BytesPerScanLine = BiosVideoPrivate->VbeModeInformationBlock->LinBytesPerScanLine;\r
CurrentModeData->Red.Position = BiosVideoPrivate->VbeModeInformationBlock->LinRedFieldPosition;\r