[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [Patch v3 11/30] s390x/cpumodel: let the CPU model handle f
From: |
David Hildenbrand |
Subject: |
[Qemu-devel] [Patch v3 11/30] s390x/cpumodel: let the CPU model handle feature checks |
Date: |
Wed, 24 Aug 2016 20:10:47 +0200 |
If we have certain features enabled, we have to migrate additional state
(e.g. vector registers or runtime-instrumentation registers). Let the
CPU model control that unless we have no "host" CPU model in the KVM
case. This will later on be the case for compatibility machines, so
migration from QEMU versions without the CPU model will still work.
Acked-by: Cornelia Huck <address@hidden>
Signed-off-by: David Hildenbrand <address@hidden>
---
target-s390x/cpu_models.c | 25 +++++++++++++++++++++++++
target-s390x/cpu_models.h | 2 ++
target-s390x/kvm.c | 4 ++--
target-s390x/machine.c | 14 ++------------
4 files changed, 31 insertions(+), 14 deletions(-)
diff --git a/target-s390x/cpu_models.c b/target-s390x/cpu_models.c
index 75c3099..946b565 100644
--- a/target-s390x/cpu_models.c
+++ b/target-s390x/cpu_models.c
@@ -73,6 +73,31 @@ static const S390CPUDef s390_cpu_defs[] = {
CPUDEF_INIT(0x2965, 13, 2, 47, 0x08000000U, "z13s", "IBM z13s GA1"),
};
+bool s390_has_feat(S390Feat feat)
+{
+ static S390CPU *cpu;
+
+ if (!cpu) {
+ cpu = S390_CPU(qemu_get_cpu(0));
+ }
+
+ if (!cpu || !cpu->model) {
+#ifdef CONFIG_KVM
+ if (kvm_enabled()) {
+ if (feat == S390_FEAT_VECTOR) {
+ return kvm_check_extension(kvm_state,
+ KVM_CAP_S390_VECTOR_REGISTERS);
+ }
+ if (feat == S390_FEAT_RUNTIME_INSTRUMENTATION) {
+ return kvm_s390_get_ri();
+ }
+ }
+#endif
+ return 0;
+ }
+ return test_bit(feat, cpu->model->features);
+}
+
struct S390PrintCpuListInfo {
FILE *f;
fprintf_function print;
diff --git a/target-s390x/cpu_models.h b/target-s390x/cpu_models.h
index 244256b..fe988cc 100644
--- a/target-s390x/cpu_models.h
+++ b/target-s390x/cpu_models.h
@@ -43,4 +43,6 @@ typedef struct S390CPUModel {
uint8_t cpu_ver; /* CPU version, usually "ff" for kvm */
} S390CPUModel;
+bool s390_has_feat(S390Feat feat);
+
#endif /* TARGET_S390X_CPU_MODELS_H */
diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c
index 80ac621..55bf6d7 100644
--- a/target-s390x/kvm.c
+++ b/target-s390x/kvm.c
@@ -1517,7 +1517,7 @@ static void sigp_store_adtl_status(void *arg)
{
SigpInfo *si = arg;
- if (!kvm_check_extension(kvm_state, KVM_CAP_S390_VECTOR_REGISTERS)) {
+ if (!s390_has_feat(S390_FEAT_VECTOR)) {
set_sigp_status(si, SIGP_STAT_INVALID_ORDER);
return;
}
@@ -2089,7 +2089,7 @@ static uint64_t build_channel_report_mcic(void)
MCIC_VB_WP | MCIC_VB_MS | MCIC_VB_PM | MCIC_VB_IA | MCIC_VB_FP |
MCIC_VB_GR | MCIC_VB_CR | MCIC_VB_ST | MCIC_VB_AR | MCIC_VB_PR |
MCIC_VB_FC | MCIC_VB_CT | MCIC_VB_CC;
- if (kvm_check_extension(kvm_state, KVM_CAP_S390_VECTOR_REGISTERS)) {
+ if (s390_has_feat(S390_FEAT_VECTOR)) {
mcic |= MCIC_VB_VR;
}
return mcic;
diff --git a/target-s390x/machine.c b/target-s390x/machine.c
index aa39e5d..edc3a47 100644
--- a/target-s390x/machine.c
+++ b/target-s390x/machine.c
@@ -78,12 +78,7 @@ static const VMStateDescription vmstate_fpu = {
static bool vregs_needed(void *opaque)
{
-#ifdef CONFIG_KVM
- if (kvm_enabled()) {
- return kvm_check_extension(kvm_state, KVM_CAP_S390_VECTOR_REGISTERS);
- }
-#endif
- return 0;
+ return s390_has_feat(S390_FEAT_VECTOR);
}
static const VMStateDescription vmstate_vregs = {
@@ -147,12 +142,7 @@ static const VMStateDescription vmstate_vregs = {
static bool riccb_needed(void *opaque)
{
-#ifdef CONFIG_KVM
- if (kvm_enabled()) {
- return kvm_s390_get_ri();
- }
-#endif
- return 0;
+ return s390_has_feat(S390_FEAT_RUNTIME_INSTRUMENTATION);
}
const VMStateDescription vmstate_riccb = {
--
2.6.6
- [Qemu-devel] [Patch v3 10/30] s390x/cpumodel: expose features and feature groups as properties, (continued)
- [Qemu-devel] [Patch v3 10/30] s390x/cpumodel: expose features and feature groups as properties, David Hildenbrand, 2016/08/24
- [Qemu-devel] [Patch v3 07/30] s390x/cpumodel: introduce CPU feature group definitions, David Hildenbrand, 2016/08/24
- [Qemu-devel] [Patch v3 04/30] s390x/cpumodel: introduce CPU features, David Hildenbrand, 2016/08/24
- [Qemu-devel] [Patch v3 12/30] s390x/cpumodel: check and apply the CPU model, David Hildenbrand, 2016/08/24
- [Qemu-devel] [Patch v3 13/30] s390x/sclp: factor out preparation of cpu entries, David Hildenbrand, 2016/08/24
- [Qemu-devel] [Patch v3 22/30] s390x/kvm: disable host model for problematic compat machines, David Hildenbrand, 2016/08/24
- [Qemu-devel] [Patch v3 02/30] s390x/cpumodel: "host" and "qemu" as CPU subclasses, David Hildenbrand, 2016/08/24
- [Qemu-devel] [Patch v3 28/30] s390x/cpumodel: implement QMP interface "query-cpu-model-expansion", David Hildenbrand, 2016/08/24
- [Qemu-devel] [Patch v3 29/30] s390x/cpumodel: implement QMP interface "query-cpu-model-comparison", David Hildenbrand, 2016/08/24
- [Qemu-devel] [Patch v3 17/30] s390x/sclp: propagate the mha via sclp, David Hildenbrand, 2016/08/24
- [Qemu-devel] [Patch v3 11/30] s390x/cpumodel: let the CPU model handle feature checks,
David Hildenbrand <=
- [Qemu-devel] [Patch v3 30/30] s390x/cpumodel: implement QMP interface "query-cpu-model-baseline", David Hildenbrand, 2016/08/24
- [Qemu-devel] [Patch v3 03/30] s390x/cpumodel: expose CPU class properties, David Hildenbrand, 2016/08/24
- [Qemu-devel] [Patch v3 18/30] s390x/sclp: propagate hmfai, David Hildenbrand, 2016/08/24
- [Qemu-devel] [Patch v3 08/30] s390x/cpumodel: register defined CPU models as subclasses, David Hildenbrand, 2016/08/24
- [Qemu-devel] [Patch v3 27/30] qmp: add QMP interface "query-cpu-model-baseline", David Hildenbrand, 2016/08/24
- [Qemu-devel] [Patch v3 26/30] qmp: add QMP interface "query-cpu-model-comparison", David Hildenbrand, 2016/08/24
- [Qemu-devel] [Patch v3 24/30] s390x/kvm: don't enable key wrapping if msa3 is disabled, David Hildenbrand, 2016/08/24
- [Qemu-devel] [Patch v3 21/30] s390x/kvm: implement CPU model support, David Hildenbrand, 2016/08/24