From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paolo Bonzini Subject: Re: [RFC PATCH 7/7] [hyper-v] init hyper-v cpuid leafs Date: Tue, 11 Oct 2011 09:38:10 +0200 Message-ID: <4E93F262.3070800@redhat.com> References: <1318186375-27672-1-git-send-email-vrozenfe@redhat.com> <1318186375-27672-8-git-send-email-vrozenfe@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: kvm@vger.kernel.org, Avi Kivity To: Vadim Rozenfeld Return-path: Received: from mail-ww0-f44.google.com ([74.125.82.44]:45348 "EHLO mail-ww0-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750942Ab1JKHiN (ORCPT ); Tue, 11 Oct 2011 03:38:13 -0400 Received: by wwf22 with SMTP id 22so10096591wwf.1 for ; Tue, 11 Oct 2011 00:38:12 -0700 (PDT) In-Reply-To: <1318186375-27672-8-git-send-email-vrozenfe@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: On 10/09/2011 08:52 PM, Vadim Rozenfeld wrote: > --- > target-i386/kvm.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++- > 1 files changed, 52 insertions(+), 1 deletions(-) > > diff --git a/target-i386/kvm.c b/target-i386/kvm.c > index 3840255..74fcc9a 100644 > --- a/target-i386/kvm.c > +++ b/target-i386/kvm.c > @@ -29,6 +29,7 @@ > #include "hw/pc.h" > #include "hw/apic.h" > #include "ioport.h" > +#include "hyperv.h" > > //#define DEBUG_KVM > > @@ -379,11 +380,21 @@ int kvm_arch_init_vcpu(CPUState *env) > cpuid_i = 0; > > /* Paravirtualization CPUIDs */ > - memcpy(signature, "KVMKVMKVM\0\0\0", 12); These should not be KVM-specific. You should be able to add enlightenments to a TCG VM. At the same time, the KVM leaves could be moved to 0x40000100 when enlightenments are active, similar to what Xen does. Paolo > c =&cpuid_data.entries[cpuid_i++]; > memset(c, 0, sizeof(*c)); > c->function = KVM_CPUID_SIGNATURE; > +#ifndef CONFIG_HYPERV > + memcpy(signature, "KVMKVMKVM\0\0\0", 12); > c->eax = 0; > +#else > + if (!hyperv_enabled()) { > + memcpy(signature, "KVMKVMKVM\0\0\0", 12); > + c->eax = 0; > + } else { > + memcpy(signature, "Microsoft Hv", 12); > + c->eax = HYPERV_CPUID_MIN; > + } > +#endif > c->ebx = signature[0]; > c->ecx = signature[1]; > c->edx = signature[2]; > @@ -393,6 +404,46 @@ int kvm_arch_init_vcpu(CPUState *env) > c->function = KVM_CPUID_FEATURES; > c->eax = env->cpuid_kvm_features& > kvm_arch_get_supported_cpuid(s, KVM_CPUID_FEATURES, 0, R_EAX); > +#ifdef CONFIG_HYPERV > + if (hyperv_enabled()) { > + memcpy(signature, "Hv#1\0\0\0\0\0\0\0\0", 12); > + c->eax = signature[0]; > + > + c =&cpuid_data.entries[cpuid_i++]; > + memset(c, 0, sizeof(*c)); > + c->function = HYPERV_CPUID_VERSION; > + c->eax = 0x00001bbc; > + c->ebx = 0x00060001; > + > + c =&cpuid_data.entries[cpuid_i++]; > + memset(c, 0, sizeof(*c)); > + c->function = HYPERV_CPUID_FEATURES; > + if (hyperv_relaxed_timing()) { > + c->eax |= HV_X64_MSR_HYPERCALL_AVAILABLE; > + } > + if (hyperv_apic_recommended()) { > + c->eax |= HV_X64_MSR_HYPERCALL_AVAILABLE; > + c->eax |= HV_X64_MSR_APIC_ACCESS_AVAILABLE; > + } > + > + c =&cpuid_data.entries[cpuid_i++]; > + memset(c, 0, sizeof(*c)); > + c->function = HYPERV_CPUID_ENLIGHTMENT_INFO; > + if (hyperv_relaxed_timing()) { > + c->eax |= HV_X64_RELAXED_TIMING_RECOMMENDED; > + } > + if (hyperv_apic_recommended()) { > + c->eax |= HV_X64_APIC_ACCESS_RECOMMENDED; > + } > + c->ebx = hyperv_spinlock_retries(); > + > + c =&cpuid_data.entries[cpuid_i++]; > + memset(c, 0, sizeof(*c)); > + c->function = HYPERV_CPUID_IMPLEMENT_LIMITS; > + c->eax = 0x40; > + c->ebx = 0x40; > + } > +#endif > > has_msr_async_pf_en = c->eax& (1<< KVM_FEATURE_ASYNC_PF); >