From: Robert Hoo <robert.hu@linux.intel.com>
To: pbonzini@redhat.com, rth@twiddle.net, ehabkost@redhat.com,
eblake@redhat.com, armbru@redhat.com
Cc: robert.hu@intel.com, Robert Hoo <robert.hu@linux.intel.com>,
xiaoyao.li@intel.com, qemu-devel@nongnu.org,
chenyi.qiang@intel.com
Subject: [PATCH 1/2] Introduce (x86) CPU model deprecation API
Date: Wed, 3 Jun 2020 19:47:02 +0800 [thread overview]
Message-ID: <1591184823-140846-1-git-send-email-robert.hu@linux.intel.com> (raw)
Complement versioned CPU model framework with the ability of marking some
versions deprecated. When that CPU model is chosen, get some warning. The
warning message is customized, e.g. telling in which future QEMU version will
it be obsoleted.
The deprecation message will also appear by x86_cpu_list_entry(), e.g. '-cpu
help'.
QMP 'query-cpu-definitions' will also return a bool value indicating the
deprecation status.
Signed-off-by: Robert Hoo <robert.hu@linux.intel.com>
---
exec.c | 3 +++
include/hw/core/cpu.h | 1 +
qapi/machine-target.json | 3 ++-
target/i386/cpu.c | 45 +++++++++++++++++++++++++++++++++++++++++++--
4 files changed, 49 insertions(+), 3 deletions(-)
diff --git a/exec.c b/exec.c
index 5162f0d..a403937 100644
--- a/exec.c
+++ b/exec.c
@@ -981,6 +981,9 @@ const char *parse_cpu_option(const char *cpu_option)
cpu_type = object_class_get_name(oc);
cc = CPU_CLASS(oc);
cc->parse_features(cpu_type, model_pieces[1], &error_fatal);
+ if (cc->deprecation_check) {
+ cc->deprecation_check(oc);
+ }
g_strfreev(model_pieces);
return cpu_type;
}
diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
index 07f7698..b2df186 100644
--- a/include/hw/core/cpu.h
+++ b/include/hw/core/cpu.h
@@ -218,6 +218,7 @@ typedef struct CPUClass {
void (*disas_set_info)(CPUState *cpu, disassemble_info *info);
vaddr (*adjust_watchpoint_address)(CPUState *cpu, vaddr addr, int len);
void (*tcg_initialize)(void);
+ void (*deprecation_check)(ObjectClass *oc);
/* Keep non-pointer data at the end to minimize holes. */
int gdb_num_core_regs;
diff --git a/qapi/machine-target.json b/qapi/machine-target.json
index f2c8294..2e7db97 100644
--- a/qapi/machine-target.json
+++ b/qapi/machine-target.json
@@ -309,7 +309,8 @@
'static': 'bool',
'*unavailable-features': [ 'str' ],
'typename': 'str',
- '*alias-of' : 'str' },
+ '*alias-of' : 'str',
+ 'deprecated' : 'bool' },
'if': 'defined(TARGET_PPC) || defined(TARGET_ARM) || defined(TARGET_I386) || defined(TARGET_S390X) || defined(TARGET_MIPS)' }
##
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index 3733d9a..d7ac22f 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -1599,6 +1599,7 @@ typedef struct X86CPUVersionDefinition {
const char *alias;
const char *note;
PropValue *props;
+ bool deprecated;
} X86CPUVersionDefinition;
/* Base definition for a CPU model */
@@ -1638,6 +1639,11 @@ struct X86CPUModel {
* This matters only for "-cpu help" and query-cpu-definitions
*/
bool is_alias;
+ /*
+ * If true, this is deprecated and obsoleted in the future.
+ * Trying to use deprecated CPU model shall be warned.
+ */
+ bool deprecated;
};
/* Get full model name for CPU version */
@@ -4128,8 +4134,7 @@ 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) {
+ } else if (v == CPU_VERSION_LATEST) {
return x86_cpu_model_last_version(model);
}
return v;
@@ -4975,6 +4980,7 @@ 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;
+ info->deprecated = cc->model ? cc->model->deprecated : false;
/*
* Old machine types won't report aliases, so that alias translation
* doesn't break compatibility with previous QEMU versions.
@@ -5411,6 +5417,7 @@ static void x86_register_cpudef_types(X86CPUDefinition *def)
m->cpudef = def;
m->version = vdef->version;
m->note = vdef->note;
+ m->deprecated = vdef->deprecated;
x86_register_cpu_model_type(name, m);
if (vdef->alias) {
@@ -5418,6 +5425,8 @@ static void x86_register_cpudef_types(X86CPUDefinition *def)
am->cpudef = def;
am->version = vdef->version;
am->is_alias = true;
+ am->note = vdef->note;
+ am->deprecated = vdef->deprecated;
x86_register_cpu_model_type(vdef->alias, am);
}
}
@@ -7229,6 +7238,37 @@ static Property x86_cpu_properties[] = {
DEFINE_PROP_END_OF_LIST()
};
+static void x86_cpu_deprecation_check(ObjectClass *oc)
+{
+ X86CPUClass *xcc = X86_CPU_CLASS(oc);
+ X86CPUVersion effective_version;
+ const X86CPUVersionDefinition *vdef;
+
+ if (xcc->model == NULL) {
+ return;
+ }
+
+ if (xcc->model->version == CPU_VERSION_LEGACY) {
+ /* Treat legacy version as v1 */
+ effective_version = 1;
+ } else {
+ effective_version = x86_cpu_model_resolve_version(xcc->model);
+ }
+
+ vdef = xcc->model->cpudef->versions;
+
+ if (vdef == NULL) {
+ return;
+ } else {
+ if (vdef[effective_version - 1].deprecated) {
+ warn_report("Effective CPU model '%s' -- %s",
+ x86_cpu_versioned_model_name(xcc->model->cpudef,\
+ effective_version),
+ vdef[effective_version - 1].note);
+ }
+ }
+}
+
static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
{
X86CPUClass *xcc = X86_CPU_CLASS(oc);
@@ -7287,6 +7327,7 @@ static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
cc->tlb_fill = x86_cpu_tlb_fill;
#endif
cc->disas_set_info = x86_disas_set_info;
+ cc->deprecation_check = x86_cpu_deprecation_check;
dc->user_creatable = true;
}
--
1.8.3.1
next reply other threads:[~2020-06-03 11:48 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-03 11:47 Robert Hoo [this message]
2020-06-03 11:47 ` [PATCH 2/2] Mark Icelake-Client CPU models deprecated Robert Hoo
2020-06-03 14:11 ` [PATCH 1/2] Introduce (x86) CPU model deprecation API Eric Blake
2020-06-04 8:07 ` Robert Hoo
2020-06-04 11:59 ` Eric Blake
2020-06-05 2:47 ` Robert Hoo
2020-06-05 13:47 ` Eric Blake
2020-06-06 3:05 ` Robert Hoo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1591184823-140846-1-git-send-email-robert.hu@linux.intel.com \
--to=robert.hu@linux.intel.com \
--cc=armbru@redhat.com \
--cc=chenyi.qiang@intel.com \
--cc=eblake@redhat.com \
--cc=ehabkost@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=robert.hu@intel.com \
--cc=rth@twiddle.net \
--cc=xiaoyao.li@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).