From 0a5b1e09bf62fcbe776eb641640f802f64bb6169 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Tue, 31 May 2011 21:18:56 +0000 Subject: [PATCH] 2011-05-31 Pedro Alves 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 | 6 +++ gdb/gdbserver/linux-x86-low.c | 2 +- gdb/gdbserver/win32-i386-low.c | 2 +- gdb/testsuite/ChangeLog | 5 +++ gdb/testsuite/gdb.arch/i386-dr3-watch.c | 43 ++++++++++++++++++++ gdb/testsuite/gdb.arch/i386-dr3-watch.exp | 49 +++++++++++++++++++++++ 6 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 gdb/testsuite/gdb.arch/i386-dr3-watch.c create mode 100644 gdb/testsuite/gdb.arch/i386-dr3-watch.exp diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 98c11007f2..4a9baf6e03 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,9 @@ +2011-05-31 Pedro Alves + + * 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 * 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 027a5635d6..dd69379573 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 6063df8556..c29b9b040e 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 4ba8c65161..3d89273725 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-05-31 Pedro Alves + + * gdb.arch/i386-dr3-watch.c: New file. + * gdb.arch/i386-dr3-watch.exp: New file. + 2011-05-30 Yao Qi * 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 0000000000..a851d8ad7c --- /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 . */ + +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 0000000000..f560b013fe --- /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 . + +# 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"