ARM: hw_breakpoint: reset control registers in hotplug path
authorWill Deacon <will.deacon@arm.com>
Wed, 24 Nov 2010 17:45:49 +0000 (17:45 +0000)
committerWill Deacon <will.deacon@arm.com>
Mon, 6 Dec 2010 11:55:56 +0000 (11:55 +0000)
The ARMv7 debug architecture doesn't make any guarantees about the
contents of debug control registers following a debug logic reset.

This patch ensures that we reset the control registers when a cpu
comes ONLINE (for example, with hotplug) so that when we enable
monitor mode while inserting a breakpoint we won't exhibit random
behaviour.

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

index 793959e..515a3c4 100644 (file)
@@ -764,7 +764,7 @@ out:
 /*
  * One-time initialisation.
  */
-static void __init reset_ctrl_regs(void *unused)
+static void reset_ctrl_regs(void *unused)
 {
        int i;
 
@@ -799,6 +799,18 @@ static void __init reset_ctrl_regs(void *unused)
        }
 }
 
+static int __cpuinit dbg_reset_notify(struct notifier_block *self,
+                                     unsigned long action, void *cpu)
+{
+       if (action == CPU_ONLINE)
+               smp_call_function_single((int)cpu, reset_ctrl_regs, NULL, 1);
+       return NOTIFY_OK;
+}
+
+static struct notifier_block __cpuinitdata dbg_reset_nb = {
+       .notifier_call = dbg_reset_notify,
+};
+
 static int __init arch_hw_breakpoint_init(void)
 {
        int ret = 0;
@@ -846,6 +858,8 @@ static int __init arch_hw_breakpoint_init(void)
        hook_ifault_code(2, hw_breakpoint_pending, SIGTRAP, TRAP_HWBKPT,
                        "breakpoint debug exception");
 
+       /* Register hotplug notifier. */
+       register_cpu_notifier(&dbg_reset_nb);
 out:
        return ret;
 }