[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] x86 hvm: Fix #UD interception.



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1246456711 -3600
# Node ID 479f1fa084d6af8611b0973be0fb6d642db1f9f9
# Parent  945232b8e226893da8010c9523ae0a1678db5961
x86 hvm: Fix #UD interception.
 * Interception should be standard part of HVM_TRAP_MASK
 * Failed intercept should quietly forward #UD to the guest

Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
 xen/arch/x86/hvm/svm/svm.c    |   20 +++++------------
 xen/arch/x86/hvm/svm/vmcb.c   |    3 --
 xen/arch/x86/hvm/vmx/vmcs.c   |    3 --
 xen/arch/x86/hvm/vmx/vmx.c    |   48 +++++++++++++++++-------------------------
 xen/include/asm-x86/hvm/hvm.h |    2 -
 5 files changed, 29 insertions(+), 47 deletions(-)

diff -r 945232b8e226 -r 479f1fa084d6 xen/arch/x86/hvm/svm/svm.c
--- a/xen/arch/x86/hvm/svm/svm.c        Wed Jul 01 10:54:25 2009 +0100
+++ b/xen/arch/x86/hvm/svm/svm.c        Wed Jul 01 14:58:31 2009 +0100
@@ -1226,24 +1226,16 @@ static void svm_vmexit_ud_intercept(stru
     switch ( rc )
     {
     case X86EMUL_UNHANDLEABLE:
-        gdprintk(XENLOG_WARNING,
-                 "instruction emulation failed @ %04x:%lx: "
-                 "%02x %02x %02x %02x %02x %02x\n",
-                 hvmemul_get_seg_reg(x86_seg_cs, &ctxt)->sel,
-                 ctxt.insn_buf_eip,
-                 ctxt.insn_buf[0], ctxt.insn_buf[1],
-                 ctxt.insn_buf[2], ctxt.insn_buf[3],
-                 ctxt.insn_buf[4], ctxt.insn_buf[5]);
-         return;
+        svm_inject_exception(TRAP_invalid_op, HVM_DELIVER_NO_ERROR_CODE, 0);
+        break;
     case X86EMUL_EXCEPTION:
         if ( ctxt.exn_pending )
             hvm_inject_exception(ctxt.exn_vector, ctxt.exn_error_code, 0);
-        break;
+        /* fall through */
     default:
-        break;
-    }
-
-    hvm_emulate_writeback(&ctxt);
+        hvm_emulate_writeback(&ctxt);
+        break;
+    }
 }
 
 static void wbinvd_ipi(void *info)
diff -r 945232b8e226 -r 479f1fa084d6 xen/arch/x86/hvm/svm/vmcb.c
--- a/xen/arch/x86/hvm/svm/vmcb.c       Wed Jul 01 10:54:25 2009 +0100
+++ b/xen/arch/x86/hvm/svm/vmcb.c       Wed Jul 01 14:58:31 2009 +0100
@@ -227,8 +227,7 @@ static int construct_vmcb(struct vcpu *v
 
     vmcb->exception_intercepts =
         HVM_TRAP_MASK
-        | (1U << TRAP_no_device)
-        | (1U << TRAP_invalid_op);
+        | (1U << TRAP_no_device);
 
     if ( paging_mode_hap(v->domain) )
     {
diff -r 945232b8e226 -r 479f1fa084d6 xen/arch/x86/hvm/vmx/vmcs.c
--- a/xen/arch/x86/hvm/vmx/vmcs.c       Wed Jul 01 10:54:25 2009 +0100
+++ b/xen/arch/x86/hvm/vmx/vmcs.c       Wed Jul 01 14:58:31 2009 +0100
@@ -679,8 +679,7 @@ static int construct_vmcs(struct vcpu *v
     __vmwrite(EXCEPTION_BITMAP,
               HVM_TRAP_MASK
               | (paging_mode_hap(d) ? 0 : (1U << TRAP_page_fault))
-              | (1U << TRAP_no_device)
-              | (1U << TRAP_invalid_op));
+              | (1U << TRAP_no_device));
 
     v->arch.hvm_vcpu.guest_cr[0] = X86_CR0_PE | X86_CR0_ET;
     hvm_update_guest_cr(v, 0);
diff -r 945232b8e226 -r 479f1fa084d6 xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c        Wed Jul 01 10:54:25 2009 +0100
+++ b/xen/arch/x86/hvm/vmx/vmx.c        Wed Jul 01 14:58:31 2009 +0100
@@ -2258,34 +2258,26 @@ asmlinkage void vmx_enter_realmode(struc
 
 static void vmx_vmexit_ud_intercept(struct cpu_user_regs *regs)
 {
-     struct hvm_emulate_ctxt ctxt;
-     int rc;
- 
-     hvm_emulate_prepare(&ctxt, regs);
- 
-     rc = hvm_emulate_one(&ctxt);
- 
-     switch ( rc )
-     {
-     case X86EMUL_UNHANDLEABLE:
-         gdprintk(XENLOG_WARNING,
-                  "instruction emulation failed @ %04x:%lx: "
-                  "%02x %02x %02x %02x %02x %02x\n",
-                  hvmemul_get_seg_reg(x86_seg_cs, &ctxt)->sel,
-                  ctxt.insn_buf_eip,
-                  ctxt.insn_buf[0], ctxt.insn_buf[1],
-                  ctxt.insn_buf[2], ctxt.insn_buf[3],
-                  ctxt.insn_buf[4], ctxt.insn_buf[5]);
-          return;
-     case X86EMUL_EXCEPTION:
-         if ( ctxt.exn_pending )
-             hvm_inject_exception(ctxt.exn_vector, ctxt.exn_error_code, 0);
-         break;
-     default:
-         break;
-     }
- 
-     hvm_emulate_writeback(&ctxt);
+    struct hvm_emulate_ctxt ctxt;
+    int rc;
+
+    hvm_emulate_prepare(&ctxt, regs);
+
+    rc = hvm_emulate_one(&ctxt);
+
+    switch ( rc )
+    {
+    case X86EMUL_UNHANDLEABLE:
+        vmx_inject_hw_exception(TRAP_invalid_op, HVM_DELIVER_NO_ERROR_CODE);
+        break;
+    case X86EMUL_EXCEPTION:
+        if ( ctxt.exn_pending )
+            hvm_inject_exception(ctxt.exn_vector, ctxt.exn_error_code, 0);
+        /* fall through */
+    default:
+        hvm_emulate_writeback(&ctxt);
+        break;
+    }
 }
 
 asmlinkage void vmx_vmexit_handler(struct cpu_user_regs *regs)
diff -r 945232b8e226 -r 479f1fa084d6 xen/include/asm-x86/hvm/hvm.h
--- a/xen/include/asm-x86/hvm/hvm.h     Wed Jul 01 10:54:25 2009 +0100
+++ b/xen/include/asm-x86/hvm/hvm.h     Wed Jul 01 14:58:31 2009 +0100
@@ -268,7 +268,7 @@ static inline int hvm_do_pmu_interrupt(s
         X86_CR4_OSFXSR | X86_CR4_OSXMMEXCPT)))
 
 /* These exceptions must always be intercepted. */
-#define HVM_TRAP_MASK (1U << TRAP_machine_check)
+#define HVM_TRAP_MASK ((1U << TRAP_machine_check) | (1U << TRAP_invalid_op))
 
 /*
  * x86 event types. This enumeration is valid for:

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.