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

[Xen-changelog] [xen-unstable] vmx: Clean up exception delivery logic.



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1226403300 0
# Node ID 7be8e7eefbd79e7bb823b20eadfbdd1fec483d93
# Parent  7e8db19d72a54a86034177e2a48f7d2a2af87648
vmx: Clean up exception delivery logic.
Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
 xen/arch/x86/hvm/vmx/intr.c       |    4 -
 xen/arch/x86/hvm/vmx/vmx.c        |   80 ++++++++++++++++++--------------------
 xen/arch/x86/hvm/vmx/vpmu_core2.c |    2 
 xen/include/asm-x86/hvm/vmx/vmx.h |    6 +-
 4 files changed, 44 insertions(+), 48 deletions(-)

diff -r 7e8db19d72a5 -r 7be8e7eefbd7 xen/arch/x86/hvm/vmx/intr.c
--- a/xen/arch/x86/hvm/vmx/intr.c       Tue Nov 11 11:13:57 2008 +0000
+++ b/xen/arch/x86/hvm/vmx/intr.c       Tue Nov 11 11:35:00 2008 +0000
@@ -140,12 +140,12 @@ asmlinkage void vmx_intr_assist(void)
 
     if ( intack.source == hvm_intsrc_nmi )
     {
-        vmx_inject_nmi(v);
+        vmx_inject_nmi();
     }
     else
     {
         HVMTRACE_2D(INJ_VIRQ, intack.vector, /*fake=*/ 0);
-        vmx_inject_extint(v, intack.vector);
+        vmx_inject_extint(intack.vector);
         pt_intr_post(v, intack);
     }
 
diff -r 7e8db19d72a5 -r 7be8e7eefbd7 xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c        Tue Nov 11 11:13:57 2008 +0000
+++ b/xen/arch/x86/hvm/vmx/vmx.c        Tue Nov 11 11:35:00 2008 +0000
@@ -187,7 +187,7 @@ static enum handler_return long_mode_do_
     check_long_mode:
         if ( !(hvm_long_mode_enabled(v)) )
         {
-            vmx_inject_hw_exception(v, TRAP_gp_fault, 0);
+            vmx_inject_hw_exception(TRAP_gp_fault, 0);
             return HNDL_exception_raised;
         }
         break;
@@ -284,7 +284,7 @@ static enum handler_return long_mode_do_
  uncanonical_address:
     HVM_DBG_LOG(DBG_LEVEL_0, "Not cano address of msr write %x", ecx);
  gp_fault:
-    vmx_inject_hw_exception(v, TRAP_gp_fault, 0);
+    vmx_inject_hw_exception(TRAP_gp_fault, 0);
  exception_raised:
     return HNDL_exception_raised;
 }
@@ -1094,8 +1094,7 @@ void ept_sync_domain(struct domain *d)
     }
 }
 
