Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1579837

[BUGFIX PATCH 2/3] kprobes/arm: Skip single-stepping in recursing path if possible

From Masami Hiramatsu <mhiramat@kernel.org>
Newsgroups linux.kernel
Subject [BUGFIX PATCH 2/3] kprobes/arm: Skip single-stepping in recursing path if possible
Date 2017-02-13 16:10 +0100
Message-ID <taqqm-5kT-19@gated-at.bofh.it> (permalink)
References <taqql-5kT-13@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


Kprobes/arm skips single-stepping (moreover handling the event)
if the conditional instruction must not be executed. This
also apply the rule when we hit the recursing kprobe, so
that kprobe does not count nmissed up in that case.

Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
---
 arch/arm/probes/kprobes/core.c |   19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/arch/arm/probes/kprobes/core.c b/arch/arm/probes/kprobes/core.c
index 264fedb..84989ae 100644
--- a/arch/arm/probes/kprobes/core.c
+++ b/arch/arm/probes/kprobes/core.c
@@ -265,7 +265,15 @@ void __kprobes kprobe_handler(struct pt_regs *regs)
 #endif
 
 	if (p) {
-		if (cur) {
+		if (!p->ainsn.insn_check_cc(regs->ARM_cpsr)) {
+			/*
+			 * Probe hit but conditional execution check failed,
+			 * so just skip the instruction and continue as if
+			 * nothing had happened.
+			 * In this case, we can skip recursing check too.
+			 */
+			singlestep_skip(p, regs);
+		} else if (cur) {
 			/* Kprobe is pending, so we're recursing. */
 			switch (kcb->kprobe_status) {
 			case KPROBE_HIT_ACTIVE:
@@ -288,7 +296,7 @@ void __kprobes kprobe_handler(struct pt_regs *regs)
 				/* impossible cases */
 				BUG();
 			}
-		} else if (p->ainsn.insn_check_cc(regs->ARM_cpsr)) {
+		} else {
 			/* Probe hit and conditional execution check ok. */
 			set_current_kprobe(p);
 			kcb->kprobe_status = KPROBE_HIT_ACTIVE;
@@ -309,13 +317,6 @@ void __kprobes kprobe_handler(struct pt_regs *regs)
 				}
 				reset_current_kprobe();
 			}
-		} else {
-			/*
-			 * Probe hit but conditional execution check failed,
-			 * so just skip the instruction and continue as if
-			 * nothing had happened.
-			 */
-			singlestep_skip(p, regs);
 		}
 	} else if (cur) {
 		/* We probably hit a jprobe.  Call its break handler. */

Back to linux.kernel | Previous | NextNext in thread | Find similar | Unroll thread


Thread

[BUGFIX PATCH 2/3] kprobes/arm: Skip single-stepping in recursing path if possible Masami Hiramatsu <mhiramat@kernel.org> - 2017-02-13 16:10 +0100
  Re: [BUGFIX PATCH 2/3] kprobes/arm: Skip single-stepping in  recursing path if possible "Jon Medhurst (Tixy)" <tixy@linaro.org> - 2017-02-14 11:10 +0100
    Re: [BUGFIX PATCH 2/3] kprobes/arm: Skip single-stepping in  recursing path if possible Masami Hiramatsu <mhiramat@kernel.org> - 2017-02-14 16:40 +0100

csiph-web