]> git.proxmox.com Git - mirror_edk2.git/blobdiff - DuetPkg/BiosVideoThunkDxe/LegacyBiosThunk.c
Fix Duet hang/reboot issue due to the NULL instance of CpuExceptionHandlerLib is...
[mirror_edk2.git] / DuetPkg / BiosVideoThunkDxe / LegacyBiosThunk.c
index b8603426c666d1c89bce33467ca6e2940a8aed0a..c1fab403a7659fb1b87741ebbbb0773950990ae4 100644 (file)
@@ -1,8 +1,8 @@
 /** @file\r
   Provide legacy thunk interface for accessing Bios Video Rom.\r
   \r
-Copyright (c) 2006 - 2007, Intel Corporation                                                         \r
-All rights reserved. This program and the accompanying materials                          \r
+Copyright (c) 2006 - 2007, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials                          \r
 are licensed and made available under the terms and conditions of the BSD License         \r
 which accompanies this distribution.  The full text of the license may be found at        \r
 http://opensource.org/licenses/bsd-license.php                                            \r
@@ -30,26 +30,25 @@ InitializeBiosIntCaller (
   UINT32                RealModeBufferSize;\r
   UINT32                ExtraStackSize;\r
   EFI_PHYSICAL_ADDRESS  LegacyRegionBase;\r
-  \r
+  UINT32                LegacyRegionSize;\r
   //\r
   // Get LegacyRegion\r
   //\r
   AsmGetThunk16Properties (&RealModeBufferSize, &ExtraStackSize);\r
-\r
+  LegacyRegionSize = (((RealModeBufferSize + ExtraStackSize) / EFI_PAGE_SIZE) + 1) * EFI_PAGE_SIZE;\r
   LegacyRegionBase = 0x100000;\r
   Status = gBS->AllocatePages (\r
                   AllocateMaxAddress,\r
                   EfiACPIMemoryNVS,\r
-                  EFI_SIZE_TO_PAGES(RealModeBufferSize + ExtraStackSize + 200),\r
+                  EFI_SIZE_TO_PAGES(LegacyRegionSize),\r
                   &LegacyRegionBase\r
                   );\r
   ASSERT_EFI_ERROR (Status);\r
   \r
   ThunkContext->RealModeBuffer     = (VOID*)(UINTN)LegacyRegionBase;\r
-  ThunkContext->RealModeBufferSize = EFI_PAGES_TO_SIZE (RealModeBufferSize);\r
-  ThunkContext->ThunkAttributes    = 3;\r
+  ThunkContext->RealModeBufferSize = LegacyRegionSize;\r
+  ThunkContext->ThunkAttributes    = THUNK_ATTRIBUTE_BIG_REAL_MODE|THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15;\r
   AsmPrepareThunk16(ThunkContext);\r
-  \r
 }\r
 \r
 /**\r
@@ -137,7 +136,7 @@ EFIAPI
 LegacyBiosInt86 (\r
   IN  BIOS_VIDEO_DEV                 *BiosDev,\r
   IN  UINT8                           BiosInt,\r
-  IN  EFI_IA32_REGISTER_SET           *Regs\r
+  IN  IA32_REGISTER_SET              *Regs\r
   )\r
 {\r
   UINTN                 Status;\r
@@ -146,17 +145,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 +166,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 +181,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
@@ -219,9 +215,9 @@ LegacyBiosInt86 (
   Regs->E.DS       = ThunkRegSet.E.DS;  \r
   Regs->E.ES       = ThunkRegSet.E.ES;\r
 \r
-  CopyMem (&(Regs->E.EFlags), &(ThunkRegSet.E.EFLAGS), sizeof (UINT32));\r
+  CopyMem (&(Regs->E.EFLAGS), &(ThunkRegSet.E.EFLAGS), sizeof (UINT32));\r
 \r
-  Ret = (BOOLEAN) (Regs->E.EFlags.CF == 1);\r
+  Ret = (BOOLEAN) (Regs->E.EFLAGS.Bits.CF == 1);\r
 \r
   return Ret;\r
 }\r