On 2026/08/26 10:38 AM, Chinmay Rath wrote: > From: Ojaswin Mujoo <[email protected]> > > With sleep, doze, nap, rvwinkle and stop instructions moved to > decodetree, the helper these instructions used : gen_helper_pminsn, > should now be renamed to gen_helper_PMINSN, abiding by the decodetree > standards. Do the same. > Also refactor their translation routine to use a common do_sleep routine > since they share majority of the code. > > Signed-off-by: Ojaswin Mujoo <[email protected]> > Signed-off-by: Chinmay Rath <[email protected]> > --- > target/ppc/helper.h | 2 +- > target/ppc/tcg-excp_helper.c | 2 +- > .../ppc/translate/processor-ctrl-impl.c.inc | 99 +++---------------- > 3 files changed, 16 insertions(+), 87 deletions(-)
Reviewed-by: Amit Machhiwal <[email protected]> > > diff --git a/target/ppc/helper.h b/target/ppc/helper.h > index cd2a0948a3..7e15676122 100644 > --- a/target/ppc/helper.h > +++ b/target/ppc/helper.h > @@ -18,7 +18,7 @@ DEF_HELPER_1(rfdi, void, env) > DEF_HELPER_1(rfmci, void, env) > #if defined(TARGET_PPC64) > DEF_HELPER_2(scv, noreturn, env, i32) > -DEF_HELPER_2(pminsn, void, env, i32) > +DEF_HELPER_2(PMINSN, void, env, i32) > DEF_HELPER_1(rfid, void, env) > DEF_HELPER_1(rfscv, void, env) > DEF_HELPER_1(hrfid, void, env) > diff --git a/target/ppc/tcg-excp_helper.c b/target/ppc/tcg-excp_helper.c > index b04f07a637..c4ffa2dfbb 100644 > --- a/target/ppc/tcg-excp_helper.c > +++ b/target/ppc/tcg-excp_helper.c > @@ -459,7 +459,7 @@ void helper_scv(CPUPPCState *env, uint32_t lev) > } > } > > -void helper_pminsn(CPUPPCState *env, uint32_t insn) > +void helper_PMINSN(CPUPPCState *env, uint32_t insn) > { > CPUState *cs = env_cpu(env); > > diff --git a/target/ppc/translate/processor-ctrl-impl.c.inc > b/target/ppc/translate/processor-ctrl-impl.c.inc > index bdbc195294..3b3ed3019a 100644 > --- a/target/ppc/translate/processor-ctrl-impl.c.inc > +++ b/target/ppc/translate/processor-ctrl-impl.c.inc > @@ -104,103 +104,32 @@ static bool trans_MSGSYNC(DisasContext *ctx, > arg_MSGSYNC *a) > return true; > } > > -static bool do_doze(DisasContext *ctx, arg_DOZE *a) > -{ > - REQUIRE_64BIT(ctx); > - > -#if defined(CONFIG_USER_ONLY) > - gen_priv_opc(ctx); > -#else > - TCGv_i32 t; > - > - REQUIRE_HV(ctx); > - translator_io_start(&ctx->base); > - t = tcg_constant_i32(PPC_PM_DOZE); > - gen_helper_pminsn(tcg_env, t); > - /* Stop translation, as the CPU is supposed to sleep from now */ > - gen_exception_nip(ctx, EXCP_HLT, ctx->base.pc_next); > -#endif /* defined(CONFIG_USER_ONLY) */ > - > - return true; > -} > -TRANS_FLAGS2(PM_ISA206, DOZE, do_doze); > - > -static bool do_nap(DisasContext *ctx, arg_NAP *a) > -{ > - REQUIRE_64BIT(ctx); > - > -#if defined(CONFIG_USER_ONLY) > - gen_priv_opc(ctx); > -#else > - TCGv_i32 t; > - > - REQUIRE_HV(ctx); > - translator_io_start(&ctx->base); > - t = tcg_constant_i32(PPC_PM_NAP); > - gen_helper_pminsn(tcg_env, t); > - /* Stop translation, as the CPU is supposed to sleep from now */ > - gen_exception_nip(ctx, EXCP_HLT, ctx->base.pc_next); > -#endif /* defined(CONFIG_USER_ONLY) */ > - return true; > -} > -TRANS_FLAGS2(PM_ISA206, NAP, do_nap); > - > -static bool do_sleep(DisasContext *ctx, arg_SLEEP *a) > -{ > - REQUIRE_64BIT(ctx); > - > -#if defined(CONFIG_USER_ONLY) > - gen_priv_opc(ctx); > -#else > - TCGv_i32 t; > - > - REQUIRE_HV(ctx); > - translator_io_start(&ctx->base); > - t = tcg_constant_i32(PPC_PM_SLEEP); > - gen_helper_pminsn(tcg_env, t); > - /* Stop translation, as the CPU is supposed to sleep from now */ > - gen_exception_nip(ctx, EXCP_HLT, ctx->base.pc_next); > -#endif /* defined(CONFIG_USER_ONLY) */ > - return true; > -} > -TRANS_FLAGS2(PM_ISA206, SLEEP, do_sleep); > - > -static bool do_rvwinkle(DisasContext *ctx, arg_RVWINKLE *a) > +/* > + * Helper to handle DOZE, NAP, SLEEP, RVWINKLE & STOP. Since none of them use > + * any arguments just use a placeholder arg_SLEEP. > + */ > +static bool do_sleep(DisasContext *ctx, arg_SLEEP *a, powerpc_pm_insn_t type) > { > REQUIRE_64BIT(ctx); > > #if defined(CONFIG_USER_ONLY) > gen_priv_opc(ctx); > -#else > +#elif defined(TARGET_PPC64) > TCGv_i32 t; > > REQUIRE_HV(ctx); > translator_io_start(&ctx->base); > - t = tcg_constant_i32(PPC_PM_RVWINKLE); > - gen_helper_pminsn(tcg_env, t); > + t = tcg_constant_i32(type); > + gen_helper_PMINSN(tcg_env, t); > /* Stop translation, as the CPU is supposed to sleep from now */ > gen_exception_nip(ctx, EXCP_HLT, ctx->base.pc_next); > -#endif /* defined(CONFIG_USER_ONLY) */ > - return true; > -} > -TRANS_FLAGS2(PM_ISA206, RVWINKLE, do_rvwinkle); > - > -static bool do_stop(DisasContext *ctx, arg_STOP *a) > -{ > - REQUIRE_64BIT(ctx); > - > -#if defined(CONFIG_USER_ONLY) > - gen_priv_opc(ctx); > #else > - TCGv_i32 t; > - > - REQUIRE_HV(ctx); > - translator_io_start(&ctx->base); > - t = tcg_constant_i32(PPC_PM_STOP); > - gen_helper_pminsn(tcg_env, t); > - /* Stop translation, as the CPU is supposed to sleep from now */ > - gen_exception_nip(ctx, EXCP_HLT, ctx->base.pc_next); > + qemu_build_not_reached(); > #endif > return true; > } > -TRANS_FLAGS2(ISA300, STOP, do_stop); > +TRANS_FLAGS2(PM_ISA206, DOZE, do_sleep, PPC_PM_DOZE); > +TRANS_FLAGS2(PM_ISA206, NAP, do_sleep, PPC_PM_NAP); > +TRANS_FLAGS2(PM_ISA206, SLEEP, do_sleep, PPC_PM_SLEEP); > +TRANS_FLAGS2(PM_ISA206, RVWINKLE, do_sleep, PPC_PM_RVWINKLE); > +TRANS_FLAGS2(ISA300, STOP, do_sleep, PPC_PM_STOP); > -- > 2.55.0 >
