Thanks Richard. I have incorporated your feedback in v5.

-Rajnesh

On Wed, Dec 4, 2024 at 7:30 PM Richard Henderson
<richard.hender...@linaro.org> wrote:
>
> On 12/4/24 06:56, Rajnesh Kanwal wrote:
> > diff --git a/target/riscv/insn_trans/trans_privileged.c.inc 
> > b/target/riscv/insn_trans/trans_privileged.c.inc
> > index 
> > 0bdfa9a0ed3313223ce9032fb24484c3887cddf9..a5c2410cfa0779b1a928e7b89bd2ee5bb24216e4
> >  100644
> > --- a/target/riscv/insn_trans/trans_privileged.c.inc
> > +++ b/target/riscv/insn_trans/trans_privileged.c.inc
> > @@ -78,9 +78,10 @@ static bool trans_sret(DisasContext *ctx, arg_sret *a)
> >   {
> >   #ifndef CONFIG_USER_ONLY
> >       if (has_ext(ctx, RVS)) {
> > +        TCGv src = tcg_constant_tl(ctx->base.pc_next);
>
> This is incorrect.
> You need to use gen_pc_plus_diff(src, ctx, 0).
>
> Alternately, for here in sret and mret, instead of adding an extra parameter, 
> use
> gen_update_pc(ctx, 0) to update env->pc
>
>
>
> > @@ -95,9 +96,10 @@ static bool trans_sret(DisasContext *ctx, arg_sret *a)
> >   static bool trans_mret(DisasContext *ctx, arg_mret *a)
> >   {
> >   #ifndef CONFIG_USER_ONLY
> > +    TCGv src = tcg_constant_tl(ctx->base.pc_next);
>
> Likewise.
>
>
> > diff --git a/target/riscv/insn_trans/trans_rvi.c.inc 
> > b/target/riscv/insn_trans/trans_rvi.c.inc
> > index 
> > 96c218a9d7875c6419287ac3aa9746251be3f442..fc182e7b18a289e13ad212f10a3233aca25fae41
> >  100644
> > --- a/target/riscv/insn_trans/trans_rvi.c.inc
> > +++ b/target/riscv/insn_trans/trans_rvi.c.inc
> > @@ -93,6 +93,50 @@ static bool trans_jal(DisasContext *ctx, arg_jal *a)
> >       return true;
> >   }
> >
> > +#ifndef CONFIG_USER_ONLY
> > +/*
> > + * Indirect calls
> > + * - jalr x1, rs where rs != x5;
> > + * - jalr x5, rs where rs != x1;
> > + * - c.jalr rs1 where rs1 != x5;
> > + *
> > + * Indirect jumps
> > + * - jalr x0, rs where rs != x1 and rs != x5;
> > + * - c.jr rs1 where rs1 != x1 and rs1 != x5.
> > + *
> > + * Returns
> > + * - jalr rd, rs where (rs == x1 or rs == x5) and rd != x1 and rd != x5;
> > + * - c.jr rs1 where rs1 == x1 or rs1 == x5.
> > + *
> > + * Co-routine swap
> > + * - jalr x1, x5;
> > + * - jalr x5, x1;
> > + * - c.jalr x5.
> > + *
> > + * Other indirect jumps
> > + * - jalr rd, rs where rs != x1, rs != x5, rd != x0, rd != x1 and rd != x5.
> > + */
> > +static void helper_ctr_jalr(DisasContext *ctx, arg_jalr *a)
>
> Generally "helper_*" are out-of-line functions, whereas this is generating 
> inline code.
> Better as "gen_ctr_jalr".
>
> > +{
> > +    TCGv src = tcg_constant_tl(ctx->base.pc_next);
>
> gen_pc_plus_diff
>
> > @@ -219,6 +269,9 @@ static bool gen_branch(DisasContext *ctx, arg_b *a, 
> > TCGCond cond)
> >       TCGv src1 = get_gpr(ctx, a->rs1, EXT_SIGN);
> >       TCGv src2 = get_gpr(ctx, a->rs2, EXT_SIGN);
> >       target_ulong orig_pc_save = ctx->pc_save;
> > +#ifndef CONFIG_USER_ONLY
> > +    TCGv src = tcg_constant_tl(ctx->base.pc_next);
> > +#endif
>
> gen_pc_plus_diff, though perhaps delay until used.
>
> >
> >       if (get_xl(ctx) == MXL_RV128) {
> >           TCGv src1h = get_gprh(ctx, a->rs1);
> > @@ -231,6 +284,15 @@ static bool gen_branch(DisasContext *ctx, arg_b *a, 
> > TCGCond cond)
> >       } else {
> >           tcg_gen_brcond_tl(cond, src1, src2, l);
> >       }
> > +
> > +#ifndef CONFIG_USER_ONLY
> > +    if (ctx->cfg_ptr->ext_smctr || ctx->cfg_ptr->ext_ssctr) {
> > +        TCGv type = tcg_constant_tl(CTRDATA_TYPE_NONTAKEN_BRANCH);
> > +        TCGv dest = tcg_constant_tl(ctx->base.pc_next + ctx->cur_insn_len);
>
> gen_pc_plus_diff
>
> > +        gen_helper_ctr_add_entry(tcg_env, src, dest, type);
> > +    }
> > +#endif
> > +
> >       gen_goto_tb(ctx, 1, ctx->cur_insn_len);
> >       ctx->pc_save = orig_pc_save;
> >
> > @@ -243,6 +305,14 @@ static bool gen_branch(DisasContext *ctx, arg_b *a, 
> > TCGCond cond)
> >           gen_pc_plus_diff(target_pc, ctx, a->imm);
> >           gen_exception_inst_addr_mis(ctx, target_pc);
> >       } else {
> > +#ifndef CONFIG_USER_ONLY
> > +        if (ctx->cfg_ptr->ext_smctr || ctx->cfg_ptr->ext_ssctr) {
> > +            TCGv type = tcg_constant_tl(CTRDATA_TYPE_TAKEN_BRANCH);
> > +            TCGv dest = tcg_constant_tl(ctx->base.pc_next + a->imm);
>
> gen_pc_plus_diff.
>
> > diff --git a/target/riscv/insn_trans/trans_rvzce.c.inc 
> > b/target/riscv/insn_trans/trans_rvzce.c.inc
> > index 
> > cd234ad960724c936b92afb6fd1f3c7c2a37cb80..07b51d9f4d847c4411165b422a843fea65c86d45
> >  100644
> > --- a/target/riscv/insn_trans/trans_rvzce.c.inc
> > +++ b/target/riscv/insn_trans/trans_rvzce.c.inc
> > @@ -204,6 +204,13 @@ static bool gen_pop(DisasContext *ctx, arg_cmpp *a, 
> > bool ret, bool ret_val)
> >       if (ret) {
> >           TCGv ret_addr = get_gpr(ctx, xRA, EXT_SIGN);
> >           tcg_gen_mov_tl(cpu_pc, ret_addr);
> > +#ifndef CONFIG_USER_ONLY
> > +        if (ctx->cfg_ptr->ext_smctr || ctx->cfg_ptr->ext_ssctr) {
> > +            TCGv src = tcg_constant_tl(ctx->base.pc_next);
>
> gen_pc_plus_diff, and it will need to be done *before* the assignment to 
> cpu_pc.
>
> > @@ -309,6 +316,21 @@ static bool trans_cm_jalt(DisasContext *ctx, 
> > arg_cm_jalt *a)
> >           gen_set_gpr(ctx, xRA, succ_pc);
> >       }
> >
> > +#ifndef CONFIG_USER_ONLY
> > +    if (ctx->cfg_ptr->ext_smctr || ctx->cfg_ptr->ext_ssctr) {
> > +        TCGv src = tcg_constant_tl(ctx->base.pc_next);
>
> Here, we have updated cpu_pc to current (see the start of the function), so 
> you can just
> use that instead of src.
>
> > +void helper_ctr_add_entry(CPURISCVState *env, target_ulong src,
> > +                          target_ulong dest, target_ulong type)
> > +{
> > +    riscv_ctr_add_entry(env, src, dest, (enum CTRType)type,
> > +                            env->priv, env->virt_enabled);
>
> Indent to line up after (.
>
> > +static void helper_ctr_jal(DisasContext *ctx, int rd, target_ulong imm)
>
> gen_ctr_jal.
>
> > +{
> > +    TCGv dest = tcg_constant_tl(ctx->base.pc_next + imm);
> > +    TCGv src = tcg_constant_tl(ctx->base.pc_next);
>
> gen_pc_plus_diff.
>
>
> r~

Reply via email to