]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Fix bug of wrong stack16 stack for thunk call. This may cause Duet failed to enter...
authorklu2 <klu2@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 2 Mar 2009 15:03:37 +0000 (15:03 +0000)
committerklu2 <klu2@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 2 Mar 2009 15:03:37 +0000 (15:03 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@7771 6f19259b-4bc3-4df7-8a09-765794883524

DuetPkg/BiosVideoThunkDxe/BiosVideo.c
DuetPkg/BiosVideoThunkDxe/LegacyBiosThunk.c

index 6a8e55a0347c60f41565d0d19feca7fa9471246f..7053a0002c408040e7e2b87a0ccbb629634ea6f7 100644 (file)
@@ -1043,6 +1043,7 @@ BiosVideoCheckForVbe (
   VESA_BIOS_EXTENSIONS_VALID_EDID_TIMING ValidEdidTiming;\r
   EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE      *GraphicsOutputMode;\r
 \r
+  DEBUG ((EFI_D_INFO, "Enter BiosVideoCheckForVbe()\n"));\r
   //\r
   // Allocate buffer under 1MB for VBE data structures\r
   //\r
@@ -1095,26 +1096,33 @@ BiosVideoCheckForVbe (
   Regs.X.ES = EFI_SEGMENT ((UINTN) BiosVideoPrivate->VbeInformationBlock);\r
   Regs.X.DI = EFI_OFFSET ((UINTN) BiosVideoPrivate->VbeInformationBlock);\r
 \r
+  DEBUG ((EFI_D_INFO, "Before VESA!\n"));\r
   LegacyBiosInt86 (BiosVideoPrivate, 0x10, &Regs);\r
-  \r
+  DEBUG ((EFI_D_INFO, "Call VESA! Return Status=0x%X\n", Regs.X.AX));\r
+  DEBUG ((EFI_D_INFO, "Call VESA! VESA Signature =0x%X\n", BiosVideoPrivate->VbeInformationBlock->VESASignature));\r
+  DEBUG ((EFI_D_INFO, "Call VESA! VESA Version =0x%X\n", BiosVideoPrivate->VbeInformationBlock->VESAVersion));\r
+    \r
   Status = EFI_DEVICE_ERROR;\r
 \r
   //\r
   // See if the VESA call succeeded\r
   //\r
   if (Regs.X.AX != VESA_BIOS_EXTENSIONS_STATUS_SUCCESS) {\r
+    DEBUG ((EFI_D_INFO, "Fail to call VESA! Status=0x%X\n", Regs.X.AX));\r
     return Status;\r
   }\r
   //\r
   // Check for 'VESA' signature\r
   //\r
   if (BiosVideoPrivate->VbeInformationBlock->VESASignature != VESA_BIOS_EXTENSIONS_VESA_SIGNATURE) {\r
+    DEBUG ((EFI_D_INFO, "Fail to check VESA signature!\n"));\r
     return Status;\r
   }\r
   //\r
   // Check to see if this is VBE 2.0 or higher\r
   //\r
   if (BiosVideoPrivate->VbeInformationBlock->VESAVersion < VESA_BIOS_EXTENSIONS_VERSION_2_0) {\r
+    DEBUG ((EFI_D_INFO, "VBE version is little than 2.0!\n"));\r
     return Status;\r
   }\r
 \r
index b8603426c666d1c89bce33467ca6e2940a8aed0a..08ed35c1f4aadfe93050c5bc424daad7fb1f1f64 100644 (file)
@@ -146,17 +146,17 @@ LegacyBiosInt86 (
   BOOLEAN               Ret;\r
   UINT16                *Stack16;\r
   \r
-  Regs->X.Flags.Reserved1 = 1;\r
-  Regs->X.Flags.Reserved2 = 0;\r
-  Regs->X.Flags.Reserved3 = 0;\r
-  Regs->X.Flags.Reserved4 = 0;\r
-  Regs->X.Flags.IOPL      = 3;\r
-  Regs->X.Flags.NT        = 0;\r
-  Regs->X.Flags.IF        = 1;\r
-  Regs->X.Flags.TF        = 0;\r
-  Regs->X.Flags.CF        = 0;\r
-\r
   ZeroMem (&ThunkRegSet, sizeof (ThunkRegSet));\r
+  ThunkRegSet.E.EFLAGS.Bits.Reserved_0 = 1;\r
+  ThunkRegSet.E.EFLAGS.Bits.Reserved_1 = 0;\r
+  ThunkRegSet.E.EFLAGS.Bits.Reserved_2 = 0;\r
+  ThunkRegSet.E.EFLAGS.Bits.Reserved_3 = 0;\r
+  ThunkRegSet.E.EFLAGS.Bits.IOPL       = 3;\r
+  ThunkRegSet.E.EFLAGS.Bits.NT         = 0;\r
+  ThunkRegSet.E.EFLAGS.Bits.IF         = 1;\r
+  ThunkRegSet.E.EFLAGS.Bits.TF         = 0;\r
+  ThunkRegSet.E.EFLAGS.Bits.CF         = 0;\r
+  \r
   ThunkRegSet.E.EDI  = Regs->E.EDI;\r
   ThunkRegSet.E.ESI  = Regs->E.ESI;\r
   ThunkRegSet.E.EBP  = Regs->E.EBP;\r
@@ -167,8 +167,6 @@ LegacyBiosInt86 (
   ThunkRegSet.E.DS   = Regs->E.DS;\r
   ThunkRegSet.E.ES   = Regs->E.ES;\r
 \r
-  CopyMem (&(ThunkRegSet.E.EFLAGS), &(Regs->E.EFlags), sizeof (UINT32));\r
\r
   //\r
   // The call to Legacy16 is a critical section to EFI\r
   //\r
@@ -184,16 +182,15 @@ LegacyBiosInt86 (
   ASSERT_EFI_ERROR (Status);\r
   \r
   Stack16 = (UINT16 *)((UINT8 *) BiosDev->ThunkContext->RealModeBuffer + BiosDev->ThunkContext->RealModeBufferSize - sizeof (UINT16));\r
-  Stack16 -= sizeof (ThunkRegSet.E.EFLAGS) / sizeof (UINT16);\r
-  CopyMem (Stack16, &ThunkRegSet.E.EFLAGS, sizeof (ThunkRegSet.E.EFLAGS));\r
 \r
   ThunkRegSet.E.SS   = (UINT16) (((UINTN) Stack16 >> 16) << 12);\r
   ThunkRegSet.E.ESP  = (UINT16) (UINTN) Stack16;\r
+\r
   ThunkRegSet.E.Eip  = (UINT16)((UINT32 *)NULL)[BiosInt];\r
   ThunkRegSet.E.CS   = (UINT16)(((UINT32 *)NULL)[BiosInt] >> 16);\r
   BiosDev->ThunkContext->RealModeState = &ThunkRegSet;\r
   AsmThunk16 (BiosDev->ThunkContext);\r
-\r
+  \r
   //\r
   // Restore protected mode interrupt state\r
   //\r