From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34620) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c3z4X-0000Hk-In for qemu-devel@nongnu.org; Tue, 08 Nov 2016 00:35:51 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c3z4T-0002Ec-Ow for qemu-devel@nongnu.org; Tue, 08 Nov 2016 00:35:49 -0500 Date: Tue, 8 Nov 2016 14:49:30 +1100 From: David Gibson Message-ID: <20161108034930.GP28688@umbus.fritz.box> References: <1477825928-10803-1-git-send-email-david@gibson.dropbear.id.au> <1477825928-10803-8-git-send-email-david@gibson.dropbear.id.au> <4149b9cb-9a41-ed27-3f08-503548485f90@ozlabs.ru> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="v9g2r9e2kvGs7M7R" Content-Disposition: inline In-Reply-To: <4149b9cb-9a41-ed27-3f08-503548485f90@ozlabs.ru> Subject: Re: [Qemu-devel] [RFC 07/17] ppc: Rewrite ppc_set_compat() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Alexey Kardashevskiy Cc: nikunj@linux.vnet.ibm.com, mdroth@linux.vnet.ibm.com, thuth@redhat.com, lvivier@redhat.com, qemu-ppc@nongnu.org, qemu-devel@nongnu.org --v9g2r9e2kvGs7M7R Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Fri, Nov 04, 2016 at 01:57:45PM +1100, Alexey Kardashevskiy wrote: > On 30/10/16 22:11, David Gibson wrote: > > This rewrites the ppc_set_compat() function so that instead of open cod= ing > > the various compatibility modes, it reads the relevant data from a tabl= e. > > This is a first step in consolidating the information on compatibility > > modes scattered across the code into a single place. > >=20 > > It also makes one change to the logic. The old code masked the bits to= be > > set in the PCR (Processor Compatibility Register) by which bits are val= id > > on the host CPU. This made no sense, since it was done regardless of > > whether our guest CPU was the same as the host CPU or not. Futhermore, >=20 > s/Futhermore/Furthermore/ >=20 >=20 > > the actual PCR bits are only relevant for TCG[1] - KVM instead uses the > > compatibility mode we tell it in kvmppc_set_compat(). When using TCG > > host cpu information usually isn't even present. > >=20 > > While we're at it, we put the new implementation in a new file to make = the > > enormouse translate_init.c a little smaller. >=20 > s/enormouse/enormous/ Thanks, spelling corrections applied. >=20 >=20 > >=20 > > [1] Actually it doesn't even do anything in TCG, but it will if / when = we > > get to implementing compatibility mode logic at that level. > >=20 > > Signed-off-by: David Gibson >=20 > Reviewed-by: Alexey Kardashevskiy >=20 > > --- > > target-ppc/Makefile.objs | 1 + > > target-ppc/compat.c | 91 +++++++++++++++++++++++++++++++++++++= ++++++++ > > target-ppc/cpu.h | 6 ++- > > target-ppc/translate_init.c | 41 -------------------- > > 4 files changed, 97 insertions(+), 42 deletions(-) > > create mode 100644 target-ppc/compat.c > >=20 > > diff --git a/target-ppc/Makefile.objs b/target-ppc/Makefile.objs > > index e667e69..feb5c30 100644 > > --- a/target-ppc/Makefile.objs > > +++ b/target-ppc/Makefile.objs > > @@ -15,3 +15,4 @@ obj-y +=3D misc_helper.o > > obj-y +=3D mem_helper.o > > obj-$(CONFIG_USER_ONLY) +=3D user_only_helper.o > > obj-y +=3D gdbstub.o > > +obj-$(TARGET_PPC64) +=3D compat.o > > diff --git a/target-ppc/compat.c b/target-ppc/compat.c > > new file mode 100644 > > index 0000000..f3fd9c6 > > --- /dev/null > > +++ b/target-ppc/compat.c > > @@ -0,0 +1,91 @@ > > +/* > > + * PowerPC CPU initialization for qemu. > > + * > > + * Copyright 2016, David Gibson, Red Hat Inc. > > + * > > + * This library is free software; you can redistribute it and/or > > + * modify it under the terms of the GNU Lesser General Public > > + * License as published by the Free Software Foundation; either > > + * version 2 of the License, or (at your option) any later version. > > + * > > + * This library is distributed in the hope that it will be useful, > > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > > + * Lesser General Public License for more details. > > + * > > + * You should have received a copy of the GNU Lesser General Public > > + * License along with this library; if not, see . > > + */ > > + > > +#include "qemu/osdep.h" > > +#include "sysemu/kvm.h" > > +#include "kvm_ppc.h" > > +#include "sysemu/cpus.h" > > +#include "qemu/error-report.h" > > +#include "qapi/error.h" > > +#include "cpu-models.h" > > + > > +typedef struct { > > + uint32_t pvr; > > + uint64_t pcr; > > +} CompatInfo; > > + > > +static const CompatInfo compat_table[] =3D { > > + { /* POWER6, ISA2.05 */ > > + .pvr =3D CPU_POWERPC_LOGICAL_2_05, > > + .pcr =3D PCR_COMPAT_2_07 | PCR_COMPAT_2_06 | PCR_COMPAT_2_05 > > + | PCR_TM_DIS | PCR_VSX_DIS, > > + }, > > + { /* POWER7, ISA2.06 */ > > + .pvr =3D CPU_POWERPC_LOGICAL_2_06, > > + .pcr =3D PCR_COMPAT_2_07 | PCR_COMPAT_2_06 | PCR_TM_DIS, > > + }, > > + { > > + .pvr =3D CPU_POWERPC_LOGICAL_2_06_PLUS, > > + .pcr =3D PCR_COMPAT_2_07 | PCR_COMPAT_2_06 | PCR_TM_DIS, > > + }, > > + { /* POWER8, ISA2.07 */ > > + .pvr =3D CPU_POWERPC_LOGICAL_2_07, > > + .pcr =3D PCR_COMPAT_2_07, > > + }, > > +}; > > + > > +static const CompatInfo *compat_by_pvr(uint32_t pvr) > > +{ > > + int i; > > + > > + for (i =3D 0; i < ARRAY_SIZE(compat_table); i++) { > > + if (compat_table[i].pvr =3D=3D pvr) { > > + return &compat_table[i]; > > + } > > + } > > + return NULL; > > +} > > + > > +void ppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr, Error **errp) > > +{ > > + const CompatInfo *compat =3D compat_by_pvr(compat_pvr); > > + CPUPPCState *env =3D &cpu->env; > > + PowerPCCPUClass *pcc =3D POWERPC_CPU_GET_CLASS(cpu); > > + uint64_t pcr; > > + > > + if (!compat_pvr) { > > + pcr =3D 0; > > + } else if (!compat) { > > + error_setg(errp, "Unknown compatibility PVR 0x%08"PRIx32, comp= at_pvr); > > + return; > > + } else { > > + pcr =3D compat->pcr; > > + } > > + > > + cpu->compat_pvr =3D compat_pvr; > > + env->spr[SPR_PCR] =3D pcr & pcc->pcr_mask; > > + > > + if (kvm_enabled()) { > > + int ret =3D kvmppc_set_compat(cpu, cpu->compat_pvr); > > + if (ret < 0) { > > + error_setg_errno(errp, -ret, > > + "Unable to set CPU compatibility mode in = KVM"); > > + } > > + } > > +} > > diff --git a/target-ppc/cpu.h b/target-ppc/cpu.h > > index f7656cb..15d5e4b 100644 > > --- a/target-ppc/cpu.h > > +++ b/target-ppc/cpu.h > > @@ -1243,7 +1243,6 @@ void ppc_store_msr (CPUPPCState *env, target_ulon= g value); > > void ppc_cpu_list (FILE *f, fprintf_function cpu_fprintf); > > int ppc_get_compat_smt_threads(PowerPCCPU *cpu); > > #if defined(TARGET_PPC64) > > -void ppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr, Error **errp= ); > > #endif > > =20 > > /* Time-base and decrementer management */ > > @@ -1314,6 +1313,11 @@ static inline int cpu_mmu_index (CPUPPCState *en= v, bool ifetch) > > return ifetch ? env->immu_idx : env->dmmu_idx; > > } > > =20 > > +/* Compatibility modes */ > > +#if defined(TARGET_PPC64) > > +void ppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr, Error **errp= ); > > +#endif /* defined(TARGET_PPC64) */ > > + > > #include "exec/cpu-all.h" > > =20 > > /*********************************************************************= ********/ > > diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c > > index c35065d..a70eafb 100644 > > --- a/target-ppc/translate_init.c > > +++ b/target-ppc/translate_init.c > > @@ -9972,47 +9972,6 @@ int ppc_get_compat_smt_threads(PowerPCCPU *cpu) > > return ret; > > } > > =20 > > -#ifdef TARGET_PPC64 > > -void ppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr, Error **errp) > > -{ > > - int ret =3D 0; > > - CPUPPCState *env =3D &cpu->env; > > - PowerPCCPUClass *host_pcc; > > - > > - cpu->compat_pvr =3D compat_pvr; > > - > > - switch (compat_pvr) { > > - case CPU_POWERPC_LOGICAL_2_05: > > - env->spr[SPR_PCR] =3D PCR_TM_DIS | PCR_VSX_DIS | PCR_COMPAT_2_= 07 | > > - PCR_COMPAT_2_06 | PCR_COMPAT_2_05; > > - break; > > - case CPU_POWERPC_LOGICAL_2_06: > > - case CPU_POWERPC_LOGICAL_2_06_PLUS: > > - env->spr[SPR_PCR] =3D PCR_TM_DIS | PCR_COMPAT_2_07 | PCR_COMPA= T_2_06; > > - break; > > - case CPU_POWERPC_LOGICAL_2_07: > > - env->spr[SPR_PCR] =3D PCR_COMPAT_2_07; > > - break; > > - default: > > - env->spr[SPR_PCR] =3D 0; > > - break; > > - } > > - > > - host_pcc =3D kvm_ppc_get_host_cpu_class(); > > - if (host_pcc) { > > - env->spr[SPR_PCR] &=3D host_pcc->pcr_mask; > > - } > > - > > - if (kvm_enabled()) { > > - ret =3D kvmppc_set_compat(cpu, cpu->compat_pvr); > > - if (ret < 0) { > > - error_setg_errno(errp, -ret, > > - "Unable to set CPU compatibility mode in = KVM"); > > - } > > - } > > -} > > -#endif > > - > > static gint ppc_cpu_compare_class_pvr(gconstpointer a, gconstpointer b) > > { > > ObjectClass *oc =3D (ObjectClass *)a; > >=20 >=20 >=20 --=20 David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson --v9g2r9e2kvGs7M7R Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAEBCAAGBQJYIUtKAAoJEGw4ysog2bOS0TYP/RyfUuBNProJ1DgLq4FFPjeK ICOWB3NoD2qizCJAJu2AljTHnJcGXlpt/+ulJZem84CPMx53oGUhtX75GoWZGd5K s+GEB/itEYIVDC/EP3cdwJsi/Kyxwny2OBBCqVK82KQ/6XP3wQzYLu3Orb0MMxio cvAhz2WqIQLzsg5bkON2AXBI17O1HEW++RluCttfKnZJVyoxslxNKLNJCsXUqsyB uBimsaaI+VQr42mNzycLmniCMYcZ9jHpE9TNVQ/qcwtPV3kefXdrww1ZDxs1/uuD 99Ujj3nKXj5LB0g0jci+L2rQ8Bz+zJf7TE9qfMKwJ0mP0/uPxDC4rfVYG33lYeeg euDzwUHUxMKuFj7u1WQLSLi7Nj+nHjumXBBDnoe+2OTAmczRyHcBYHbc+BjKmree KANUAbBlOSgR0vBmqpoqovY/tKB58kkseGNeQIe1C1XCIJm6Gh6wC1KNmBZPCx77 7erN5XkpgMEznY0TdF6AKtLAD1//cUevOqkczp9yhkHcHUzDAK7Jh4nXd0xNBtcZ m3InzB2ZwitiU1XCEOdE0/Xk0Map5Ql0qURAbyRDvJ+9YIiYJZY4tgTFRucgad1n zVPsOdZ/p+IRMqeAGbYlihu9fLHKMMCsqqYqomyd0WzLax4pn7EDjghoKzI6wD4v WNqIen0u4iZgCbIMS5Am =+U0e -----END PGP SIGNATURE----- --v9g2r9e2kvGs7M7R--