target-i386: Convert kvm_default_*features to property/value pairs
Convert the kvm_default_features and kvm_default_unset_features arrays into a simple list of property/value pairs that will be applied to X86CPU objects when using KVM. Acked-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
This commit is contained in:
parent
a32ef3bfc1
commit
5114e84222
@ -332,7 +332,7 @@ static void pc_compat_2_1(MachineState *machine)
|
|||||||
|
|
||||||
pc_compat_2_2(machine);
|
pc_compat_2_2(machine);
|
||||||
smbios_uuid_encoded = false;
|
smbios_uuid_encoded = false;
|
||||||
x86_cpu_compat_kvm_no_autodisable(FEAT_8000_0001_ECX, CPUID_EXT3_SVM);
|
x86_cpu_change_kvm_default("svm", NULL);
|
||||||
pcms->enforce_aligned_dimm = false;
|
pcms->enforce_aligned_dimm = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -368,7 +368,7 @@ static void pc_compat_1_7(MachineState *machine)
|
|||||||
gigabyte_align = false;
|
gigabyte_align = false;
|
||||||
option_rom_has_mr = true;
|
option_rom_has_mr = true;
|
||||||
legacy_acpi_table_size = 6414;
|
legacy_acpi_table_size = 6414;
|
||||||
x86_cpu_compat_kvm_no_autoenable(FEAT_1_ECX, CPUID_EXT_X2APIC);
|
x86_cpu_change_kvm_default("x2apic", NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pc_compat_1_6(MachineState *machine)
|
static void pc_compat_1_6(MachineState *machine)
|
||||||
@ -398,7 +398,7 @@ static void pc_compat_1_3(MachineState *machine)
|
|||||||
static void pc_compat_1_2(MachineState *machine)
|
static void pc_compat_1_2(MachineState *machine)
|
||||||
{
|
{
|
||||||
pc_compat_1_3(machine);
|
pc_compat_1_3(machine);
|
||||||
x86_cpu_compat_kvm_no_autoenable(FEAT_KVM, 1 << KVM_FEATURE_PV_EOI);
|
x86_cpu_change_kvm_default("kvm-pv-eoi", NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PC compat function for pc-0.10 to pc-0.13 */
|
/* PC compat function for pc-0.10 to pc-0.13 */
|
||||||
@ -421,7 +421,7 @@ static void pc_init_isa(MachineState *machine)
|
|||||||
if (!machine->cpu_model) {
|
if (!machine->cpu_model) {
|
||||||
machine->cpu_model = "486";
|
machine->cpu_model = "486";
|
||||||
}
|
}
|
||||||
x86_cpu_compat_kvm_no_autoenable(FEAT_KVM, 1 << KVM_FEATURE_PV_EOI);
|
x86_cpu_change_kvm_default("kvm-pv-eoi", NULL);
|
||||||
enable_compat_apic_id_mode();
|
enable_compat_apic_id_mode();
|
||||||
pc_init1(machine, TYPE_I440FX_PCI_HOST_BRIDGE, TYPE_I440FX_PCI_DEVICE);
|
pc_init1(machine, TYPE_I440FX_PCI_HOST_BRIDGE, TYPE_I440FX_PCI_DEVICE);
|
||||||
}
|
}
|
||||||
|
@ -316,7 +316,7 @@ static void pc_compat_2_1(MachineState *machine)
|
|||||||
pc_compat_2_2(machine);
|
pc_compat_2_2(machine);
|
||||||
pcms->enforce_aligned_dimm = false;
|
pcms->enforce_aligned_dimm = false;
|
||||||
smbios_uuid_encoded = false;
|
smbios_uuid_encoded = false;
|
||||||
x86_cpu_compat_kvm_no_autodisable(FEAT_8000_0001_ECX, CPUID_EXT3_SVM);
|
x86_cpu_change_kvm_default("svm", NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pc_compat_2_0(MachineState *machine)
|
static void pc_compat_2_0(MachineState *machine)
|
||||||
@ -333,7 +333,7 @@ static void pc_compat_1_7(MachineState *machine)
|
|||||||
smbios_defaults = false;
|
smbios_defaults = false;
|
||||||
gigabyte_align = false;
|
gigabyte_align = false;
|
||||||
option_rom_has_mr = true;
|
option_rom_has_mr = true;
|
||||||
x86_cpu_compat_kvm_no_autoenable(FEAT_1_ECX, CPUID_EXT_X2APIC);
|
x86_cpu_change_kvm_default("x2apic", NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pc_compat_1_6(MachineState *machine)
|
static void pc_compat_1_6(MachineState *machine)
|
||||||
|
@ -478,38 +478,6 @@ const char *get_register_name_32(unsigned int reg)
|
|||||||
return x86_reg_info_32[reg].name;
|
return x86_reg_info_32[reg].name;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* KVM-specific features that are automatically added to all CPU models
|
|
||||||
* when KVM is enabled.
|
|
||||||
*/
|
|
||||||
static uint32_t kvm_default_features[FEATURE_WORDS] = {
|
|
||||||
[FEAT_KVM] = (1 << KVM_FEATURE_CLOCKSOURCE) |
|
|
||||||
(1 << KVM_FEATURE_NOP_IO_DELAY) |
|
|
||||||
(1 << KVM_FEATURE_CLOCKSOURCE2) |
|
|
||||||
(1 << KVM_FEATURE_ASYNC_PF) |
|
|
||||||
(1 << KVM_FEATURE_STEAL_TIME) |
|
|
||||||
(1 << KVM_FEATURE_PV_EOI) |
|
|
||||||
(1 << KVM_FEATURE_CLOCKSOURCE_STABLE_BIT),
|
|
||||||
[FEAT_1_ECX] = CPUID_EXT_X2APIC,
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Features that are not added by default to any CPU model when KVM is enabled.
|
|
||||||
*/
|
|
||||||
static uint32_t kvm_default_unset_features[FEATURE_WORDS] = {
|
|
||||||
[FEAT_1_EDX] = CPUID_ACPI,
|
|
||||||
[FEAT_1_ECX] = CPUID_EXT_MONITOR,
|
|
||||||
[FEAT_8000_0001_ECX] = CPUID_EXT3_SVM,
|
|
||||||
};
|
|
||||||
|
|
||||||
void x86_cpu_compat_kvm_no_autoenable(FeatureWord w, uint32_t features)
|
|
||||||
{
|
|
||||||
kvm_default_features[w] &= ~features;
|
|
||||||
}
|
|
||||||
|
|
||||||
void x86_cpu_compat_kvm_no_autodisable(FeatureWord w, uint32_t features)
|
|
||||||
{
|
|
||||||
kvm_default_unset_features[w] &= ~features;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Returns the set of feature flags that are supported and migratable by
|
* Returns the set of feature flags that are supported and migratable by
|
||||||
* QEMU, for a given FeatureWord.
|
* QEMU, for a given FeatureWord.
|
||||||
@ -1392,6 +1360,43 @@ static X86CPUDefinition builtin_x86_defs[] = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct PropValue {
|
||||||
|
const char *prop, *value;
|
||||||
|
} PropValue;
|
||||||
|
|
||||||
|
/* KVM-specific features that are automatically added/removed
|
||||||
|
* from all CPU models when KVM is enabled.
|
||||||
|
*/
|
||||||
|
static PropValue kvm_default_props[] = {
|
||||||
|
{ "kvmclock", "on" },
|
||||||
|
{ "kvm-nopiodelay", "on" },
|
||||||
|
{ "kvm-asyncpf", "on" },
|
||||||
|
{ "kvm-steal-time", "on" },
|
||||||
|
{ "kvm-pv-eoi", "on" },
|
||||||
|
{ "kvmclock-stable-bit", "on" },
|
||||||
|
{ "x2apic", "on" },
|
||||||
|
{ "acpi", "off" },
|
||||||
|
{ "monitor", "off" },
|
||||||
|
{ "svm", "off" },
|
||||||
|
{ NULL, NULL },
|
||||||
|
};
|
||||||
|
|
||||||
|
void x86_cpu_change_kvm_default(const char *prop, const char *value)
|
||||||
|
{
|
||||||
|
PropValue *pv;
|
||||||
|
for (pv = kvm_default_props; pv->prop; pv++) {
|
||||||
|
if (!strcmp(pv->prop, prop)) {
|
||||||
|
pv->value = value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* It is valid to call this function only for properties that
|
||||||
|
* are already present in the kvm_default_props table.
|
||||||
|
*/
|
||||||
|
assert(pv->prop);
|
||||||
|
}
|
||||||
|
|
||||||
static uint32_t x86_cpu_get_supported_feature_word(FeatureWord w,
|
static uint32_t x86_cpu_get_supported_feature_word(FeatureWord w,
|
||||||
bool migratable_only);
|
bool migratable_only);
|
||||||
|
|
||||||
@ -2061,6 +2066,18 @@ static int x86_cpu_filter_features(X86CPU *cpu)
|
|||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void x86_cpu_apply_props(X86CPU *cpu, PropValue *props)
|
||||||
|
{
|
||||||
|
PropValue *pv;
|
||||||
|
for (pv = props; pv->prop; pv++) {
|
||||||
|
if (!pv->value) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
object_property_parse(OBJECT(cpu), pv->value, pv->prop,
|
||||||
|
&error_abort);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Load data from X86CPUDefinition
|
/* Load data from X86CPUDefinition
|
||||||
*/
|
*/
|
||||||
static void x86_cpu_load_def(X86CPU *cpu, X86CPUDefinition *def, Error **errp)
|
static void x86_cpu_load_def(X86CPU *cpu, X86CPUDefinition *def, Error **errp)
|
||||||
@ -2084,11 +2101,7 @@ static void x86_cpu_load_def(X86CPU *cpu, X86CPUDefinition *def, Error **errp)
|
|||||||
|
|
||||||
/* Special cases not set in the X86CPUDefinition structs: */
|
/* Special cases not set in the X86CPUDefinition structs: */
|
||||||
if (kvm_enabled()) {
|
if (kvm_enabled()) {
|
||||||
FeatureWord w;
|
x86_cpu_apply_props(cpu, kvm_default_props);
|
||||||
for (w = 0; w < FEATURE_WORDS; w++) {
|
|
||||||
env->features[w] |= kvm_default_features[w];
|
|
||||||
env->features[w] &= ~kvm_default_unset_features[w];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
env->features[FEAT_1_ECX] |= CPUID_EXT_HYPERVISOR;
|
env->features[FEAT_1_ECX] |= CPUID_EXT_HYPERVISOR;
|
||||||
|
@ -1341,8 +1341,15 @@ void cpu_smm_update(X86CPU *cpu);
|
|||||||
|
|
||||||
void cpu_report_tpr_access(CPUX86State *env, TPRAccess access);
|
void cpu_report_tpr_access(CPUX86State *env, TPRAccess access);
|
||||||
|
|
||||||
void x86_cpu_compat_kvm_no_autoenable(FeatureWord w, uint32_t features);
|
/* Change the value of a KVM-specific default
|
||||||
void x86_cpu_compat_kvm_no_autodisable(FeatureWord w, uint32_t features);
|
*
|
||||||
|
* If value is NULL, no default will be set and the original
|
||||||
|
* value from the CPU model table will be kept.
|
||||||
|
*
|
||||||
|
* It is valid to call this funciton only for properties that
|
||||||
|
* are already present in the kvm_default_props table.
|
||||||
|
*/
|
||||||
|
void x86_cpu_change_kvm_default(const char *prop, const char *value);
|
||||||
|
|
||||||
|
|
||||||
/* Return name of 32-bit register, from a R_* constant */
|
/* Return name of 32-bit register, from a R_* constant */
|
||||||
|
Loading…
Reference in New Issue
Block a user