From: Masami Hiramatsu <mhiramat@kernel.org>
To: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>,
Borislav Petkov <bp@alien8.de>,
linux-kernel@vger.kernel.org, Ingo Molnar <mingo@kernel.org>,
Thomas Gleixner <tglx@linutronix.de>
Subject: Re: [RFC PATCH 2/2] kprobes/x86: Exit single-stepping before trying fixup_exception
Date: Thu, 2 Mar 2017 08:30:28 +0900 [thread overview]
Message-ID: <20170302083028.bbd015d78e15df5d89aa0c2e@kernel.org> (raw)
In-Reply-To: <148821206816.15765.7737579843541819311.stgit@devbox>
On Tue, 28 Feb 2017 01:14:38 +0900
Masami Hiramatsu <mhiramat@kernel.org> wrote:
> Exit single-stepping out of line and get back regs->ip to original
> (probed) address before trying fixup_exception() if the exception
> happened on the singlestep buffer, since the fixup_exception()
> depends on regs->ip to search an entry on __ex_table.
>
> Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
> ---
> arch/x86/include/asm/kprobes.h | 1
> arch/x86/kernel/kprobes/core.c | 83 +++++++++++++++++++++++++---------------
> arch/x86/kernel/traps.c | 19 +++++++++
> 3 files changed, 71 insertions(+), 32 deletions(-)
>
> diff --git a/arch/x86/include/asm/kprobes.h b/arch/x86/include/asm/kprobes.h
> index d1d1e50..79e121a 100644
> --- a/arch/x86/include/asm/kprobes.h
> +++ b/arch/x86/include/asm/kprobes.h
> @@ -111,6 +111,7 @@ struct kprobe_ctlblk {
> struct prev_kprobe prev_kprobe;
> };
>
> +extern int kprobe_exit_singlestep(struct pt_regs *regs);
> extern int kprobe_fault_handler(struct pt_regs *regs, int trapnr);
> extern int kprobe_exceptions_notify(struct notifier_block *self,
> unsigned long val, void *data);
> diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c
> index 34d3a52..f2a3f3b 100644
> --- a/arch/x86/kernel/kprobes/core.c
> +++ b/arch/x86/kernel/kprobes/core.c
> @@ -949,43 +949,62 @@ int kprobe_debug_handler(struct pt_regs *regs)
> }
> NOKPROBE_SYMBOL(kprobe_debug_handler);
>
> -int kprobe_fault_handler(struct pt_regs *regs, int trapnr)
> +/* Fixup current ip register and reset current kprobe, if needed. */
> +int kprobe_exit_singlestep(struct pt_regs *regs)
> {
> - struct kprobe *cur = kprobe_running();
> struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
> + struct kprobe *cur = kprobe_running();
>
> - if (unlikely(regs->ip == (unsigned long)cur->ainsn.insn)) {
> - /* This must happen on single-stepping */
> - WARN_ON(kcb->kprobe_status != KPROBE_HIT_SS &&
> - kcb->kprobe_status != KPROBE_REENTER);
> - /*
> - * We are here because the instruction being single
> - * stepped caused a page fault. We reset the current
> - * kprobe and the ip points back to the probe address
> - * and allow the page fault handler to continue as a
> - * normal page fault.
> - */
> - regs->ip = (unsigned long)cur->addr;
> - /*
> - * Trap flag (TF) has been set here because this fault
> - * happened where the single stepping will be done.
> - * So clear it by resetting the current kprobe:
> - */
> - regs->flags &= ~X86_EFLAGS_TF;
> + if (unlikely(regs->ip != (unsigned long)cur->ainsn.insn))
Oops, this is not unlikely, this is likely case (since I inverted the condition).
Thanks,
--
Masami Hiramatsu <mhiramat@kernel.org>
next prev parent reply other threads:[~2017-03-01 23:30 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-02-23 18:30 kprobes vs __ex_table[] Peter Zijlstra
2017-02-24 1:04 ` Masami Hiramatsu
2017-02-24 9:26 ` Peter Zijlstra
2017-02-24 16:34 ` Masami Hiramatsu
2017-02-24 17:48 ` Peter Zijlstra
2017-02-27 16:12 ` [RFC PATCH 0/2] kprobes/x86: Handle probing on ex_table cases Masami Hiramatsu
2017-02-27 16:13 ` [RFC PATCH 1/2] kprobes/x86: Use probe_kernel_read instead of memcpy Masami Hiramatsu
2017-02-27 16:14 ` [RFC PATCH 2/2] kprobes/x86: Exit single-stepping before trying fixup_exception Masami Hiramatsu
2017-03-01 23:30 ` Masami Hiramatsu [this message]
2017-02-28 16:16 ` kprobes vs __ex_table[] Masami Hiramatsu
2017-02-28 16:23 ` [PATCH] [BUGFIX] kprobes/x86: Fix to check __ex_table entry by probed address Masami Hiramatsu
2017-03-01 9:13 ` [tip:perf/urgent] kprobes/x86: Fix kernel panic when certain exception-handling addresses are probed tip-bot for Masami Hiramatsu
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=20170302083028.bbd015d78e15df5d89aa0c2e@kernel.org \
--to=mhiramat@kernel.org \
--cc=bp@alien8.de \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
/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: link
Be 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.