[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <0196614f-27f0-1edd-ad23-a44eb3631c1d@loongson.cn>
Date: Thu, 22 Sep 2022 20:35:04 +0800
From: Tiezhu Yang <yangtiezhu@...ngson.cn>
To: Jinyang He <hejinyang@...ngson.cn>,
Huacai Chen <chenhuacai@...nel.org>,
Masami Hiramatsu <mhiramat@...nel.org>
Cc: loongarch@...ts.linux.dev, linux-kernel@...r.kernel.org
Subject: Re: [PATCH 1/4] LoongArch: Add kprobe support
Hi Jinyang,
On 09/22/2022 10:19 AM, Jinyang He wrote:
> On 09/20/2022 11:37 AM, Tiezhu Yang wrote:
>
>> Kprobes allows you to trap at almost any kernel address and
>> execute a callback function, this commit adds kprobe support
>> for LoongArch.
>>
>> Signed-off-by: Tiezhu Yang <yangtiezhu@...ngson.cn>
>> ---
>> arch/loongarch/Kconfig | 1 +
>> arch/loongarch/include/asm/inst.h | 31 ++++
>> arch/loongarch/include/asm/kprobes.h | 44 +++++
>> arch/loongarch/include/asm/ptrace.h | 1 +
>> arch/loongarch/kernel/Makefile | 2 +
>> arch/loongarch/kernel/inst.c | 107 ++++++++++++
>> arch/loongarch/kernel/kprobes.c | 309
...
>> +void simu_pc(struct pt_regs *regs, union loongarch_instruction insn)
>> +{
>> + unsigned long pc = regs->csr_era;
>> + unsigned int rd = insn.reg1i20_format.rd;
>> + unsigned int imm = insn.reg1i20_format.immediate;
>> +
>> + switch (insn.reg1i20_format.opcode) {
>> + case pcaddi_op:
>> + regs->regs[rd] = pc + sign_extended(imm << 2, 21);
>> + break;
>> + case pcaddu12i_op:
>> + regs->regs[rd] = pc + sign_extended(imm << 12, 31);
>> + break;
>> + case pcaddu18i_op:
>> + regs->regs[rd] = pc + sign_extended(imm << 18, 37);
>> + break;
>> + case pcalau12i_op:
>> + regs->regs[rd] = pc + sign_extended(imm << 12, 31);
>> + regs->regs[rd] &= ~((1 << 12) - 1);
>> + break;
>> + }
>> +
>> + regs->csr_era += LOONGARCH_INSN_SIZE;
>> +}
> Hi, Tiezhu,
>
> The simu_pc and the simu_branch should make sure the instruction op is
> excepted.
> I think returning with errno or adding notes to explain that is needed.
>
OK, will do it in v2.
> BTW, I honored these arch-specific simulation work I used to contribute
> in the old world, although the codes has been optimized. Could you add
> my sign-off?
OK, no problem, as we discussed offline, I will split it into a
single patch and add your credit, thanks for your work.
>> diff --git a/arch/loongarch/kernel/kprobes.c
>> b/arch/loongarch/kernel/kprobes.c
...
>> +int kprobe_exceptions_notify(struct notifier_block *self,
>> + unsigned long val, void *data)
>> +{
>> + struct die_args *args = (struct die_args *)data;
>> + int ret = NOTIFY_DONE;
>> +
>> + switch (val) {
>> + case DIE_BREAK:
>> + if (kprobe_pre_handler(args->regs))
>> + ret = NOTIFY_STOP;
>> + break;
>> + case DIE_SSTEPBP:
>> + if (kprobe_post_handler(args->regs))
>> + ret = NOTIFY_STOP;
>> + break;
>> + case DIE_PAGE_FAULT:
>> + preempt_disable();
>> + if (kprobe_running()
>> + && kprobe_fault_handler(args->regs, args->trapnr))
>> + ret = NOTIFY_STOP;
>> + preempt_enable();
>> + break;
> The DIE_PAGE_FAULT not be notified in do_page_fault() now, and the newly
> version to call kprobe_fault_handler is
> do_page_fault()->kprobe_page_fault()
> ->kprobe_fault_handler().
OK, will modify it in v2, thanks for your review.
Thanks,
Tiezhu
Powered by blists - more mailing lists