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.
Signed-off-by: Eduardo Habkost <ehabk...@redhat.com> --- target-i386/cpu.c | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/target-i386/cpu.c b/target-i386/cpu.c index f4b2674..e229112 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -1200,8 +1200,9 @@ static int 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); @@ -1792,17 +1793,18 @@ CpuDefinitionInfoList *arch_query_cpu_definitions(Error **errp) 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 { + return wi->tcg_features; + } } /* Filters CPU feature words based on host availability of each feature * * Returns 0 if all flags are supported by the host, non-zero otherwise. - * - * This function may be called only if KVM is enabled. */ static int x86_cpu_filter_features(X86CPU *cpu) { @@ -2539,17 +2541,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 -- 1.8.5.3