mirror of https://github.com/xqemu/xqemu.git
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 enforce_cpuid;
|
||||||
bool expose_kvm;
|
bool expose_kvm;
|
||||||
bool migratable;
|
bool migratable;
|
||||||
|
bool host_features;
|
||||||
|
|
||||||
/* if true the CPUID code directly forward host cache leaves to the guest */
|
/* if true the CPUID code directly forward host cache leaves to the guest */
|
||||||
bool cache_info_passthrough;
|
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
|
#ifdef CONFIG_KVM
|
||||||
|
|
||||||
static int cpu_x86_fill_model_id(char *str)
|
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;
|
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)
|
static void host_x86_cpu_initfn(Object *obj)
|
||||||
{
|
{
|
||||||
X86CPU *cpu = X86_CPU(obj);
|
X86CPU *cpu = X86_CPU(obj);
|
||||||
CPUX86State *env = &cpu->env;
|
CPUX86State *env = &cpu->env;
|
||||||
KVMState *s = kvm_state;
|
KVMState *s = kvm_state;
|
||||||
FeatureWord w;
|
|
||||||
|
|
||||||
assert(kvm_enabled());
|
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_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_xlevel = kvm_arch_get_supported_cpuid(s, 0x80000000, 0, R_EAX);
|
||||||
env->cpuid_xlevel2 = kvm_arch_get_supported_cpuid(s, 0xC0000000, 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);
|
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, ",");
|
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++) {
|
for (w = 0; w < FEATURE_WORDS; w++) {
|
||||||
env->features[w] |= plus_features[w];
|
env->features[w] |= plus_features[w];
|
||||||
env->features[w] &= ~minus_features[w];
|
env->features[w] &= ~minus_features[w];
|
||||||
|
|
Loading…
Reference in New Issue