]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Foundation/Library/Thunk16/Ia32/Thunk16.asm
Sync all bug fixes between EDK1.04 and EDK1.06 into EdkCompatibilityPkg.
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Library / Thunk16 / Ia32 / Thunk16.asm
index 410347764ac1e2479809aba6381a7ac54b45cb37..76c1317469af9de0f1ce12291a2e3402cd11cce3 100644 (file)
@@ -1,6 +1,6 @@
 ;*****************************************************************************\r
 ;*\r
-;*   Copyright (c) 2006 - 2007, 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
@@ -55,6 +55,8 @@ _DATA   ENDS
 \r
 _TEXT   SEGMENT FLAT    "CODE"  PARA\r
 \r
+STACK_PARAM_SIZE  EQU  16\r
+\r
 IA32_REGS   STRUC   4t\r
 _EDI        DD      ?\r
 _ESI        DD      ?\r
@@ -99,6 +101,11 @@ __Thunk16   PROC    USES    ebp ebx esi edi ds  es  fs  gs
     push    sizeof (IA32_REGS) / 4\r
     pop     ecx\r
     rep     movsd                       ; copy context to 16-bit stack\r
+\r
+    ; copy eflags to stack frame\r
+    mov     eax, [esi - sizeof(IA32_REGS)]._EFLAGS\r
+    mov     [edi - sizeof(IA32_REGS) - STACK_PARAM_SIZE - 4], eax\r
+\r
     pop     ebx                         ; ebx <- 16-bit stack offset\r
     mov     eax, offset @F              ; return offset\r
     stosd\r
@@ -158,20 +165,22 @@ RealMode    PROC
     pop     es\r
     pop     fs\r
     pop     gs\r
-    add     sp, 4                       ; skip EFlags\r
-    test    (_STK16 ptr [esp + 8]).ThunkFlags, 1\r
+    sub     esp, (sizeof(IA32_REGS) - 12) + STACK_PARAM_SIZE + 4\r
+    popfd\r
+    test    (_STK16 ptr [esp + STACK_PARAM_SIZE + sizeof(IA32_REGS)]).ThunkFlags, 1\r
     jz      @F\r
-    pushf\r
+    pushf                               ; push Flags when it's INT#\r
 @@:\r
     push    cs\r
 ;    push    @FarCallRet - _Code16Addr\r
     DB      68h                         ; push /iw\r
     DW      @FarCallRet - _Code16Addr\r
     jz      @F\r
-    jmp     fword ptr [esp + 6]\r
+    jmp     fword ptr [esp + 6 + STACK_PARAM_SIZE + sizeof(IA32_REGS) - 8]\r
 @@:\r
-    jmp     fword ptr [esp + 4]\r
+    jmp     fword ptr [esp + 4 + STACK_PARAM_SIZE + sizeof(IA32_REGS) - 8]\r
 @FarCallRet:\r
+    add     esp, (sizeof(IA32_REGS) - 12) + STACK_PARAM_SIZE + 4\r
     pushfd\r
     push    gs\r
     push    fs\r