diff options
author | Eduardo Habkost <ehabkost@redhat.com> | 2014-04-30 13:48:39 -0300 |
---|---|---|
committer | Andreas Färber <afaerber@suse.de> | 2014-06-25 23:54:57 +0200 |
commit | fefb41bf3485a1c9a44c15e382d28035c6fb5f4b (patch) | |
tree | 4e9509707be902eedcf4ba8301b989e54b56d0b3 /target-i386 | |
parent | 37ce3522cb88c524caec57cb52a4bfbb880abbe5 (diff) | |
download | qemu-fefb41bf3485a1c9a44c15e382d28035c6fb5f4b.zip qemu-fefb41bf3485a1c9a44c15e382d28035c6fb5f4b.tar.gz qemu-fefb41bf3485a1c9a44c15e382d28035c6fb5f4b.tar.bz2 |
target-i386: Support check/enforce flags in TCG mode, too
If enforce/check is specified in TCG mode, QEMU will ensure all CPU
features are supported by TCG, so no CPU feature is silently disabled.
Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
[AF: Be explicit about TCG vs. !KVM]
Signed-off-by: Andreas Färber <afaerber@suse.de>
Diffstat (limited to 'target-i386')
-rw-r--r-- | target-i386/cpu.c | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/target-i386/cpu.c b/target-i386/cpu.c index 3e1dad7..d789cba 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -1263,8 +1263,9 @@ static void report_unavailable_features(FeatureWord w, uint32_t mask) if (1 << i & mask) { const char *reg = get_register_name_32(f->cpuid_reg); assert(reg); - fprintf(stderr, "warning: host doesn't support requested feature: " + fprintf(stderr, "warning: %s doesn't support requested feature: " "CPUID.%02XH:%s%s%s [bit %d]\n", + kvm_enabled() ? "host" : "TCG", f->cpuid_eax, reg, f->feat_names[i] ? "." : "", f->feat_names[i] ? f->feat_names[i] : "", i); @@ -1829,17 +1830,20 @@ static uint32_t x86_cpu_get_supported_feature_word(FeatureWord w) { FeatureWordInfo *wi = &feature_word_info[w]; - assert(kvm_enabled()); - return kvm_arch_get_supported_cpuid(kvm_state, wi->cpuid_eax, - wi->cpuid_ecx, - wi->cpuid_reg); + if (kvm_enabled()) { + return kvm_arch_get_supported_cpuid(kvm_state, wi->cpuid_eax, + wi->cpuid_ecx, + wi->cpuid_reg); + } else if (tcg_enabled()) { + return wi->tcg_features; + } else { + return ~0; + } } /* * Filters CPU feature words based on host availability of each feature. * - * This function may be called only if KVM is enabled. - * * Returns: 0 if all flags are supported by the host, non-zero otherwise. */ static int x86_cpu_filter_features(X86CPU *cpu) @@ -2596,17 +2600,13 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp) & CPUID_EXT2_AMD_ALIASES); } - if (!kvm_enabled()) { - FeatureWord w; - for (w = 0; w < FEATURE_WORDS; w++) { - env->features[w] &= feature_word_info[w].tcg_features; - } - } else { - if (x86_cpu_filter_features(cpu) && cpu->enforce_cpuid) { - error_setg(&local_err, - "Host's CPU doesn't support requested features"); - goto out; - } + + if (x86_cpu_filter_features(cpu) && cpu->enforce_cpuid) { + error_setg(&local_err, + kvm_enabled() ? + "Host doesn't support requested features" : + "TCG doesn't support requested features"); + goto out; } #ifndef CONFIG_USER_ONLY |