Commit 8a0e9acf authored by Sonic Zhang's avatar Sonic Zhang Committed by Bryan Wu

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: default avatarSonic Zhang <sonic.zhang@analog.com>
Signed-off-by: default avatarBryan Wu <cooloney@kernel.org>
parent 0b82e274
...@@ -219,6 +219,7 @@ int bfin_set_hw_break(unsigned long addr, int len, enum kgdb_bptype type) ...@@ -219,6 +219,7 @@ int bfin_set_hw_break(unsigned long addr, int len, enum kgdb_bptype type)
if (bfin_type == breakinfo[breakno].type if (bfin_type == breakinfo[breakno].type
&& !breakinfo[breakno].occupied) { && !breakinfo[breakno].occupied) {
breakinfo[breakno].occupied = 1; breakinfo[breakno].occupied = 1;
breakinfo[breakno].skip = 0;
breakinfo[breakno].enabled = 1; breakinfo[breakno].enabled = 1;
breakinfo[breakno].addr = addr; breakinfo[breakno].addr = addr;
breakinfo[breakno].dataacc = dataacc; breakinfo[breakno].dataacc = dataacc;
...@@ -426,17 +427,6 @@ int kgdb_arch_handle_exception(int vector, int signo, ...@@ -426,17 +427,6 @@ int kgdb_arch_handle_exception(int vector, int signo,
kgdb_single_step = i + 1; 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(); bfin_correct_hw_break();
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment