diff options
author | Jason Wessel <jason.wessel@windriver.com> | 2008-02-15 15:55:56 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-04-17 14:05:39 -0400 |
commit | 64e9ee3095b61d0300ea548216a57d2536611309 (patch) | |
tree | 21cf21caafa18b5661ceeaeb4d29e2ed784d0345 /arch/x86/kernel/setup64.c | |
parent | 67baf94cd260dc37504dbd15ba3faa2d8cf8a444 (diff) |
kgdb: add x86 HW breakpoints
Add HW breakpoints into the arch specific portion of x86 kgdb. In the
current x86 kernel.org kernels HW breakpoints are changed out in lazy
fashion because there is no infrastructure around changing them when
changing to a kernel task or entering the kernel mode via a system
call. This lazy approach means that if a user process uses HW
breakpoints the kgdb will loose out. This is an acceptable trade off
because the developer debugging the kernel is assumed to know what is
going on system wide and would be aware of this trade off.
There is a minor bug fix to the kgdb core so as to correctly call the
hw breakpoint functions with a valid value from the enum.
There is also a minor change to the x86_64 startup code when using
early HW breakpoints. When the debugger is connected, the cpu startup
code must not zero out the HW breakpoint registers or you cannot hit
the breakpoints you are interested in, in the first place.
Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/setup64.c')
-rw-r--r-- | arch/x86/kernel/setup64.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/arch/x86/kernel/setup64.c b/arch/x86/kernel/setup64.c index e24c45677094..143aa78c566b 100644 --- a/arch/x86/kernel/setup64.c +++ b/arch/x86/kernel/setup64.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <linux/bootmem.h> | 11 | #include <linux/bootmem.h> |
12 | #include <linux/bitops.h> | 12 | #include <linux/bitops.h> |
13 | #include <linux/module.h> | 13 | #include <linux/module.h> |
14 | #include <linux/kgdb.h> | ||
14 | #include <asm/pda.h> | 15 | #include <asm/pda.h> |
15 | #include <asm/pgtable.h> | 16 | #include <asm/pgtable.h> |
16 | #include <asm/processor.h> | 17 | #include <asm/processor.h> |
@@ -327,6 +328,17 @@ void __cpuinit cpu_init (void) | |||
327 | load_TR_desc(); | 328 | load_TR_desc(); |
328 | load_LDT(&init_mm.context); | 329 | load_LDT(&init_mm.context); |
329 | 330 | ||
331 | #ifdef CONFIG_KGDB | ||
332 | /* | ||
333 | * If the kgdb is connected no debug regs should be altered. This | ||
334 | * is only applicable when KGDB and a KGDB I/O module are built | ||
335 | * into the kernel and you are using early debugging with | ||
336 | * kgdbwait. KGDB will control the kernel HW breakpoint registers. | ||
337 | */ | ||
338 | if (kgdb_connected && arch_kgdb_ops.correct_hw_break) | ||
339 | arch_kgdb_ops.correct_hw_break(); | ||
340 | else { | ||
341 | #endif | ||
330 | /* | 342 | /* |
331 | * Clear all 6 debug registers: | 343 | * Clear all 6 debug registers: |
332 | */ | 344 | */ |
@@ -337,6 +349,10 @@ void __cpuinit cpu_init (void) | |||
337 | set_debugreg(0UL, 3); | 349 | set_debugreg(0UL, 3); |
338 | set_debugreg(0UL, 6); | 350 | set_debugreg(0UL, 6); |
339 | set_debugreg(0UL, 7); | 351 | set_debugreg(0UL, 7); |
352 | #ifdef CONFIG_KGDB | ||
353 | /* If the kgdb is connected no debug regs should be altered. */ | ||
354 | } | ||
355 | #endif | ||
340 | 356 | ||
341 | fpu_init(); | 357 | fpu_init(); |
342 | 358 | ||