Signed-off-by: Andrew Morton 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, +}; +