From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50950) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bWmYV-0001Z2-S0 for qemu-devel@nongnu.org; Mon, 08 Aug 2016 11:33:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bWmYQ-0005Bo-GL for qemu-devel@nongnu.org; Mon, 08 Aug 2016 11:33:30 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:43429 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bWmYQ-0005BY-BT for qemu-devel@nongnu.org; Mon, 08 Aug 2016 11:33:26 -0400 Received: from pps.filterd (m0098421.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.11/8.16.0.11) with SMTP id u78FOkuw077837 for ; Mon, 8 Aug 2016 11:33:26 -0400 Received: from e06smtp15.uk.ibm.com (e06smtp15.uk.ibm.com [195.75.94.111]) by mx0a-001b2d01.pphosted.com with ESMTP id 24nbvwdd9r-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Mon, 08 Aug 2016 11:33:25 -0400 Received: from localhost by e06smtp15.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 8 Aug 2016 16:33:24 +0100 Received: from b06cxnps4076.portsmouth.uk.ibm.com (d06relay13.portsmouth.uk.ibm.com [9.149.109.198]) by d06dlp02.portsmouth.uk.ibm.com (Postfix) with ESMTP id 0BF122190069 for ; Mon, 8 Aug 2016 16:32:48 +0100 (BST) Received: from d06av02.portsmouth.uk.ibm.com (d06av02.portsmouth.uk.ibm.com [9.149.37.228]) by b06cxnps4076.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id u78FXMA37602610 for ; Mon, 8 Aug 2016 15:33:22 GMT Received: from d06av02.portsmouth.uk.ibm.com (localhost [127.0.0.1]) by d06av02.portsmouth.uk.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id u78FXMv4032460 for ; Mon, 8 Aug 2016 09:33:22 -0600 From: David Hildenbrand Date: Mon, 8 Aug 2016 17:32:40 +0200 In-Reply-To: <1470670378-53732-1-git-send-email-dahi@linux.vnet.ibm.com> References: <1470670378-53732-1-git-send-email-dahi@linux.vnet.ibm.com> Message-Id: <1470670378-53732-12-git-send-email-dahi@linux.vnet.ibm.com> Subject: [Qemu-devel] [Patch v2 11/29] s390x/cpumodel: let the CPU model handle feature checks List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: ehabkost@redhat.com, jdenemar@redhat.com, imammedo@redhat.com, cornelia.huck@de.ibm.com, borntraeger@de.ibm.com, fiuczy@linux.vnet.ibm.com, mimu@linux.vnet.ibm.com 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 Signed-off-by: David Hildenbrand --- target-s390x/cpu_models.c | 24 ++++++++++++++++++++++++ target-s390x/cpu_models.h | 2 ++ target-s390x/kvm.c | 4 ++-- target-s390x/machine.c | 14 ++------------ 4 files changed, 30 insertions(+), 14 deletions(-) diff --git a/target-s390x/cpu_models.c b/target-s390x/cpu_models.c index 5f218c2..d135661 100644 --- a/target-s390x/cpu_models.c +++ b/target-s390x/cpu_models.c @@ -73,6 +73,30 @@ static const 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 244256b..fe988cc 100644 --- a/target-s390x/cpu_models.h +++ b/target-s390x/cpu_models.h @@ -43,4 +43,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 80ac621..55bf6d7 100644 --- a/target-s390x/kvm.c +++ b/target-s390x/kvm.c @@ -1517,7 +1517,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; } @@ -2089,7 +2089,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 aa39e5d..edc3a47 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 = { -- 2.6.6