- 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
{
/* 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 */
/* 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;