Blackfin arch: Fix bug - hardware breakpoint doesn't always work in kgdb
authorSonic Zhang <sonic.zhang@analog.com>
Tue, 18 Nov 2008 09:48:22 +0000 (17:48 +0800)
committerBryan Wu <cooloney@kernel.org>
Tue, 18 Nov 2008 09:48:22 +0000 (17:48 +0800)
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>
arch/blackfin/kernel/kgdb.c

index ab4022131a2a9edb4fbecf46413e591682dae4a7..0c4c53fa723e7d3bd88320bce1bb5ae880a7f599 100644 (file)
@@ -219,6 +219,7 @@ int bfin_set_hw_break(unsigned long addr, int len, enum kgdb_bptype type)
                if (bfin_type == breakinfo[breakno].type
                        && !breakinfo[breakno].occupied) {
                        breakinfo[breakno].occupied = 1;
+                       breakinfo[breakno].skip = 0;
                        breakinfo[breakno].enabled = 1;
                        breakinfo[breakno].addr = addr;
                        breakinfo[breakno].dataacc = dataacc;
@@ -426,17 +427,6 @@ int kgdb_arch_handle_exception(int vector, int signo,
                        kgdb_single_step = i + 1;
                }
 
-               if (vector == VEC_WATCH) {
-                       wp_status = bfin_read_WPSTAT();
-                       for (breakno = 0; breakno < HW_WATCHPOINT_NUM; breakno++) {
-                               if (wp_status & (1 << breakno)) {
-                                       breakinfo->skip = 1;
-                                       break;
-                               }
-                       }
-                       bfin_write_WPSTAT(0);
-               }
-
                bfin_correct_hw_break();
 
                return 0;