From: Dongxiao Xu <dongxiao...@intel.com>

Signed-off-by: Dongxiao Xu <dongxiao...@intel.com>
---
 arch/x86/kvm/vmx.c |   36 +++++++++++++++++++++++-------------
 1 files changed, 23 insertions(+), 13 deletions(-)

diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index ae3217d..10e2c3c 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -442,6 +442,19 @@ static void vmcs_clear(struct vmcs *vmcs)
                       vmcs, phys_addr);
 }
 
+static void vmcs_load(struct vmcs *vmcs)
+{
+       u64 phys_addr = __pa(vmcs);
+       u8 error;
+
+       asm volatile (__ex(ASM_VMX_VMPTRLD_RAX) "; setna %0"
+                       : "=g"(error) : "a"(&phys_addr), "m"(phys_addr)
+                       : "cc", "memory");
+       if (error)
+               printk(KERN_ERR "kvm: vmptrld %p/%llx fail\n",
+                      vmcs, phys_addr);
+}
+
 static void __vcpu_clear(void *arg)
 {
        struct vcpu_vmx *vmx = arg;
@@ -766,7 +779,6 @@ static void vmx_load_host_state(struct vcpu_vmx *vmx)
 static void vmx_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
 {
        struct vcpu_vmx *vmx = to_vmx(vcpu);
-       u64 phys_addr = __pa(vmx->vmcs);
        u64 tsc_this, delta, new_offset;
 
        if (vcpu->cpu != cpu) {
@@ -780,15 +792,8 @@ static void vmx_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
        }
 
        if (per_cpu(current_vmcs, cpu) != vmx->vmcs) {
-               u8 error;
-
                per_cpu(current_vmcs, cpu) = vmx->vmcs;
-               asm volatile (__ex(ASM_VMX_VMPTRLD_RAX) "; setna %0"
-                             : "=g"(error) : "a"(&phys_addr), "m"(phys_addr)
-                             : "cc");
-               if (error)
-                       printk(KERN_ERR "kvm: vmptrld %p/%llx fail\n",
-                              vmx->vmcs, phys_addr);
+               vmcs_load(vmx->vmcs);
        }
 
        if (vcpu->cpu != cpu) {
@@ -1211,6 +1216,13 @@ static __init int vmx_disabled_by_bios(void)
        /* locked but not enabled */
 }
 
+static void kvm_cpu_vmxon(u64 addr)
+{
+       asm volatile (ASM_VMX_VMXON_RAX
+                       : : "a"(&addr), "m"(addr)
+                       : "memory", "cc");
+}
+
 static int hardware_enable(void *garbage)
 {
        int cpu = raw_smp_processor_id();
@@ -1231,9 +1243,7 @@ static int hardware_enable(void *garbage)
                       FEATURE_CONTROL_LOCKED |
                       FEATURE_CONTROL_VMXON_ENABLED);
        write_cr4(read_cr4() | X86_CR4_VMXE); /* FIXME: not cpu hotplug safe */
-       asm volatile (ASM_VMX_VMXON_RAX
-                     : : "a"(&phys_addr), "m"(phys_addr)
-                     : "memory", "cc");
+       kvm_cpu_vmxon(phys_addr);
 
        ept_sync_global();
 
@@ -1257,13 +1267,13 @@ static void vmclear_local_vcpus(void)
 static void kvm_cpu_vmxoff(void)
 {
        asm volatile (__ex(ASM_VMX_VMXOFF) : : : "cc");
-       write_cr4(read_cr4() & ~X86_CR4_VMXE);
 }
 
 static void hardware_disable(void *garbage)
 {
        vmclear_local_vcpus();
        kvm_cpu_vmxoff();
+       write_cr4(read_cr4() & ~X86_CR4_VMXE);
 }
 
 static __init int adjust_vmx_controls(u32 ctl_min, u32 ctl_opt,
-- 
1.6.3
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to