From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [PATCH 10/27] nVMX: Implement VMCLEAR Date: Sun, 17 Oct 2010 15:05:54 +0200 Message-ID: <4CBAF4B2.5000505@redhat.com> References: <1287309814-nyh@il.ibm.com> <201010171008.o9HA8g4E029408@rice.haifa.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: kvm@vger.kernel.org, gleb@redhat.com To: "Nadav Har'El" Return-path: Received: from mx1.redhat.com ([209.132.183.28]:21541 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753521Ab0JQNGA (ORCPT ); Sun, 17 Oct 2010 09:06:00 -0400 In-Reply-To: <201010171008.o9HA8g4E029408@rice.haifa.ibm.com> Sender: kvm-owner@vger.kernel.org List-ID: On 10/17/2010 12:08 PM, Nadav Har'El wrote: > This patch implements the VMCLEAR instruction. > > Signed-off-by: Nadav Har'El > --- > arch/x86/kvm/vmx.c | 62 ++++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 61 insertions(+), 1 deletion(-) > > --- .before/arch/x86/kvm/vmx.c 2010-10-17 11:52:01.000000000 +0200 > +++ .after/arch/x86/kvm/vmx.c 2010-10-17 11:52:01.000000000 +0200 > @@ -146,6 +146,8 @@ struct __packed vmcs12 { > */ > u32 revision_id; > u32 abort; > + > + bool launch_state; /* set to 0 by VMCLEAR, to 1 by VMLAUNCH */ u32 please, this is an ABI. > }; > > /* > @@ -3830,6 +3832,64 @@ static void nested_vmx_failValid(struct > get_vmcs12_fields(vcpu)->vm_instruction_error = vm_instruction_error; > } > > +/* Emulate the VMCLEAR instruction */ > +static int handle_vmclear(struct kvm_vcpu *vcpu) > +{ > + struct vcpu_vmx *vmx = to_vmx(vcpu); > + gva_t gva; > + gpa_t vmcs12_addr; > + struct vmcs12 *vmcs12; > + struct page *page; > + > + if (!nested_vmx_check_permission(vcpu)) > + return 1; > + > + if (get_vmx_mem_address(vcpu, vmcs_readl(EXIT_QUALIFICATION), > + vmcs_read32(VMX_INSTRUCTION_INFO),&gva)) > + return 1; > + > + if (kvm_read_guest_virt(gva,&vmcs12_addr, sizeof(vmcs12_addr), > + vcpu, NULL)) { > + kvm_queue_exception(vcpu, PF_VECTOR); > + return 1; > + } > + > + if (!IS_ALIGNED(vmcs12_addr, PAGE_SIZE)) { > + nested_vmx_failValid(vcpu, VMXERR_VMCLEAR_INVALID_ADDRESS); > + skip_emulated_instruction(vcpu); > + return 1; > + } > + > + if (vmcs12_addr == vmx->nested.current_vmptr){ > + kunmap(vmx->nested.current_vmcs12_page); > + nested_release_page(vmx->nested.current_vmcs12_page); > + vmx->nested.current_vmptr = -1ull; > + } > + > + page = nested_get_page(vcpu, vmcs12_addr); > + if(page == NULL){ Missing whitespace. > + /* > + * For accurate processor emulation, VMCLEAR beyond available > + * physical memory should do nothing at all. However, it is > + * possible that a nested vmx bug, not a guest hypervisor bug, > + * resulted in this case, so let's shut down before doing any > + * more damage: > + */ > + set_bit(KVM_REQ_TRIPLE_FAULT,&vcpu->requests); > + return 1; > + } > + vmcs12 = kmap(page); kmap_atomic() please (better, kvm_write_guest(), but can defer that for later) > + vmcs12->launch_state = 0; > + kunmap(page); > + nested_release_page(page); > + > + nested_free_vmcs(vcpu, vmcs12_addr); > + > + skip_emulated_instruction(vcpu); > + nested_vmx_succeed(vcpu); > + return 1; > +} > + > static int handle_invlpg(struct kvm_vcpu *vcpu) > { > unsigned long exit_qualification = vmcs_readl(EXIT_QUALIFICATION); -- error compiling committee.c: too many arguments to function