From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39296) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ahqEu-0003L7-37 for qemu-devel@nongnu.org; Sun, 20 Mar 2016 23:10:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ahqEq-0006hN-Pq for qemu-devel@nongnu.org; Sun, 20 Mar 2016 23:10:44 -0400 Date: Mon, 21 Mar 2016 14:06:54 +1100 From: David Gibson Message-ID: <20160321030654.GC23586@voom.redhat.com> References: <1458134034-32500-1-git-send-email-clg@fr.ibm.com> <1458134034-32500-8-git-send-email-clg@fr.ibm.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="hYooF8G/hrfVAmum" Content-Disposition: inline In-Reply-To: <1458134034-32500-8-git-send-email-clg@fr.ibm.com> Subject: Re: [Qemu-devel] [PATCH v2 07/10] ppc: Fix writing to AMR/UAMOR List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: =?iso-8859-1?Q?C=E9dric?= Le Goater Cc: Thomas Huth , qemu-ppc@nongnu.org, qemu-devel@nongnu.org --hYooF8G/hrfVAmum Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Wed, Mar 16, 2016 at 02:13:51PM +0100, C=E9dric Le Goater wrote: > From: Benjamin Herrenschmidt >=20 > The masks weren't chosen nor applied properly. The architecture specifies > that writes to AMR are masked by UAMOR for PR=3D1, otherwise AMOR for HV= =3D0. >=20 > The writes to UAMOR are masked by AMOR for HV=3D0 >=20 > Signed-off-by: Benjamin Herrenschmidt > [clg: moved gen_spr_amr() prototype change to next patch ] > Signed-off-by: C=E9dric Le Goater Reviewed-by: David Gibson > --- > target-ppc/translate_init.c | 74 ++++++++++++++++++++++++++++++++++++---= ------ > 1 file changed, 59 insertions(+), 15 deletions(-) >=20 > diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c > index b1d1949d24e2..4514188ff07c 100644 > --- a/target-ppc/translate_init.c > +++ b/target-ppc/translate_init.c > @@ -1063,26 +1063,68 @@ static void gen_spr_7xx (CPUPPCState *env) > =20 > #ifdef TARGET_PPC64 > #ifndef CONFIG_USER_ONLY > -static void spr_read_uamr (DisasContext *ctx, int gprn, int sprn) > +static void spr_write_amr(DisasContext *ctx, int sprn, int gprn) > { > - gen_load_spr(cpu_gpr[gprn], SPR_AMR); > - spr_load_dump_spr(SPR_AMR); > -} > + TCGv t0 =3D tcg_temp_new(); > + TCGv t1 =3D tcg_temp_new(); > + TCGv t2 =3D tcg_temp_new(); > =20 > -static void spr_write_uamr (DisasContext *ctx, int sprn, int gprn) > -{ > - gen_store_spr(SPR_AMR, cpu_gpr[gprn]); > + /* Note, the HV=3D1 PR=3D0 case is handled earlier by simply using > + * spr_write_generic for HV mode in the SPR table > + */ > + > + /* Build insertion mask into t1 based on context */ > + if (ctx->pr) { > + gen_load_spr(t1, SPR_UAMOR); > + } else { > + gen_load_spr(t1, SPR_AMOR); > + } > + > + /* Mask new bits into t2 */ > + tcg_gen_and_tl(t2, t1, cpu_gpr[gprn]); > + > + /* Load AMR and clear new bits in t0 */ > + gen_load_spr(t0, SPR_AMR); > + tcg_gen_andc_tl(t0, t0, t1); > + > + /* Or'in new bits and write it out */ > + tcg_gen_or_tl(t0, t0, t2); > + gen_store_spr(SPR_AMR, t0); > spr_store_dump_spr(SPR_AMR); > + > + tcg_temp_free(t0); > + tcg_temp_free(t1); > + tcg_temp_free(t2); > } > =20 > -static void spr_write_uamr_pr (DisasContext *ctx, int sprn, int gprn) > +static void spr_write_uamor(DisasContext *ctx, int sprn, int gprn) > { > TCGv t0 =3D tcg_temp_new(); > + TCGv t1 =3D tcg_temp_new(); > + TCGv t2 =3D tcg_temp_new(); > + > + /* Note, the HV=3D1 case is handled earlier by simply using > + * spr_write_generic for HV mode in the SPR table > + */ > =20 > + /* Build insertion mask into t1 based on context */ > + gen_load_spr(t1, SPR_AMOR); > + > + /* Mask new bits into t2 */ > + tcg_gen_and_tl(t2, t1, cpu_gpr[gprn]); > + > + /* Load AMR and clear new bits in t0 */ > gen_load_spr(t0, SPR_UAMOR); > - tcg_gen_and_tl(t0, t0, cpu_gpr[gprn]); > - gen_store_spr(SPR_AMR, t0); > - spr_store_dump_spr(SPR_AMR); > + tcg_gen_andc_tl(t0, t0, t1); > + > + /* Or'in new bits and write it out */ > + tcg_gen_or_tl(t0, t0, t2); > + gen_store_spr(SPR_UAMOR, t0); > + spr_store_dump_spr(SPR_UAMOR); > + > + tcg_temp_free(t0); > + tcg_temp_free(t1); > + tcg_temp_free(t2); > } > #endif /* CONFIG_USER_ONLY */ > =20 > @@ -1094,15 +1136,17 @@ static void gen_spr_amr (CPUPPCState *env) > * userspace accessible, 29 is privileged. So we only need to set > * the kvm ONE_REG id on one of them, we use 29 */ > spr_register(env, SPR_UAMR, "UAMR", > - &spr_read_uamr, &spr_write_uamr_pr, > - &spr_read_uamr, &spr_write_uamr, > + &spr_read_generic, &spr_write_amr, > + &spr_read_generic, &spr_write_amr, > 0); > - spr_register_kvm(env, SPR_AMR, "AMR", > + spr_register_kvm_hv(env, SPR_AMR, "AMR", > SPR_NOACCESS, SPR_NOACCESS, > + &spr_read_generic, &spr_write_amr, > &spr_read_generic, &spr_write_generic, > KVM_REG_PPC_AMR, 0); > - spr_register_kvm(env, SPR_UAMOR, "UAMOR", > + spr_register_kvm_hv(env, SPR_UAMOR, "UAMOR", > SPR_NOACCESS, SPR_NOACCESS, > + &spr_read_generic, &spr_write_uamor, > &spr_read_generic, &spr_write_generic, > KVM_REG_PPC_UAMOR, 0); > spr_register_hv(env, SPR_AMOR, "AMOR", --=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 --hYooF8G/hrfVAmum Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJW72VOAAoJEGw4ysog2bOSmmUQALhSlob7HBtqIpmJdStB1uM5 3D0qC7teVnJpFsc5y1vSwU0nWOagYuImYXMlmxKzjOKTLwFWt4So2WVFqQfKerGA Ljqp5tsZ04/olKlHQNr96R8l31VlxF/KGH3rZqgInn80FprwihuhTVNiDQUFnbve okdzK6kGJTinCGGjCRuLoDzLqt18mfz1bwKGSQ2ceFJbUK4LJZPvCEAoAeK23jLt 478UO7oqgut6YAb/LkZ7s+NhXD5R4myRotQoz+pvu29/EyAY/T1J5ZyKQ6murt3I aApYoRsKoz61pXuLlRvz3rWFMwLvNwUfqGmFMJ+3mCEKHcV+bmcjRDTmns7ci7HH uTKVtEsL6Rr27ff+C6pzzzvONVyOHel7KmEffkj0T+3FYNaaPdcWM1hlWIu4xl+o QcbDc0uxlLApDPsnplO4f75CA91OoFs8MHVVb9w/ZP+Qz8fvUpArCgXDmZN5r9kl MFQaZVHWO45SuHtlJ/1ZEWGKXmhXzaWVcRLrrJ9CQiAVoaaTHiTJSpqUXzdragO6 EeshIefgRjCsEVtXvzzys0/kFoV66yFjqVPgZ8FHduVuFaKG70W9S9m0LfyRKTRX l3su4TJ73nlp2+7p9m2G3OvDn3UMPZixcSQWctNd4amTV8VUbGtQbGLss/7tk4r7 c4jAsrZPoH/Sq6gpgeXp =xms+ -----END PGP SIGNATURE----- --hYooF8G/hrfVAmum--