From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LScOB-0003M6-5K for qemu-devel@nongnu.org; Thu, 29 Jan 2009 14:17:23 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LScO8-0003LI-J2 for qemu-devel@nongnu.org; Thu, 29 Jan 2009 14:17:21 -0500 Received: from [199.232.76.173] (port=43946 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LScO8-0003LF-DC for qemu-devel@nongnu.org; Thu, 29 Jan 2009 14:17:20 -0500 Received: from mail-qy0-f20.google.com ([209.85.221.20]:44640) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LScO7-00049Y-U8 for qemu-devel@nongnu.org; Thu, 29 Jan 2009 14:17:20 -0500 Received: by qyk13 with SMTP id 13so147026qyk.10 for ; Thu, 29 Jan 2009 11:17:17 -0800 (PST) MIME-Version: 1.0 In-Reply-To: <1233249569-16686-5-git-send-email-glommer@redhat.com> References: <1233249569-16686-1-git-send-email-glommer@redhat.com> <1233249569-16686-2-git-send-email-glommer@redhat.com> <1233249569-16686-3-git-send-email-glommer@redhat.com> <1233249569-16686-4-git-send-email-glommer@redhat.com> <1233249569-16686-5-git-send-email-glommer@redhat.com> Date: Thu, 29 Jan 2009 17:17:17 -0200 Message-ID: <5d6222a80901291117o18afbdabh45a83cab0842c402@mail.gmail.com> Subject: Re: [Qemu-devel] [PATCH 4/4] kvm pv features PART I From: Glauber Costa Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: aliguori@us.ibm.com On Thu, Jan 29, 2009 at 3:19 PM, Glauber Costa wrote: > Signed-off-by: Glauber Costa Shame on you, what a great changelog entry! This is where temporary becomes definitive by accident ;-) Anthony, let me know if you are okay with this patch, and if so, I'll provide a more meaningful changelog (that would be easy). > --- > kvm.h | 5 +++++ > target-i386/helper.c | 19 ++++++++++++++++++- > target-i386/kvm.c | 30 ++++++++++++++++++++++++++++++ > 3 files changed, 53 insertions(+), 1 deletions(-) > > diff --git a/kvm.h b/kvm.h > index efce145..49a2653 100644 > --- a/kvm.h > +++ b/kvm.h > @@ -17,6 +17,8 @@ > #include "config.h" > > #ifdef CONFIG_KVM > +#include > +#include > extern int kvm_allowed; > > #define kvm_enabled() (kvm_allowed) > @@ -76,4 +78,7 @@ int kvm_arch_init(KVMState *s, int smp_cpus); > > int kvm_arch_init_vcpu(CPUState *env); > > +/* x86 specific */ > +uint32_t kvm_get_para_features(CPUState *env); > + > #endif > diff --git a/target-i386/helper.c b/target-i386/helper.c > index 1410002..6bcd94d 100644 > --- a/target-i386/helper.c > +++ b/target-i386/helper.c > @@ -1405,7 +1405,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, > uint32_t *ecx, uint32_t *edx) > { > /* test if maximum index reached */ > - if (index & 0x80000000) { > + if (index & 0x40000000) { > + /* Those are KVM-specific, dodge them without messing with > + * exposed cpuid_level */ > + } else if (index & 0x80000000) { > if (index > env->cpuid_xlevel) > index = env->cpuid_level; > } else { > @@ -1511,6 +1514,20 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, > *ecx = 0; > *edx = 0; > break; > + case 0x40000000: > + if (kvm_enabled()) { > + /* KVM CPUID signature */ > + *eax = 0; > + *ebx = 0x4b4d564b; /* KVMKVMK */ > + *ecx = 0x564b4d56; /* VMKV */ > + *edx = 0x0000004d; /* M */ > + } > + break; > + case 0x40000001: > + if (kvm_enabled()) { > + *eax = kvm_get_para_features(env); > + } > + break; > case 0x80000000: > *eax = env->cpuid_xlevel; > *ebx = env->cpuid_vendor1; > diff --git a/target-i386/kvm.c b/target-i386/kvm.c > index 64b24db..c9f0272 100644 > --- a/target-i386/kvm.c > +++ b/target-i386/kvm.c > @@ -56,6 +56,36 @@ static void kvm_fill_cpuid(CPUState *env, KVMCpuid *cpuid_data, > } > } > > +static struct kvm_para_features { > + int cap; > + int feature; > +} para_features[] = { > +#ifdef KVM_CAP_CLOCKSOURCE > + { KVM_CAP_CLOCKSOURCE, KVM_FEATURE_CLOCKSOURCE }, > +#endif > +#ifdef KVM_CAP_NOP_IO_DELAY > + { KVM_CAP_NOP_IO_DELAY, KVM_FEATURE_NOP_IO_DELAY }, > +#endif > +#ifdef KVM_CAP_PV_MMU > + { KVM_CAP_PV_MMU, KVM_FEATURE_MMU_OP }, > +#endif > +#ifdef KVM_CAP_CR3_CACHE > + { KVM_CAP_CR3_CACHE, KVM_FEATURE_CR3_CACHE }, > +#endif > +}; > + > +uint32_t kvm_get_para_features(CPUState *env) > + { > + uint32_t i, features = 0; > + > + for (i = 0; i < ARRAY_SIZE(para_features); i++) { > + if (kvm_ioctl(env->kvm_state, KVM_CHECK_EXTENSION, para_features[i].cap)) > + features |= (1 << para_features[i].feature); > + } > + > + return features; > +} > + > int kvm_arch_init_vcpu(CPUState *env) > { > KVMCpuid cpuid_data; > -- > 1.5.6.5 > > > > -- Glauber Costa. "Free as in Freedom" http://glommer.net "The less confident you are, the more serious you have to act."