From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54268) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W6mE4-0001C7-Bb for qemu-devel@nongnu.org; Fri, 24 Jan 2014 14:15:42 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1W6mDt-0004pn-Rw for qemu-devel@nongnu.org; Fri, 24 Jan 2014 14:15:36 -0500 Received: from mx1.redhat.com ([209.132.183.28]:41006) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W6mDt-0004pX-Cz for qemu-devel@nongnu.org; Fri, 24 Jan 2014 14:15:25 -0500 Date: Fri, 24 Jan 2014 17:08:09 -0200 From: Marcelo Tosatti Message-ID: <20140124190809.GC11980@amt.cnet> References: <1390580276-15298-1-git-send-email-pbonzini@redhat.com> <1390580276-15298-2-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1390580276-15298-2-git-send-email-pbonzini@redhat.com> Subject: Re: [Qemu-devel] [PATCH 1/5] KVM: fix coexistence of KVM and Hyper-V leaves List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini Cc: qemu-devel@nongnu.org, kvm@vger.kernel.org, vrozenfe@redhat.com On Fri, Jan 24, 2014 at 05:17:52PM +0100, Paolo Bonzini wrote: > kvm_arch_init_vcpu's initialization of the KVM leaves at 0x40000100 > is broken, because KVM_CPUID_FEATURES is left at 0x40000001. Move > it to 0x40000101 if Hyper-V is enabled. > > Signed-off-by: Paolo Bonzini arch/x86/include/asm/kvm_para.h static inline unsigned int kvm_arch_para_features(void) { return cpuid_eax(KVM_CPUID_FEATURES); } Shouldnt it be using kvm_cpuid_base ? > --- > target-i386/kvm.c | 47 +++++++++++++++++++++++++---------------------- > 1 file changed, 25 insertions(+), 22 deletions(-) > > diff --git a/target-i386/kvm.c b/target-i386/kvm.c > index 0a21c30..5738911 100644 > --- a/target-i386/kvm.c > +++ b/target-i386/kvm.c > @@ -455,6 +455,7 @@ int kvm_arch_init_vcpu(CPUState *cs) > uint32_t unused; > struct kvm_cpuid_entry2 *c; > uint32_t signature[3]; > + int kvm_base = KVM_CPUID_SIGNATURE; > int r; > > memset(&cpuid_data, 0, sizeof(cpuid_data)); > @@ -462,26 +463,22 @@ int kvm_arch_init_vcpu(CPUState *cs) > cpuid_i = 0; > > /* Paravirtualization CPUIDs */ > - c = &cpuid_data.entries[cpuid_i++]; > - c->function = KVM_CPUID_SIGNATURE; > - if (!hyperv_enabled(cpu)) { > - memcpy(signature, "KVMKVMKVM\0\0\0", 12); > - c->eax = 0; > - } else { > + if (hyperv_enabled(cpu)) { > + c = &cpuid_data.entries[cpuid_i++]; > + c->function = HYPERV_CPUID_VENDOR_AND_MAX_FUNCTIONS; > memcpy(signature, "Microsoft Hv", 12); > c->eax = HYPERV_CPUID_MIN; > - } > - c->ebx = signature[0]; > - c->ecx = signature[1]; > - c->edx = signature[2]; > - > - c = &cpuid_data.entries[cpuid_i++]; > - c->function = KVM_CPUID_FEATURES; > - c->eax = env->features[FEAT_KVM]; > + c->ebx = signature[0]; > + c->ecx = signature[1]; > + c->edx = signature[2]; > > - if (hyperv_enabled(cpu)) { > + c = &cpuid_data.entries[cpuid_i++]; > + c->function = HYPERV_CPUID_INTERFACE; > memcpy(signature, "Hv#1\0\0\0\0\0\0\0\0", 12); > c->eax = signature[0]; > + c->ebx = 0; > + c->ecx = 0; > + c->edx = 0; > > c = &cpuid_data.entries[cpuid_i++]; > c->function = HYPERV_CPUID_VERSION; > @@ -513,15 +510,21 @@ int kvm_arch_init_vcpu(CPUState *cs) > c->eax = 0x40; > c->ebx = 0x40; > > - c = &cpuid_data.entries[cpuid_i++]; > - c->function = KVM_CPUID_SIGNATURE_NEXT; > - memcpy(signature, "KVMKVMKVM\0\0\0", 12); > - c->eax = 0; > - c->ebx = signature[0]; > - c->ecx = signature[1]; > - c->edx = signature[2]; > + kvm_base = KVM_CPUID_SIGNATURE_NEXT; > } > > + memcpy(signature, "KVMKVMKVM\0\0\0", 12); > + c = &cpuid_data.entries[cpuid_i++]; > + c->function = KVM_CPUID_SIGNATURE | kvm_base; > + c->eax = 0; > + c->ebx = signature[0]; > + c->ecx = signature[1]; > + c->edx = signature[2]; > + > + c = &cpuid_data.entries[cpuid_i++]; > + c->function = KVM_CPUID_FEATURES | kvm_base; > + c->eax = env->features[FEAT_KVM]; > + > has_msr_async_pf_en = c->eax & (1 << KVM_FEATURE_ASYNC_PF); > > has_msr_pv_eoi_en = c->eax & (1 << KVM_FEATURE_PV_EOI); > -- > 1.8.3.1 >