Blame SOURCES/kvm-s390x-kvm-Handle-bpb-feature.patch

9bac43
From 89628ec85c86fee920a518330759891dd0c01921 Mon Sep 17 00:00:00 2001
9bac43
From: Thomas Huth <thuth@redhat.com>
9bac43
Date: Tue, 23 Jan 2018 19:12:45 +0100
9bac43
Subject: [PATCH 3/8] s390x/kvm: Handle bpb feature
9bac43
9bac43
RH-Author: Thomas Huth <thuth@redhat.com>
9bac43
Message-id: <1516734766-12075-3-git-send-email-thuth@redhat.com>
9bac43
Patchwork-id: 78701
9bac43
O-Subject: [RHEL-7.5 qemu-kvm-ma PATCH 2/3] s390x/kvm: Handle bpb feature
9bac43
Bugzilla: 1535606
9bac43
RH-Acked-by: David Hildenbrand <david@redhat.com>
9bac43
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
9bac43
RH-Acked-by: Jens Freimann <jfreimann@redhat.com>
9bac43
9bac43
From: Christian Borntraeger <borntraeger@de.ibm.com>
9bac43
9bac43
We need to handle the bpb control on reset and migration. Normally
9bac43
stfle.82 is transparent (and the normal guest part works without
9bac43
hypervisor activity). To prevent any issues we require full
9bac43
host kernel support for this feature.
9bac43
9bac43
Cc: qemu-stable@nongnu.org
9bac43
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
9bac43
Message-Id: <20180118085628.40798-3-borntraeger@de.ibm.com>
9bac43
Reviewed-by: Thomas Huth <thuth@redhat.com>
9bac43
Reviewed-by: David Hildenbrand <david@redhat.com>
9bac43
[CH: 'Branch Prediction Blocking' -> 'Branch prediction blocking']
9bac43
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
9bac43
(cherry picked from commit b073c87517d4d348c7bac0f0b35e8e83e6354d82)
9bac43
9bac43
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
9bac43
---
9bac43
 target/s390x/cpu.c              |  1 +
9bac43
 target/s390x/cpu.h              |  1 +
9bac43
 target/s390x/cpu_features.c     |  1 +
9bac43
 target/s390x/cpu_features_def.h |  1 +
9bac43
 target/s390x/gen-features.c     |  1 +
9bac43
 target/s390x/kvm.c              | 14 ++++++++++++++
9bac43
 target/s390x/machine.c          | 17 +++++++++++++++++
9bac43
 7 files changed, 36 insertions(+)
9bac43
9bac43
diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c
9bac43
index 489bc25..8bd463c 100644
9bac43
--- a/target/s390x/cpu.c
9bac43
+++ b/target/s390x/cpu.c
9bac43
@@ -78,6 +78,7 @@ static void s390_cpu_reset(CPUState *s)
9bac43
     CPUS390XState *env = &cpu->env;
9bac43
 
9bac43
     env->pfault_token = -1UL;
9bac43
+    env->bpbc = false;
9bac43
     scc->parent_reset(s);
9bac43
     cpu->env.sigp_order = 0;
9bac43
     s390_cpu_set_state(CPU_STATE_STOPPED, cpu);
