]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
ARM: hw_breakpoint: disallow per-cpu breakpoints without overflow handler
authorWill Deacon <will.deacon@arm.com>
Wed, 1 Dec 2010 17:05:24 +0000 (17:05 +0000)
committerWill Deacon <will.deacon@arm.com>
Mon, 6 Dec 2010 11:55:57 +0000 (11:55 +0000)
Single-stepping a breakpoint requires us to disable it temporarily so that
we don't get stuck in a recursive debug trap. With per-cpu breakpoints this
presents a problem where an interrupt can be taken before the single-step has
completed and a new task is eventually scheduled. This new task will not
hit the breakpoint because it will have been disabled during the previous
handling code.

This patch disallows per-cpu breakpoints on ARM when an overflow handler
is not present. A similar effect can be created by placing breakpoints on
a shell and then running applications there.

Signed-off-by: Will Deacon <will.deacon@arm.com>
arch/arm/kernel/hw_breakpoint.c

index 36cd7680d3d2a0e8cf7538911137d40f54248559..eef1b1e235a7214b94ecdbb7ca2eb4e37d04debc 100644 (file)
@@ -622,10 +622,12 @@ int arch_validate_hwbkpt_settings(struct perf_event *bp)
         * Currently we rely on an overflow handler to take
         * care of single-stepping the breakpoint when it fires.
         * In the case of userspace breakpoints on a core with V7 debug,
-        * we can use the mismatch feature as a poor-man's hardware single-step.
+        * we can use the mismatch feature as a poor-man's hardware
+        * single-step, but this only works for per-task breakpoints.
         */
        if (WARN_ONCE(!bp->overflow_handler &&
-               (arch_check_bp_in_kernelspace(bp) || !core_has_mismatch_brps()),
+               (arch_check_bp_in_kernelspace(bp) || !core_has_mismatch_brps()
+                || !bp->hw.bp_target),
                        "overflow handler required but none found")) {
                ret = -EINVAL;
        }