a19a21
From 722078f9fdb766c2f0990145de6732f0c36a63b7 Mon Sep 17 00:00:00 2001
a19a21
From: Thomas Huth <thuth@redhat.com>
a19a21
Date: Wed, 11 Nov 2020 12:03:16 -0500
a19a21
Subject: [PATCH 16/18] s390x: pv: Fix diag318 PV fencing
a19a21
a19a21
RH-Author: Thomas Huth <thuth@redhat.com>
a19a21
Message-id: <20201111120316.707489-13-thuth@redhat.com>
a19a21
Patchwork-id: 99509
a19a21
O-Subject: [RHEL-8.4.0 qemu-kvm PATCH v2 12/12] s390x: pv: Fix diag318 PV fencing
a19a21
Bugzilla: 1798506
a19a21
RH-Acked-by: Jens Freimann <jfreimann@redhat.com>
a19a21
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
a19a21
RH-Acked-by: David Hildenbrand <david@redhat.com>
a19a21
a19a21
From: Janosch Frank <frankja@linux.ibm.com>
a19a21
a19a21
Diag318 fencing needs to be determined on the current VM PV state and
a19a21
not on the state that the VM has when we create the CPU model.
a19a21
a19a21
Fixes: fabdada935 ("s390: guest support for diagnose 0x318")
a19a21
Reported-by: Marc Hartmayer <mhartmay@linux.ibm.com>
a19a21
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
a19a21
Tested-by: Marc Hartmayer <mhartmay@linux.ibm.com>
a19a21
Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
a19a21
Reviewed-by: Collin Walling <walling@linux.ibm.com>
a19a21
Acked-by: David Hildenbrand <david@redhat.com>
a19a21
Message-Id: <20201022103135.126033-3-frankja@linux.ibm.com>
a19a21
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
a19a21
(cherry picked from commit 3ded270a2697852a71961b45291519ae044f25e3)
a19a21
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
a19a21
---
a19a21
 target/s390x/cpu_features.c | 5 +++++
a19a21
 target/s390x/cpu_features.h | 4 ++++
a19a21
 target/s390x/cpu_models.c   | 4 ++++
a19a21
 target/s390x/kvm.c          | 3 +--
a19a21
 4 files changed, 14 insertions(+), 2 deletions(-)
a19a21
a19a21
diff --git a/target/s390x/cpu_features.c b/target/s390x/cpu_features.c
a19a21
index 9f817e3cfa7..e5cdf232607 100644
a19a21
--- a/target/s390x/cpu_features.c
a19a21
+++ b/target/s390x/cpu_features.c
a19a21
@@ -14,6 +14,7 @@
a19a21
 #include "qemu/osdep.h"
a19a21
 #include "qemu/module.h"
a19a21
 #include "cpu_features.h"
a19a21
+#include "hw/s390x/pv.h"
a19a21
 
a19a21
 #define DEF_FEAT(_FEAT, _NAME, _TYPE, _BIT, _DESC) \
a19a21
     [S390_FEAT_##_FEAT] = {                        \
a19a21
@@ -105,6 +106,10 @@ void s390_fill_feat_block(const S390FeatBitmap features, S390FeatType type,
a19a21
         }
a19a21
         feat = find_next_bit(features, S390_FEAT_MAX, feat + 1);
a19a21
     }
a19a21
+
a19a21
+    if (type == S390_FEAT_TYPE_SCLP_FAC134 && s390_is_pv()) {
a19a21
+        clear_be_bit(s390_feat_def(S390_FEAT_DIAG_318)->bit, data);
a19a21
+    }
a19a21
 }
a19a21
 
a19a21
 void s390_add_from_feat_block(S390FeatBitmap features, S390FeatType type,
a19a21
diff --git a/target/s390x/cpu_features.h b/target/s390x/cpu_features.h
a19a21
index f74f7fc3a11..d3c685a04c8 100644
a19a21
--- a/target/s390x/cpu_features.h
a19a21
+++ b/target/s390x/cpu_features.h
a19a21
@@ -81,6 +81,10 @@ const S390FeatGroupDef *s390_feat_group_def(S390FeatGroup group);
a19a21
 
a19a21
 #define BE_BIT_NR(BIT) (BIT ^ (BITS_PER_LONG - 1))
a19a21
 
a19a21
+static inline void clear_be_bit(unsigned int bit_nr, uint8_t *array)
a19a21
+{
a19a21
+    array[bit_nr / 8] &= ~(0x80 >> (bit_nr % 8));
a19a21
+}
a19a21
 static inline void set_be_bit(unsigned int bit_nr, uint8_t *array)
a19a21
 {
a19a21
     array[bit_nr / 8] |= 0x80 >> (bit_nr % 8);
a19a21
diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c
a19a21
index bf6a3faba9e..d489923cb8a 100644
a19a21
--- a/target/s390x/cpu_models.c
a19a21
+++ b/target/s390x/cpu_models.c
a19a21
@@ -29,6 +29,7 @@
a19a21
 #include "hw/pci/pci.h"
a19a21
 #endif
a19a21
 #include "qapi/qapi-commands-machine-target.h"
a19a21
+#include "hw/s390x/pv.h"
a19a21
 
a19a21
 #define CPUDEF_INIT(_type, _gen, _ec_ga, _mha_pow, _hmfai, _name, _desc) \
a19a21
     {                                                                    \
a19a21
@@ -238,6 +239,9 @@ bool s390_has_feat(S390Feat feat)
a19a21
         }
a19a21
         return 0;
a19a21
     }
a19a21
+    if (feat == S390_FEAT_DIAG_318 && s390_is_pv()) {
a19a21
+        return false;
a19a21
+    }
a19a21
     return test_bit(feat, cpu->model->features);
a19a21
 }
a19a21
 
a19a21
diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
a19a21
index e5e190d21c9..6edb52f6d25 100644
a19a21
--- a/target/s390x/kvm.c
a19a21
+++ b/target/s390x/kvm.c
a19a21
@@ -2483,8 +2483,7 @@ void kvm_s390_get_host_cpu_model(S390CPUModel *model, Error **errp)
a19a21
      */
a19a21
     set_bit(S390_FEAT_EXTENDED_LENGTH_SCCB, model->features);
a19a21
 
a19a21
-    /* DIAGNOSE 0x318 is not supported under protected virtualization */
a19a21
-    if (!s390_is_pv() && kvm_check_extension(kvm_state, KVM_CAP_S390_DIAG318)) {
a19a21
+    if (kvm_check_extension(kvm_state, KVM_CAP_S390_DIAG318)) {
a19a21
         set_bit(S390_FEAT_DIAG_318, model->features);
a19a21
     }
a19a21
 
a19a21
-- 
a19a21
2.27.0
a19a21