# 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
|