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