|
|
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 |
|