@@ -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: */
@@ -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);
@@ -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
*
@@ -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;
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 <ehabkost@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(-)