aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Mammedov <imammedo@redhat.com>2013-01-11 03:10:17 +0100
committerAndreas Färber <afaerber@suse.de>2013-01-15 04:09:15 +0100
commit5ec01c2e96910e1588d1a0de8609b9dda7618c7f (patch)
treed9391c53241e652db9645be16e9caa7c9f79bc3a
parentfa2db3c494270c1892365eef370d06a4559619e0 (diff)
downloadqemu-5ec01c2e96910e1588d1a0de8609b9dda7618c7f.zip
qemu-5ec01c2e96910e1588d1a0de8609b9dda7618c7f.tar.gz
qemu-5ec01c2e96910e1588d1a0de8609b9dda7618c7f.tar.bz2
target-i386: Move kvm_check_features_against_host() check to realize time
kvm_check_features_against_host() should be called when features can't be changed, and when features are converted to properties it would be possible to change them until realize time, so correct way is to call kvm_check_features_against_host() in x86_cpu_realize(). Signed-off-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Eduardo Habkost <ehabkost@redhat.com> Signed-off-by: Andreas Färber <afaerber@suse.de>
-rw-r--r--target-i386/cpu.c28
1 files changed, 15 insertions, 13 deletions
diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index 3a68470f..333745b 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -1022,27 +1022,28 @@ static int unavailable_host_feature(FeatureWordInfo *f, uint32_t mask)
*
* This function may be called only if KVM is enabled.
*/
-static int kvm_check_features_against_host(x86_def_t *guest_def)
+static int kvm_check_features_against_host(X86CPU *cpu)
{
+ CPUX86State *env = &cpu->env;
x86_def_t host_def;
uint32_t mask;
int rv, i;
struct model_features_t ft[] = {
- {&guest_def->features, &host_def.features,
+ {&env->cpuid_features, &host_def.features,
FEAT_1_EDX },
- {&guest_def->ext_features, &host_def.ext_features,
+ {&env->cpuid_ext_features, &host_def.ext_features,
FEAT_1_ECX },
- {&guest_def->ext2_features, &host_def.ext2_features,
+ {&env->cpuid_ext2_features, &host_def.ext2_features,
FEAT_8000_0001_EDX },
- {&guest_def->ext3_features, &host_def.ext3_features,
+ {&env->cpuid_ext3_features, &host_def.ext3_features,
FEAT_8000_0001_ECX },
- {&guest_def->ext4_features, &host_def.ext4_features,
+ {&env->cpuid_ext4_features, &host_def.ext4_features,
FEAT_C000_0001_EDX },
- {&guest_def->cpuid_7_0_ebx_features, &host_def.cpuid_7_0_ebx_features,
+ {&env->cpuid_7_0_ebx_features, &host_def.cpuid_7_0_ebx_features,
FEAT_7_0_EBX },
- {&guest_def->svm_features, &host_def.svm_features,
+ {&env->cpuid_svm_features, &host_def.svm_features,
FEAT_SVM },
- {&guest_def->kvm_features, &host_def.kvm_features,
+ {&env->cpuid_kvm_features, &host_def.kvm_features,
FEAT_KVM },
};
@@ -1471,10 +1472,6 @@ static int cpu_x86_parse_featurestr(x86_def_t *x86_cpu_def, char *features)
x86_cpu_def->kvm_features &= ~minus_features[FEAT_KVM];
x86_cpu_def->svm_features &= ~minus_features[FEAT_SVM];
x86_cpu_def->cpuid_7_0_ebx_features &= ~minus_features[FEAT_7_0_EBX];
- if (check_cpuid && kvm_enabled()) {
- if (kvm_check_features_against_host(x86_cpu_def) && enforce_cpuid)
- goto error;
- }
return 0;
error:
@@ -2177,6 +2174,11 @@ void x86_cpu_realize(Object *obj, Error **errp)
#ifdef CONFIG_KVM
filter_features_for_kvm(cpu);
#endif
+ if (check_cpuid && kvm_check_features_against_host(cpu)
+ && enforce_cpuid) {
+ error_setg(errp, "Host's CPU doesn't support requested features");
+ return;
+ }
}
#ifndef CONFIG_USER_ONLY