Signed-off-by: Andrew Morton <akpm@osdl.org>
Index: linux-2.6.17-rc4/arch/i386/kernel/kgdb.c
===================================================================
--- linux-2.6.17-rc4.orig/arch/i386/kernel/kgdb.c 2006-06-09 17:17:01.000000000 +0100
+++ linux-2.6.17-rc4/arch/i386/kernel/kgdb.c 2006-06-09 17:17:12.000000000 +0100
@@ -184,6 +184,54 @@ void kgdb_correct_hw_break(void)
asm volatile ("movl %0, %%db7\n"::"r" (dr7));
}
+int kgdb_remove_hw_break(unsigned long addr)
+{
+ int i, idx = -1;
+ for (i = 0; i < 4; i++) {
+ if (breakinfo[i].addr == addr && breakinfo[i].enabled) {
+ idx = i;
+ break;
+ }
+ }
+ if (idx == -1)
+ return -1;
+
+ breakinfo[idx].enabled = 0;
+ return 0;
+}
+
+void kgdb_remove_all_hw_break(void)
+{
+ int i;
+
+ for (i = 0; i < 4; i++) {
+ if (breakinfo[i].enabled) {
+ /* Do what? */
+ ;
+ }
+ memset(&breakinfo[i], 0, sizeof(struct hw_breakpoint));
+ }
+}
+
+int kgdb_set_hw_break(unsigned long addr)
+{
+ int i, idx = -1;
+ for (i = 0; i < 4; i++) {
+ if (!breakinfo[i].enabled) {
+ idx = i;
+ break;
+ }
+ }
+ if (idx == -1)
+ return -1;
+
+ breakinfo[idx].enabled = 1;
+ breakinfo[idx].type = 1;
+ breakinfo[idx].len = 1;
+ breakinfo[idx].addr = addr;
+ return 0;
+}
+
void kgdb_disable_hw_debug(struct pt_regs *regs)
{
/* Disable hardware debugging while we are in kgdb */
@@ -311,3 +359,6 @@ int kgdb_skipexception(int exception, st
struct kgdb_arch arch_kgdb_ops = {
.gdb_bpt_instr = {0xcc},
+ .flags = KGDB_HW_BREAKPOINT,
+};
+