On Tue, 2011-10-11 at 09:38 +0200, Paolo Bonzini wrote: > 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. > IMO, adding Hyper-V features without KVM support has little, if any, meaning. Relaxed timing is the only one thing, which can be activated without help from hypervisor. > 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); > > > > -- > To unsubscribe from this list: send the line "unsubscribe kvm" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html