x86emul: correct PUSHF/POPF

Both need to raise #GP(0) when in VM86 mode with IOPL < 3.

Additionally PUSHF is documented to clear VM and RF from the value
placed onto the stack.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
This commit is contained in:
Jan Beulich committed 2016-12-07 13:55:42 +01:00
1 parent 3eabc1c2e2
commit e5c1b8145b
1 file changed
+8 -1
+8 -1
View File
@@ -3121,13 +3121,20 @@ x86_emulate(
}
case 0x9c: /* pushf */
src.val = _regs.eflags;
generate_exception_if((_regs.eflags & EFLG_VM) &&
MASK_EXTR(_regs.eflags, EFLG_IOPL) != 3,
EXC_GP, 0);
src.val = _regs.eflags & ~(EFLG_VM | EFLG_RF);
goto push;
case 0x9d: /* popf */ {
uint32_t mask = EFLG_VIP | EFLG_VIF | EFLG_VM;
if ( !mode_ring0() )
{
generate_exception_if((_regs.eflags & EFLG_VM) &&
MASK_EXTR(_regs.eflags, EFLG_IOPL) != 3,
EXC_GP, 0);
mask |= EFLG_IOPL;
if ( !mode_iopl() )
mask |= EFLG_IF;
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.