]> git.proxmox.com Git - mirror_edk2.git/blobdiff - DuetPkg/BiosVideoThunkDxe/LegacyBiosThunk.c
ArmPkg/ArmSvcLib: Add ArmSvcLib implementation.
[mirror_edk2.git] / DuetPkg / BiosVideoThunkDxe / LegacyBiosThunk.c
index b8603426c666d1c89bce33467ca6e2940a8aed0a..6dc453ff0932e10dce8115a1032c9b5db7ad9731 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,26 +136,26 @@ 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
-  UINTN                 Eflags;\r
   IA32_REGISTER_SET     ThunkRegSet;\r
   BOOLEAN               Ret;\r
   UINT16                *Stack16;\r
+  BOOLEAN               Enabled;\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,15 +166,10 @@ 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
-  Eflags = AsmReadEflags ();\r
-  if ((Eflags | EFI_CPU_EFLAGS_IF) != 0) {\r
-    DisableInterrupts ();\r
-  }\r
+  Enabled = SaveAndDisableInterrupts();\r
 \r
   //\r
   // Set Legacy16 state. 0x08, 0x70 is legacy 8259 vector bases.\r
@@ -184,16 +178,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
@@ -203,9 +196,7 @@ LegacyBiosInt86 (
   //\r
   // End critical section\r
   //\r
-  if ((Eflags | EFI_CPU_EFLAGS_IF) != 0) {\r
-    EnableInterrupts ();\r
-  }\r
+  SetInterruptState (Enabled);\r
 \r
   Regs->E.EDI      = ThunkRegSet.E.EDI;      \r
   Regs->E.ESI      = ThunkRegSet.E.ESI;  \r
@@ -219,9 +210,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