[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 4/6] fix KVMs GET_SUPPORTED_CPUID feature usage
From: |
Andre Przywara |
Subject: |
[Qemu-devel] [PATCH 4/6] fix KVMs GET_SUPPORTED_CPUID feature usage |
Date: |
Thu, 25 Jun 2009 00:08:02 +0200 |
If we want to trim the user provided CPUID bits for KVM to be not greater
than that of the host, we should not remove the bits _after_ we sent
them to the kernel.
This fixes the masking of features that are not present on the host by
moving the trim function and it's call from helper.c to kvm.c.
It helps to use -cpu host.
Signed-off-by: Andre Przywara <address@hidden>
---
target-i386/helper.c | 29 -----------------------------
target-i386/kvm.c | 22 ++++++++++++++++++++++
2 files changed, 22 insertions(+), 29 deletions(-)
diff --git a/target-i386/helper.c b/target-i386/helper.c
index d4498e5..2e77570 100644
--- a/target-i386/helper.c
+++ b/target-i386/helper.c
@@ -92,20 +92,6 @@ static void add_flagname_to_bitmaps(const char *flagname,
uint32_t *features,
}
}
-static void kvm_trim_features(uint32_t *features, uint32_t supported,
- const char *names[])
-{
- int i;
- uint32_t mask;
-
- for (i = 0; i < 32; ++i) {
- mask = 1U << i;
- if ((*features & mask) && !(supported & mask)) {
- *features &= ~mask;
- }
- }
-}
-
typedef struct x86_def_t {
const char *name;
uint32_t level;
@@ -1773,21 +1759,6 @@ CPUX86State *cpu_x86_init(const char *cpu_model)
qemu_init_vcpu(env);
- if (kvm_enabled()) {
- kvm_trim_features(&env->cpuid_features,
- kvm_arch_get_supported_cpuid(env, 1, R_EDX),
- feature_name);
- kvm_trim_features(&env->cpuid_ext_features,
- kvm_arch_get_supported_cpuid(env, 1, R_ECX),
- ext_feature_name);
- kvm_trim_features(&env->cpuid_ext2_features,
- kvm_arch_get_supported_cpuid(env, 0x80000001, R_EDX),
- ext2_feature_name);
- kvm_trim_features(&env->cpuid_ext3_features,
- kvm_arch_get_supported_cpuid(env, 0x80000001, R_ECX),
- ext3_feature_name);
- }
-
return env;
}
diff --git a/target-i386/kvm.c b/target-i386/kvm.c
index c4fd484..70a9b45 100644
--- a/target-i386/kvm.c
+++ b/target-i386/kvm.c
@@ -117,6 +117,19 @@ uint32_t kvm_arch_get_supported_cpuid(CPUState *env,
uint32_t function, int reg)
#endif
+static void kvm_trim_features(uint32_t *features, uint32_t supported)
+{
+ int i;
+ uint32_t mask;
+
+ for (i = 0; i < 32; ++i) {
+ mask = 1U << i;
+ if ((*features & mask) && !(supported & mask)) {
+ *features &= ~mask;
+ }
+ }
+}
+
int kvm_arch_init_vcpu(CPUState *env)
{
struct {
@@ -128,6 +141,15 @@ int kvm_arch_init_vcpu(CPUState *env)
env->mp_state = KVM_MP_STATE_RUNNABLE;
+ kvm_trim_features(&env->cpuid_features,
+ kvm_arch_get_supported_cpuid(env, 1, R_EDX));
+ kvm_trim_features(&env->cpuid_ext_features,
+ kvm_arch_get_supported_cpuid(env, 1, R_ECX));
+ kvm_trim_features(&env->cpuid_ext2_features,
+ kvm_arch_get_supported_cpuid(env, 0x80000001, R_EDX));
+ kvm_trim_features(&env->cpuid_ext3_features,
+ kvm_arch_get_supported_cpuid(env, 0x80000001, R_ECX));
+
cpuid_i = 0;
cpu_x86_cpuid(env, 0, 0, &limit, &unused, &unused, &unused);
--
1.6.1.3
- [Qemu-devel] [PATCH 0/6] Add -cpu host CPU type, Andre Przywara, 2009/06/24
- [Qemu-devel] [PATCH 1/6] allow hypervisor CPUID bit to be overriden, Andre Przywara, 2009/06/24
- [Qemu-devel] [PATCH 5/6] remove CPUID host hacks, Andre Przywara, 2009/06/24
- [Qemu-devel] [PATCH 4/6] fix KVMs GET_SUPPORTED_CPUID feature usage,
Andre Przywara <=
- [Qemu-devel] [PATCH 3/6] CPUID Fn8000_0001.EAX is family/model/stepping, not features, Andre Przywara, 2009/06/24
- [Qemu-devel] [PATCH 6/6] preserve the hypervisor bit while KVM trims the CPUID bits, Andre Przywara, 2009/06/24
- [Qemu-devel] [PATCH 2/6] introduce -cpu host target, Andre Przywara, 2009/06/24