mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-27 21:40:49 +00:00
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. Cc: qemu-stable@nongnu.org Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> Message-Id: <20180118085628.40798-3-borntraeger@de.ibm.com> Reviewed-by: Thomas Huth <thuth@redhat.com> Reviewed-by: David Hildenbrand <david@redhat.com> [CH: 'Branch Prediction Blocking' -> 'Branch prediction blocking'] Signed-off-by: Cornelia Huck <cohuck@redhat.com>
This commit is contained in:
parent
9cbb636270
commit
b073c87517
@ -89,6 +89,7 @@ static void s390_cpu_reset(CPUState *s)
|
|||||||
CPUS390XState *env = &cpu->env;
|
CPUS390XState *env = &cpu->env;
|
||||||
|
|
||||||
env->pfault_token = -1UL;
|
env->pfault_token = -1UL;
|
||||||
|
env->bpbc = false;
|
||||||
scc->parent_reset(s);
|
scc->parent_reset(s);
|
||||||
cpu->env.sigp_order = 0;
|
cpu->env.sigp_order = 0;
|
||||||
s390_cpu_set_state(CPU_STATE_STOPPED, cpu);
|
s390_cpu_set_state(CPU_STATE_STOPPED, cpu);
|
||||||
|
@ -93,6 +93,7 @@ struct CPUS390XState {
|
|||||||
|
|
||||||
uint32_t fpc; /* floating-point control register */
|
uint32_t fpc; /* floating-point control register */
|
||||||
uint32_t cc_op;
|
uint32_t cc_op;
|
||||||
|
bool bpbc; /* branch prediction blocking */
|
||||||
|
|
||||||
float_status fpu_status; /* passed to softfloat lib */
|
float_status fpu_status; /* passed to softfloat lib */
|
||||||
|
|
||||||
|
@ -89,6 +89,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("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("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("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("vx", S390_FEAT_TYPE_STFL, 129, "Vector facility"),
|
||||||
FEAT_INIT("iep", S390_FEAT_TYPE_STFL, 130, "Instruction-execution-protection facility"),
|
FEAT_INIT("iep", S390_FEAT_TYPE_STFL, 130, "Instruction-execution-protection facility"),
|
||||||
FEAT_INIT("sea_esop2", S390_FEAT_TYPE_STFL, 131, "Side-effect-access facility and Enhanced-suppression-on-protection facility 2"),
|
FEAT_INIT("sea_esop2", S390_FEAT_TYPE_STFL, 131, "Side-effect-access facility and Enhanced-suppression-on-protection facility 2"),
|
||||||
|
@ -80,6 +80,7 @@ typedef enum {
|
|||||||
S390_FEAT_MSA_EXT_4,
|
S390_FEAT_MSA_EXT_4,
|
||||||
S390_FEAT_EDAT_2,
|
S390_FEAT_EDAT_2,
|
||||||
S390_FEAT_DFP_PACKED_CONVERSION,
|
S390_FEAT_DFP_PACKED_CONVERSION,
|
||||||
|
S390_FEAT_BPB,
|
||||||
S390_FEAT_VECTOR,
|
S390_FEAT_VECTOR,
|
||||||
S390_FEAT_INSTRUCTION_EXEC_PROT,
|
S390_FEAT_INSTRUCTION_EXEC_PROT,
|
||||||
S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2,
|
S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2,
|
||||||
|
@ -352,6 +352,7 @@ static uint16_t base_GEN14_GA1[] = {
|
|||||||
* support these features yet.
|
* support these features yet.
|
||||||
*/
|
*/
|
||||||
static uint16_t full_GEN7_GA1[] = {
|
static uint16_t full_GEN7_GA1[] = {
|
||||||
|
S390_FEAT_BPB,
|
||||||
S390_FEAT_SIE_F2,
|
S390_FEAT_SIE_F2,
|
||||||
S390_FEAT_SIE_SKEY,
|
S390_FEAT_SIE_SKEY,
|
||||||
S390_FEAT_SIE_GPERE,
|
S390_FEAT_SIE_GPERE,
|
||||||
|
@ -490,6 +490,11 @@ int kvm_arch_put_registers(CPUState *cs, int level)
|
|||||||
cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_GSCB;
|
cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_GSCB;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 */
|
/* Finally the prefix */
|
||||||
if (can_sync_regs(cs, KVM_SYNC_PREFIX)) {
|
if (can_sync_regs(cs, KVM_SYNC_PREFIX)) {
|
||||||
cs->kvm_run->s.regs.prefix = env->psa;
|
cs->kvm_run->s.regs.prefix = env->psa;
|
||||||
@ -600,6 +605,10 @@ int kvm_arch_get_registers(CPUState *cs)
|
|||||||
memcpy(env->gscb, cs->kvm_run->s.regs.gscb, 32);
|
memcpy(env->gscb, cs->kvm_run->s.regs.gscb, 32);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (can_sync_regs(cs, KVM_SYNC_BPBC)) {
|
||||||
|
env->bpbc = cs->kvm_run->s.regs.bpbc;
|
||||||
|
}
|
||||||
|
|
||||||
/* pfault parameters */
|
/* pfault parameters */
|
||||||
if (can_sync_regs(cs, KVM_SYNC_PFAULT)) {
|
if (can_sync_regs(cs, KVM_SYNC_PFAULT)) {
|
||||||
env->pfault_token = cs->kvm_run->s.regs.pft;
|
env->pfault_token = cs->kvm_run->s.regs.pft;
|
||||||
@ -2278,6 +2287,11 @@ void kvm_s390_get_host_cpu_model(S390CPUModel *model, Error **errp)
|
|||||||
clear_bit(S390_FEAT_CMM_NT, model->features);
|
clear_bit(S390_FEAT_CMM_NT, model->features);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 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);
|
||||||
|
}
|
||||||
|
|
||||||
/* We emulate a zPCI bus and AEN, therefore we don't need HW support */
|
/* We emulate a zPCI bus and AEN, therefore we don't need HW support */
|
||||||
if (pci_available) {
|
if (pci_available) {
|
||||||
set_bit(S390_FEAT_ZPCI, model->features);
|
set_bit(S390_FEAT_ZPCI, model->features);
|
||||||
|
@ -194,6 +194,22 @@ const VMStateDescription vmstate_gscb = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
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 = {
|
const VMStateDescription vmstate_s390_cpu = {
|
||||||
.name = "cpu",
|
.name = "cpu",
|
||||||
.post_load = cpu_post_load,
|
.post_load = cpu_post_load,
|
||||||
@ -228,6 +244,7 @@ const VMStateDescription vmstate_s390_cpu = {
|
|||||||
&vmstate_riccb,
|
&vmstate_riccb,
|
||||||
&vmstate_exval,
|
&vmstate_exval,
|
||||||
&vmstate_gscb,
|
&vmstate_gscb,
|
||||||
|
&vmstate_bpbc,
|
||||||
NULL
|
NULL
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user