Re: [PATCH] uprobe: Do not use UPROBE_SWBP_INSN as static initializer
From: Oleg Nesterov <oleg@redhat.com>
Date: 2024-06-21 12:03:33
Also in:
bpf, lkml
From: Oleg Nesterov <oleg@redhat.com>
Date: 2024-06-21 12:03:33
Also in:
bpf, lkml
On 06/20, Andrii Nakryiko wrote:
On Thu, Jun 20, 2024 at 12:40 PM Oleg Nesterov [off-list ref] wrote:quoted
But I can't understand what does it do, it calls emit_break() and git grep -w emit_break finds nothing.It's DEF_EMIT_REG0I15_FORMAT(break, break_op) in arch/loongarch/include/asm/inst.h A bunch of macro magic, but in the end it produces some constant value, of course.
I see, thanks! Then perhaps something like below? Oleg.
--- x/arch/loongarch/include/asm/uprobes.h
+++ x/arch/loongarch/include/asm/uprobes.h@@ -9,7 +9,7 @@ typedef u32 uprobe_opcode_t; #define MAX_UINSN_BYTES 8 #define UPROBE_XOL_SLOT_BYTES MAX_UINSN_BYTES -#define UPROBE_SWBP_INSN larch_insn_gen_break(BRK_UPROBE_BP) +#define UPROBE_SWBP_INSN (uprobe_opcode_t)(BRK_UPROBE_BP | (break_op << 15)) #define UPROBE_SWBP_INSN_SIZE LOONGARCH_INSN_SIZE #define UPROBE_XOLBP_INSN larch_insn_gen_break(BRK_UPROBE_XOLBP) --- x/arch/loongarch/kernel/uprobes.c +++ x/arch/loongarch/kernel/uprobes.c
@@ -7,6 +7,13 @@ #define UPROBE_TRAP_NR UINT_MAX +static __init int __ck_insn(void) +{ + BUG_ON(UPROBE_SWBP_INSN != larch_insn_gen_break(BRK_UPROBE_BP)); + return 0; +} +late_initcall(__ck_insn); + int arch_uprobe_analyze_insn(struct arch_uprobe *auprobe, struct mm_struct *mm, unsigned long addr) {