]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Foundation/Library/Thunk16/X86Thunk.c
Sync all bug fixes between EDK1.04 and EDK1.06 into EdkCompatibilityPkg.
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Library / Thunk16 / X86Thunk.c
index c9aafd36aacc229a6476dce51d98e01d4e01c9e6..ed24663b48a17dc081832fac6e24e0bc66493628 100644 (file)
@@ -1,6 +1,6 @@
 /*++\r
 \r
-Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2010, 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
@@ -53,6 +53,18 @@ AsmFxSave (
   OUT IA32_FX_BUFFER *Buffer\r
   );\r
 \r
+UINTN\r
+EFIAPI\r
+AsmGetEflags (\r
+  VOID\r
+  );\r
+\r
+VOID\r
+EFIAPI\r
+AsmSetEflags (\r
+  IN UINTN   Eflags\r
+  );\r
+\r
 //\r
 // Implementation\r
 //\r
@@ -98,6 +110,7 @@ Returns:
 {\r
   IA32_FX_BUFFER                    *FpSavedState;\r
   UINT8                             FpBuffer[sizeof (*FpSavedState) + 0x10];\r
+  UINTN                             Eflags;\r
 \r
   FpSavedState = (IA32_FX_BUFFER*)(((UINTN)FpBuffer + 0xf) & ~0xf);\r
 \r
@@ -110,6 +123,8 @@ Returns:
     AsmFxSave (FpSavedState);\r
   }\r
 \r
+  Eflags = AsmGetEflags ();\r
+\r
   EfiCommonLibCopyMem (\r
     RegisterSet,\r
     _Thunk16 (\r
@@ -120,6 +135,8 @@ Returns:
     sizeof (*RegisterSet)\r
     );\r
 \r
+   AsmSetEflags (Eflags);\r
+\r
   if (ThunkFlags & THUNK_SAVE_FP_STATE) {\r
     AsmFxRestore (FpSavedState);\r
   }\r
@@ -200,6 +217,67 @@ Returns:
   return ThunkContext;\r
 }\r
 \r
+#pragma pack (1)\r
+\r
+typedef struct {\r
+  UINT32                            EDI;\r
+  UINT32                            ESI;\r
+  UINT32                            EBP;\r
+  UINT32                            ESP;\r
+  UINT32                            EBX;\r
+  UINT32                            EDX;\r
+  UINT32                            ECX;\r
+  UINT32                            EAX;\r
+  UINT16                            DS;\r
+  UINT16                            ES;\r
+  UINT16                            FS;\r
+  UINT16                            GS;\r
+  UINTN                             EFLAGS;\r
+  UINT32                            EIP;\r
+  UINT16                            CS;\r
+  UINT16                            SS;\r
+} IA32_REGS;\r
+\r
+typedef struct {\r
+  UINT16  Limit;\r
+  UINT32  Base;\r
+} IA32_DESC;\r
+\r
+typedef struct {\r
+  UINT32    RetEip;\r
+  UINT16    RetCs;\r
+  UINT16    ThunkFlags;\r
+#ifdef EFI32\r
+  UINT32    SavedEsp;\r
+  UINT16    SavedSs;\r
+#endif\r
+  IA32_DESC SavedGdtr;\r
+#ifdef EFIX64\r
+  UINT16    Resvd1;\r
+#endif\r
+  UINT32    SavedCr0;\r
+  UINT32    SavedCr4;\r
+} _STK16;\r
+#pragma pack ()\r
+\r
+#define STACK_PARAM_SIZE  16\r
+\r
+BOOLEAN\r
+AsmThunk16SetUserStack (\r
+  IN THUNK_CONTEXT             *ThunkContext,\r
+  IN VOID                      *Stack,\r
+  IN UINTN                     StackSize\r
+  )\r
+{\r
+  if (StackSize > STACK_PARAM_SIZE) {\r
+    return FALSE;\r
+  }\r
+\r
+  EfiCommonLibCopyMem ((VOID *)(UINTN)(ThunkContext->DefaultStack - sizeof(_STK16) - sizeof(IA32_REGS) - STACK_PARAM_SIZE), Stack, StackSize);\r
+\r
+  return TRUE;\r
+}\r
+\r
 VOID\r
 EFIAPI\r
 AsmThunk16Destroy (\r
@@ -253,12 +331,8 @@ Arguments:
                   set on input, otherwise ignored.\r
                   EFlages is ignored on input.\r
                   On output, values of CS, EIP, SS and ESP should be ignored.\r
-  ThunkFlags    - 2 flags have currently been defined, THUNK_SAVE_FP_STATE and\r
-                  THUNK_USER_STACK.\r
-                  THUNK_SAVE_FP_STATE - FPU state would be saved/restored\r
-                                        before/after calling real mode code.\r
-                  THUNK_USER_STACK    - The stack specified by SS:ESP would be\r
-                                        used instead of the default stack.\r
+  ThunkFlags    - THUNK_USER_STACK: The stack specified by SS:ESP would be\r
+                  used instead of the default stack.\r
 \r
 Returns:\r
 \r
@@ -298,12 +372,8 @@ Arguments:
                   set on input, otherwise ignored.\r
                   EFlages is ignored on input.\r
                   On output, values of CS, EIP, SS and ESP should be ignored.\r
-  ThunkFlags    - 2 flags have currently been defined, THUNK_SAVE_FP_STATE and\r
-                  THUNK_USER_STACK.\r
-                  THUNK_SAVE_FP_STATE - FPU state would be saved/restored\r
-                                        before/after calling real mode code.\r
-                  THUNK_USER_STACK    - The stack specified by SS:ESP would be\r
-                                        used instead of the default stack.\r
+  ThunkFlags    - THUNK_USER_STACK: The stack specified by SS:ESP would be\r
+                  used instead of the default stack.\r
 \r
 Returns:\r
 \r