Browse Source

sh: kprobes: Fix up race against probe point removal.

Handle a corner case where another CPU or debugger removes the probe
point from underneath us.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Paul Mundt 16 years ago
parent
commit
734db3770d
1 changed files with 11 additions and 0 deletions
  1. 11 0
      arch/sh/kernel/kprobes.c

+ 11 - 0
arch/sh/kernel/kprobes.c

@@ -252,6 +252,17 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
 	p = get_kprobe(addr);
 	p = get_kprobe(addr);
 	if (!p) {
 	if (!p) {
 		/* Not one of ours: let kernel handle it */
 		/* Not one of ours: let kernel handle it */
+		if (*(kprobe_opcode_t *)addr != BREAKPOINT_INSTRUCTION) {
+			/*
+			 * The breakpoint instruction was removed right
+			 * after we hit it. Another cpu has removed
+			 * either a probepoint or a debugger breakpoint
+			 * at this address. In either case, no further
+			 * handling of this interrupt is appropriate.
+			 */
+			ret = 1;
+		}
+
 		goto no_kprobe;
 		goto no_kprobe;
 	}
 	}