This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
Home Products Support Community News


[Xen-devel] [PATCH] hvm: clear vmxe if vmxoff

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH] hvm: clear vmxe if vmxoff
From: Magnus Damm <magnus@xxxxxxxxxxxxx>
Date: Fri, 29 Sep 2006 15:44:25 +0900
Cc: Magnus Damm <magnus@xxxxxxxxxxxxx>, magnus.damm@xxxxxxxxx
Delivery-date: Fri, 29 Sep 2006 01:12:49 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
hvm: clear vmxe if vmxoff

The current Xen code keeps X86_CR4_VMXE set even if VMXON has not been 
executed. The stop_vmx() code assumes that it is possible to call VMXOFF
if X86_CR4_VMXE is set which is not always true. Calling VMXOFF without 
VMXON results in an illegal opcode trap, and to avoid this condition this 
patch makes sure that X86_CR4_VMXE is only set when VMXON has been called.

Tested using x86_32 on a Pentium D 930.

Signed-Off-By: Magnus Damm <magnus@xxxxxxxxxxxxx>

--- 0001/xen/arch/x86/hvm/vmx/vmx.c
+++ work/xen/arch/x86/hvm/vmx/vmx.c     2006-09-29 14:49:55.000000000 +0900
@@ -485,8 +485,10 @@ static void vmx_ctxt_switch_to(struct vc
 static void stop_vmx(void)
-    if (read_cr4() & X86_CR4_VMXE)
+    if (read_cr4() & X86_CR4_VMXE) {
+        clear_in_cr4(X86_CR4_VMXE);
+    }
 void vmx_migrate_timers(struct vcpu *v)
@@ -806,12 +808,14 @@ int start_vmx(void)
     if ( (vmcs = vmx_alloc_host_vmcs()) == NULL )
+        clear_in_cr4(X86_CR4_VMXE);
         printk("Failed to allocate host VMCS\n");
         return 0;
     if ( __vmxon(virt_to_maddr(vmcs)) )
+        clear_in_cr4(X86_CR4_VMXE);
         printk("VMXON failed\n");
         return 0;

Xen-devel mailing list

<Prev in Thread] Current Thread [Next in Thread>