Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:42.3:Update
qemu-linux-user
0067-s390x-kvm-Handle-bpb-feature.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0067-s390x-kvm-Handle-bpb-feature.patch of Package qemu-linux-user
From c93de4efa914208a4fcbdc89e4bfa8cc3ef63c25 Mon Sep 17 00:00:00 2001 From: Christian Borntraeger <borntraeger@de.ibm.com> Date: Fri, 12 Jan 2018 17:34:47 +0100 Subject: [PATCH] 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#1076813] Signed-off-by: Liang Yan <lyan@suse.com> --- target/s390x/cpu.c | 1 + target/s390x/cpu.h | 1 + target/s390x/cpu_features.c | 1 + target/s390x/cpu_features_def.h | 1 + target/s390x/gen-features.c | 1 + target/s390x/kvm.c | 14 ++++++++++++++ target/s390x/machine.c | 17 +++++++++++++++++ 7 files changed, 36 insertions(+) diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c index 066dcd17df..7898a82e7d 100644 --- a/target/s390x/cpu.c +++ b/target/s390x/cpu.c @@ -79,6 +79,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 058ddad83a..1971b8ab20 100644 --- a/target/s390x/cpu.h +++ b/target/s390x/cpu.h @@ -91,6 +91,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/cpu_features.c b/target/s390x/cpu_features.c index 42fd9d792b..dc5b980838 100644 --- a/target/s390x/cpu_features.c +++ b/target/s390x/cpu_features.c @@ -81,6 +81,7 @@ static const S390FeatDef s390_features[] = { FEAT_INIT("msa4-base", S390_FEAT_TYPE_STFL, 77, "Message-security-assist-extension-4 facility (excluding subfunctions)"), FEAT_INIT("edat2", S390_FEAT_TYPE_STFL, 78, "Enhanced-DAT facility 2"), FEAT_INIT("dfppc", S390_FEAT_TYPE_STFL, 80, "Decimal-floating-point packed-conversion facility"), + FEAT_INIT("bpb", S390_FEAT_TYPE_STFL, 82, "Branch Prediction Blocking"), FEAT_INIT("vx", S390_FEAT_TYPE_STFL, 129, "Vector facility"), FEAT_INIT("gsls", S390_FEAT_TYPE_SCLP_CONF_CHAR, 40, "SIE: Guest-storage-limit-suppression facility"), diff --git a/target/s390x/cpu_features_def.h b/target/s390x/cpu_features_def.h index aa5ab8d371..2a96fa7235 100644 --- a/target/s390x/cpu_features_def.h +++ b/target/s390x/cpu_features_def.h @@ -71,6 +71,7 @@ typedef enum { S390_FEAT_MSA_EXT_4, S390_FEAT_EDAT_2, S390_FEAT_DFP_PACKED_CONVERSION, + S390_FEAT_BPB, S390_FEAT_VECTOR, S390_FEAT_SIE_GSLS, S390_FEAT_ESOP, diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c index e674738ae3..eec302830d 100644 --- a/target/s390x/gen-features.c +++ b/target/s390x/gen-features.c @@ -288,6 +288,7 @@ static uint16_t base_GEN13_GA1[] = { /* full features differing to the base in order of release */ static uint16_t full_GEN7_GA1[] = { + S390_FEAT_BPB, S390_FEAT_SIE_F2, S390_FEAT_SIE_SKEY, S390_FEAT_SIE_GPERE, diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c index ac47154b83..cc7d0578f0 100644 --- a/target/s390x/kvm.c +++ b/target/s390x/kvm.c @@ -456,6 +456,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; @@ -562,6 +567,10 @@ int kvm_arch_get_registers(CPUState *cs) memcpy(env->riccb, cs->kvm_run->s.regs.riccb, 64); } + 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; @@ -2604,6 +2613,11 @@ void kvm_s390_get_host_cpu_model(S390CPUModel *model, Error **errp) return; } + /* bpb needs kernel support for migration, VSIE and reset */ + if (!kvm_check_extension(kvm_state, KVM_CAP_S390_BPB)) { + clear_bit(S390_FEAT_BPB, model->features); + } + /* with cpu model support, CMM is only indicated if really available */ if (kvm_s390_cmma_available()) { set_bit(S390_FEAT_CMM, model->features); diff --git a/target/s390x/machine.c b/target/s390x/machine.c index 8503fa1c8d..a9c6fb69dd 100644 --- a/target/s390x/machine.c +++ b/target/s390x/machine.c @@ -156,6 +156,22 @@ const VMStateDescription vmstate_riccb = { } }; +static bool bpbc_needed(void *opaque) +{ + return s390_has_feat(S390_FEAT_BPB); +} + +const VMStateDescription vmstate_bpbc = { + .name = "cpu/bpbc", + .version_id = 1, + .minimum_version_id = 1, + .needed = bpbc_needed, + .fields = (VMStateField[]) { + VMSTATE_BOOL(env.bpbc, S390CPU), + VMSTATE_END_OF_LIST() + } +}; + const VMStateDescription vmstate_s390_cpu = { .name = "cpu", .post_load = cpu_post_load, @@ -188,6 +204,7 @@ const VMStateDescription vmstate_s390_cpu = { &vmstate_fpu, &vmstate_vregs, &vmstate_riccb, + &vmstate_bpbc, NULL }, };
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor