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
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html