Skip to content

Commit 49ed320

Browse files
seehearfeelchenhuacai
authored andcommitted
LoongArch: Add larch_insn_gen_break() to generate break insns
There exist various break insns such as BRK_KPROBE_BP, BRK_KPROBE_SSTEPBP, BRK_UPROBE_BP and BRK_UPROBE_XOLBP, add larch_insn_gen_break() to generate break insns simpler, this is preparation for later patch. Tested-by: Jeff Xie <[email protected]> Signed-off-by: Tiezhu Yang <[email protected]> Signed-off-by: Huacai Chen <[email protected]>
1 parent b82fad4 commit 49ed320

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

arch/loongarch/include/asm/inst.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,8 @@ u32 larch_insn_gen_nop(void);
482482
u32 larch_insn_gen_b(unsigned long pc, unsigned long dest);
483483
u32 larch_insn_gen_bl(unsigned long pc, unsigned long dest);
484484

485+
u32 larch_insn_gen_break(int imm);
486+
485487
u32 larch_insn_gen_or(enum loongarch_gpr rd, enum loongarch_gpr rj, enum loongarch_gpr rk);
486488
u32 larch_insn_gen_move(enum loongarch_gpr rd, enum loongarch_gpr rj);
487489

@@ -500,6 +502,16 @@ static inline bool unsigned_imm_check(unsigned long val, unsigned int bit)
500502
return val < (1UL << bit);
501503
}
502504

505+
#define DEF_EMIT_REG0I15_FORMAT(NAME, OP) \
506+
static inline void emit_##NAME(union loongarch_instruction *insn, \
507+
int imm) \
508+
{ \
509+
insn->reg0i15_format.opcode = OP; \
510+
insn->reg0i15_format.immediate = imm; \
511+
}
512+
513+
DEF_EMIT_REG0I15_FORMAT(break, break_op)
514+
503515
#define DEF_EMIT_REG0I26_FORMAT(NAME, OP) \
504516
static inline void emit_##NAME(union loongarch_instruction *insn, \
505517
int offset) \

arch/loongarch/kernel/inst.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,20 @@ u32 larch_insn_gen_bl(unsigned long pc, unsigned long dest)
253253
return insn.word;
254254
}
255255

256+
u32 larch_insn_gen_break(int imm)
257+
{
258+
union loongarch_instruction insn;
259+
260+
if (imm < 0 || imm >= SZ_32K) {
261+
pr_warn("The generated break instruction is out of range.\n");
262+
return INSN_BREAK;
263+
}
264+
265+
emit_break(&insn, imm);
266+
267+
return insn.word;
268+
}
269+
256270
u32 larch_insn_gen_or(enum loongarch_gpr rd, enum loongarch_gpr rj, enum loongarch_gpr rk)
257271
{
258272
union loongarch_instruction insn;

0 commit comments

Comments
 (0)