From: Masami Hiramatsu <mhiramat@kernel.org>
To: Thomas Gleixner <tglx@linutronix.de>, Ingo Molnar <mingo@kernel.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>,
Ingo Molnar <mingo@redhat.com>, "H . Peter Anvin" <hpa@zytor.com>,
linux-kernel@vger.kernel.org,
Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>,
Andrew Morton <akpm@linux-foundation.org>,
Steven Rostedt <rostedt@goodmis.org>,
linux-arch@vger.kernel.org,
Benjamin Herrenschmidt <benh@kernel.crashing.org>,
Paul Mackerras <paulus@samba.org>,
Michael Ellerman <mpe@ellerman.id.au>,
linuxppc-dev@lists.ozlabs.org
Subject: [PATCH -tip v6 18/27] powerpc/kprobes: Don't call the ->break_handler() in powerpc kprobes code
Date: Wed, 20 Jun 2018 01:12:51 +0900 [thread overview]
Message-ID: <152942477127.15209.8982613703787878618.stgit@devbox> (raw)
In-Reply-To: <152942424698.15209.15245996287444292393.stgit@devbox>
Don't call the ->break_handler() from the powerpc kprobes code,
because it was only used by jprobes which got removed.
This also removes skip_singlestep() and embeds it in the
caller, kprobe_ftrace_handler(), which simplifies regs->nip
operation around there.
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Acked-by: "Naveen N. Rao" <naveen.n.rao@linux.vnet.ibm.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: linuxppc-dev@lists.ozlabs.org
---
Changes in v6
- Fix patch description
- Move post handler emulation into kprobe_ftrace_handler().
---
arch/powerpc/include/asm/kprobes.h | 10 -------
arch/powerpc/kernel/kprobes-ftrace.c | 46 +++++++++-------------------------
arch/powerpc/kernel/kprobes.c | 31 ++++++++---------------
3 files changed, 23 insertions(+), 64 deletions(-)
diff --git a/arch/powerpc/include/asm/kprobes.h b/arch/powerpc/include/asm/kprobes.h
index 674036db558b..785c464b6588 100644
--- a/arch/powerpc/include/asm/kprobes.h
+++ b/arch/powerpc/include/asm/kprobes.h
@@ -102,16 +102,6 @@ extern int kprobe_exceptions_notify(struct notifier_block *self,
extern int kprobe_fault_handler(struct pt_regs *regs, int trapnr);
extern int kprobe_handler(struct pt_regs *regs);
extern int kprobe_post_handler(struct pt_regs *regs);
-#ifdef CONFIG_KPROBES_ON_FTRACE
-extern int skip_singlestep(struct kprobe *p, struct pt_regs *regs,
- struct kprobe_ctlblk *kcb);
-#else
-static inline int skip_singlestep(struct kprobe *p, struct pt_regs *regs,
- struct kprobe_ctlblk *kcb)
-{
- return 0;
-}
-#endif
#else
static inline int kprobe_handler(struct pt_regs *regs) { return 0; }
static inline int kprobe_post_handler(struct pt_regs *regs) { return 0; }
diff --git a/arch/powerpc/kernel/kprobes-ftrace.c b/arch/powerpc/kernel/kprobes-ftrace.c
index 1b316331c2d9..070d1d862444 100644
--- a/arch/powerpc/kernel/kprobes-ftrace.c
+++ b/arch/powerpc/kernel/kprobes-ftrace.c
@@ -25,35 +25,6 @@
#include <linux/preempt.h>
#include <linux/ftrace.h>
-static nokprobe_inline
-int __skip_singlestep(struct kprobe *p, struct pt_regs *regs,
- struct kprobe_ctlblk *kcb, unsigned long orig_nip)
-{
- /*
- * Emulate singlestep (and also recover regs->nip)
- * as if there is a nop
- */
- regs->nip = (unsigned long)p->addr + MCOUNT_INSN_SIZE;
- if (unlikely(p->post_handler)) {
- kcb->kprobe_status = KPROBE_HIT_SSDONE;
- p->post_handler(p, regs, 0);
- }
- __this_cpu_write(current_kprobe, NULL);
- if (orig_nip)
- regs->nip = orig_nip;
- return 1;
-}
-
-int skip_singlestep(struct kprobe *p, struct pt_regs *regs,
- struct kprobe_ctlblk *kcb)
-{
- if (kprobe_ftrace(p))
- return __skip_singlestep(p, regs, kcb, 0);
- else
- return 0;
-}
-NOKPROBE_SYMBOL(skip_singlestep);
-
/* Ftrace callback handler for kprobes */
void kprobe_ftrace_handler(unsigned long nip, unsigned long parent_nip,
struct ftrace_ops *ops, struct pt_regs *regs)
@@ -71,8 +42,6 @@ void kprobe_ftrace_handler(unsigned long nip, unsigned long parent_nip,
if (kprobe_running()) {
kprobes_inc_nmissed_count(p);
} else {
- unsigned long orig_nip = regs->nip;
-
/*
* On powerpc, NIP is *before* this instruction for the
* pre handler
@@ -81,9 +50,18 @@ void kprobe_ftrace_handler(unsigned long nip, unsigned long parent_nip,
__this_cpu_write(current_kprobe, p);
kcb->kprobe_status = KPROBE_HIT_ACTIVE;
- if (!p->pre_handler || !p->pre_handler(p, regs))
- __skip_singlestep(p, regs, kcb, orig_nip);
- else {
+ if (!p->pre_handler || !p->pre_handler(p, regs)) {
+ /*
+ * Emulate singlestep (and also recover regs->nip)
+ * as if there is a nop
+ */
+ regs->nip += MCOUNT_INSN_SIZE;
+ if (unlikely(p->post_handler)) {
+ kcb->kprobe_status = KPROBE_HIT_SSDONE;
+ p->post_handler(p, regs, 0);
+ }
+ __this_cpu_write(current_kprobe, NULL);
+ } else {
/*
* If pre_handler returns !0, it sets regs->nip and
* resets current kprobe. In this case, we should not
diff --git a/arch/powerpc/kernel/kprobes.c b/arch/powerpc/kernel/kprobes.c
index 600678fce0a8..f06747e2e70d 100644
--- a/arch/powerpc/kernel/kprobes.c
+++ b/arch/powerpc/kernel/kprobes.c
@@ -317,25 +317,17 @@ int kprobe_handler(struct pt_regs *regs)
}
prepare_singlestep(p, regs);
return 1;
- } else {
- if (*addr != BREAKPOINT_INSTRUCTION) {
- /* If trap variant, then it belongs not to us */
- kprobe_opcode_t cur_insn = *addr;
- if (is_trap(cur_insn))
- goto no_kprobe;
- /* The breakpoint instruction was removed by
- * another cpu right after we hit, no further
- * handling of this interrupt is appropriate
- */
- ret = 1;
+ } else if (*addr != BREAKPOINT_INSTRUCTION) {
+ /* If trap variant, then it belongs not to us */
+ kprobe_opcode_t cur_insn = *addr;
+
+ if (is_trap(cur_insn))
goto no_kprobe;
- }
- p = __this_cpu_read(current_kprobe);
- if (p->break_handler && p->break_handler(p, regs)) {
- if (!skip_singlestep(p, regs, kcb))
- goto ss_probe;
- ret = 1;
- }
+ /* The breakpoint instruction was removed by
+ * another cpu right after we hit, no further
+ * handling of this interrupt is appropriate
+ */
+ ret = 1;
}
goto no_kprobe;
}
@@ -350,7 +342,7 @@ int kprobe_handler(struct pt_regs *regs)
*/
kprobe_opcode_t cur_insn = *addr;
if (is_trap(cur_insn))
- goto no_kprobe;
+ goto no_kprobe;
/*
* The breakpoint instruction was removed right
* after we hit it. Another cpu has removed
@@ -370,7 +362,6 @@ int kprobe_handler(struct pt_regs *regs)
/* handler has already set things up, so skip ss setup */
return 1;
-ss_probe:
if (p->ainsn.boostable >= 0) {
ret = try_to_emulate(p, regs);
next prev parent reply other threads:[~2018-06-19 16:12 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-06-19 16:04 [PATCH -tip v6 00/27] kprobes: Cleanup jprobe implementation Masami Hiramatsu
2018-06-19 16:04 ` Masami Hiramatsu
2018-06-19 16:04 ` [PATCH -tip v6 01/27] Documentation/kprobes: Fix to remove remaining jprobe Masami Hiramatsu
2018-06-19 16:04 ` Masami Hiramatsu
2018-06-19 16:05 ` [PATCH -tip v6 02/27] kprobes: Remove jprobe API implementation Masami Hiramatsu
2018-06-19 16:05 ` Masami Hiramatsu
2018-06-19 16:05 ` [PATCH -tip v6 03/27] kprobes/x86: Remove jprobe implementation Masami Hiramatsu
2018-06-19 16:05 ` Masami Hiramatsu
2018-06-19 16:06 ` [PATCH -tip v6 04/27] ARC: kprobes: " Masami Hiramatsu
2018-06-19 16:06 ` Masami Hiramatsu
2018-06-19 16:06 ` [PATCH -tip v6 05/27] ARM: kprobes: Remove jprobe arm implementation Masami Hiramatsu
2018-06-19 16:06 ` Masami Hiramatsu
2018-06-19 16:07 ` [PATCH -tip v6 06/27] arm64: kprobes: Remove jprobe implementation Masami Hiramatsu
2018-06-19 16:07 ` Masami Hiramatsu
2018-06-19 16:07 ` [PATCH -tip v6 07/27] powerpc/kprobes: Remove jprobe powerpc implementation Masami Hiramatsu
2018-06-19 16:07 ` Masami Hiramatsu
2018-06-19 16:08 ` [PATCH -tip v6 08/27] ia64: kprobes: Remove jprobe implementation Masami Hiramatsu
2018-06-19 16:08 ` Masami Hiramatsu
2018-06-19 16:08 ` [PATCH -tip v6 09/27] MIPS: " Masami Hiramatsu
2018-06-19 16:08 ` Masami Hiramatsu
2018-06-19 16:08 ` [PATCH -tip v6 10/27] s390/kprobes: " Masami Hiramatsu
2018-06-19 16:08 ` Masami Hiramatsu
2018-06-19 16:09 ` [PATCH -tip v6 11/27] sh: kprobes: " Masami Hiramatsu
2018-06-19 16:09 ` Masami Hiramatsu
2018-06-19 16:09 ` [PATCH -tip v6 12/27] sparc64: " Masami Hiramatsu
2018-06-19 16:09 ` Masami Hiramatsu
2018-06-19 16:10 ` [PATCH -tip v6 13/27] kprobes: Don't check the ->break_handler() in generic kprobes code Masami Hiramatsu
2018-06-19 16:10 ` Masami Hiramatsu
2018-06-19 16:10 ` [PATCH -tip v6 14/27] kprobes/x86: Don't call ->break_handler() in x86 kprobes Masami Hiramatsu
2018-06-19 16:10 ` Masami Hiramatsu
2018-06-19 16:11 ` [PATCH -tip v6 15/27] ARC: kprobes: Don't call the ->break_handler() in ARC kprobes code Masami Hiramatsu
2018-06-19 16:11 ` Masami Hiramatsu
2018-06-19 16:11 ` [PATCH -tip v6 16/27] ARM: kprobes: Don't call the ->break_handler() in arm " Masami Hiramatsu
2018-06-19 16:11 ` Masami Hiramatsu
2018-06-19 16:12 ` [PATCH -tip v6 17/27] arm64: kprobes: Don't call the ->break_handler() in arm64 " Masami Hiramatsu
2018-06-19 16:12 ` Masami Hiramatsu
2018-06-19 16:12 ` Masami Hiramatsu [this message]
2018-06-19 16:12 ` [PATCH -tip v6 18/27] powerpc/kprobes: Don't call the ->break_handler() in powerpc " Masami Hiramatsu
2018-06-19 16:13 ` [PATCH -tip v6 19/27] ia64: kprobes: Don't call the ->break_handler() in ia64 " Masami Hiramatsu
2018-06-19 16:13 ` Masami Hiramatsu
2018-06-19 16:13 ` [PATCH -tip v6 20/27] MIPS: kprobes: Don't call the ->break_handler() in MIPS " Masami Hiramatsu
2018-06-19 16:13 ` Masami Hiramatsu
2018-06-19 16:14 ` [PATCH -tip v6 21/27] s390/kprobes: Don't call the ->break_handler() in s390 " Masami Hiramatsu
2018-06-19 16:14 ` Masami Hiramatsu
2018-06-19 16:14 ` [PATCH -tip v6 22/27] sh: kprobes: Don't call the ->break_handler() in SH " Masami Hiramatsu
2018-06-19 16:14 ` Masami Hiramatsu
2018-06-19 16:15 ` [PATCH -tip v6 23/27] sparc64: kprobes: Don't call the ->break_handler() in sparc64 " Masami Hiramatsu
2018-06-19 16:15 ` Masami Hiramatsu
2018-06-19 16:15 ` [PATCH -tip v6 24/27] bpf: error-inject: kprobes: Clear current_kprobe and enable preempt in kprobe Masami Hiramatsu
2018-06-19 16:15 ` Masami Hiramatsu
2018-06-19 16:16 ` [PATCH -tip v6 25/27] kprobes/x86: Do not disable preempt on int3 path Masami Hiramatsu
2018-06-19 16:16 ` Masami Hiramatsu
2018-06-19 16:16 ` [PATCH -tip v6 26/27] Documentation: kprobes: Add how to change the execution path Masami Hiramatsu
2018-06-19 16:16 ` Masami Hiramatsu
2018-06-19 16:31 ` Randy Dunlap
2018-06-19 16:31 ` Randy Dunlap
2018-06-20 8:26 ` Masami Hiramatsu
2018-06-20 8:26 ` Masami Hiramatsu
2018-06-21 10:35 ` Ingo Molnar
2018-06-21 10:35 ` Ingo Molnar
2018-06-22 6:07 ` Masami Hiramatsu
2018-06-22 6:07 ` Masami Hiramatsu
2018-06-19 16:17 ` [PATCH -tip v6 27/27] kprobes: Remove jprobe stub API Masami Hiramatsu
2018-06-19 16:17 ` 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=152942477127.15209.8982613703787878618.stgit@devbox \
--to=mhiramat@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=ananth@linux.vnet.ibm.com \
--cc=benh@kernel.crashing.org \
--cc=hpa@zytor.com \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=mingo@kernel.org \
--cc=mingo@redhat.com \
--cc=mpe@ellerman.id.au \
--cc=paulus@samba.org \
--cc=rostedt@goodmis.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).