9bac43
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
9bac43
index 29fdd5d..ce1f933 100644
9bac43
--- a/target/s390x/cpu.h
9bac43
+++ b/target/s390x/cpu.h
9bac43
@@ -96,6 +96,7 @@ typedef struct CPUS390XState {
9bac43
 
9bac43
     uint32_t fpc;          /* floating-point control register */
9bac43
     uint32_t cc_op;
9bac43
+    bool bpbc;             /* branch prediction blocking */
9bac43
 
9bac43
     float_status fpu_status; /* passed to softfloat lib */
9bac43
 
9bac43
diff --git a/target/s390x/cpu_features.c b/target/s390x/cpu_features.c
9bac43
index 1d3a036..d39efb0 100644
9bac43
--- a/target/s390x/cpu_features.c
9bac43
+++ b/target/s390x/cpu_features.c
9bac43
@@ -89,6 +89,7 @@ static const S390FeatDef s390_features[] = {
9bac43
     FEAT_INIT("msa4-base", S390_FEAT_TYPE_STFL, 77, "Message-security-assist-extension-4 facility (excluding subfunctions)"),
9bac43
     FEAT_INIT("edat2", S390_FEAT_TYPE_STFL, 78, "Enhanced-DAT facility 2"),
9bac43
     FEAT_INIT("dfppc", S390_FEAT_TYPE_STFL, 80, "Decimal-floating-point packed-conversion facility"),
9bac43
+    FEAT_INIT("bpb", S390_FEAT_TYPE_STFL, 82, "Branch prediction blocking"),
9bac43
     FEAT_INIT("vx", S390_FEAT_TYPE_STFL, 129, "Vector facility"),
9bac43
     FEAT_INIT("iep", S390_FEAT_TYPE_STFL, 130, "Instruction-execution-protection facility"),
9bac43
     FEAT_INIT("sea_esop2", S390_FEAT_TYPE_STFL, 131, "Side-effect-access facility and Enhanced-suppression-on-protection facility 2"),
9bac43
diff --git a/target/s390x/cpu_features_def.h b/target/s390x/cpu_features_def.h
9bac43
index 4b6d4e9..4487cfd 100644
9bac43
--- a/target/s390x/cpu_features_def.h
9bac43
+++ b/target/s390x/cpu_features_def.h
9bac43
@@ -80,6 +80,7 @@ typedef enum {
9bac43
     S390_FEAT_MSA_EXT_4,
9bac43
     S390_FEAT_EDAT_2,
9bac43
     S390_FEAT_DFP_PACKED_CONVERSION,
9bac43
+    S390_FEAT_BPB,
9bac43
     S390_FEAT_VECTOR,
9bac43
     S390_FEAT_INSTRUCTION_EXEC_PROT,
9bac43
     S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2,
9bac43
diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c
9bac43
index 68e6c31..13a6291 100644
9bac43
--- a/target/s390x/gen-features.c
9bac43
+++ b/target/s390x/gen-features.c
9bac43
@@ -352,6 +352,7 @@ static uint16_t base_GEN14_GA1[] = {
9bac43
  * support these features yet.
9bac43
  */
9bac43
 static uint16_t full_GEN7_GA1[] = {
9bac43
+    S390_FEAT_BPB,
9bac43
     S390_FEAT_SIE_F2,
9bac43
     S390_FEAT_SIE_SKEY,
9bac43
     S390_FEAT_SIE_GPERE,
9bac43
diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
9bac43
index 3589e6e..871f441 100644
9bac43
--- a/target/s390x/kvm.c
9bac43
+++ b/target/s390x/kvm.c
9bac43
@@ -488,6 +488,11 @@ int kvm_arch_put_registers(CPUState *cs, int level)
9bac43
         cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_GSCB;
9bac43
     }
9bac43
 
9bac43
+    if (can_sync_regs(cs, KVM_SYNC_BPBC)) {
9bac43
+        cs->kvm_run->s.regs.bpbc = env->bpbc;
9bac43
+        cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_BPBC;
9bac43
+    }
9bac43
+
9bac43
     /* Finally the prefix */
9bac43
     if (can_sync_regs(cs, KVM_SYNC_PREFIX)) {
9bac43
         cs->kvm_run->s.regs.prefix = env->psa;
9bac43
@@ -598,6 +603,10 @@ int kvm_arch_get_registers(CPUState *cs)
9bac43
         memcpy(env->gscb, cs->kvm_run->s.regs.gscb, 32);
9bac43
     }
9bac43
 
9bac43
+    if (can_sync_regs(cs, KVM_SYNC_BPBC)) {
9bac43
+        env->bpbc = cs->kvm_run->s.regs.bpbc;
9bac43
+    }
9bac43
+
9bac43
     /* pfault parameters */
9bac43
     if (can_sync_regs(cs, KVM_SYNC_PFAULT)) {
9bac43
         env->pfault_token = cs->kvm_run->s.regs.pft;
9bac43
@@ -2666,6 +2675,11 @@ void kvm_s390_get_host_cpu_model(S390CPUModel *model, Error **errp)
9bac43
         clear_bit(S390_FEAT_CMM_NT, model->features);
9bac43
     }
9bac43
 
9bac43
+    /* bpb needs kernel support for migration, VSIE and reset */
9bac43
+    if (!kvm_check_extension(kvm_state, KVM_CAP_S390_BPB)) {
9bac43
+        clear_bit(S390_FEAT_BPB, model->features);
9bac43
+    }
9bac43
+
9bac43
     /* We emulate a zPCI bus and AEN, therefore we don't need HW support */
9bac43
     set_bit(S390_FEAT_ZPCI, model->features);
9bac43
     set_bit(S390_FEAT_ADAPTER_EVENT_NOTIFICATION, model->features);
9bac43
diff --git a/target/s390x/machine.c b/target/s390x/machine.c
9bac43
index 2dcadfd..f24088b 100644
9bac43
--- a/target/s390x/machine.c
9bac43
+++ b/target/s390x/machine.c
9bac43
@@ -190,6 +190,22 @@ const VMStateDescription vmstate_gscb = {
9bac43
         }
9bac43
 };
9bac43
 
9bac43
+static bool bpbc_needed(void *opaque)
9bac43
+{
9bac43
+    return s390_has_feat(S390_FEAT_BPB);
9bac43
+}
9bac43
+
9bac43
+const VMStateDescription vmstate_bpbc = {
9bac43
+    .name = "cpu/bpbc",
9bac43
+    .version_id = 1,
9bac43
+    .minimum_version_id = 1,
9bac43
+    .needed = bpbc_needed,
9bac43
+    .fields = (VMStateField[]) {
9bac43
+        VMSTATE_BOOL(env.bpbc, S390CPU),
9bac43
+        VMSTATE_END_OF_LIST()
9bac43
+    }
9bac43
+};
9bac43
+
9bac43
 const VMStateDescription vmstate_s390_cpu = {
9bac43
     .name = "cpu",
9bac43
     .post_load = cpu_post_load,
9bac43
@@ -224,6 +240,7 @@ const VMStateDescription vmstate_s390_cpu = {
9bac43
         &vmstate_riccb,
9bac43
         &vmstate_exval,
9bac43
         &vmstate_gscb,
9bac43
+        &vmstate_bpbc,
9bac43
         NULL
9bac43
     },
9bac43
 };
9bac43
-- 
9bac43
1.8.3.1
9bac43