Remove double invocation of vmx_intr_assist when VM_EXIT
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Tue, 23 Aug 2005 09:26:11 +0000 (09:26 +0000)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Tue, 23 Aug 2005 09:26:11 +0000 (09:26 +0000)
causes a domain switch.

Signed-off-by: Eddie Dong <eddie.dong@intel.com>
Signed-off-by: Edwin Zhai <edwin.zhai@intel.com>
xen/arch/x86/vmx.c
xen/arch/x86/vmx_io.c
xen/arch/x86/x86_32/entry.S
xen/arch/x86/x86_64/entry.S
xen/include/asm-x86/vmx.h

index f7c39b83462c01eb2759c3508d26f4f601cd96c6..d9725938e09b4e8e7c5c8707fce19d2ec2aa63f9 100644 (file)
@@ -1712,9 +1712,6 @@ asmlinkage void vmx_vmexit_handler(struct cpu_user_regs regs)
     default:
         __vmx_bug(&regs);       /* should not happen */
     }
-
-    vmx_intr_assist(v);
-    return;
 }
 
 asmlinkage void load_cr2(void)
index cbc88deb8ba569100da7a88af381d3028f0d830f..ceee60690c3e10c3cf55a298eb3ce3a9738bd6d0 100644 (file)
@@ -631,12 +631,14 @@ static inline int irq_masked(unsigned long eflags)
     return ((eflags & X86_EFLAGS_IF) == 0);
 }
 
-void vmx_intr_assist(struct vcpu *v
+asmlinkage void vmx_intr_assist(void
 {
     int intr_type = 0;
-    int highest_vector = find_highest_pending_irq(v, &intr_type);
+    int highest_vector;
     unsigned long intr_fields, eflags, interruptibility, cpu_exec_control;
+    struct vcpu *v = current;
 
+    highest_vector = find_highest_pending_irq(v, &intr_type);
     __vmread(CPU_BASED_VM_EXEC_CONTROL, &cpu_exec_control);
 
     if (highest_vector == -1) {
@@ -712,9 +714,6 @@ void vmx_do_resume(struct vcpu *d)
 
     /* We can't resume the guest if we're waiting on I/O */
     ASSERT(!test_bit(ARCH_VMX_IO_WAIT, &d->arch.arch_vmx.flags));
-
-    /* We always check for interrupts before resuming guest */
-    vmx_intr_assist(d);
 }
 
 #endif /* CONFIG_VMX */
index a2491612d76152a9089d00aa5cb68abbdfcc7a2c..911594b910c89d8d0da95bc8476fa25ee6e0497a 100644 (file)
@@ -140,6 +140,7 @@ ENTRY(vmx_asm_vmexit_handler)
         jnz 2f
 
 /* vmx_restore_all_guest */
+        call vmx_intr_assist
         call load_cr2
         .endif
         VMX_RESTORE_ALL_NOSEGREGS
index 0f24b15ca12b4b1ce2e326992b531787770eb687..3db22487bf95ceb0c090ab82fe71a644bf1dc038 100644 (file)
@@ -233,6 +233,7 @@ ENTRY(vmx_asm_vmexit_handler)
         jnz  2f 
 
 /* vmx_restore_all_guest */
+        call vmx_intr_assist
         call load_cr2
         .endif
         /* 
index 714969eb2e8db5190796e3286478286d975280d9..0d40e51068dca880eda3dda00413e078b0f7db12 100644 (file)
@@ -31,7 +31,7 @@
 extern void vmx_asm_vmexit_handler(struct cpu_user_regs);
 extern void vmx_asm_do_resume(void);
 extern void vmx_asm_do_launch(void);
-extern void vmx_intr_assist(struct vcpu *d);
+extern void vmx_intr_assist(void);
 
 extern void arch_vmx_do_launch(struct vcpu *);
 extern void arch_vmx_do_resume(struct vcpu *);
@@ -355,7 +355,7 @@ static inline int __vmxon (u64 addr)
 }
 
 /* Make sure that xen intercepts any FP accesses from current */
-static inline void vmx_stts()
+static inline void vmx_stts(void)
 {
     unsigned long cr0;