diff options
author | Pedro Alves <palves@redhat.com> | 2011-05-31 21:18:56 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2011-05-31 21:18:56 +0000 |
commit | 0a5b1e09bf62fcbe776eb641640f802f64bb6169 (patch) | |
tree | dd65006627e5bfe52013d110020fb5255e17a3c7 /gdb | |
parent | 74ce8de7cab5dd5a4e098f226235256b976b5165 (diff) | |
download | gdb-0a5b1e09bf62fcbe776eb641640f802f64bb6169.zip gdb-0a5b1e09bf62fcbe776eb641640f802f64bb6169.tar.gz gdb-0a5b1e09bf62fcbe776eb641640f802f64bb6169.tar.bz2 |
2011-05-31 Pedro Alves <pedro@codesourcery.com>
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.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/gdbserver/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/gdbserver/linux-x86-low.c | 2 | ||||
-rw-r--r-- | gdb/gdbserver/win32-i386-low.c | 2 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.arch/i386-dr3-watch.c | 43 | ||||
-rw-r--r-- | gdb/testsuite/gdb.arch/i386-dr3-watch.exp | 49 |
6 files changed, 105 insertions, 2 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 98c1100..4a9baf6 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -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 diff --git a/gdb/gdbserver/linux-x86-low.c b/gdb/gdbserver/linux-x86-low.c index 027a563..dd69379 100644 --- a/gdb/gdbserver/linux-x86-low.c +++ b/gdb/gdbserver/linux-x86-low.c @@ -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); } diff --git a/gdb/gdbserver/win32-i386-low.c b/gdb/gdbserver/win32-i386-low.c index 6063df8..c29b9b0 100644 --- a/gdb/gdbserver/win32-i386-low.c +++ b/gdb/gdbserver/win32-i386-low.c @@ -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]; } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 4ba8c65..3d89273 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -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 index 0000000..a851d8a --- /dev/null +++ b/gdb/testsuite/gdb.arch/i386-dr3-watch.c @@ -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 index 0000000..f560b01 --- /dev/null +++ b/gdb/testsuite/gdb.arch/i386-dr3-watch.exp @@ -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" |