From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58837) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZyCYg-0007ic-L1 for qemu-devel@nongnu.org; Mon, 16 Nov 2015 00:42:32 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZyCYf-0007rP-9M for qemu-devel@nongnu.org; Mon, 16 Nov 2015 00:42:30 -0500 Date: Mon, 16 Nov 2015 16:09:35 +1100 From: David Gibson Message-ID: <20151116050935.GE2747@voom.fritz.box> References: <1447201710-10229-1-git-send-email-benh@kernel.crashing.org> <1447201710-10229-7-git-send-email-benh@kernel.crashing.org> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="3XA6nns4nE4KvaS/" Content-Disposition: inline In-Reply-To: <1447201710-10229-7-git-send-email-benh@kernel.crashing.org> Subject: Re: [Qemu-devel] [Qemu-ppc] [PATCH 06/77] ppc: Add macros to register hypervisor mode SPRs List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Benjamin Herrenschmidt Cc: qemu-ppc@nongnu.org, qemu-devel@nongnu.org --3XA6nns4nE4KvaS/ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Wed, Nov 11, 2015 at 11:27:19AM +1100, Benjamin Herrenschmidt wrote: > The current set of spr_register_* macros only take the user and > supervisor function pointers. To make the transition easy, we > don't change that but we add "_hv" variants that can be used to > register all 3 sets. >=20 > To simplify the transition, users of the "old" macro will set the > hypervisor callback to be the same as the supervisor one. The new > registration function only needs to be used for registers that are > either hypervisor only or behave differently in HV mode. >=20 > Signed-off-by: Benjamin Herrenschmidt Reviewed-by: David Gibson > --- > target-ppc/translate.c | 26 ++++++++++++++++---------- > target-ppc/translate_init.c | 35 +++++++++++++++++++++++++++++++---- > 2 files changed, 47 insertions(+), 14 deletions(-) >=20 > diff --git a/target-ppc/translate.c b/target-ppc/translate.c > index e18d204..a2fe1b5 100644 > --- a/target-ppc/translate.c > +++ b/target-ppc/translate.c > @@ -4299,14 +4299,17 @@ static inline void gen_op_mfspr(DisasContext *ctx) > void (*read_cb)(DisasContext *ctx, int gprn, int sprn); > uint32_t sprn =3D SPR(ctx->opcode); > =20 > -#if !defined(CONFIG_USER_ONLY) > - if (ctx->hv) > +#if defined(CONFIG_USER_ONLY) > + read_cb =3D ctx->spr_cb[sprn].uea_read; > +#else > + if (ctx->pr) { > + read_cb =3D ctx->spr_cb[sprn].uea_read; > + } else if (ctx->hv) { > read_cb =3D ctx->spr_cb[sprn].hea_read; > - else if (!ctx->pr) > + } else if (!ctx->pr) { > read_cb =3D ctx->spr_cb[sprn].oea_read; > - else > + } > #endif > - read_cb =3D ctx->spr_cb[sprn].uea_read; > if (likely(read_cb !=3D NULL)) { > if (likely(read_cb !=3D SPR_NOACCESS)) { > (*read_cb)(ctx, rD(ctx->opcode), sprn); > @@ -4450,14 +4453,17 @@ static void gen_mtspr(DisasContext *ctx) > void (*write_cb)(DisasContext *ctx, int sprn, int gprn); > uint32_t sprn =3D SPR(ctx->opcode); > =20 > -#if !defined(CONFIG_USER_ONLY) > - if (ctx->hv) > +#if defined(CONFIG_USER_ONLY) > + write_cb =3D ctx->spr_cb[sprn].uea_write; > +#else > + if (ctx->pr) { > + write_cb =3D ctx->spr_cb[sprn].uea_write; > + } else if (ctx->hv) { > write_cb =3D ctx->spr_cb[sprn].hea_write; > - else if (!ctx->pr) > + } else { > write_cb =3D ctx->spr_cb[sprn].oea_write; > - else > + } > #endif > - write_cb =3D ctx->spr_cb[sprn].uea_write; > if (likely(write_cb !=3D NULL)) { > if (likely(write_cb !=3D SPR_NOACCESS)) { > (*write_cb)(ctx, sprn, rS(ctx->opcode)); > diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c > index e88dc7f..30a03ce 100644 > --- a/target-ppc/translate_init.c > +++ b/target-ppc/translate_init.c > @@ -578,17 +578,33 @@ static inline void vscr_init (CPUPPCState *env, uin= t32_t val) > #define spr_register_kvm(env, num, name, uea_read, uea_write, = \ > oea_read, oea_write, one_reg_id, initial_value)= \ > _spr_register(env, num, name, uea_read, uea_write, initial_value) > +#define spr_register_kvm_hv(env, num, name, uea_read, uea_write, = \ > + oea_read, oea_write, hea_read, hea_write, = \ > + one_reg_id, initial_value) = \ > + _spr_register(env, num, name, uea_read, uea_write, initial_value) > #else > #if !defined(CONFIG_KVM) > #define spr_register_kvm(env, num, name, uea_read, uea_write, = \ > - oea_read, oea_write, one_reg_id, initial_value)= \ > + oea_read, oea_write, one_reg_id, initial_value)= \ > + _spr_register(env, num, name, uea_read, uea_write, = \ > + oea_read, oea_write, oea_read, oea_write, initial_valu= e) > +#define spr_register_kvm_hv(env, num, name, uea_read, uea_write, = \ > + oea_read, oea_write, hea_read, hea_write, = \ > + one_reg_id, initial_value) = \ > _spr_register(env, num, name, uea_read, uea_write, = \ > - oea_read, oea_write, initial_value) > + oea_read, oea_write, hea_read, hea_write, initial_valu= e) > #else > #define spr_register_kvm(env, num, name, uea_read, uea_write, = \ > - oea_read, oea_write, one_reg_id, initial_value)= \ > + oea_read, oea_write, one_reg_id, initial_value)= \ > + _spr_register(env, num, name, uea_read, uea_write, = \ > + oea_read, oea_write, oea_read, oea_write, = \ > + one_reg_id, initial_value) > +#define spr_register_kvm_hv(env, num, name, uea_read, uea_write, = \ > + oea_read, oea_write, hea_read, hea_write, = \ > + one_reg_id, initial_value) = \ > _spr_register(env, num, name, uea_read, uea_write, = \ > - oea_read, oea_write, one_reg_id, initial_value) > + oea_read, oea_write, hea_read, hea_write, = \ > + one_reg_id, initial_value) > #endif > #endif > =20 > @@ -597,6 +613,13 @@ static inline void vscr_init (CPUPPCState *env, uint= 32_t val) > spr_register_kvm(env, num, name, uea_read, uea_write, = \ > oea_read, oea_write, 0, initial_value) > =20 > +#define spr_register_hv(env, num, name, uea_read, uea_write, = \ > + oea_read, oea_write, hea_read, hea_write, = \ > + initial_value) = \ > + spr_register_kvm_hv(env, num, name, uea_read, uea_write, = \ > + oea_read, oea_write, hea_read, hea_write, = \ > + 0, initial_value) > + > static inline void _spr_register(CPUPPCState *env, int num, > const char *name, > void (*uea_read)(DisasContext *ctx, int= gprn, int sprn), > @@ -605,6 +628,8 @@ static inline void _spr_register(CPUPPCState *env, in= t num, > =20 > void (*oea_read)(DisasContext *ctx, int= gprn, int sprn), > void (*oea_write)(DisasContext *ctx, in= t sprn, int gprn), > + void (*hea_read)(DisasContext *opaque, = int gprn, int sprn), > + void (*hea_write)(DisasContext *opaque,= int sprn, int gprn), > #endif > #if defined(CONFIG_KVM) > uint64_t one_reg_id, > @@ -632,6 +657,8 @@ static inline void _spr_register(CPUPPCState *env, in= t num, > #if !defined(CONFIG_USER_ONLY) > spr->oea_read =3D oea_read; > spr->oea_write =3D oea_write; > + spr->hea_read =3D hea_read; > + spr->hea_write =3D hea_write; > #endif > #if defined(CONFIG_KVM) > spr->one_reg_id =3D one_reg_id, --=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 --3XA6nns4nE4KvaS/ Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJWSWUOAAoJEGw4ysog2bOSHsMP/3Zfgxik8FUGJ1lMqle5Jg2E mJLhnqsAPD7EWkJhTyDFo2R6wd6nsj64HB/V5pRqWNWxTADIAyar+8on7M1L2SA7 YFWuqZfvS5B5RSs0Yt5jUTJFsg/fPs4W7h8MP2sl27ia67aqPh2HoPoMnARLBbZr Ln1vmFhYKahAGVFAWMfJbH2fQjSDUheiDHh95TLlX7oqFdSbCMMzpNQZijqLYW5y +Sldp2QY+gOa9zx7eeS49l06CGxm2lclptrnz+edYC7/I8SovkHlyrxBH+xR8SvK Q0TIYe0cxRWt52Gw/f4ZaViXJ3Gh1g/4Y2xt2/9RPRTtUDor74eBQMteB9G8hX6O 9Zd2yDomBHbEmEMCXTsZf3FSPPy8wMslmsw+UUtsj+Qy+FezYz6hoiSw53AB0jyi czb2t0J7F7lyPezZcdf18iAS0QKHIRRhWyTcjQq1klJC9aDhurRywAJp6cJ2WYs0 FJ2E3OsnAL+pWe0bLS1s51feZMDBuT6yGp41u/fFUm0MfIXqBffsx1QYBQ40X55E FimoKc7v1os5PwHqGSWQfUpwE0fXgOSaRaRNK6zlPTkm3mnHx69osQgC02m0Ufyn qpU7t5U2cDyAxyViTyVX1cUrhmxMmIYXGcLJ/g+YXVGU03Dk+HtvWTTRj0LlYK+p L46bkmnlWjgmkirBfWzV =EcXm -----END PGP SIGNATURE----- --3XA6nns4nE4KvaS/--