From mboxrd@z Thu Jan 1 00:00:00 1970 From: Magnus Damm Subject: [PATCH] hvm: clear vmxe if vmxoff Date: Fri, 29 Sep 2006 15:44:25 +0900 Message-ID: <20060929064425.24864.5149.sendpatchset@localhost> Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com Cc: Magnus Damm , magnus.damm@gmail.com List-Id: xen-devel@lists.xenproject.org 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 --- 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) { __vmxoff(); + 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"); vmx_free_host_vmcs(vmcs); return 0;