diff options
author | Eduardo Habkost <ehabkost@redhat.com> | 2017-02-22 16:00:29 -0300 |
---|---|---|
committer | Eduardo Habkost <ehabkost@redhat.com> | 2017-02-27 13:23:35 -0300 |
commit | b8097deb359bbbd92592b9670adfe9e245b2d0bd (patch) | |
tree | 38954c296dc6d55f072e80cbed1435c94ba41348 /target | |
parent | f99fd7ca2afd33bb067e78740c4ee5a689494690 (diff) |
i386: Improve query-cpu-model-expansion full mode
This keeps the same results on type=static expansion, but make
type=full 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 <jdenemar@redhat.com>
Message-Id: <20170222190029.17243-4-ehabkost@redhat.com>
Tested-by: Jiri Denemark <jdenemar@redhat.com>
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
Diffstat (limited to 'target')
-rw-r--r-- | target/i386/cpu.c | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 139b7ea12e..89421c893b 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -2419,6 +2419,34 @@ static void x86_cpu_to_dict(X86CPU *cpu, QDict *props) } } +/* 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 = 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; @@ -2489,11 +2517,13 @@ arch_query_cpu_model_expansion(CpuModelExpansionType type, goto out; } + props = qdict_new(); switch (type) { case CPU_MODEL_EXPANSION_TYPE_STATIC: /* Static expansion will be based on "base" only */ base_name = "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 @@ -2501,9 +2531,7 @@ arch_query_cpu_model_expansion(CpuModelExpansionType type, * properties on top of that. */ base_name = model->name; - if (model->has_props && model->props) { - props = qdict_clone_shallow(qobject_to_qdict(model->props)); - } + x86_cpu_to_dict_full(xc, props); break; default: error_setg(&err, "Unsupportted expansion type"); |