From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LSaYA-0001NY-Rq for qemu-devel@nongnu.org; Thu, 29 Jan 2009 12:19:34 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LSaY9-0001Mb-Q1 for qemu-devel@nongnu.org; Thu, 29 Jan 2009 12:19:33 -0500 Received: from [199.232.76.173] (port=51481 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LSaY9-0001Lz-3y for qemu-devel@nongnu.org; Thu, 29 Jan 2009 12:19:33 -0500 Received: from mx2.redhat.com ([66.187.237.31]:53018) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LSaY8-0007qs-Jg for qemu-devel@nongnu.org; Thu, 29 Jan 2009 12:19:32 -0500 From: Glauber Costa Date: Thu, 29 Jan 2009 12:19:29 -0500 Message-Id: <1233249569-16686-5-git-send-email-glommer@redhat.com> In-Reply-To: <1233249569-16686-4-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> Subject: [Qemu-devel] [PATCH 4/4] kvm pv features PART I 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 Signed-off-by: Glauber Costa --- 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