aboutsummaryrefslogtreecommitdiffstats
path: root/arch/blackfin/kernel
diff options
context:
space:
mode:
authorSonic Zhang <sonic.zhang@analog.com>2010-11-17 01:52:39 -0500
committerMike Frysinger <vapier@gentoo.org>2011-01-10 07:18:23 -0500
commitb68233e7f0126dfe59e1a064da9e37827c1f35ec (patch)
tree79f7891894b4a943a7166a42f8c404b1de281a39 /arch/blackfin/kernel
parent900de05182d520ff66378e74a7b18f7d9971a32d (diff)
Blackfin: kgdb: disable preempt schedule when running single step in kgdb
Otherwise, gdb continue operation after a breakpoint is hit may trap into endless breakpoint. Signed-off-by: Sonic Zhang <sonic.zhang@analog.com> Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Diffstat (limited to 'arch/blackfin/kernel')
-rw-r--r--arch/blackfin/kernel/kgdb.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/arch/blackfin/kernel/kgdb.c b/arch/blackfin/kernel/kgdb.c
index e89ef34f744f..eb92592fd80c 100644
--- a/arch/blackfin/kernel/kgdb.c
+++ b/arch/blackfin/kernel/kgdb.c
@@ -347,15 +347,20 @@ void kgdb_roundup_cpu(int cpu, unsigned long flags)
347 347
348#ifdef CONFIG_IPIPE 348#ifdef CONFIG_IPIPE
349static unsigned long kgdb_arch_imask; 349static unsigned long kgdb_arch_imask;
350#endif
350 351
351void kgdb_post_primary_code(struct pt_regs *regs, int e_vector, int err_code) 352void kgdb_post_primary_code(struct pt_regs *regs, int e_vector, int err_code)
352{ 353{
354 if (kgdb_single_step)
355 preempt_enable();
356
357#ifdef CONFIG_IPIPE
353 if (kgdb_arch_imask) { 358 if (kgdb_arch_imask) {
354 cpu_pda[raw_smp_processor_id()].ex_imask = kgdb_arch_imask; 359 cpu_pda[raw_smp_processor_id()].ex_imask = kgdb_arch_imask;
355 kgdb_arch_imask = 0; 360 kgdb_arch_imask = 0;
356 } 361 }
357}
358#endif 362#endif
363}
359 364
360int kgdb_arch_handle_exception(int vector, int signo, 365int kgdb_arch_handle_exception(int vector, int signo,
361 int err_code, char *remcom_in_buffer, 366 int err_code, char *remcom_in_buffer,
@@ -401,6 +406,7 @@ int kgdb_arch_handle_exception(int vector, int signo,
401 */ 406 */
402 kgdb_single_step = i + 1; 407 kgdb_single_step = i + 1;
403 408
409 preempt_disable();
404#ifdef CONFIG_IPIPE 410#ifdef CONFIG_IPIPE
405 kgdb_arch_imask = cpu_pda[raw_smp_processor_id()].ex_imask; 411 kgdb_arch_imask = cpu_pda[raw_smp_processor_id()].ex_imask;
406 cpu_pda[raw_smp_processor_id()].ex_imask = 0; 412 cpu_pda[raw_smp_processor_id()].ex_imask = 0;