We will introduce code that will return machine-type-specific from other machines (not the current one), so we'll need a helper for getting the default CPU version from a machine class.
With the new helper, we don't need the machine init function to call x86_cpu_set_default_version() anymore: we can just look at the machine class of the current machine. Replace the default_cpu_version static variable with a default_cpu_version() function that will look at qdev_get_machine(). Signed-off-by: Eduardo Habkost <ehabk...@redhat.com> --- include/hw/i386/pc.h | 5 ++++- target/i386/cpu.h | 6 ------ hw/i386/pc.c | 3 --- target/i386/cpu.c | 28 ++++++++++++++++++++-------- 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h index 37bfd95113..00ac726ebc 100644 --- a/include/hw/i386/pc.h +++ b/include/hw/i386/pc.h @@ -113,7 +113,10 @@ typedef struct PCMachineClass { /* Compat options: */ - /* Default CPU model version. See x86_cpu_set_default_version(). */ + /* + * Default CPU model version for CPU models having + * version == CPU_VERSION_AUTO. + */ int default_cpu_version; /* ACPI compat: */ diff --git a/target/i386/cpu.h b/target/i386/cpu.h index cedb5bc205..aa17c79b43 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -2168,12 +2168,6 @@ void x86_cpu_change_kvm_default(const char *prop, const char *value); typedef int X86CPUVersion; -/* - * Set default CPU model version for CPU models having - * version == CPU_VERSION_AUTO. - */ -void x86_cpu_set_default_version(X86CPUVersion version); - /* Return name of 32-bit register, from a R_* constant */ const char *get_register_name_32(unsigned int reg); diff --git a/hw/i386/pc.c b/hw/i386/pc.c index 4b1904237e..64ec995172 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -1503,9 +1503,6 @@ void pc_cpus_init(PCMachineState *pcms) const CPUArchIdList *possible_cpus; MachineState *ms = MACHINE(pcms); MachineClass *mc = MACHINE_GET_CLASS(pcms); - PCMachineClass *pcmc = PC_MACHINE_CLASS(mc); - - x86_cpu_set_default_version(pcmc->default_cpu_version); /* Calculates the limit to CPU APIC ID values * diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 8cecc669b3..5dbd379331 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -57,6 +57,7 @@ #include "hw/xen/xen.h" #include "hw/i386/apic_internal.h" #include "hw/boards.h" +#include "hw/i386/pc.h" #endif #include "disas/capstone.h" @@ -3165,14 +3166,25 @@ static PropValue tcg_default_props[] = { }; -X86CPUVersion default_cpu_version = CPU_VERSION_LATEST; +#ifdef CONFIG_USER_ONLY +static X86CPUVersion default_cpu_version(void) +{ + return CPU_VERSION_LATEST; +} +#else +static X86CPUVersion default_cpu_version_for_machine(MachineClass *mc) +{ + PCMachineClass *pcmc = + (PCMachineClass *)object_class_dynamic_cast(OBJECT_CLASS(mc), TYPE_PC_MACHINE); + return pcmc ? pcmc->default_cpu_version : CPU_VERSION_LATEST; +} -void x86_cpu_set_default_version(X86CPUVersion version) +static X86CPUVersion default_cpu_version(void) { - /* Translating CPU_VERSION_AUTO to CPU_VERSION_AUTO doesn't make sense */ - assert(version != CPU_VERSION_AUTO); - default_cpu_version = version; + return default_cpu_version_for_machine(MACHINE_GET_CLASS(qdev_get_machine())); } +#endif + static X86CPUVersion x86_cpu_model_last_version(const X86CPUModel *model) { @@ -4047,8 +4059,8 @@ static void x86_cpu_definition_entry(gpointer data, gpointer user_data) * Old machine types won't report aliases, so that alias translation * doesn't break compatibility with previous QEMU versions. */ - if (default_cpu_version != CPU_VERSION_LEGACY) { - info->alias_of = x86_cpu_class_get_alias_of(cc, default_cpu_version); + if (default_cpu_version() != CPU_VERSION_LEGACY) { + info->alias_of = x86_cpu_class_get_alias_of(cc, default_cpu_version()); info->has_alias_of = !!info->alias_of; } @@ -4119,7 +4131,7 @@ static void x86_cpu_apply_props(X86CPU *cpu, PropValue *props) static void x86_cpu_apply_version_props(X86CPU *cpu, X86CPUModel *model) { const X86CPUVersionDefinition *vdef; - X86CPUVersion version = x86_cpu_model_resolve_version(model, default_cpu_version); + X86CPUVersion version = x86_cpu_model_resolve_version(model, default_cpu_version()); if (version == CPU_VERSION_LEGACY) { return; -- 2.21.0