x86,early dr regs,kgdb: Allow kernel debugger early dr register access
[sfrench/cifs-2.6.git] / arch / x86 / kernel / cpu / common.c
index c1c00d0b1692d47bf45981439122b962a9b1dac0..cc83a002786e0bb16163afd17ffba909f88abe14 100644 (file)
@@ -1084,6 +1084,20 @@ static void clear_all_debug_regs(void)
        }
 }
 
+#ifdef CONFIG_KGDB
+/*
+ * Restore debug regs if using kgdbwait and you have a kernel debugger
+ * connection established.
+ */
+static void dbg_restore_debug_regs(void)
+{
+       if (unlikely(kgdb_connected && arch_kgdb_ops.correct_hw_break))
+               arch_kgdb_ops.correct_hw_break();
+}
+#else /* ! CONFIG_KGDB */
+#define dbg_restore_debug_regs()
+#endif /* ! CONFIG_KGDB */
+
 /*
  * cpu_init() initializes state that is per-CPU. Some data is already
  * initialized (naturally) in the bootstrap process, such as the GDT
@@ -1174,18 +1188,8 @@ void __cpuinit cpu_init(void)
        load_TR_desc();
        load_LDT(&init_mm.context);
 
-#ifdef CONFIG_KGDB
-       /*
-        * If the kgdb is connected no debug regs should be altered.  This
-        * is only applicable when KGDB and a KGDB I/O module are built
-        * into the kernel and you are using early debugging with
-        * kgdbwait. KGDB will control the kernel HW breakpoint registers.
-        */
-       if (kgdb_connected && arch_kgdb_ops.correct_hw_break)
-               arch_kgdb_ops.correct_hw_break();
-       else
-#endif
-               clear_all_debug_regs();
+       clear_all_debug_regs();
+       dbg_restore_debug_regs();
 
        fpu_init();
 
@@ -1239,6 +1243,7 @@ void __cpuinit cpu_init(void)
 #endif
 
        clear_all_debug_regs();
+       dbg_restore_debug_regs();
 
        /*
         * Force FPU initialization: