From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LV6R8-0007sT-CA for qemu-devel@nongnu.org; Thu, 05 Feb 2009 10:46:42 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LV6R6-0007qU-Iq for qemu-devel@nongnu.org; Thu, 05 Feb 2009 10:46:41 -0500 Received: from [199.232.76.173] (port=37639 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LV6R6-0007qJ-Da for qemu-devel@nongnu.org; Thu, 05 Feb 2009 10:46:40 -0500 Received: from mx2.redhat.com ([66.187.237.31]:46362) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LV6R5-0005Ep-K9 for qemu-devel@nongnu.org; Thu, 05 Feb 2009 10:46:39 -0500 From: Glauber Costa Date: Thu, 5 Feb 2009 10:35:07 -0500 Message-Id: <1233848107-9331-3-git-send-email-glommer@redhat.com> In-Reply-To: <1233848107-9331-2-git-send-email-glommer@redhat.com> References: <1233848107-9331-1-git-send-email-glommer@redhat.com> <1233848107-9331-2-git-send-email-glommer@redhat.com> Subject: [Qemu-devel] [PATCH 2/2] expose kvm pv features 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 expose kvm paravirtual features into cpuid. This enables the use of kvmclock in qemu guests. (and all the other features too). Signed-off-by: Glauber Costa --- kvm.h | 5 +++++ target-i386/kvm.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 0 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/kvm.c b/target-i386/kvm.c index 4a55931..736ee38 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -33,6 +33,33 @@ do { } while (0) #endif +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 +}; + +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; +} + typedef struct { struct kvm_cpuid cpuid; struct kvm_cpuid_entry entries[100]; @@ -69,6 +96,8 @@ int kvm_arch_init_vcpu(CPUState *env) kvm_fill_cpuid(env, &cpuid_data, 0, limit); + kvm_fill_cpuid(env, &cpuid_data, KVM_CPUID_SIGNATURE, KVM_CPUID_FEATURES); + cpu_x86_cpuid(env, 0x80000000, &eax, &ebx, &ecx, &edx); limit = eax; kvm_fill_cpuid(env, &cpuid_data, 0x80000000, limit); -- 1.5.6.5