[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 2/4] target-i386: Convert kvm_default_*features
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [PATCH 2/4] target-i386: Convert kvm_default_*features to property/value pairs |
Date: |
Mon, 14 Sep 2015 10:32:14 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.1.0 |
On 11/09/2015 21:25, Eduardo Habkost wrote:
> 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.
>
> Signed-off-by: Eduardo Habkost <address@hidden>
> ---
> hw/i386/pc_piix.c | 8 ++---
> hw/i386/pc_q35.c | 4 +--
> target-i386/cpu.c | 87
> ++++++++++++++++++++++++++++++++-----------------------
> target-i386/cpu.h | 11 +++++--
> 4 files changed, 65 insertions(+), 45 deletions(-)
>
> diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
> index 3f925b2..e79ef0d 100644
> --- a/hw/i386/pc_piix.c
> +++ b/hw/i386/pc_piix.c
> @@ -325,7 +325,7 @@ static void pc_compat_2_1(MachineState *machine)
>
> pc_compat_2_2(machine);
> 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;
> }
>
> @@ -361,7 +361,7 @@ static void pc_compat_1_7(MachineState *machine)
> gigabyte_align = false;
> option_rom_has_mr = true;
> 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)
> @@ -391,7 +391,7 @@ static void pc_compat_1_3(MachineState *machine)
> static void pc_compat_1_2(MachineState *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 */
> @@ -414,7 +414,7 @@ static void pc_init_isa(MachineState *machine)
> if (!machine->cpu_model) {
> 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();
> pc_init1(machine, TYPE_I440FX_PCI_HOST_BRIDGE, TYPE_I440FX_PCI_DEVICE);
> }
> diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
> index 11601ab..c17d9df 100644
> --- a/hw/i386/pc_q35.c
> +++ b/hw/i386/pc_q35.c
> @@ -309,7 +309,7 @@ static void pc_compat_2_1(MachineState *machine)
> pc_compat_2_2(machine);
> pcms->enforce_aligned_dimm = 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)
> @@ -326,7 +326,7 @@ static void pc_compat_1_7(MachineState *machine)
> smbios_defaults = false;
> gigabyte_align = false;
> 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)
> diff --git a/target-i386/cpu.c b/target-i386/cpu.c
> index d505743..9a4bfa3 100644
> --- a/target-i386/cpu.c
> +++ b/target-i386/cpu.c
> @@ -478,38 +478,6 @@ const char *get_register_name_32(unsigned int reg)
> 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
> * QEMU, for a given FeatureWord.
> @@ -1398,6 +1366,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,
> bool migratable_only);
>
> @@ -2067,6 +2072,18 @@ static int x86_cpu_filter_features(X86CPU *cpu)
> 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
> */
> static void x86_cpu_load_def(X86CPU *cpu, X86CPUDefinition *def, Error
> **errp)
> @@ -2090,11 +2107,7 @@ static void x86_cpu_load_def(X86CPU *cpu,
> X86CPUDefinition *def, Error **errp)
>
> /* Special cases not set in the X86CPUDefinition structs: */
> if (kvm_enabled()) {
> - FeatureWord w;
> - for (w = 0; w < FEATURE_WORDS; w++) {
> - env->features[w] |= kvm_default_features[w];
> - env->features[w] &= ~kvm_default_unset_features[w];
> - }
> + x86_cpu_apply_props(cpu, kvm_default_props);
> }
>
> env->features[FEAT_1_ECX] |= CPUID_EXT_HYPERVISOR;
> diff --git a/target-i386/cpu.h b/target-i386/cpu.h
> index 74b674d..f7c733b 100644
> --- a/target-i386/cpu.h
> +++ b/target-i386/cpu.h
> @@ -1332,8 +1332,15 @@ void cpu_smm_update(X86CPU *cpu);
>
> void cpu_report_tpr_access(CPUX86State *env, TPRAccess access);
>
> -void x86_cpu_compat_kvm_no_autoenable(FeatureWord w, uint32_t features);
> -void x86_cpu_compat_kvm_no_autodisable(FeatureWord w, uint32_t features);
> +/* Change the value of a KVM-specific default
> + *
> + * 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 */
>
Acked-by: Paolo Bonzini <address@hidden>
- [Qemu-devel] [PATCH 0/4] target-i386: Don't try to enable unsupported TCG features by default, Eduardo Habkost, 2015/09/11
- [Qemu-devel] [PATCH 1/4] target-i386: Expand PPRO_FEATURES on qemu64/qemu32 definitions, Eduardo Habkost, 2015/09/11
- [Qemu-devel] [PATCH 2/4] target-i386: Convert kvm_default_*features to property/value pairs, Eduardo Habkost, 2015/09/11
- Re: [Qemu-devel] [PATCH 2/4] target-i386: Convert kvm_default_*features to property/value pairs,
Paolo Bonzini <=
- [Qemu-devel] [PATCH 4/4] target-i386: Disable DE on qemu64 & qemu32 on TCG, Eduardo Habkost, 2015/09/11
- [Qemu-devel] [PATCH 3/4] target-i386: Add optional class name to kvm_default_props, Eduardo Habkost, 2015/09/11
- Re: [Qemu-devel] [PATCH 0/4] target-i386: Don't try to enable unsupported TCG features by default, Richard Henderson, 2015/09/11
- Re: [Qemu-devel] [PATCH 0/4] target-i386: Don't try to enable unsupported TCG features by default, Eduardo Habkost, 2015/09/11
- Re: [Qemu-devel] [PATCH 0/4] target-i386: Don't try to enable unsupported TCG features by default, Paolo Bonzini, 2015/09/12
- Re: [Qemu-devel] [PATCH 0/4] target-i386: Don't try to enable unsupported TCG features by default, Eduardo Habkost, 2015/09/14
- Re: [Qemu-devel] [PATCH 0/4] target-i386: Don't try to enable unsupported TCG features by default, Richard Henderson, 2015/09/14
- Re: [Qemu-devel] [PATCH 0/4] target-i386: Don't try to enable unsupported TCG features by default, Paolo Bonzini, 2015/09/14
- Re: [Qemu-devel] [PATCH 0/4] target-i386: Don't try to enable unsupported TCG features by default, Richard Henderson, 2015/09/14