]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
2011-05-31 Pedro Alves <pedro@codesourcery.com>
authorPedro Alves <palves@redhat.com>
Tue, 31 May 2011 21:18:56 +0000 (21:18 +0000)
committerPedro Alves <palves@redhat.com>
Tue, 31 May 2011 21:18:56 +0000 (21:18 +0000)
gdb/gdbserver/
* linux-x86-low.c (i386_dr_low_get_addr): Fix off by one in
assertion.
* win32-i386-low.c (i386_dr_low_get_addr): Ditto.

gdb/testsuite/
* gdb.arch/i386-dr3-watch.c: New file.
* gdb.arch/i386-dr3-watch.exp: New file.

gdb/gdbserver/ChangeLog
gdb/gdbserver/linux-x86-low.c
gdb/gdbserver/win32-i386-low.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.arch/i386-dr3-watch.c [new file with mode: 0644]
gdb/testsuite/gdb.arch/i386-dr3-watch.exp [new file with mode: 0644]

index 98c11007f2e72f9af0e892dc752faefc038faa51..4a9baf6e034166c5b6fff7b7df3af27a36f978ed 100644 (file)
@@ -1,3 +1,9 @@
+2011-05-31  Pedro Alves  <pedro@codesourcery.com>
+
+       * linux-x86-low.c (i386_dr_low_get_addr): Fix off by one in
+       assertion.
+       * win32-i386-low.c (i386_dr_low_get_addr): Ditto.
+
 2011-05-26  Yao Qi  <yao@codesourcery.com>
 
        * Makefile.in (thread-db.o): Track dependence to
index 027a5635d687967d13a0826cd481f79ec4444f46..dd69379573089553066c5a58d04c35ffc86388ac 100644 (file)
@@ -508,7 +508,7 @@ i386_dr_low_get_addr (int regnum)
   ptid_t ptid = ptid_of (lwp);
 
   /* DR6 and DR7 are retrieved with some other way.  */
-  gdb_assert (DR_FIRSTADDR <= regnum && regnum < DR_LASTADDR);
+  gdb_assert (DR_FIRSTADDR <= regnum && regnum <= DR_LASTADDR);
 
   return x86_linux_dr_get (ptid, regnum);
 }
index 6063df855625377e4b0420db90bd96c0812d7cf0..c29b9b040ee7297e88fd015552b8381d1e446a4b 100644 (file)
@@ -61,7 +61,7 @@ i386_dr_low_set_addr (const struct i386_debug_reg_state *state, int regnum)
 CORE_ADDR
 i386_dr_low_get_addr (int regnum)
 {
-  gdb_assert (DR_FIRSTADDR <= regnum && regnum < DR_LASTADDR);
+  gdb_assert (DR_FIRSTADDR <= regnum && regnum <= DR_LASTADDR);
 
   return debug_reg_state.dr_mirror[regnum];
 }
index 4ba8c65161a028fb6becf0229621c064dbf4ead4..3d89273725a461d7bfc688aa2547d3b4ffeeaad5 100644 (file)
@@ -1,3 +1,8 @@
+2011-05-31  Pedro Alves  <pedro@codesourcery.com>
+
+       * gdb.arch/i386-dr3-watch.c: New file.
+       * gdb.arch/i386-dr3-watch.exp: New file.
+
 2011-05-30  Yao Qi  <yao@codesourcery.com>
 
        * gdb.base/callfuncs.c (t_structs_fc): New.
diff --git a/gdb/testsuite/gdb.arch/i386-dr3-watch.c b/gdb/testsuite/gdb.arch/i386-dr3-watch.c
new file mode 100644 (file)
index 0000000..a851d8a
--- /dev/null
@@ -0,0 +1,43 @@
+/* Copyright 2011 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+int i1;
+char gap1[32];
+
+int i2;
+char gap2[32];
+
+int i3;
+char gap3[32];
+
+int i4;
+
+void
+trigger (void)
+{
+  i1 = 1;
+  i2 = 2;
+  i3 = 3;
+  i4 = 4;
+}
+
+int
+main ()
+{
+  trigger ();
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.arch/i386-dr3-watch.exp b/gdb/testsuite/gdb.arch/i386-dr3-watch.exp
new file mode 100644 (file)
index 0000000..f560b01
--- /dev/null
@@ -0,0 +1,49 @@
+# Copyright 2011 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# x86 and amd64 gdbserver had a bug where a watchpoint triggered by
+# the DR3 debug register would trip on a bogus assertion.
+
+# This test relies on being able to set 4 hardware watchpoints.  Since
+# that is not a valid assumption across most targets, and we're
+# testing a x86 specific bug, skip everywhere else.
+if { ![istarget "i?86-*-*"] && ![istarget "x86_64-*-*"] } then {
+    return 0
+}
+
+set testfile "i386-dr3-watch"
+set srcfile ${testfile}.c
+
+if [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} {debug $additional_flags}] {
+    untested "failed to compile ${testfile}"
+    return -1
+}
+
+if ![runto_main] then {
+    untested "could not run to main"
+    return -1
+}
+
+gdb_test_no_output "set breakpoint always-inserted on"
+
+gdb_test "watch i1" "Hardware watchpoint .*: i1"
+gdb_test "watch i2" "Hardware watchpoint .*: i2"
+gdb_test "watch i3" "Hardware watchpoint .*: i3"
+gdb_test "watch i4" "Hardware watchpoint .*: i4"
+
+gdb_test "c" "Hardware watchpoint.*: i1.*" "continue to i1 watchpoint"
+gdb_test "c" "Hardware watchpoint.*: i2.*" "continue to i2 watchpoint"
+gdb_test "c" "Hardware watchpoint.*: i3.*" "continue to i3 watchpoint"
+gdb_test "c" "Hardware watchpoint.*: i4.*" "continue to i4 watchpoint"