From nobody Mon May 6 09:20:02 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487790386014348.998238971835; Wed, 22 Feb 2017 11:06:26 -0800 (PST) Received: from localhost ([::1]:54823 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cgcF6-00011y-6z for importer@patchew.org; Wed, 22 Feb 2017 14:06:24 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36595) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cgc9W-0004KB-OL for qemu-devel@nongnu.org; Wed, 22 Feb 2017 14:00:39 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cgc9V-0004az-De for qemu-devel@nongnu.org; Wed, 22 Feb 2017 14:00:38 -0500 Received: from mx1.redhat.com ([209.132.183.28]:59550) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cgc9V-0004am-56 for qemu-devel@nongnu.org; Wed, 22 Feb 2017 14:00:37 -0500 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3552D3D957 for ; Wed, 22 Feb 2017 19:00:37 +0000 (UTC) Received: from localhost (ovpn-116-33.gru2.redhat.com [10.97.116.33]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1MJ0a7U010165; Wed, 22 Feb 2017 14:00:36 -0500 From: Eduardo Habkost To: qemu-devel@nongnu.org Date: Wed, 22 Feb 2017 16:00:27 -0300 Message-Id: <20170222190029.17243-2-ehabkost@redhat.com> In-Reply-To: <20170222190029.17243-1-ehabkost@redhat.com> References: <20170222190029.17243-1-ehabkost@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Wed, 22 Feb 2017 19:00:37 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v3 1/3] target-i386: Define static "base" CPU model X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The query-cpu-model-expand QMP command needs at least one static model, to allow the "static" expansion mode to be implemented. Instead of defining static versions of every CPU model, define a "base" CPU model that has absolutely no feature flag enabled. Despite having no CPUID data set at all, "-cpu base" is even a functional CPU: * It can boot a Slackware Linux 1.01 image with a Linux 0.99.12 kernel[1]. * It is even possible to boot[2] a modern Fedora x86_64 guest by manually enabling the following CPU features: -cpu base,+lm,+msr,+pae,+fpu,+cx8,+cmov,+sse,+sse2,+fxsr [1] http://www.qemu-advent-calendar.org/2014/#day-1 [2] This is what can be seen in the guest: [root@localhost ~]# cat /proc/cpuinfo processor : 0 vendor_id : unknown cpu family : 0 model : 0 model name : 00/00 stepping : 0 physical id : 0 siblings : 1 core id : 0 cpu cores : 1 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 1 wp : yes flags : fpu msr pae cx8 cmov fxsr sse sse2 lm nopl bugs : bogomips : 5832.70 clflush size : 64 cache_alignment : 64 address sizes : 36 bits physical, 48 bits virtual power management: [root@localhost ~]# x86info -v -a x86info v1.30. Dave Jones 2001-2011 Feedback to . No TSC, MHz calculation cannot be performed. Unknown vendor (0) MP Table: Family: 0 Model: 0 Stepping: 0 CPU Model (x86info's best guess): eax in: 0x00000000, eax =3D 00000001 ebx =3D 00000000 ecx =3D 00000000 = edx =3D 00000000 eax in: 0x00000001, eax =3D 00000000 ebx =3D 00000800 ecx =3D 00000000 = edx =3D 07008161 eax in: 0x80000000, eax =3D 80000001 ebx =3D 00000000 ecx =3D 00000000 = edx =3D 00000000 eax in: 0x80000001, eax =3D 00000000 ebx =3D 00000000 ecx =3D 00000000 = edx =3D 20000000 Feature flags: fpu Onboard FPU msr Model-Specific Registers pae Physical Address Extensions cx8 CMPXCHG8 instruction cmov CMOV instruction fxsr FXSAVE and FXRSTOR instructions sse SSE support sse2 SSE2 support Long NOPs supported: yes Address sizes : 0 bits physical, 0 bits virtual 0MHz processor (estimate). running at an estimated 0MHz [root@localhost ~]# Signed-off-by: Eduardo Habkost Reviewed-by: David Hildenbrand --- target/i386/cpu-qom.h | 2 ++ target/i386/cpu.c | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/target/i386/cpu-qom.h b/target/i386/cpu-qom.h index f6c704c3a9..c2205e6077 100644 --- a/target/i386/cpu-qom.h +++ b/target/i386/cpu-qom.h @@ -50,6 +50,7 @@ typedef struct X86CPUDefinition X86CPUDefinition; * @kvm_required: Whether CPU model requires KVM to be enabled. * @ordering: Ordering on the "-cpu help" CPU model list. * @migration_safe: See CpuDefinitionInfo::migration_safe + * @static_model: See CpuDefinitionInfo::static * @parent_realize: The parent class' realize handler. * @parent_reset: The parent class' reset handler. * @@ -68,6 +69,7 @@ typedef struct X86CPUClass { bool kvm_required; int ordering; bool migration_safe; + bool static_model; =20 /* Optional description of CPU model. * If unavailable, cpu_def->model_id is used */ diff --git a/target/i386/cpu.c b/target/i386/cpu.c index c6f62367b0..4241f56e8a 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -2230,6 +2230,7 @@ static void x86_cpu_definition_entry(gpointer data, g= pointer user_data) info->q_typename =3D g_strdup(object_class_get_name(oc)); info->migration_safe =3D cc->migration_safe; info->has_migration_safe =3D true; + info->q_static =3D cc->static_model; =20 entry =3D g_malloc0(sizeof(*entry)); entry->value =3D info; @@ -3836,6 +3837,24 @@ static const TypeInfo x86_cpu_type_info =3D { .class_init =3D x86_cpu_common_class_init, }; =20 + +/* "base" CPU model, used by query-cpu-model-expansion */ +static void x86_cpu_base_class_init(ObjectClass *oc, void *data) +{ + X86CPUClass *xcc =3D X86_CPU_CLASS(oc); + + xcc->static_model =3D true; + xcc->migration_safe =3D true; + xcc->model_description =3D "base CPU model type with no feature enable= d"; + xcc->ordering =3D 8; +} + +static const TypeInfo x86_base_cpu_type_info =3D { + .name =3D X86_CPU_TYPE_NAME("base"), + .parent =3D TYPE_X86_CPU, + .class_init =3D x86_cpu_base_class_init, +}; + static void x86_cpu_register_types(void) { int i; @@ -3845,6 +3864,7 @@ static void x86_cpu_register_types(void) x86_register_cpudef_type(&builtin_x86_defs[i]); } type_register_static(&max_x86_cpu_type_info); + type_register_static(&x86_base_cpu_type_info); #ifdef CONFIG_KVM type_register_static(&host_x86_cpu_type_info); #endif --=20 2.11.0.259.g40922b1 From nobody Mon May 6 09:20:02 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487790165813122.5693248175188; Wed, 22 Feb 2017 11:02:45 -0800 (PST) Received: from localhost ([::1]:54797 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cgcBX-0005kO-AS for importer@patchew.org; Wed, 22 Feb 2017 14:02:43 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36617) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cgc9Y-0004KP-QU for qemu-devel@nongnu.org; Wed, 22 Feb 2017 14:00:42 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cgc9X-0004ba-Fe for qemu-devel@nongnu.org; Wed, 22 Feb 2017 14:00:40 -0500 Received: from mx1.redhat.com ([209.132.183.28]:41896) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cgc9X-0004bB-60 for qemu-devel@nongnu.org; Wed, 22 Feb 2017 14:00:39 -0500 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 45D63C04D2F2 for ; Wed, 22 Feb 2017 19:00:39 +0000 (UTC) Received: from localhost (ovpn-116-33.gru2.redhat.com [10.97.116.33]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1MJ0cMn030141; Wed, 22 Feb 2017 14:00:38 -0500 From: Eduardo Habkost To: qemu-devel@nongnu.org Date: Wed, 22 Feb 2017 16:00:28 -0300 Message-Id: <20170222190029.17243-3-ehabkost@redhat.com> In-Reply-To: <20170222190029.17243-1-ehabkost@redhat.com> References: <20170222190029.17243-1-ehabkost@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Wed, 22 Feb 2017 19:00:39 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v3 2/3] target-i386: Implement query-cpu-model-expansion QMP command X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: libvir-list@redhat.com, Jiri Denemark Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Implement query-cpu-model-expansion for target-i386. This should meet all the requirements while being simple. In the case of static expansion, it will use the new "base" CPU model, and in the case of full expansion, it will keep the original CPU model name+props, and append extra properties. A future follow-up should improve the implementation of type=3Dfull, so that it returns more detailed data, including every writable QOM property in the CPU object. Cc: libvir-list@redhat.com Cc: Jiri Denemark Signed-off-by: Eduardo Habkost --- Changes v1 -> v2: * Fix typos * Reported-by: Markus Armbruster * Removed static/migration-safe field from return value (they will be added by a separate patch) * Use a dictionary to keep track of the properties that should be included in the expansion, instead of hardcoding them * Removed test case to keep series simple (test case will be submitted as a separate series) --- monitor.c | 4 +- target/i386/cpu.c | 191 ++++++++++++++++++++++++++++++++++++++++++++++++++= +++- 2 files changed, 193 insertions(+), 2 deletions(-) diff --git a/monitor.c b/monitor.c index 3cd72a9bab..8e987cd27f 100644 --- a/monitor.c +++ b/monitor.c @@ -984,8 +984,10 @@ static void qmp_unregister_commands_hack(void) #ifndef TARGET_ARM qmp_unregister_command("query-gic-capabilities"); #endif -#if !defined(TARGET_S390X) +#if !defined(TARGET_S390X) && !defined(TARGET_I386) qmp_unregister_command("query-cpu-model-expansion"); +#endif +#if !defined(TARGET_S390X) qmp_unregister_command("query-cpu-model-baseline"); qmp_unregister_command("query-cpu-model-comparison"); #endif diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 4241f56e8a..6e76eac268 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -29,10 +29,16 @@ #include "qemu/option.h" #include "qemu/config-file.h" #include "qapi/qmp/qerror.h" +#include "qapi/qmp/qstring.h" +#include "qapi/qmp/qdict.h" +#include "qapi/qmp/qbool.h" +#include "qapi/qmp/qint.h" +#include "qapi/qmp/qfloat.h" =20 #include "qapi-types.h" #include "qapi-visit.h" #include "qapi/visitor.h" +#include "qom/qom-qobject.h" #include "sysemu/arch_init.h" =20 #if defined(CONFIG_KVM) @@ -2289,7 +2295,7 @@ static void x86_cpu_apply_props(X86CPU *cpu, PropValu= e *props) } } =20 -/* Load data from X86CPUDefinition +/* Load data from X86CPUDefinition into a X86CPU object */ static void x86_cpu_load_def(X86CPU *cpu, X86CPUDefinition *def, Error **e= rrp) { @@ -2298,6 +2304,11 @@ static void x86_cpu_load_def(X86CPU *cpu, X86CPUDefi= nition *def, Error **errp) char host_vendor[CPUID_VENDOR_SZ + 1]; FeatureWord w; =20 + /*NOTE: any property set by this function should be returned by + * x86_cpu_static_props(), so static expansion of + * query-cpu-model-expansion is always complete. + */ + /* CPU models only set _minimum_ values for level/xlevel: */ object_property_set_int(OBJECT(cpu), def->level, "min-level", errp); object_property_set_int(OBJECT(cpu), def->xlevel, "min-xlevel", errp); @@ -2342,6 +2353,184 @@ static void x86_cpu_load_def(X86CPU *cpu, X86CPUDef= inition *def, Error **errp) =20 } =20 +/* Return a QDict containing keys for all properties that can be included + * in static expansion of CPU models. All properties set by x86_cpu_load_d= ef() + * must be included in the dictionary. + */ +static QDict *x86_cpu_static_props(void) +{ + FeatureWord w; + int i; + static const char *props[] =3D { + "min-level", + "min-xlevel", + "family", + "model", + "stepping", + "model-id", + "vendor", + "lmce", + NULL, + }; + static QDict *d; + + if (d) { + return d; + } + + d =3D qdict_new(); + for (i =3D 0; props[i]; i++) { + qdict_put_obj(d, props[i], qnull()); + } + + for (w =3D 0; w < FEATURE_WORDS; w++) { + FeatureWordInfo *fi =3D &feature_word_info[w]; + int bit; + for (bit =3D 0; bit < 32; bit++) { + if (!fi->feat_names[bit]) { + continue; + } + qdict_put_obj(d, fi->feat_names[bit], qnull()); + } + } + + return d; +} + +/* Add an entry to @props dict, with the value for property. */ +static void x86_cpu_expand_prop(X86CPU *cpu, QDict *props, const char *pro= p) +{ + QObject *value =3D object_property_get_qobject(OBJECT(cpu), prop, + &error_abort); + + qdict_put_obj(props, prop, value); +} + +/* Convert CPU model data from X86CPU object to a property dictionary + * that can recreate exactly the same CPU model. + */ +static void x86_cpu_to_dict(X86CPU *cpu, QDict *props) +{ + QDict *sprops =3D x86_cpu_static_props(); + const QDictEntry *e; + + for (e =3D qdict_first(sprops); e; e =3D qdict_next(sprops, e)) { + const char *prop =3D qdict_entry_key(e); + x86_cpu_expand_prop(cpu, props, prop); + } +} + +static void object_apply_props(Object *obj, QDict *props, Error **errp) +{ + const QDictEntry *prop; + Error *err =3D NULL; + + for (prop =3D qdict_first(props); prop; prop =3D qdict_next(props, pro= p)) { + object_property_set_qobject(obj, qdict_entry_value(prop), + qdict_entry_key(prop), &err); + if (err) { + break; + } + } + + error_propagate(errp, err); +} + +/* Create X86CPU object according to model+props specification */ +static X86CPU *x86_cpu_from_model(const char *model, QDict *props, Error *= *errp) +{ + X86CPU *xc =3D NULL; + X86CPUClass *xcc; + Error *err =3D NULL; + + xcc =3D X86_CPU_CLASS(cpu_class_by_name(TYPE_X86_CPU, model)); + if (xcc =3D=3D NULL) { + error_setg(&err, "CPU model '%s' not found", model); + goto out; + } + + xc =3D X86_CPU(object_new(object_class_get_name(OBJECT_CLASS(xcc)))); + if (props) { + object_apply_props(OBJECT(xc), props, &err); + if (err) { + goto out; + } + } + + x86_cpu_expand_features(xc, &err); + if (err) { + goto out; + } + +out: + if (err) { + error_propagate(errp, err); + object_unref(OBJECT(xc)); + xc =3D NULL; + } + return xc; +} + +CpuModelExpansionInfo * +arch_query_cpu_model_expansion(CpuModelExpansionType type, + CpuModelInfo *model, + Error **errp) +{ + X86CPU *xc =3D NULL; + Error *err =3D NULL; + CpuModelExpansionInfo *ret =3D g_new0(CpuModelExpansionInfo, 1); + QDict *props =3D NULL; + const char *base_name; + + xc =3D x86_cpu_from_model(model->name, + model->has_props ? + qobject_to_qdict(model->props) : + NULL, &err); + if (err) { + goto out; + } + + + switch (type) { + case CPU_MODEL_EXPANSION_TYPE_STATIC: + /* Static expansion will be based on "base" only */ + base_name =3D "base"; + break; + case CPU_MODEL_EXPANSION_TYPE_FULL: + /* As we don't return every single property, full expansion needs + * to keep the original model name+props, and add extra + * properties on top of that. + */ + base_name =3D model->name; + if (model->has_props && model->props) { + props =3D qdict_clone_shallow(qobject_to_qdict(model->props)); + } + break; + default: + error_setg(&err, "Unsupportted expansion type"); + goto out; + } + + if (!props) { + props =3D qdict_new(); + } + x86_cpu_to_dict(xc, props); + + ret->model =3D g_new0(CpuModelInfo, 1); + ret->model->name =3D g_strdup(base_name); + ret->model->props =3D QOBJECT(props); + ret->model->has_props =3D true; + +out: + object_unref(OBJECT(xc)); + if (err) { + error_propagate(errp, err); + qapi_free_CpuModelExpansionInfo(ret); + ret =3D NULL; + } + return ret; +} + X86CPU *cpu_x86_init(const char *cpu_model) { return X86_CPU(cpu_generic_init(TYPE_X86_CPU, cpu_model)); --=20 2.11.0.259.g40922b1 From nobody Mon May 6 09:20:02 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487790171656780.6788823184764; Wed, 22 Feb 2017 11:02:51 -0800 (PST) Received: from localhost ([::1]:54798 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cgcBe-0005xh-AS for importer@patchew.org; Wed, 22 Feb 2017 14:02:50 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36647) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cgc9a-0004Kw-UQ for qemu-devel@nongnu.org; Wed, 22 Feb 2017 14:00:48 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cgc9Z-0004cY-MU for qemu-devel@nongnu.org; Wed, 22 Feb 2017 14:00:42 -0500 Received: from mx1.redhat.com ([209.132.183.28]:45712) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cgc9Z-0004bz-Ai for qemu-devel@nongnu.org; Wed, 22 Feb 2017 14:00:41 -0500 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5B1983A7690 for ; Wed, 22 Feb 2017 19:00:41 +0000 (UTC) Received: from localhost (ovpn-116-33.gru2.redhat.com [10.97.116.33]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1MJ0d1T030157; Wed, 22 Feb 2017 14:00:40 -0500 From: Eduardo Habkost To: qemu-devel@nongnu.org Date: Wed, 22 Feb 2017 16:00:29 -0300 Message-Id: <20170222190029.17243-4-ehabkost@redhat.com> In-Reply-To: <20170222190029.17243-1-ehabkost@redhat.com> References: <20170222190029.17243-1-ehabkost@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Wed, 22 Feb 2017 19:00:41 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v3 3/3] i386: Improve query-cpu-model-expansion full mode X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jiri Denemark Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This keeps the same results on type=3Dstatic expansion, but make type=3Dfull expansion return every single QOM property on the CPU object that have a different value from the "base' CPU model, plus all the CPU feature flag properties. Cc: Jiri Denemark Signed-off-by: Eduardo Habkost --- target/i386/cpu.c | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 6e76eac268..82d958e89f 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -2420,6 +2420,34 @@ static void x86_cpu_to_dict(X86CPU *cpu, QDict *prop= s) } } =20 +/* Convert CPU model data from X86CPU object to a property dictionary + * that can recreate exactly the same CPU model, including every + * writeable QOM property. + */ +static void x86_cpu_to_dict_full(X86CPU *cpu, QDict *props) +{ + ObjectPropertyIterator iter; + ObjectProperty *prop; + + object_property_iter_init(&iter, OBJECT(cpu)); + while ((prop =3D object_property_iter_next(&iter))) { + /* skip read-only or write-only properties */ + if (!prop->get || !prop->set) { + continue; + } + + /* "hotplugged" is the only property that is configurable + * on the command-line but will be set differently on CPUs + * created using "-cpu ... -smp ..." and by CPUs created + * on the fly by x86_cpu_from_model() for querying. Skip it. + */ + if (!strcmp(prop->name, "hotplugged")) { + continue; + } + x86_cpu_expand_prop(cpu, props, prop->name); + } +} + static void object_apply_props(Object *obj, QDict *props, Error **errp) { const QDictEntry *prop; @@ -2490,11 +2518,13 @@ arch_query_cpu_model_expansion(CpuModelExpansionTyp= e type, goto out; } =20 + props =3D qdict_new(); =20 switch (type) { case CPU_MODEL_EXPANSION_TYPE_STATIC: /* Static expansion will be based on "base" only */ base_name =3D "base"; + x86_cpu_to_dict(xc, props); break; case CPU_MODEL_EXPANSION_TYPE_FULL: /* As we don't return every single property, full expansion needs @@ -2502,9 +2532,7 @@ arch_query_cpu_model_expansion(CpuModelExpansionType = type, * properties on top of that. */ base_name =3D model->name; - if (model->has_props && model->props) { - props =3D qdict_clone_shallow(qobject_to_qdict(model->props)); - } + x86_cpu_to_dict_full(xc, props); break; default: error_setg(&err, "Unsupportted expansion type"); --=20 2.11.0.259.g40922b1