diff options
author | Eduardo Habkost <ehabkost@redhat.com> | 2019-06-27 21:28:42 -0300 |
---|---|---|
committer | Eduardo Habkost <ehabkost@redhat.com> | 2019-07-05 17:08:04 -0300 |
commit | 0788a56bd1ae3ea4e118beb4aeb071a181791184 (patch) | |
tree | cc2face02302fe220177e146ae94de6efc120f7d /target | |
parent | 53db89d93bebe70a3e7f4c45933deffcf3e7cb62 (diff) | |
download | qemu-0788a56bd1ae3ea4e118beb4aeb071a181791184.zip qemu-0788a56bd1ae3ea4e118beb4aeb071a181791184.tar.gz qemu-0788a56bd1ae3ea4e118beb4aeb071a181791184.tar.bz2 |
i386: Make unversioned CPU models be aliases
This will make unversioned CPU models behavior depend on the
machine type:
* "pc-*-4.0" and older will not report them as aliases.
This is done to keep compatibility with older QEMU versions
after management software starts translating aliases.
* "pc-*-4.1" will translate unversioned CPU models to -v1.
This is done to keep compatibility with existing management
software, that still relies on CPU model runnability promises.
* "none" will translate unversioned CPU models to their latest
version. This is planned become the default in future machine
types (probably in pc-*-4.3).
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
Message-Id: <20190628002844.24894-8-ehabkost@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
Diffstat (limited to 'target')
-rw-r--r-- | target/i386/cpu.c | 52 | ||||
-rw-r--r-- | target/i386/cpu.h | 12 |
2 files changed, 63 insertions, 1 deletions
diff --git a/target/i386/cpu.c b/target/i386/cpu.c index f419176..0cf8e54 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -1470,6 +1470,11 @@ struct X86CPUModel { X86CPUDefinition *cpudef; /* CPU model version */ X86CPUVersion version; + /* + * If true, this is an alias CPU model. + * This matters only for "-cpu help" and query-cpu-definitions + */ + bool is_alias; }; /* Get full model name for CPU version */ @@ -2835,6 +2840,15 @@ static PropValue tcg_default_props[] = { }; +X86CPUVersion default_cpu_version = CPU_VERSION_LATEST; + +void x86_cpu_set_default_version(X86CPUVersion version) +{ + /* Translating CPU_VERSION_AUTO to CPU_VERSION_AUTO doesn't make sense */ + assert(version != CPU_VERSION_AUTO); + default_cpu_version = version; +} + static X86CPUVersion x86_cpu_model_last_version(const X86CPUModel *model) { int v = 0; @@ -2851,6 +2865,9 @@ static X86CPUVersion x86_cpu_model_last_version(const X86CPUModel *model) static X86CPUVersion x86_cpu_model_resolve_version(const X86CPUModel *model) { X86CPUVersion v = model->version; + if (v == CPU_VERSION_AUTO) { + v = default_cpu_version; + } if (v == CPU_VERSION_LATEST) { return x86_cpu_model_last_version(model); } @@ -3589,13 +3606,35 @@ static char *x86_cpu_class_get_model_id(X86CPUClass *xc) return r; } +static char *x86_cpu_class_get_alias_of(X86CPUClass *cc) +{ + X86CPUVersion version; + + if (!cc->model || !cc->model->is_alias) { + return NULL; + } + version = x86_cpu_model_resolve_version(cc->model); + if (version <= 0) { + return NULL; + } + return x86_cpu_versioned_model_name(cc->model->cpudef, version); +} + static void x86_cpu_list_entry(gpointer data, gpointer user_data) { ObjectClass *oc = data; X86CPUClass *cc = X86_CPU_CLASS(oc); char *name = x86_cpu_class_get_model_name(cc); char *desc = g_strdup(cc->model_description); + char *alias_of = x86_cpu_class_get_alias_of(cc); + if (!desc && alias_of) { + if (cc->model && cc->model->version == CPU_VERSION_AUTO) { + desc = g_strdup("(alias configured by machine type)"); + } else { + desc = g_strdup_printf("(alias of %s)", alias_of); + } + } if (!desc) { desc = x86_cpu_class_get_model_id(cc); } @@ -3603,6 +3642,7 @@ static void x86_cpu_list_entry(gpointer data, gpointer user_data) qemu_printf("x86 %-20s %-48s\n", name, desc); g_free(name); g_free(desc); + g_free(alias_of); } /* list available CPU models and flags */ @@ -3651,6 +3691,14 @@ static void x86_cpu_definition_entry(gpointer data, gpointer user_data) info->migration_safe = cc->migration_safe; info->has_migration_safe = true; info->q_static = cc->static_model; + /* + * 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); + info->has_alias_of = !!info->alias_of; + } entry = g_malloc0(sizeof(*entry)); entry->value = info; @@ -4070,7 +4118,8 @@ static void x86_register_cpudef_types(X86CPUDefinition *def) /* Unversioned model: */ m = g_new0(X86CPUModel, 1); m->cpudef = def; - m->version = CPU_VERSION_LEGACY; + m->version = CPU_VERSION_AUTO; + m->is_alias = true; x86_register_cpu_model_type(def->name, m); /* Versioned models: */ @@ -4087,6 +4136,7 @@ static void x86_register_cpudef_types(X86CPUDefinition *def) X86CPUModel *am = g_new0(X86CPUModel, 1); am->cpudef = def; am->version = vdef->version; + am->is_alias = true; x86_register_cpu_model_type(vdef->alias, am); } } diff --git a/target/i386/cpu.h b/target/i386/cpu.h index 12bc3cd..05393cf 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -1934,11 +1934,23 @@ void x86_cpu_change_kvm_default(const char *prop, const char *value); /* Resolve to latest CPU version */ #define CPU_VERSION_LATEST -1 +/* + * Resolve to version defined by current machine type. + * See x86_cpu_set_default_version() + */ +#define CPU_VERSION_AUTO -2 + /* Don't resolve to any versioned CPU models, like old QEMU versions */ #define CPU_VERSION_LEGACY 0 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); |