From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [PATCH 1/5]KVM: x86, apicv: add APICv register virtualization support Date: Thu, 06 Sep 2012 19:01:41 +0300 Message-ID: <5048C8E5.40107@redhat.com> References: Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Cc: "kvm@vger.kernel.org" To: "Li, Jiongxi" Return-path: Received: from mx1.redhat.com ([209.132.183.28]:32394 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758549Ab2IFQBp (ORCPT ); Thu, 6 Sep 2012 12:01:45 -0400 In-Reply-To: Sender: kvm-owner@vger.kernel.org List-ID: On 09/05/2012 08:41 AM, Li, Jiongxi wrote: > - APIC read doesn't cause VM-Exit > - APIC write becomes trap-like > > > +/* emulate APIC access in a trap manner */ > +int kvm_apic_write_nodecode(struct kvm_vcpu *vcpu, u32 offset) > +{ > + u32 val; > + > + /* hw has done the conditional check and inst decode */ > + offset &= 0xff0; > + if ((offset != APIC_EOI) && > + apic_reg_read(vcpu->arch.apic, offset, 4, &val)) > + return 1; TMICT is a write-only register IIRC. > + > + /* TODO: optimize to just emulate side effect w/o one more write */ > + return apic_reg_write(vcpu->arch.apic, offset, val); val may be uninitialized here. > +} > +EXPORT_SYMBOL_GPL(kvm_apic_write_nodecode); > + > void kvm_lapic_set_eoi(struct kvm_vcpu *vcpu) > { > > +static bool __read_mostly enable_apicv_reg = 0; Enable by default. > +module_param(enable_apicv_reg, bool, S_IRUGO); Let's have one module parameter for all related features, called apicv. So modeprobe kvm-intel apicv=0 disables it. > > +static int handle_apic_write(struct kvm_vcpu *vcpu) > +{ > + unsigned long exit_qualification = vmcs_readl(EXIT_QUALIFICATION); > + u32 offset = exit_qualification & 0xfff; > + > + /* APIC-write VM exit is trap-like and thus no need to adjust IP */ > + return kvm_apic_write_nodecode(vcpu, offset) == 0; > +} Return 1 here means exit to userspace. This will go crazy. You need to return 0 always. If this is an msr write to a read-only register, you need to inject a #GP (IIRC). -- error compiling committee.c: too many arguments to function