File 0256-s390x-kvm-Handle-bpb-feature.patch of Package qemu.19799

From: Christian Borntraeger <borntraeger@de.ibm.com>
Date: Fri, 12 Jan 2018 17:34:47 +0100
Subject: s390x/kvm: Handle bpb feature

We need to handle the bpb control on reset and migration. Normally
stfle.82 is transparent (and the normal guest part works without
hypervisor activity). To prevent any issues we require full
host kernel support for this feature.

Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
(cherry picked from commit b073c87517d4d348c7bac0f0b35e8e83e6354d82)
[LY: BSC#1076814]
Signed-off-by: Liang Yan <lyan@suse.com>
---
 target-s390x/cpu.c | 1 +
 target-s390x/cpu.h | 1 +
 target-s390x/kvm.c | 9 +++++++++
 3 files changed, 11 insertions(+)

diff --git a/target-s390x/cpu.c b/target-s390x/cpu.c
index 4bfff341dc3702abbe5992349338..3373d3cb5c27b64ef8b8d14f7487 100644
--- a/target-s390x/cpu.c
+++ b/target-s390x/cpu.c
@@ -101,6 +101,7 @@ static void s390_cpu_reset(CPUState *s)
     CPUS390XState *env = &cpu->env;
 
     env->pfault_token = -1UL;
+    env->bpbc = false;
     scc->parent_reset(s);
     cpu->env.sigp_order = 0;
     s390_cpu_set_state(CPU_STATE_STOPPED, cpu);
diff --git a/target-s390x/cpu.h b/target-s390x/cpu.h
index 6d97c089a4160f9952a3ddf47eae..8ce1c5bb7b261eee2e42efefaec0 100644
--- a/target-s390x/cpu.h
+++ b/target-s390x/cpu.h
@@ -89,6 +89,7 @@ typedef struct CPUS390XState {
 
     uint32_t fpc;          /* floating-point control register */
     uint32_t cc_op;
+    bool bpbc;             /* branch prediction blocking */
 
     float_status fpu_status; /* passed to softfloat lib */
 
diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c
index e1859cae0492a4e9d09858c01262..8979944a1c24e3b2c918a07b50a6 100644
--- a/target-s390x/kvm.c
+++ b/target-s390x/kvm.c
@@ -426,6 +426,11 @@ int kvm_arch_put_registers(CPUState *cs, int level)
         }
     }
 
+    if (can_sync_regs(cs, KVM_SYNC_BPBC)) {
+        cs->kvm_run->s.regs.bpbc = env->bpbc;
+        cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_BPBC;
+    }
+
     /* Finally the prefix */
     if (can_sync_regs(cs, KVM_SYNC_PREFIX)) {
         cs->kvm_run->s.regs.prefix = env->psa;
@@ -528,6 +533,10 @@ int kvm_arch_get_registers(CPUState *cs)
         kvm_get_one_reg(cs, KVM_REG_S390_PP, &env->pp);
     }
 
+    if (can_sync_regs(cs, KVM_SYNC_BPBC)) {
+        env->bpbc = cs->kvm_run->s.regs.bpbc;
+    }
+
     /* pfault parameters */
     if (can_sync_regs(cs, KVM_SYNC_PFAULT)) {
         env->pfault_token = cs->kvm_run->s.regs.pft;
openSUSE Build Service is sponsored by