[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-3.2-testing] x86_emulate: Return X86EMUL_UNHANDLEABLE if mode_iopl() or
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1206015293 0 # Node ID d1d4cff0b3e491b47f8fb8f5318598d6ad3e7f96 # Parent 0ce555fb429ed53b7273f1cd81308fdeed110386 x86_emulate: Return X86EMUL_UNHANDLEABLE if mode_iopl() or mode_ring0() checks cannot be carried out. Also fix handling of EFLAGS.IF in iret and popf. Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx> xen-unstable changeset: 17251:f45aa9a14db425d1f726fb1368a8932263de68da xen-unstable date: Wed Mar 19 14:06:18 2008 +0000 --- xen/arch/x86/x86_emulate.c | 22 ++++++++++++++++++---- 1 files changed, 18 insertions(+), 4 deletions(-) diff -r 0ce555fb429e -r d1d4cff0b3e4 xen/arch/x86/x86_emulate.c --- a/xen/arch/x86/x86_emulate.c Thu Mar 20 12:12:57 2008 +0000 +++ b/xen/arch/x86/x86_emulate.c Thu Mar 20 12:14:53 2008 +0000 @@ -784,11 +784,21 @@ _mode_iopl( struct x86_emulate_ops *ops) { int cpl = get_cpl(ctxt, ops); + if ( cpl == -1 ) + return -1; return ((cpl >= 0) && (cpl <= ((ctxt->regs->eflags >> 12) & 3))); } -#define mode_ring0() (get_cpl(ctxt, ops) == 0) -#define mode_iopl() _mode_iopl(ctxt, ops) +#define mode_ring0() ({ \ + int _cpl = get_cpl(ctxt, ops); \ + fail_if(_cpl < 0); \ + (_cpl == 0); \ +}) +#define mode_iopl() ({ \ + int _iopl = _mode_iopl(ctxt, ops); \ + fail_if(_iopl < 0); \ + _iopl; \ +}) static int in_realmode( @@ -2388,8 +2398,10 @@ x86_emulate( case 0x9d: /* popf */ { uint32_t mask = EFLG_VIP | EFLG_VIF | EFLG_VM; + if ( !mode_ring0() ) + mask |= EFLG_IOPL; if ( !mode_iopl() ) - mask |= EFLG_IOPL; + mask |= EFLG_IF; fail_if(ops->write_rflags == NULL); /* 64-bit mode: POP defaults to a 64-bit operand. */ if ( mode_64bit() && (op_bytes == 4) ) @@ -2637,8 +2649,10 @@ x86_emulate( case 0xcf: /* iret */ { unsigned long cs, eip, eflags; uint32_t mask = EFLG_VIP | EFLG_VIF | EFLG_VM; + if ( !mode_ring0() ) + mask |= EFLG_IOPL; if ( !mode_iopl() ) - mask |= EFLG_IOPL; + mask |= EFLG_IF; fail_if(!in_realmode(ctxt, ops)); fail_if(ops->write_rflags == NULL); if ( (rc = ops->read(x86_seg_ss, sp_post_inc(op_bytes), _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |