From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [PATCH 9/9] Add VMEXIT handler and intercepts Date: Mon, 01 Sep 2008 16:58:41 +0300 Message-ID: <48BBF511.5070803@qumranet.com> References: <1220270281-15720-1-git-send-email-agraf@suse.de> <1220270281-15720-2-git-send-email-agraf@suse.de> <1220270281-15720-3-git-send-email-agraf@suse.de> <1220270281-15720-4-git-send-email-agraf@suse.de> <1220270281-15720-5-git-send-email-agraf@suse.de> <1220270281-15720-6-git-send-email-agraf@suse.de> <1220270281-15720-7-git-send-email-agraf@suse.de> <1220270281-15720-8-git-send-email-agraf@suse.de> <1220270281-15720-9-git-send-email-agraf@suse.de> <1220270281-15720-10-git-send-email-agraf@suse.de> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: kvm@vger.kernel.org, joro@8bytes.org, anthony@codemonkey.ws To: Alexander Graf Return-path: Received: from il.qumranet.com ([212.179.150.194]:29280 "EHLO il.qumranet.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751207AbYIAN6n (ORCPT ); Mon, 1 Sep 2008 09:58:43 -0400 In-Reply-To: <1220270281-15720-10-git-send-email-agraf@suse.de> Sender: kvm-owner@vger.kernel.org List-ID: Alexander Graf wrote: > This adds the #VMEXIT intercept, so we return to the level 1 guest > when something happens in the level 2 guest that should return to > the level 1 guest. > > @@ -223,6 +228,21 @@ static void svm_queue_exception(struct kvm_vcpu *vcpu, unsigned nr, > { > struct vcpu_svm *svm = to_svm(vcpu); > > + /* If we are within a nested VM we'd better #VMEXIT and let the > + guest handle the exception */ > + if (is_nested(svm)) { > + svm->vmcb->control.exit_code = SVM_EXIT_EXCP_BASE + nr; > + svm->vmcb->control.exit_code_hi = 0; > + svm->vmcb->control.exit_info_1 = error_code; > + svm->vmcb->control.exit_info_2 = svm->vcpu.arch.cr2; > #vmexit isn't supposed to modify cr2, but we've corrupted it here. > + if (nested_svm_exit_handled(svm, false)) { > + nsvm_printk("VMexit -> EXCP 0x%x\n", nr); > + > + nested_svm_vmexit(svm); > + return; > + } > + } > + > Please move the entire block into a separate function. > +static int nested_svm_vmexit_real(struct vcpu_svm *svm, void *arg1, > + void *arg2, void *opaque) > +{ > + struct vmcb *nested_vmcb = (struct vmcb *)arg1; > + struct vmcb *hsave = (struct vmcb *)arg2; > + u64 nested_save[] = { nested_vmcb->save.cr0, > + nested_vmcb->save.cr3, > + nested_vmcb->save.cr4, > + nested_vmcb->save.efer, > + nested_vmcb->control.intercept_cr_read, > + nested_vmcb->control.intercept_cr_write, > + nested_vmcb->control.intercept_dr_read, > + nested_vmcb->control.intercept_dr_write, > + nested_vmcb->control.intercept_exceptions, > + nested_vmcb->control.intercept, > + nested_vmcb->control.msrpm_base_pa, > + nested_vmcb->control.iopm_base_pa, > + nested_vmcb->control.tsc_offset }; > + > + /* Give the current vmcb to the guest */ > + memcpy(nested_vmcb, svm->vmcb, sizeof(struct vmcb)); > + nested_vmcb->save.cr0 = nested_save[0]; > + if (!npt_enabled) > + nested_vmcb->save.cr3 = nested_save[1]; > + nested_vmcb->save.cr4 = nested_save[2]; > + nested_vmcb->save.efer = nested_save[3]; > + nested_vmcb->control.intercept_cr_read = nested_save[4]; > + nested_vmcb->control.intercept_cr_write = nested_save[5]; > + nested_vmcb->control.intercept_dr_read = nested_save[6]; > + nested_vmcb->control.intercept_dr_write = nested_save[7]; > + nested_vmcb->control.intercept_exceptions = nested_save[8]; > + nested_vmcb->control.intercept = nested_save[9]; > + nested_vmcb->control.msrpm_base_pa = nested_save[10]; > + nested_vmcb->control.iopm_base_pa = nested_save[11]; > + nested_vmcb->control.tsc_offset = nested_save[12]; > + > + if ((nested_vmcb->control.int_ctl & V_IRQ_MASK) && > + (nested_vmcb->control.int_vector)) { > + nsvm_printk("WARNING: IRQ 0x%x still enabled on #VMEXIT\n", > + nested_vmcb->control.int_vector); > + } > + > + /* Restore the original control entries */ > + memcpy(&svm->vmcb->control, &hsave->control, > + sizeof(struct vmcb_control_area)); > + force_new_asid(&svm->vcpu); > + /* Kill any pending exceptions */ > + if (svm->vcpu.arch.exception.pending == true) > + nsvm_printk("WARNING: Pending Exception\n"); > This should set control.exit_int_info. -- error compiling committee.c: too many arguments to function