- 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
This commit is contained in:
Timo Kreuzer 2010-09-16 19:21:20 +00:00
parent cdebe5691a
commit 30fad2a263

View 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;