Skip to content

Commit 90b73f2

Browse files
Chenghao DuanKernel Patches Daemon
authored andcommitted
LoongArch: Add larch_insn_gen_{beq,bne} helpers
Add larch_insn_gen_beq() and larch_insn_gen_bne() helpers which will be used in BPF trampoline implementation. Co-developed-by: George Guo <[email protected]> Signed-off-by: George Guo <[email protected]> Co-developed-by: Youling Tang <[email protected]> Signed-off-by: Youling Tang <[email protected]> Signed-off-by: Chenghao Duan <[email protected]>
1 parent 9879802 commit 90b73f2

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

arch/loongarch/include/asm/inst.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,8 @@ u32 larch_insn_gen_lu12iw(enum loongarch_gpr rd, int imm);
511511
u32 larch_insn_gen_lu32id(enum loongarch_gpr rd, int imm);
512512
u32 larch_insn_gen_lu52id(enum loongarch_gpr rd, enum loongarch_gpr rj, int imm);
513513
u32 larch_insn_gen_jirl(enum loongarch_gpr rd, enum loongarch_gpr rj, int imm);
514+
u32 larch_insn_gen_beq(enum loongarch_gpr rd, enum loongarch_gpr rj, int imm);
515+
u32 larch_insn_gen_bne(enum loongarch_gpr rd, enum loongarch_gpr rj, int imm);
514516

515517
static inline bool signed_imm_check(long val, unsigned int bit)
516518
{

arch/loongarch/kernel/inst.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,3 +336,31 @@ u32 larch_insn_gen_jirl(enum loongarch_gpr rd, enum loongarch_gpr rj, int imm)
336336

337337
return insn.word;
338338
}
339+
340+
u32 larch_insn_gen_beq(enum loongarch_gpr rd, enum loongarch_gpr rj, int imm)
341+
{
342+
union loongarch_instruction insn;
343+
344+
if ((imm & 3) || imm < -SZ_128K || imm >= SZ_128K) {
345+
pr_warn("The generated beq instruction is out of range.\n");
346+
return INSN_BREAK;
347+
}
348+
349+
emit_beq(&insn, rj, rd, imm >> 2);
350+
351+
return insn.word;
352+
}
353+
354+
u32 larch_insn_gen_bne(enum loongarch_gpr rd, enum loongarch_gpr rj, int imm)
355+
{
356+
union loongarch_instruction insn;
357+
358+
if ((imm & 3) || imm < -SZ_128K || imm >= SZ_128K) {
359+
pr_warn("The generated bne instruction is out of range.\n");
360+
return INSN_BREAK;
361+
}
362+
363+
emit_bne(&insn, rj, rd, imm >> 2);
364+
365+
return insn.word;
366+
}

0 commit comments

Comments
 (0)