From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [PATCH 11/29] nVMX: Implement VMCLEAR Date: Sun, 30 Jan 2011 14:07:53 +0200 Message-ID: <4D455499.8080500@redhat.com> References: <1296116987-nyh@il.ibm.com> <201101270835.p0R8ZTuw002557@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]:45008 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752788Ab1A3MH7 (ORCPT ); Sun, 30 Jan 2011 07:07:59 -0500 In-Reply-To: <201101270835.p0R8ZTuw002557@rice.haifa.ibm.com> Sender: kvm-owner@vger.kernel.org List-ID: On 01/27/2011 10:35 AM, Nadav Har'El wrote: > This patch implements the VMCLEAR instruction. > > > > +/* 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); This generates an exception without an error code. Use the 'struct x86_exception' parameter to kvm_read_guest_virt() to obtain the correct exception/error code pair. > + 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) { > + /* > + * 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: > + */ > + kvm_make_request(KVM_REQ_TRIPLE_FAULT, vcpu); > + nested_release_page(page); nested_release_page(NULL) unneeded. > + return 1; > + } > + vmcs12 = kmap(page); > + vmcs12->launch_state = 0; > + kunmap(page); > + nested_release_page(page); > + > + nested_free_vmcs(vmx, vmcs12_addr); > + > + skip_emulated_instruction(vcpu); > + nested_vmx_succeed(vcpu); > + return 1; > +} > + -- error compiling committee.c: too many arguments to function