From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51227) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1afXZQ-0004iE-HQ for qemu-devel@nongnu.org; Mon, 14 Mar 2016 14:50:25 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1afXZM-0005JI-0K for qemu-devel@nongnu.org; Mon, 14 Mar 2016 14:50:24 -0400 References: <1457974600-13828-1-git-send-email-clg@fr.ibm.com> <1457974600-13828-3-git-send-email-clg@fr.ibm.com> From: Thomas Huth Message-ID: <56E707E7.8050204@redhat.com> Date: Mon, 14 Mar 2016 19:50:15 +0100 MIME-Version: 1.0 In-Reply-To: <1457974600-13828-3-git-send-email-clg@fr.ibm.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH 02/17] ppc: Add macros to register hypervisor mode SPRs List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: =?UTF-8?Q?C=c3=a9dric_Le_Goater?= , David Gibson Cc: qemu-ppc@nongnu.org, qemu-devel@nongnu.org On 14.03.2016 17:56, C=C3=A9dric Le Goater wrote: > From: Benjamin Herrenschmidt >=20 > 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 e402ff920314..327f3259b4be 100644 > --- a/target-ppc/translate.c > +++ b/target-ppc/translate.c > @@ -4282,14 +4282,17 @@ static inline void gen_op_mfspr(DisasContext *c= tx) > 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) { That check for !ctx->pr is now superfluous, isn't it? ... because it has already been checked 4 lines earlier. > 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); > @@ -4437,14 +4440,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 { Here it is right already :-) > 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 fb206aff29ad..6a11b41206e5 100644 > --- a/target-ppc/translate_init.c > +++ b/target-ppc/translate_init.c > @@ -579,17 +579,33 @@ static inline void vscr_init (CPUPPCState *env, u= int32_t val) > #define spr_register_kvm(env, num, name, uea_read, uea_write, = \ > oea_read, oea_write, one_reg_id, initial_valu= e) \ > _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_valu= e) \ > + oea_read, oea_write, one_reg_id, initial_valu= e) \ > + _spr_register(env, num, name, uea_read, uea_write, = \ > + oea_read, oea_write, oea_read, oea_write, initial_va= lue) > +#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_va= lue) > #else > #define spr_register_kvm(env, num, name, uea_read, uea_write, = \ > - oea_read, oea_write, one_reg_id, initial_valu= e) \ > + oea_read, oea_write, one_reg_id, initial_valu= e) \ > + _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 > @@ -598,6 +614,13 @@ static inline void vscr_init (CPUPPCState *env, ui= nt32_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, i= nt gprn, int sprn), > @@ -606,6 +629,8 @@ static inline void _spr_register(CPUPPCState *env, = int num, > =20 > void (*oea_read)(DisasContext *ctx, i= nt gprn, int sprn), > void (*oea_write)(DisasContext *ctx, = int sprn, int gprn), > + void (*hea_read)(DisasContext *opaque= , int gprn, int sprn), > + void (*hea_write)(DisasContext *opaqu= e, int sprn, int gprn), > #endif > #if defined(CONFIG_KVM) > uint64_t one_reg_id, > @@ -633,6 +658,8 @@ static inline void _spr_register(CPUPPCState *env, = int 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, Apart from the one superfluous if-statement, the patch looks fine to me. Thomas