s390x/cpumodel: let the CPU model handle feature checks
If we have certain features enabled, we have to migrate additional state (e.g. vector registers or runtime-instrumentation registers). Let the CPU model control that unless we have no "host" CPU model in the KVM case. This will later on be the case for compatibility machines, so migration from QEMU versions without the CPU model will still work. Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com> Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com> Message-Id: <20160905085244.99980-12-dahi@linux.vnet.ibm.com> Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
This commit is contained in:
parent
0754f60429
commit
7c72ac49ae
|
@ -73,6 +73,31 @@ static S390CPUDef s390_cpu_defs[] = {
|
||||||
CPUDEF_INIT(0x2965, 13, 2, 47, 0x08000000U, "z13s", "IBM z13s GA1"),
|
CPUDEF_INIT(0x2965, 13, 2, 47, 0x08000000U, "z13s", "IBM z13s GA1"),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool s390_has_feat(S390Feat feat)
|
||||||
|
{
|
||||||
|
static S390CPU *cpu;
|
||||||
|
|
||||||
|
if (!cpu) {
|
||||||
|
cpu = S390_CPU(qemu_get_cpu(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!cpu || !cpu->model) {
|
||||||
|
#ifdef CONFIG_KVM
|
||||||
|
if (kvm_enabled()) {
|
||||||
|
if (feat == S390_FEAT_VECTOR) {
|
||||||
|
return kvm_check_extension(kvm_state,
|
||||||
|
KVM_CAP_S390_VECTOR_REGISTERS);
|
||||||
|
}
|
||||||
|
if (feat == S390_FEAT_RUNTIME_INSTRUMENTATION) {
|
||||||
|
return kvm_s390_get_ri();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return test_bit(feat, cpu->model->features);
|
||||||
|
}
|
||||||
|
|
||||||
struct S390PrintCpuListInfo {
|
struct S390PrintCpuListInfo {
|
||||||
FILE *f;
|
FILE *f;
|
||||||
fprintf_function print;
|
fprintf_function print;
|
||||||
|
|
|
@ -49,4 +49,6 @@ typedef struct S390CPUModel {
|
||||||
uint8_t cpu_ver; /* CPU version, usually "ff" for kvm */
|
uint8_t cpu_ver; /* CPU version, usually "ff" for kvm */
|
||||||
} S390CPUModel;
|
} S390CPUModel;
|
||||||
|
|
||||||
|
bool s390_has_feat(S390Feat feat);
|
||||||
|
|
||||||
#endif /* TARGET_S390X_CPU_MODELS_H */
|
#endif /* TARGET_S390X_CPU_MODELS_H */
|
||||||
|
|
|
@ -1539,7 +1539,7 @@ static void sigp_store_adtl_status(void *arg)
|
||||||
{
|
{
|
||||||
SigpInfo *si = arg;
|
SigpInfo *si = arg;
|
||||||
|
|
||||||
if (!kvm_check_extension(kvm_state, KVM_CAP_S390_VECTOR_REGISTERS)) {
|
if (!s390_has_feat(S390_FEAT_VECTOR)) {
|
||||||
set_sigp_status(si, SIGP_STAT_INVALID_ORDER);
|
set_sigp_status(si, SIGP_STAT_INVALID_ORDER);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2119,7 +2119,7 @@ static uint64_t build_channel_report_mcic(void)
|
||||||
MCIC_VB_WP | MCIC_VB_MS | MCIC_VB_PM | MCIC_VB_IA | MCIC_VB_FP |
|
MCIC_VB_WP | MCIC_VB_MS | MCIC_VB_PM | MCIC_VB_IA | MCIC_VB_FP |
|
||||||
MCIC_VB_GR | MCIC_VB_CR | MCIC_VB_ST | MCIC_VB_AR | MCIC_VB_PR |
|
MCIC_VB_GR | MCIC_VB_CR | MCIC_VB_ST | MCIC_VB_AR | MCIC_VB_PR |
|
||||||
MCIC_VB_FC | MCIC_VB_CT | MCIC_VB_CC;
|
MCIC_VB_FC | MCIC_VB_CT | MCIC_VB_CC;
|
||||||
if (kvm_check_extension(kvm_state, KVM_CAP_S390_VECTOR_REGISTERS)) {
|
if (s390_has_feat(S390_FEAT_VECTOR)) {
|
||||||
mcic |= MCIC_VB_VR;
|
mcic |= MCIC_VB_VR;
|
||||||
}
|
}
|
||||||
return mcic;
|
return mcic;
|
||||||
|
|
|
@ -78,12 +78,7 @@ static const VMStateDescription vmstate_fpu = {
|
||||||
|
|
||||||
static bool vregs_needed(void *opaque)
|
static bool vregs_needed(void *opaque)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_KVM
|
return s390_has_feat(S390_FEAT_VECTOR);
|
||||||
if (kvm_enabled()) {
|
|
||||||
return kvm_check_extension(kvm_state, KVM_CAP_S390_VECTOR_REGISTERS);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const VMStateDescription vmstate_vregs = {
|
static const VMStateDescription vmstate_vregs = {
|
||||||
|
@ -147,12 +142,7 @@ static const VMStateDescription vmstate_vregs = {
|
||||||
|
|
||||||
static bool riccb_needed(void *opaque)
|
static bool riccb_needed(void *opaque)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_KVM
|
return s390_has_feat(S390_FEAT_RUNTIME_INSTRUMENTATION);
|
||||||
if (kvm_enabled()) {
|
|
||||||
return kvm_s390_get_ri();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const VMStateDescription vmstate_riccb = {
|
const VMStateDescription vmstate_riccb = {
|
||||||
|
|
Loading…
Reference in New Issue