aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSonic Zhang <sonic.zhang@analog.com>2008-11-18 04:48:22 -0500
committerBryan Wu <cooloney@kernel.org>2008-11-18 04:48:22 -0500
commit8a0e9acfd153cf5c726f010b075a3d4d55f80895 (patch)
tree8ba08c1f2ae8c13130ea1894035ffd42fa691a09
parent0b82e27444f4c186e931ecc97c9a8dae07128078 (diff)
Blackfin arch: Fix bug - hardware breakpoint doesn't always work in kgdb
Hardware breakpoint doesn't always work in kgdb. It works at the first two times, but if you repeatedly trigger that hardware breakpoint, it would slip over that point once in two times. Fix it by always setting hw bp skip to 0. gdb does skip after hw bp trap. Signed-off-by: Sonic Zhang <sonic.zhang@analog.com> Signed-off-by: Bryan Wu <cooloney@kernel.org>
-rw-r--r--arch/blackfin/kernel/kgdb.c12
1 files changed, 1 insertions, 11 deletions
diff --git a/arch/blackfin/kernel/kgdb.c b/arch/blackfin/kernel/kgdb.c
index ab4022131a2a..0c4c53fa723e 100644
--- a/arch/blackfin/kernel/kgdb.c
+++ b/arch/blackfin/kernel/kgdb.c
@@ -219,6 +219,7 @@ int bfin_set_hw_break(unsigned long addr, int len, enum kgdb_bptype type)
219 if (bfin_type == breakinfo[breakno].type 219 if (bfin_type == breakinfo[breakno].type
220 && !breakinfo[breakno].occupied) { 220 && !breakinfo[breakno].occupied) {
221 breakinfo[breakno].occupied = 1; 221 breakinfo[breakno].occupied = 1;
222 breakinfo[breakno].skip = 0;
222 breakinfo[breakno].enabled = 1; 223 breakinfo[breakno].enabled = 1;
223 breakinfo[breakno].addr = addr; 224 breakinfo[breakno].addr = addr;
224 breakinfo[breakno].dataacc = dataacc; 225 breakinfo[breakno].dataacc = dataacc;
@@ -426,17 +427,6 @@ int kgdb_arch_handle_exception(int vector, int signo,
426 kgdb_single_step = i + 1; 427 kgdb_single_step = i + 1;
427 } 428 }
428 429
429 if (vector == VEC_WATCH) {
430 wp_status = bfin_read_WPSTAT();
431 for (breakno = 0; breakno < HW_WATCHPOINT_NUM; breakno++) {
432 if (wp_status & (1 << breakno)) {
433 breakinfo->skip = 1;
434 break;
435 }
436 }
437 bfin_write_WPSTAT(0);
438 }
439
440 bfin_correct_hw_break(); 430 bfin_correct_hw_break();
441 431
442 return 0; 432 return 0;