Re: [PATCH] LoongArch: BPF: Adjust the parameter of emit_jirl()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Applied, thanks.

Huacai

On Thu, Nov 28, 2024 at 2:11 PM Tiezhu Yang <yangtiezhu@xxxxxxxxxxx> wrote:
>
> The branch instructions beq, bne, blt, bge, bltu, bgeu and jirl belong
> to the format reg2i16, but the sequence of oprand is different for the
> instruction jirl, adjust the parameter of emit_jirl() to make it more
> readable correspond with the Instruction Set Architecture manual.
>
> Here are the instruction formats:
>
>   beq     rj, rd, offs16
>   bne     rj, rd, offs16
>   blt     rj, rd, offs16
>   bge     rj, rd, offs16
>   bltu    rj, rd, offs16
>   bgeu    rj, rd, offs16
>   jirl    rd, rj, offs16
>
> Link: https://loongson.github.io/LoongArch-Documentation/LoongArch-Vol1-EN.html#branch-instructions
> Suggested-by: Huacai Chen <chenhuacai@xxxxxxxxxxx>
> Signed-off-by: Tiezhu Yang <yangtiezhu@xxxxxxxxxxx>
> ---
>
> This patch is based on the following commit:
> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=73c359d1d356
>
>  arch/loongarch/include/asm/inst.h | 12 +++++++++++-
>  arch/loongarch/kernel/inst.c      |  2 +-
>  arch/loongarch/net/bpf_jit.c      |  6 +++---
>  3 files changed, 15 insertions(+), 5 deletions(-)
>
> diff --git a/arch/loongarch/include/asm/inst.h b/arch/loongarch/include/asm/inst.h
> index 944482063f14..3089785ca97e 100644
> --- a/arch/loongarch/include/asm/inst.h
> +++ b/arch/loongarch/include/asm/inst.h
> @@ -683,7 +683,17 @@ DEF_EMIT_REG2I16_FORMAT(blt, blt_op)
>  DEF_EMIT_REG2I16_FORMAT(bge, bge_op)
>  DEF_EMIT_REG2I16_FORMAT(bltu, bltu_op)
>  DEF_EMIT_REG2I16_FORMAT(bgeu, bgeu_op)
> -DEF_EMIT_REG2I16_FORMAT(jirl, jirl_op)
> +
> +static inline void emit_jirl(union loongarch_instruction *insn,
> +                            enum loongarch_gpr rd,
> +                            enum loongarch_gpr rj,
> +                            int offset)
> +{
> +       insn->reg2i16_format.opcode = jirl_op;
> +       insn->reg2i16_format.immediate = offset;
> +       insn->reg2i16_format.rd = rd;
> +       insn->reg2i16_format.rj = rj;
> +}
>
>  #define DEF_EMIT_REG2BSTRD_FORMAT(NAME, OP)                            \
>  static inline void emit_##NAME(union loongarch_instruction *insn,      \
> diff --git a/arch/loongarch/kernel/inst.c b/arch/loongarch/kernel/inst.c
> index 3050329556d1..14d7d700bcb9 100644
> --- a/arch/loongarch/kernel/inst.c
> +++ b/arch/loongarch/kernel/inst.c
> @@ -332,7 +332,7 @@ u32 larch_insn_gen_jirl(enum loongarch_gpr rd, enum loongarch_gpr rj, int imm)
>                 return INSN_BREAK;
>         }
>
> -       emit_jirl(&insn, rj, rd, imm >> 2);
> +       emit_jirl(&insn, rd, rj, imm >> 2);
>
>         return insn.word;
>  }
> diff --git a/arch/loongarch/net/bpf_jit.c b/arch/loongarch/net/bpf_jit.c
> index dd350cba1252..ea357a3edc09 100644
> --- a/arch/loongarch/net/bpf_jit.c
> +++ b/arch/loongarch/net/bpf_jit.c
> @@ -181,13 +181,13 @@ static void __build_epilogue(struct jit_ctx *ctx, bool is_tail_call)
>                 /* Set return value */
>                 emit_insn(ctx, addiw, LOONGARCH_GPR_A0, regmap[BPF_REG_0], 0);
>                 /* Return to the caller */
> -               emit_insn(ctx, jirl, LOONGARCH_GPR_RA, LOONGARCH_GPR_ZERO, 0);
> +               emit_insn(ctx, jirl, LOONGARCH_GPR_ZERO, LOONGARCH_GPR_RA, 0);
>         } else {
>                 /*
>                  * Call the next bpf prog and skip the first instruction
>                  * of TCC initialization.
>                  */
> -               emit_insn(ctx, jirl, LOONGARCH_GPR_T3, LOONGARCH_GPR_ZERO, 1);
> +               emit_insn(ctx, jirl, LOONGARCH_GPR_ZERO, LOONGARCH_GPR_T3, 1);
>         }
>  }
>
> @@ -904,7 +904,7 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext
>                         return ret;
>
>                 move_addr(ctx, t1, func_addr);
> -               emit_insn(ctx, jirl, t1, LOONGARCH_GPR_RA, 0);
> +               emit_insn(ctx, jirl, LOONGARCH_GPR_RA, t1, 0);
>                 move_reg(ctx, regmap[BPF_REG_0], LOONGARCH_GPR_A0);
>                 break;
>
> --
> 2.42.0
>





[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux