This adds hardware breakpoint support for i386.  This is not as well tested as
software breakpoints, but in some minimal testing appears to be functional.

---

 linux-2.6.13-rc3-trini/arch/i386/kernel/kgdb.c |   49 +++++++++++++++++++++++++
 1 files changed, 49 insertions(+)

diff -puN arch/i386/kernel/kgdb.c~i386 arch/i386/kernel/kgdb.c
--- linux-2.6.13-rc3/arch/i386/kernel/kgdb.c~i386       2005-07-29 
12:02:15.000000000 -0700
+++ linux-2.6.13-rc3-trini/arch/i386/kernel/kgdb.c      2005-07-29 
12:02:15.000000000 -0700
@@ -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 */
@@ -298,4 +346,5 @@ int kgdb_arch_init(void)
 
 struct kgdb_arch arch_kgdb_ops = {
        .gdb_bpt_instr = {0xcc},
+       .flags = KGDB_HW_BREAKPOINT,
 };
_
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to