mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 06:02:59 +00:00
[NTOS]
- 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:
parent
cdebe5691a
commit
30fad2a263
1 changed files with 4 additions and 6 deletions
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue