Commit 7c72ac49 authored by David Hildenbrand's avatar David Hildenbrand Committed by Cornelia Huck
Browse files

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: default avatarCornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: default avatarDavid Hildenbrand <dahi@linux.vnet.ibm.com>
Message-Id: <20160905085244.99980-12-dahi@linux.vnet.ibm.com>
Signed-off-by: default avatarCornelia Huck <cornelia.huck@de.ibm.com>
parent 0754f604
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -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;
+2 −0
Original line number Diff line number Diff line
@@ -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 */
+2 −2
Original line number Diff line number Diff line
@@ -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;
+2 −12
Original line number Diff line number Diff line
@@ -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 = {