[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [Patch v4 29/30] s390x/cpumodel: implement QMP interface "q
From: |
David Hildenbrand |
Subject: |
[Qemu-devel] [Patch v4 29/30] s390x/cpumodel: implement QMP interface "query-cpu-model-comparison" |
Date: |
Mon, 5 Sep 2016 10:52:43 +0200 |
Let's implement that interface by reusing our convertion code implemented
for expansion.
We use CPU generations and CPU features to calculate the result. This
means, that a zEC12 cannot simply be converted into a z13 by stripping
of features. This is required, as other magic values (e.g. maximum
address sizes) belong to a CPU generation and cannot simply be
emulated by an older generation.
Acked-by: Cornelia Huck <address@hidden>
Signed-off-by: David Hildenbrand <address@hidden>
---
qapi-schema.json | 3 +-
target-s390x/cpu_models.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 86 insertions(+), 1 deletion(-)
diff --git a/qapi-schema.json b/qapi-schema.json
index b06135c..955a2b9 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -3232,7 +3232,8 @@
# global properties may affect expansion of CPU models. Using
# query-cpu-model-expansion while using these is not advised.
#
-# Some architectures may not support comparing CPU models.
+# Some architectures may not support comparing CPU models. s390x supports
+# comparing CPU models.
#
# Returns: a CpuModelBaselineInfo. Returns an error if comparing CPU models is
# not supported, if a model cannot be used, if a model contains
diff --git a/target-s390x/cpu_models.c b/target-s390x/cpu_models.c
index 125366a..244626c 100644
--- a/target-s390x/cpu_models.c
+++ b/target-s390x/cpu_models.c
@@ -450,6 +450,90 @@ CpuModelExpansionInfo
*arch_query_cpu_model_expansion(CpuModelExpansionType type
cpu_info_from_model(expansion_info->model, &s390_model, delta_changes);
return expansion_info;
}
+
+static void list_add_feat(const char *name, void *opaque)
+{
+ strList **last = (strList **) opaque;
+ strList *entry;
+
+ entry = g_malloc0(sizeof(*entry));
+ entry->value = g_strdup(name);
+ entry->next = *last;
+ *last = entry;
+}
+
+CpuModelCompareInfo *arch_query_cpu_model_comparison(CpuModelInfo *infoa,
+ CpuModelInfo *infob,
+ Error **errp)
+{
+ CpuModelCompareResult feat_result, gen_result;
+ CpuModelCompareInfo *compare_info;
+ S390FeatBitmap missing, added;
+ S390CPUModel modela, modelb;
+
+ /* convert both models to our internal representation */
+ cpu_model_from_info(&modela, infoa, errp);
+ if (*errp) {
+ return NULL;
+ }
+ cpu_model_from_info(&modelb, infob, errp);
+ if (*errp) {
+ return NULL;
+ }
+ compare_info = g_malloc0(sizeof(*compare_info));
+
+ /* check the cpu generation and ga level */
+ if (modela.def->gen == modelb.def->gen) {
+ if (modela.def->ec_ga == modelb.def->ec_ga) {
+ /* ec and corresponding bc are identical */
+ gen_result = CPU_MODEL_COMPARE_RESULT_IDENTICAL;
+ } else if (modela.def->ec_ga < modelb.def->ec_ga) {
+ gen_result = CPU_MODEL_COMPARE_RESULT_SUBSET;
+ } else {
+ gen_result = CPU_MODEL_COMPARE_RESULT_SUPERSET;
+ }
+ } else if (modela.def->gen < modelb.def->gen) {
+ gen_result = CPU_MODEL_COMPARE_RESULT_SUBSET;
+ } else {
+ gen_result = CPU_MODEL_COMPARE_RESULT_SUPERSET;
+ }
+ if (gen_result != CPU_MODEL_COMPARE_RESULT_IDENTICAL) {
+ /* both models cannot be made identical */
+ list_add_feat("type", &compare_info->responsible_properties);
+ }
+
+ /* check the feature set */
+ if (bitmap_equal(modela.features, modelb.features, S390_FEAT_MAX)) {
+ feat_result = CPU_MODEL_COMPARE_RESULT_IDENTICAL;
+ } else {
+ bitmap_andnot(missing, modela.features, modelb.features,
S390_FEAT_MAX);
+ s390_feat_bitmap_to_ascii(missing,
+ &compare_info->responsible_properties,
+ list_add_feat);
+ bitmap_andnot(added, modelb.features, modela.features, S390_FEAT_MAX);
+ s390_feat_bitmap_to_ascii(added, &compare_info->responsible_properties,
+ list_add_feat);
+ if (bitmap_empty(missing, S390_FEAT_MAX)) {
+ feat_result = CPU_MODEL_COMPARE_RESULT_SUBSET;
+ } else if (bitmap_empty(added, S390_FEAT_MAX)) {
+ feat_result = CPU_MODEL_COMPARE_RESULT_SUPERSET;
+ } else {
+ feat_result = CPU_MODEL_COMPARE_RESULT_INCOMPATIBLE;
+ }
+ }
+
+ /* combine the results */
+ if (gen_result == feat_result) {
+ compare_info->result = gen_result;
+ } else if (feat_result == CPU_MODEL_COMPARE_RESULT_IDENTICAL) {
+ compare_info->result = gen_result;
+ } else if (gen_result == CPU_MODEL_COMPARE_RESULT_IDENTICAL) {
+ compare_info->result = feat_result;
+ } else {
+ compare_info->result = CPU_MODEL_COMPARE_RESULT_INCOMPATIBLE;
+ }
+ return compare_info;
+}
#endif
static void check_consistency(const S390CPUModel *model)
--
2.8.4
- [Qemu-devel] [Patch v4 09/30] s390x/cpumodel: store the CPU model in the CPU instance, (continued)
- [Qemu-devel] [Patch v4 09/30] s390x/cpumodel: store the CPU model in the CPU instance, David Hildenbrand, 2016/09/05
- [Qemu-devel] [Patch v4 01/30] qmp: details about CPU definitions in query-cpu-definitions, David Hildenbrand, 2016/09/05
- [Qemu-devel] [Patch v4 16/30] s390x/sclp: propagate the ibc val(lowest and unblocked ibc), David Hildenbrand, 2016/09/05
- [Qemu-devel] [Patch v4 21/30] s390x/kvm: implement CPU model support, David Hildenbrand, 2016/09/05
- [Qemu-devel] [Patch v4 07/30] s390x/cpumodel: introduce CPU feature group definitions, David Hildenbrand, 2016/09/05
- [Qemu-devel] [Patch v4 20/30] s390x/kvm: allow runtime-instrumentation for "none" machine, David Hildenbrand, 2016/09/05
- [Qemu-devel] [Patch v4 28/30] s390x/cpumodel: implement QMP interface "query-cpu-model-expansion", David Hildenbrand, 2016/09/05
- [Qemu-devel] [Patch v4 27/30] qmp: add QMP interface "query-cpu-model-baseline", David Hildenbrand, 2016/09/05
- [Qemu-devel] [Patch v4 25/30] qmp: add QMP interface "query-cpu-model-expansion", David Hildenbrand, 2016/09/05
- [Qemu-devel] [Patch v4 04/30] s390x/cpumodel: introduce CPU features, David Hildenbrand, 2016/09/05
- [Qemu-devel] [Patch v4 29/30] s390x/cpumodel: implement QMP interface "query-cpu-model-comparison",
David Hildenbrand <=
- [Qemu-devel] [Patch v4 14/30] s390x/sclp: introduce sclp feature blocks, David Hildenbrand, 2016/09/05
- [Qemu-devel] [Patch v4 06/30] s390x/cpumodel: generate CPU feature group lists, David Hildenbrand, 2016/09/05
- [Qemu-devel] [Patch v4 13/30] s390x/sclp: factor out preparation of cpu entries, David Hildenbrand, 2016/09/05
- [Qemu-devel] [Patch v4 15/30] s390x/sclp: indicate sclp features, David Hildenbrand, 2016/09/05
- [Qemu-devel] [Patch v4 03/30] s390x/cpumodel: expose CPU class properties, David Hildenbrand, 2016/09/05
- [Qemu-devel] [Patch v4 10/30] s390x/cpumodel: expose features and feature groups as properties, David Hildenbrand, 2016/09/05
- [Qemu-devel] [Patch v4 30/30] s390x/cpumodel: implement QMP interface "query-cpu-model-baseline", David Hildenbrand, 2016/09/05
- [Qemu-devel] [Patch v4 12/30] s390x/cpumodel: check and apply the CPU model, David Hildenbrand, 2016/09/05
- [Qemu-devel] [Patch v4 23/30] s390x/kvm: let the CPU model control CMM(A), David Hildenbrand, 2016/09/05
- [Qemu-devel] [Patch v4 22/30] s390x/kvm: disable host model for problematic compat machines, David Hildenbrand, 2016/09/05