From: David Hildenbrand <dahi@linux.vnet.ibm.com>
To: qemu-devel@nongnu.org
Cc: ehabkost@redhat.com, jdenemar@redhat.com, imammedo@redhat.com,
cornelia.huck@de.ibm.com, borntraeger@de.ibm.com,
fiuczy@linux.vnet.ibm.com, mimu@linux.vnet.ibm.com
Subject: [Qemu-devel] [Patch v3 12/30] s390x/cpumodel: check and apply the CPU model
Date: Wed, 24 Aug 2016 20:10:48 +0200 [thread overview]
Message-ID: <1472062266-53206-13-git-send-email-dahi@linux.vnet.ibm.com> (raw)
In-Reply-To: <1472062266-53206-1-git-send-email-dahi@linux.vnet.ibm.com>
We have to test if a configured CPU model is runnable in the current
configuration, and if not report why that is the case. This is done by
comparing it to the maximum supported model (host for KVM or z900 for TCG).
Also, we want to do some base sanity checking for a configured CPU model.
We'll cache the maximum model and the applied model (for performance
reasons and because KVM can only be configured before any VCPU is created).
For unavailable "host" model, we have to make sure that we inform KVM,
so it can do some compatibility stuff (enable CMMA later on to be precise).
Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
---
target-s390x/cpu_models.c | 153 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 153 insertions(+)
diff --git a/target-s390x/cpu_models.c b/target-s390x/cpu_models.c
index 946b565..e226a2f 100644
--- a/target-s390x/cpu_models.c
+++ b/target-s390x/cpu_models.c
@@ -15,6 +15,7 @@
#include "gen-features.h"
#include "qapi/error.h"
#include "qapi/visitor.h"
+#include "qemu/error-report.h"
#ifndef CONFIG_USER_ONLY
#include "sysemu/arch_init.h"
#endif
@@ -183,14 +184,166 @@ CpuDefinitionInfoList *arch_query_cpu_definitions(Error **errp)
}
#endif
+static void check_consistency(const S390CPUModel *model)
+{
+ static int dep[][2] = {
+ { S390_FEAT_IPTE_RANGE, S390_FEAT_DAT_ENH },
+ { S390_FEAT_IDTE_SEGMENT, S390_FEAT_DAT_ENH },
+ { S390_FEAT_IDTE_REGION, S390_FEAT_DAT_ENH },
+ { S390_FEAT_IDTE_REGION, S390_FEAT_IDTE_SEGMENT },
+ { S390_FEAT_LOCAL_TLB_CLEARING, S390_FEAT_DAT_ENH},
+ { S390_FEAT_LONG_DISPLACEMENT_FAST, S390_FEAT_LONG_DISPLACEMENT },
+ { S390_FEAT_DFP_FAST, S390_FEAT_DFP },
+ { S390_FEAT_TRANSACTIONAL_EXE, S390_FEAT_STFLE_49 },
+ { S390_FEAT_EDAT_2, S390_FEAT_EDAT},
+ { S390_FEAT_MSA_EXT_5, S390_FEAT_KIMD_SHA_512 },
+ { S390_FEAT_MSA_EXT_5, S390_FEAT_KLMD_SHA_512 },
+ { S390_FEAT_MSA_EXT_4, S390_FEAT_MSA_EXT_3 },
+ { S390_FEAT_SIE_CMMA, S390_FEAT_CMM },
+ { S390_FEAT_SIE_CMMA, S390_FEAT_SIE_GSLS },
+ { S390_FEAT_SIE_PFMFI, S390_FEAT_EDAT },
+ };
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(dep); i++) {
+ if (test_bit(dep[i][0], model->features) &&
+ !test_bit(dep[i][1], model->features)) {
+ error_report("Warning: \'%s\' requires \'%s\'.",
+ s390_feat_def(dep[i][0])->name,
+ s390_feat_def(dep[i][1])->name);
+ }
+ }
+}
+
+static void error_prepend_missing_feat(const char *name, void *opaque)
+{
+ error_prepend((Error **) opaque, "%s ", name);
+}
+
+static void check_compatibility(const S390CPUModel *max_model,
+ const S390CPUModel *model, Error **errp)
+{
+ S390FeatBitmap missing;
+
+ if (model->def->gen > max_model->def->gen) {
+ error_setg(errp, "Selected CPU generation is too new. Maximum "
+ "supported model in the configuration: \'%s\'",
+ max_model->def->name);
+ return;
+ } else if (model->def->gen == max_model->def->gen &&
+ model->def->ec_ga > max_model->def->ec_ga) {
+ error_setg(errp, "Selected CPU GA level is too new. Maximum "
+ "supported model in the configuration: \'%s\'",
+ max_model->def->name);
+ return;
+ }
+
+ /* detect the missing features to properly report them */
+ bitmap_andnot(missing, model->features, max_model->features, S390_FEAT_MAX);
+ if (bitmap_empty(missing, S390_FEAT_MAX)) {
+ return;
+ }
+
+ error_setg(errp, " ");
+ s390_feat_bitmap_to_ascii(missing, errp, error_prepend_missing_feat);
+ error_prepend(errp, "Some features requested in the CPU model are not "
+ "available in the configuration: ");
+}
+
+static S390CPUModel *get_max_cpu_model(Error **errp)
+{
+#ifndef CONFIG_USER_ONLY
+ static S390CPUModel max_model;
+ static bool cached;
+
+ if (cached) {
+ return &max_model;
+ }
+
+ if (kvm_enabled()) {
+ error_setg(errp, "KVM does not support CPU models.");
+ } else {
+ /* TCG enulates a z900 */
+ max_model.def = &s390_cpu_defs[0];
+ bitmap_copy(max_model.features, max_model.def->default_feat,
+ S390_FEAT_MAX);
+ }
+ if (!*errp) {
+ cached = true;
+ return &max_model;
+ }
+#endif
+ return NULL;
+}
+
+static inline void apply_cpu_model(const S390CPUModel *model, Error **errp)
+{
+#ifndef CONFIG_USER_ONLY
+ static S390CPUModel applied_model;
+ static bool applied;
+
+ /*
+ * We have the same model for all VCPUs. KVM can only be configured before
+ * any VCPUs are defined in KVM.
+ */
+ if (applied) {
+ if (model && memcmp(&applied_model, model, sizeof(S390CPUModel))) {
+ error_setg(errp, "Mixed CPU models are not supported on s390x.");
+ }
+ return;
+ }
+
+ if (kvm_enabled()) {
+ /* FIXME KVM */
+ error_setg(errp, "KVM doesn't support CPU models.");
+ } else if (model) {
+ /* FIXME TCG - use data for stdip/stfl */
+ }
+
+ if (!*errp) {
+ applied = true;
+ if (model) {
+ applied_model = *model;
+ }
+ }
+#endif
+}
+
void s390_realize_cpu_model(CPUState *cs, Error **errp)
{
S390CPUClass *xcc = S390_CPU_GET_CLASS(cs);
+ S390CPU *cpu = S390_CPU(cs);
+ const S390CPUModel *max_model;
if (xcc->kvm_required && !kvm_enabled()) {
error_setg(errp, "CPU definition requires KVM");
return;
}
+
+ if (!cpu->model) {
+ /* no host model support -> perform compatibility stuff */
+ apply_cpu_model(NULL, errp);
+ return;
+ }
+
+ max_model = get_max_cpu_model(errp);
+ if (*errp) {
+ error_prepend(errp, "CPU models are not available: ");
+ return;
+ }
+
+ /* copy over properties that can vary */
+ cpu->model->lowest_ibc = max_model->lowest_ibc;
+ cpu->model->cpu_id = max_model->cpu_id;
+ cpu->model->cpu_ver = max_model->cpu_ver;
+
+ check_consistency(cpu->model);
+ check_compatibility(max_model, cpu->model, errp);
+ if (*errp) {
+ return;
+ }
+
+ apply_cpu_model(cpu->model, errp);
}
static void get_feature(Object *obj, Visitor *v, const char *name,
--
2.6.6
next prev parent reply other threads:[~2016-08-24 18:11 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-08-24 18:10 [Qemu-devel] [Patch v3 00/30] s390x CPU models: exposing features David Hildenbrand
2016-08-24 18:10 ` [Qemu-devel] [Patch v3 01/30] qmp: details about CPU definitions in query-cpu-definitions David Hildenbrand
2016-08-24 20:49 ` Eric Blake
2016-08-24 20:55 ` David Hildenbrand
2016-08-29 9:09 ` Cornelia Huck
2016-08-29 10:13 ` [Qemu-devel] [Patch " David Hildenbrand
2016-08-29 14:47 ` Eric Blake
2016-08-24 18:10 ` [Qemu-devel] [Patch v3 02/30] s390x/cpumodel: "host" and "qemu" as CPU subclasses David Hildenbrand
2016-08-24 18:10 ` [Qemu-devel] [Patch v3 03/30] s390x/cpumodel: expose CPU class properties David Hildenbrand
2016-08-24 18:10 ` [Qemu-devel] [Patch v3 04/30] s390x/cpumodel: introduce CPU features David Hildenbrand
2016-08-24 18:10 ` [Qemu-devel] [Patch v3 05/30] s390x/cpumodel: generate CPU feature lists for CPU models David Hildenbrand
2016-08-24 18:10 ` [Qemu-devel] [Patch v3 06/30] s390x/cpumodel: generate CPU feature group lists David Hildenbrand
2016-08-24 18:10 ` [Qemu-devel] [Patch v3 07/30] s390x/cpumodel: introduce CPU feature group definitions David Hildenbrand
2016-08-24 18:10 ` [Qemu-devel] [Patch v3 08/30] s390x/cpumodel: register defined CPU models as subclasses David Hildenbrand
2016-08-24 18:10 ` [Qemu-devel] [Patch v3 09/30] s390x/cpumodel: store the CPU model in the CPU instance David Hildenbrand
2016-08-24 18:10 ` [Qemu-devel] [Patch v3 10/30] s390x/cpumodel: expose features and feature groups as properties David Hildenbrand
2016-08-24 18:10 ` [Qemu-devel] [Patch v3 11/30] s390x/cpumodel: let the CPU model handle feature checks David Hildenbrand
2016-08-24 18:10 ` David Hildenbrand [this message]
2016-08-24 18:10 ` [Qemu-devel] [Patch v3 13/30] s390x/sclp: factor out preparation of cpu entries David Hildenbrand
2016-08-24 18:10 ` [Qemu-devel] [Patch v3 14/30] s390x/sclp: introduce sclp feature blocks David Hildenbrand
2016-08-24 18:10 ` [Qemu-devel] [Patch v3 15/30] s390x/sclp: indicate sclp features David Hildenbrand
2016-08-24 18:10 ` [Qemu-devel] [Patch v3 16/30] s390x/sclp: propagate the ibc val(lowest and unblocked ibc) David Hildenbrand
2016-08-24 18:10 ` [Qemu-devel] [Patch v3 17/30] s390x/sclp: propagate the mha via sclp David Hildenbrand
2016-08-24 18:10 ` [Qemu-devel] [Patch v3 18/30] s390x/sclp: propagate hmfai David Hildenbrand
2016-08-24 18:10 ` [Qemu-devel] [Patch v3 19/30] linux-headers: update against kvm/next David Hildenbrand
2016-08-24 18:10 ` [Qemu-devel] [Patch v3 20/30] s390x/kvm: allow runtime-instrumentation for "none" machine David Hildenbrand
2016-08-24 18:10 ` [Qemu-devel] [Patch v3 21/30] s390x/kvm: implement CPU model support David Hildenbrand
2016-08-24 18:10 ` [Qemu-devel] [Patch v3 22/30] s390x/kvm: disable host model for problematic compat machines David Hildenbrand
2016-08-24 18:10 ` [Qemu-devel] [Patch v3 23/30] s390x/kvm: let the CPU model control CMM(A) David Hildenbrand
2016-08-24 18:11 ` [Qemu-devel] [Patch v3 24/30] s390x/kvm: don't enable key wrapping if msa3 is disabled David Hildenbrand
2016-08-24 18:11 ` [Qemu-devel] [Patch v3 25/30] qmp: add QMP interface "query-cpu-model-expansion" David Hildenbrand
2016-08-24 19:43 ` Eduardo Habkost
2016-08-24 18:11 ` [Qemu-devel] [Patch v3 26/30] qmp: add QMP interface "query-cpu-model-comparison" David Hildenbrand
2016-08-24 19:45 ` Eduardo Habkost
2016-08-24 18:11 ` [Qemu-devel] [Patch v3 27/30] qmp: add QMP interface "query-cpu-model-baseline" David Hildenbrand
2016-08-24 19:46 ` Eduardo Habkost
2016-08-24 18:11 ` [Qemu-devel] [Patch v3 28/30] s390x/cpumodel: implement QMP interface "query-cpu-model-expansion" David Hildenbrand
2016-08-24 18:11 ` [Qemu-devel] [Patch v3 29/30] s390x/cpumodel: implement QMP interface "query-cpu-model-comparison" David Hildenbrand
2016-08-24 18:11 ` [Qemu-devel] [Patch v3 30/30] s390x/cpumodel: implement QMP interface "query-cpu-model-baseline" David Hildenbrand
2016-08-24 19:02 ` [Qemu-devel] [Patch v3 00/30] s390x CPU models: exposing features no-reply
2016-08-29 8:34 ` David Hildenbrand
2016-08-29 9:11 ` Cornelia Huck
2016-08-29 11:37 ` Cornelia Huck
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=1472062266-53206-13-git-send-email-dahi@linux.vnet.ibm.com \
--to=dahi@linux.vnet.ibm.com \
--cc=borntraeger@de.ibm.com \
--cc=cornelia.huck@de.ibm.com \
--cc=ehabkost@redhat.com \
--cc=fiuczy@linux.vnet.ibm.com \
--cc=imammedo@redhat.com \
--cc=jdenemar@redhat.com \
--cc=mimu@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
/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).