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>
This commit is contained in:
		
							parent
							
								
									37ce3522cb
								
							
						
					
					
						commit
						fefb41bf34
					
				@ -1263,8 +1263,9 @@ static void report_unavailable_features(FeatureWord w, uint32_t mask)
 | 
				
			|||||||
        if (1 << i & mask) {
 | 
					        if (1 << i & mask) {
 | 
				
			||||||
            const char *reg = get_register_name_32(f->cpuid_reg);
 | 
					            const char *reg = get_register_name_32(f->cpuid_reg);
 | 
				
			||||||
            assert(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",
 | 
					                "CPUID.%02XH:%s%s%s [bit %d]\n",
 | 
				
			||||||
 | 
					                kvm_enabled() ? "host" : "TCG",
 | 
				
			||||||
                f->cpuid_eax, reg,
 | 
					                f->cpuid_eax, reg,
 | 
				
			||||||
                f->feat_names[i] ? "." : "",
 | 
					                f->feat_names[i] ? "." : "",
 | 
				
			||||||
                f->feat_names[i] ? f->feat_names[i] : "", 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];
 | 
					    FeatureWordInfo *wi = &feature_word_info[w];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assert(kvm_enabled());
 | 
					    if (kvm_enabled()) {
 | 
				
			||||||
        return kvm_arch_get_supported_cpuid(kvm_state, wi->cpuid_eax,
 | 
					        return kvm_arch_get_supported_cpuid(kvm_state, wi->cpuid_eax,
 | 
				
			||||||
                                                       wi->cpuid_ecx,
 | 
					                                                       wi->cpuid_ecx,
 | 
				
			||||||
                                                       wi->cpuid_reg);
 | 
					                                                       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.
 | 
					 * 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.
 | 
					 * Returns: 0 if all flags are supported by the host, non-zero otherwise.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static int x86_cpu_filter_features(X86CPU *cpu)
 | 
					static int x86_cpu_filter_features(X86CPU *cpu)
 | 
				
			||||||
@ -2596,18 +2600,14 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
 | 
				
			|||||||
           & CPUID_EXT2_AMD_ALIASES);
 | 
					           & 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) {
 | 
					    if (x86_cpu_filter_features(cpu) && cpu->enforce_cpuid) {
 | 
				
			||||||
        error_setg(&local_err,
 | 
					        error_setg(&local_err,
 | 
				
			||||||
                       "Host's CPU doesn't support requested features");
 | 
					                   kvm_enabled() ?
 | 
				
			||||||
 | 
					                       "Host doesn't support requested features" :
 | 
				
			||||||
 | 
					                       "TCG doesn't support requested features");
 | 
				
			||||||
        goto out;
 | 
					        goto out;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef CONFIG_USER_ONLY
 | 
					#ifndef CONFIG_USER_ONLY
 | 
				
			||||||
    qemu_register_reset(x86_cpu_machine_reset_cb, cpu);
 | 
					    qemu_register_reset(x86_cpu_machine_reset_cb, cpu);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user