History

debug_core: disable hw_breakpoints on all cores in kgdb_cpu_enter()

The slave cpus do not have the hw breakpoints disabled upon entry to the debug_core and as a result could cause unrecoverable recursive faults on badly placed breakpoints, or get out of sync with the arch specific hw breakpoint operations. This patch addresses the problem by invoking kgdb_disable_hw_debug() earlier in kgdb_enter_cpu for each cpu that enters the debug core. The hw breakpoint dis/enable flow should be: master_debug_cpu slave_debug_cpu \ / kgdb_cpu_enter | kgdb_disable_hw_debug --> uninstall pre-enabled hw_breakpoint | do add/rm dis/enable operates to hw_breakpoints on master_debug_cpu.. | correct_hw_break --> correct/install the enabled hw_breakpoint | leave_kgdb

Dongdong Deng committed 16 years ago

Commit c1bb9a91 parent 91b152a1 file · +5 −2Browse files

Showing the changes to kernel/debug (1 of 1 file). Show all

Unified · Split

kernel/debug/debug_core.c+5−2
@@ -485,6 +485,9 @@ static int kgdb_cpu_enter(struct kgdb_state *ks, struct pt_regs *regs) · 484 unmodified lines
485 int error;485 int error;
486 int i, cpu;486 int i, cpu;
487 int trace_on = 0;487 int trace_on = 0;
488
489 kgdb_disable_hw_debug(ks->linux_regs);
490
488acquirelock:491acquirelock:
489 /*492 /*
490 * Interrupts will be restored by the 'trap return' code, except when493 * Interrupts will be restored by the 'trap return' code, except when
@@ -569,8 +572,6 @@ return_normal: · 78 unmodified lines
569 if (dbg_io_ops->pre_exception)572 if (dbg_io_ops->pre_exception)
570 dbg_io_ops->pre_exception();573 dbg_io_ops->pre_exception();
571 574
572 kgdb_disable_hw_debug(ks->linux_regs);
573
574 /*575 /*
575 * Get the passive CPU lock which will hold all the non-primary576 * Get the passive CPU lock which will hold all the non-primary
576 * CPU in a spin state while the debugger is active577 * CPU in a spin state while the debugger is active
@@ -661,6 +662,8 @@ kgdb_restore: · 84 unmodified lines
661 else662 else
662 kgdb_sstep_pid = 0;663 kgdb_sstep_pid = 0;
663 }664 }
665 if (arch_kgdb_ops.correct_hw_break)
666 arch_kgdb_ops.correct_hw_break();
664 if (trace_on)667 if (trace_on)
665 tracing_on();668 tracing_on();
666 /* Free kgdb_active */669 /* Free kgdb_active */