target-i386: Support migratable=no properly
When the "migratable" property was implemented, the behavior was tested by changing the default on the code, but actually using the option on the command-line (e.g. "-cpu host,migratable=false") doesn't work as expected. This is a regression for a common use case of "-cpu host", which is to enable features that are supported by the host CPU + kernel before feature-specific code is added to QEMU. Fix this by initializing the feature words for "-cpu host" on x86_cpu_parse_featurestr(), right after parsing the CPU options. Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> Reviewed-by: Michael Roth <mdroth@linux.vnet.ibm.com> Cc: qemu-stable@nongnu.org Signed-off-by: Andreas Färber <afaerber@suse.de>
This commit is contained in:
		
							parent
							
								
									6c3bff0ed8
								
							
						
					
					
						commit
						4d1b279b06
					
				| 
						 | 
				
			
			@ -92,6 +92,7 @@ typedef struct X86CPU {
 | 
			
		|||
    bool enforce_cpuid;
 | 
			
		||||
    bool expose_kvm;
 | 
			
		||||
    bool migratable;
 | 
			
		||||
    bool host_features;
 | 
			
		||||
 | 
			
		||||
    /* if true the CPUID code directly forward host cache leaves to the guest */
 | 
			
		||||
    bool cache_info_passthrough;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1254,6 +1254,9 @@ void x86_cpu_compat_set_features(const char *cpu_model, FeatureWord w,
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static uint32_t x86_cpu_get_supported_feature_word(FeatureWord w,
 | 
			
		||||
                                                   bool migratable_only);
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_KVM
 | 
			
		||||
 | 
			
		||||
static int cpu_x86_fill_model_id(char *str)
 | 
			
		||||
| 
						 | 
				
			
			@ -1310,26 +1313,23 @@ static void host_x86_cpu_class_init(ObjectClass *oc, void *data)
 | 
			
		|||
    dc->props = host_x86_cpu_properties;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static uint32_t x86_cpu_get_supported_feature_word(FeatureWord w,
 | 
			
		||||
                                                   bool migratable_only);
 | 
			
		||||
 | 
			
		||||
static void host_x86_cpu_initfn(Object *obj)
 | 
			
		||||
{
 | 
			
		||||
    X86CPU *cpu = X86_CPU(obj);
 | 
			
		||||
    CPUX86State *env = &cpu->env;
 | 
			
		||||
    KVMState *s = kvm_state;
 | 
			
		||||
    FeatureWord w;
 | 
			
		||||
 | 
			
		||||
    assert(kvm_enabled());
 | 
			
		||||
 | 
			
		||||
    /* We can't fill the features array here because we don't know yet if
 | 
			
		||||
     * "migratable" is true or false.
 | 
			
		||||
     */
 | 
			
		||||
    cpu->host_features = true;
 | 
			
		||||
 | 
			
		||||
    env->cpuid_level = kvm_arch_get_supported_cpuid(s, 0x0, 0, R_EAX);
 | 
			
		||||
    env->cpuid_xlevel = kvm_arch_get_supported_cpuid(s, 0x80000000, 0, R_EAX);
 | 
			
		||||
    env->cpuid_xlevel2 = kvm_arch_get_supported_cpuid(s, 0xC0000000, 0, R_EAX);
 | 
			
		||||
 | 
			
		||||
    for (w = 0; w < FEATURE_WORDS; w++) {
 | 
			
		||||
        env->features[w] =
 | 
			
		||||
            x86_cpu_get_supported_feature_word(w, cpu->migratable);
 | 
			
		||||
    }
 | 
			
		||||
    object_property_set_bool(OBJECT(cpu), true, "pmu", &error_abort);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1828,6 +1828,13 @@ static void x86_cpu_parse_featurestr(CPUState *cs, char *features,
 | 
			
		|||
        featurestr = strtok(NULL, ",");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (cpu->host_features) {
 | 
			
		||||
        for (w = 0; w < FEATURE_WORDS; w++) {
 | 
			
		||||
            env->features[w] =
 | 
			
		||||
                x86_cpu_get_supported_feature_word(w, cpu->migratable);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (w = 0; w < FEATURE_WORDS; w++) {
 | 
			
		||||
        env->features[w] |= plus_features[w];
 | 
			
		||||
        env->features[w] &= ~minus_features[w];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue