diff options
-rw-r--r-- | target-s390x/cpu_models.c | 25 | ||||
-rw-r--r-- | target-s390x/cpu_models.h | 2 | ||||
-rw-r--r-- | target-s390x/kvm.c | 4 | ||||
-rw-r--r-- | target-s390x/machine.c | 14 |
4 files changed, 31 insertions, 14 deletions
diff --git a/target-s390x/cpu_models.c b/target-s390x/cpu_models.c index 57e3bd0a59..3545bad4d6 100644 --- a/target-s390x/cpu_models.c +++ b/target-s390x/cpu_models.c @@ -73,6 +73,31 @@ static S390CPUDef s390_cpu_defs[] = { 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 { FILE *f; fprintf_function print; diff --git a/target-s390x/cpu_models.h b/target-s390x/cpu_models.h index f3f3f3c32b..cca865d3b8 100644 --- a/target-s390x/cpu_models.h +++ b/target-s390x/cpu_models.h @@ -49,4 +49,6 @@ typedef struct S390CPUModel { uint8_t cpu_ver; /* CPU version, usually "ff" for kvm */ } S390CPUModel; +bool s390_has_feat(S390Feat feat); + #endif /* TARGET_S390X_CPU_MODELS_H */ diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c index 4341d54969..4f32a6b4a0 100644 --- a/target-s390x/kvm.c +++ b/target-s390x/kvm.c @@ -1539,7 +1539,7 @@ static void sigp_store_adtl_status(void *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); 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_GR | MCIC_VB_CR | MCIC_VB_ST | MCIC_VB_AR | MCIC_VB_PR | 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; } return mcic; diff --git a/target-s390x/machine.c b/target-s390x/machine.c index aa39e5daa4..edc3a4717b 100644 --- a/target-s390x/machine.c +++ b/target-s390x/machine.c @@ -78,12 +78,7 @@ static const VMStateDescription vmstate_fpu = { static bool vregs_needed(void *opaque) { -#ifdef CONFIG_KVM - if (kvm_enabled()) { - return kvm_check_extension(kvm_state, KVM_CAP_S390_VECTOR_REGISTERS); - } -#endif - return 0; + return s390_has_feat(S390_FEAT_VECTOR); } static const VMStateDescription vmstate_vregs = { @@ -147,12 +142,7 @@ static const VMStateDescription vmstate_vregs = { static bool riccb_needed(void *opaque) { -#ifdef CONFIG_KVM - if (kvm_enabled()) { - return kvm_s390_get_ri(); - } -#endif - return 0; + return s390_has_feat(S390_FEAT_RUNTIME_INSTRUMENTATION); } const VMStateDescription vmstate_riccb = { |