From: Masami Hiramatsu <mhiramat@kernel.org> To: Jisheng Zhang <Jisheng.Zhang@synaptics.com> Cc: Catalin Marinas <catalin.marinas@arm.com>, Will Deacon <will@kernel.org>, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Liao Chang <liaochang1@huawei.com> Subject: Re: [PATCH] arm64: kprobes: Restore local irqflag if kprobes is cancelled Date: Mon, 12 Apr 2021 22:11:44 +0900 [thread overview] Message-ID: <20210412221144.2da50e902df14cda0d86eeaa@kernel.org> (raw) In-Reply-To: <20210412174101.6bfb0594@xhacker.debian> Hi Jisheng, On Mon, 12 Apr 2021 17:41:01 +0800 Jisheng Zhang <Jisheng.Zhang@synaptics.com> wrote: > If instruction being single stepped caused a page fault, the kprobes > is cancelled to let the page fault handler continue as a normal page > fault. But the local irqflags are disabled so cpu will restore pstate > with DAIF masked. After pagefault is serviced, the kprobes is > triggerred again, we overwrite the saved_irqflag by calling > kprobes_save_local_irqflag(). NOTE, DAIF is masked in this new saved > irqflag. After kprobes is serviced, the cpu pstate is retored with > DAIF masked. > > This patch is inspired by one patch for riscv from Liao Chang. Thanks for pointing it out. But I think kprobes_restore_local_irqflag() is also needed for kcb->kprobe_status == KPROBE_REENTER case...no. This is more complicated. In the reenter case, I think we have to retry the kpreprobe_fault_handler() with recovered previous kprobes so that it can handle page fault in its handler. Hmm, RISC-V and other code also needs same fix. Thank you, > > Signed-off-by: Jisheng Zhang <Jisheng.Zhang@synaptics.com> > --- > arch/arm64/kernel/probes/kprobes.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/arch/arm64/kernel/probes/kprobes.c b/arch/arm64/kernel/probes/kprobes.c > index 66aac2881ba8..85645b2b0c7a 100644 > --- a/arch/arm64/kernel/probes/kprobes.c > +++ b/arch/arm64/kernel/probes/kprobes.c > @@ -267,10 +267,12 @@ int __kprobes kprobe_fault_handler(struct pt_regs *regs, unsigned int fsr) > if (!instruction_pointer(regs)) > BUG(); > > - if (kcb->kprobe_status == KPROBE_REENTER) > + if (kcb->kprobe_status == KPROBE_REENTER) { > restore_previous_kprobe(kcb); > - else > + } else { > + kprobes_restore_local_irqflag(kcb, regs); > reset_current_kprobe(); > + } > > break; > case KPROBE_HIT_ACTIVE: > -- > 2.31.0 > -- Masami Hiramatsu <mhiramat@kernel.org>
WARNING: multiple messages have this Message-ID (diff)
From: Masami Hiramatsu <mhiramat@kernel.org> To: Jisheng Zhang <Jisheng.Zhang@synaptics.com> Cc: Catalin Marinas <catalin.marinas@arm.com>, Will Deacon <will@kernel.org>, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Liao Chang <liaochang1@huawei.com> Subject: Re: [PATCH] arm64: kprobes: Restore local irqflag if kprobes is cancelled Date: Mon, 12 Apr 2021 22:11:44 +0900 [thread overview] Message-ID: <20210412221144.2da50e902df14cda0d86eeaa@kernel.org> (raw) In-Reply-To: <20210412174101.6bfb0594@xhacker.debian> Hi Jisheng, On Mon, 12 Apr 2021 17:41:01 +0800 Jisheng Zhang <Jisheng.Zhang@synaptics.com> wrote: > If instruction being single stepped caused a page fault, the kprobes > is cancelled to let the page fault handler continue as a normal page > fault. But the local irqflags are disabled so cpu will restore pstate > with DAIF masked. After pagefault is serviced, the kprobes is > triggerred again, we overwrite the saved_irqflag by calling > kprobes_save_local_irqflag(). NOTE, DAIF is masked in this new saved > irqflag. After kprobes is serviced, the cpu pstate is retored with > DAIF masked. > > This patch is inspired by one patch for riscv from Liao Chang. Thanks for pointing it out. But I think kprobes_restore_local_irqflag() is also needed for kcb->kprobe_status == KPROBE_REENTER case...no. This is more complicated. In the reenter case, I think we have to retry the kpreprobe_fault_handler() with recovered previous kprobes so that it can handle page fault in its handler. Hmm, RISC-V and other code also needs same fix. Thank you, > > Signed-off-by: Jisheng Zhang <Jisheng.Zhang@synaptics.com> > --- > arch/arm64/kernel/probes/kprobes.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/arch/arm64/kernel/probes/kprobes.c b/arch/arm64/kernel/probes/kprobes.c > index 66aac2881ba8..85645b2b0c7a 100644 > --- a/arch/arm64/kernel/probes/kprobes.c > +++ b/arch/arm64/kernel/probes/kprobes.c > @@ -267,10 +267,12 @@ int __kprobes kprobe_fault_handler(struct pt_regs *regs, unsigned int fsr) > if (!instruction_pointer(regs)) > BUG(); > > - if (kcb->kprobe_status == KPROBE_REENTER) > + if (kcb->kprobe_status == KPROBE_REENTER) { > restore_previous_kprobe(kcb); > - else > + } else { > + kprobes_restore_local_irqflag(kcb, regs); > reset_current_kprobe(); > + } > > break; > case KPROBE_HIT_ACTIVE: > -- > 2.31.0 > -- Masami Hiramatsu <mhiramat@kernel.org> _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2021-04-12 13:11 UTC|newest] Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-04-12 9:41 [PATCH] arm64: kprobes: Restore local irqflag if kprobes is cancelled Jisheng Zhang 2021-04-12 9:41 ` Jisheng Zhang 2021-04-12 13:11 ` Masami Hiramatsu [this message] 2021-04-12 13:11 ` Masami Hiramatsu 2021-04-12 14:46 ` Masami Hiramatsu 2021-04-12 14:46 ` Masami Hiramatsu 2021-04-13 17:49 ` Will Deacon 2021-04-13 17:49 ` Will Deacon
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20210412221144.2da50e902df14cda0d86eeaa@kernel.org \ --to=mhiramat@kernel.org \ --cc=Jisheng.Zhang@synaptics.com \ --cc=catalin.marinas@arm.com \ --cc=liaochang1@huawei.com \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=will@kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.