[NTOS]
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Thu, 16 Sep 2010 19:21:20 +0000 (19:21 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Thu, 16 Sep 2010 19:21:20 +0000 (19:21 +0000)
- More fixes to VDM PUSH/POPF code:
- When doing a 32bit push, don't store the flags 2 bytes off
- Recalculate HardwareEsp, by substracting the segment part, instead of truncating the flat pointer to 16 bit.

svn path=/trunk/; revision=48781

reactos/ntoskrnl/ke/i386/v86vdm.c

index bcb4b16..503f413 100644 (file)
@@ -76,17 +76,17 @@ KiVdmOpcodePUSHF(IN PKTRAP_FRAME TrapFrame,
     {
         /* Save EFlags */
         Esp -= 4;
-        *(PULONG)(Esp - 2) = V86EFlags;
+        *(PULONG)Esp = V86EFlags;
     }
     else
     {
-        Esp -= 2;
         /* Save EFLags */
+        Esp -= 2;
         *(PUSHORT)Esp = (USHORT)V86EFlags;
     }
     
     /* Set new ESP and EIP */
-    TrapFrame->HardwareEsp = (USHORT)Esp;
+    TrapFrame->HardwareEsp = Esp - (TrapFrame->HardwareSegSs << 4);
     TrapFrame->Eip += KiVdmGetInstructionSize(Flags);
     
     /* We're done */
@@ -115,12 +115,10 @@ KiVdmOpcodePOPF(IN PKTRAP_FRAME TrapFrame,
         /* Read EFlags */
         EFlags = *(PUSHORT)Esp;
         Esp += 2;
-        /* Read correct flags and use correct stack address */
-        EFlags &= 0xFFFF;
     }
     
     /* Set new ESP */
-    TrapFrame->HardwareEsp = (USHORT)Esp;
+    TrapFrame->HardwareEsp = Esp - (TrapFrame->HardwareSegSs << 4);
     
     /* Mask out IOPL from the flags */
     EFlags &= ~EFLAGS_IOPL;