-static void __vmx_inject_exception(
-    struct vcpu *v, int trap, int type, int error_code)
+static void __vmx_inject_exception(int trap, int type, int error_code)
 {
     unsigned long intr_fields;
 
@@ -1114,15 +1113,9 @@ static void __vmx_inject_exception(
     }
 
     __vmwrite(VM_ENTRY_INTR_INFO, intr_fields);
-
-    if ( trap == TRAP_page_fault )
-        HVMTRACE_LONG_2D(PF_INJECT, error_code,
-            TRC_PAR_LONG(v->arch.hvm_vcpu.guest_cr[2]));
-    else
-        HVMTRACE_2D(INJ_EXC, trap, error_code);
-}
-
-void vmx_inject_hw_exception(struct vcpu *v, int trap, int error_code)
+}
+
+void vmx_inject_hw_exception(int trap, int error_code)
 {
     unsigned long intr_info = __vmread(VM_ENTRY_INTR_INFO);
 
@@ -1134,37 +1127,41 @@ void vmx_inject_hw_exception(struct vcpu
             error_code = 0;
     }
 
-    __vmx_inject_exception(v, trap, X86_EVENTTYPE_HW_EXCEPTION, error_code);
-}
-
-void vmx_inject_extint(struct vcpu *v, int trap)
-{
-    __vmx_inject_exception(v, trap, X86_EVENTTYPE_EXT_INTR,
+    __vmx_inject_exception(trap, X86_EVENTTYPE_HW_EXCEPTION, error_code);
+
+    if ( trap == TRAP_page_fault )
+        HVMTRACE_LONG_2D(PF_INJECT, error_code,
+                         TRC_PAR_LONG(current->arch.hvm_vcpu.guest_cr[2]));
+    else
+        HVMTRACE_2D(INJ_EXC, trap, error_code);
+
+    if ( (trap == TRAP_debug) &&
+         (guest_cpu_user_regs()->eflags & X86_EFLAGS_TF) )
+    {
+        __restore_debug_registers(current);
+        write_debugreg(6, read_debugreg(6) | 0x4000);
+    }
+}
+
+void vmx_inject_extint(int trap)
+{
+    __vmx_inject_exception(trap, X86_EVENTTYPE_EXT_INTR,
                            HVM_DELIVER_NO_ERROR_CODE);
 }
 
-void vmx_inject_nmi(struct vcpu *v)
-{
-    __vmx_inject_exception(v, 2, X86_EVENTTYPE_NMI,
+void vmx_inject_nmi(void)
+{
+    __vmx_inject_exception(2, X86_EVENTTYPE_NMI,
                            HVM_DELIVER_NO_ERROR_CODE);
 }
 
 static void vmx_inject_exception(
     unsigned int trapnr, int errcode, unsigned long cr2)
 {
-    struct vcpu *curr = current;
-
-    vmx_inject_hw_exception(curr, trapnr, errcode);
-
     if ( trapnr == TRAP_page_fault )
-        curr->arch.hvm_vcpu.guest_cr[2] = cr2;
-
-    if ( (trapnr == TRAP_debug) &&
-         (guest_cpu_user_regs()->eflags & X86_EFLAGS_TF) )
-    {
-        __restore_debug_registers(curr);
-        write_debugreg(6, read_debugreg(6) | 0x4000);
-    }
+        current->arch.hvm_vcpu.guest_cr[2] = cr2;
+
+    vmx_inject_hw_exception(trapnr, errcode);
 }
 
 static int vmx_event_pending(struct vcpu *v)
@@ -1315,7 +1312,7 @@ static void __update_guest_eip(unsigned 
     }
 
     if ( regs->eflags & X86_EFLAGS_TF )
-        vmx_inject_exception(TRAP_debug, HVM_DELIVER_NO_ERROR_CODE, 0);
+        vmx_inject_hw_exception(TRAP_debug, HVM_DELIVER_NO_ERROR_CODE);
 }
 
 static void vmx_fpu_dirty_intercept(void)
@@ -1636,7 +1633,6 @@ static int vmx_msr_read_intercept(struct
 {
     u64 msr_content = 0;
     u32 ecx = regs->ecx, eax, edx;
-    struct vcpu *v = current;
 
     HVM_DBG_LOG(DBG_LEVEL_1, "ecx=%x", ecx);
 
@@ -1712,7 +1708,7 @@ done:
     return X86EMUL_OKAY;
 
 gp_fault:
-    vmx_inject_hw_exception(v, TRAP_gp_fault, 0);
+    vmx_inject_hw_exception(TRAP_gp_fault, 0);
     return X86EMUL_EXCEPTION;
 }
 
@@ -1849,7 +1845,7 @@ static int vmx_msr_write_intercept(struc
 
         if ( (rc < 0) ||
              (vmx_add_host_load_msr(ecx) < 0) )
-            vmx_inject_hw_exception(v, TRAP_machine_check, 0);
+            vmx_inject_hw_exception(TRAP_machine_check, 0);
         else
         {
             __vmwrite(GUEST_IA32_DEBUGCTL, msr_content);
@@ -1889,7 +1885,7 @@ static int vmx_msr_write_intercept(struc
     return X86EMUL_OKAY;
 
 gp_fault:
-    vmx_inject_hw_exception(v, TRAP_gp_fault, 0);
+    vmx_inject_hw_exception(TRAP_gp_fault, 0);
     return X86EMUL_EXCEPTION;
 }
 
@@ -2197,7 +2193,7 @@ asmlinkage void vmx_vmexit_handler(struc
             }
 
             v->arch.hvm_vcpu.guest_cr[2] = exit_qualification;
-            vmx_inject_hw_exception(v, TRAP_page_fault, regs->error_code);
+            vmx_inject_hw_exception(TRAP_page_fault, regs->error_code);
             break;
         case TRAP_nmi:
             if ( (intr_info & INTR_INFO_INTR_TYPE_MASK) !=
@@ -2317,7 +2313,7 @@ asmlinkage void vmx_vmexit_handler(struc
     case EXIT_REASON_VMWRITE:
     case EXIT_REASON_VMXOFF:
     case EXIT_REASON_VMXON:
-        vmx_inject_hw_exception(v, TRAP_invalid_op, HVM_DELIVER_NO_ERROR_CODE);
+        vmx_inject_hw_exception(TRAP_invalid_op, HVM_DELIVER_NO_ERROR_CODE);
         break;
 
     case EXIT_REASON_TPR_BELOW_THRESHOLD:
@@ -2326,7 +2322,7 @@ asmlinkage void vmx_vmexit_handler(struc
     case EXIT_REASON_IO_INSTRUCTION:
     case EXIT_REASON_APIC_ACCESS:
         if ( !handle_mmio() )
-            hvm_inject_exception(TRAP_gp_fault, 0, 0);
+            vmx_inject_hw_exception(TRAP_gp_fault, 0);
         break;
 
     case EXIT_REASON_INVD:
diff -r 7e8db19d72a5 -r 7be8e7eefbd7 xen/arch/x86/hvm/vmx/vpmu_core2.c
--- a/xen/arch/x86/hvm/vmx/vpmu_core2.c Tue Nov 11 11:13:57 2008 +0000
+++ b/xen/arch/x86/hvm/vmx/vpmu_core2.c Tue Nov 11 11:35:00 2008 +0000
@@ -335,7 +335,7 @@ static int core2_vpmu_do_wrmsr(struct cp
     case MSR_CORE_PERF_GLOBAL_STATUS:
         gdprintk(XENLOG_INFO, "Can not write readonly MSR: "
                  "MSR_PERF_GLOBAL_STATUS(0x38E)!\n");
-        vmx_inject_hw_exception(current, TRAP_gp_fault, 0);
+        vmx_inject_hw_exception(TRAP_gp_fault, 0);
         return 1;
     case MSR_IA32_PEBS_ENABLE:
         if ( msr_content & 1 )
diff -r 7e8db19d72a5 -r 7be8e7eefbd7 xen/include/asm-x86/hvm/vmx/vmx.h
--- a/xen/include/asm-x86/hvm/vmx/vmx.h Tue Nov 11 11:13:57 2008 +0000
+++ b/xen/include/asm-x86/hvm/vmx/vmx.h Tue Nov 11 11:35:00 2008 +0000
@@ -351,9 +351,9 @@ static inline int __vmxon(u64 addr)
     return rc;
 }
 
-void vmx_inject_hw_exception(struct vcpu *v, int trap, int error_code);
-void vmx_inject_extint(struct vcpu *v, int trap);
-void vmx_inject_nmi(struct vcpu *v);
+void vmx_inject_hw_exception(int trap, int error_code);
+void vmx_inject_extint(int trap);
+void vmx_inject_nmi(void);
 
 void ept_p2m_init(struct domain *d);
 

_______________________________________________
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®.