gdbserver/ChangeLog:

* linux-arm-low.c (arm_linux_hw_point_initialize): Distinguish
	between unsupported TYPE and unimplementable ADDR/LEN combination.
	(arm_insert_point): Act on new return value.

testsuite/ChangeLog:

	* gdb.base/watchpoint.exp (test_wide_location_1): Expect software
	watchpoints on ARM.  When expecting software watchpoints, tolerate
	(remote) targets that report unsupported hardware watchpoint only
	at continue time.
	(test_wide_location_2): Likewise.
This commit is contained in:
Ulrich Weigand 2012-08-01 13:02:41 +00:00
parent a967a8512a
commit b62e2b271b
4 changed files with 58 additions and 15 deletions

View File

@ -1,3 +1,9 @@
2012-08-01 Ulrich Weigand <ulrich.weigand@linaro.org>
* linux-arm-low.c (arm_linux_hw_point_initialize): Distinguish
between unsupported TYPE and unimplementable ADDR/LEN combination.
(arm_insert_point): Act on new return value.
2012-07-31 Pedro Alves <palves@redhat.com>
* server.c (process_point_options): Only skip tokens if we find

View File

@ -432,8 +432,9 @@ arm_linux_hw_breakpoint_equal (const struct arm_linux_hw_breakpoint *p1,
/* Initialize the hardware breakpoint structure P for a breakpoint or
watchpoint at ADDR to LEN. The type of watchpoint is given in TYPE.
Returns -1 if TYPE is unsupported, 0 if TYPE represents a breakpoint,
and 1 if type represents a watchpoint. */
Returns -1 if TYPE is unsupported, or -2 if the particular combination
of ADDR and LEN cannot be implemented. Otherwise, returns 0 if TYPE
represents a breakpoint and 1 if type represents a watchpoint. */
static int
arm_linux_hw_point_initialize (char type, CORE_ADDR addr, int len,
struct arm_linux_hw_breakpoint *p)
@ -483,7 +484,7 @@ arm_linux_hw_point_initialize (char type, CORE_ADDR addr, int len,
break;
default:
/* Unsupported. */
return -1;
return -2;
}
}
else
@ -493,17 +494,17 @@ arm_linux_hw_point_initialize (char type, CORE_ADDR addr, int len,
/* Can not set watchpoints for zero or negative lengths. */
if (len <= 0)
return -1;
return -2;
/* The current ptrace interface can only handle watchpoints that are a
power of 2. */
if ((len & (len - 1)) != 0)
return -1;
return -2;
/* Test that the range [ADDR, ADDR + LEN) fits into the largest address
range covered by a watchpoint. */
aligned_addr = addr & ~(max_wp_length - 1);
if (aligned_addr + max_wp_length < addr + len)
return -1;
return -2;
mask = (1 << len) - 1;
}
@ -560,7 +561,7 @@ arm_insert_point (char type, CORE_ADDR addr, int len)
if (watch < 0)
{
/* Unsupported. */
return 1;
return watch == -1 ? 1 : -1;
}
if (watch)

View File

@ -1,3 +1,11 @@
2012-08-01 Ulrich Weigand <ulrich.weigand@linaro.org>
* gdb.base/watchpoint.exp (test_wide_location_1): Expect software
watchpoints on ARM. When expecting software watchpoints, tolerate
(remote) targets that report unsupported hardware watchpoint only
at continue time.
(test_wide_location_2): Likewise.
2012-08-01 Jan Kratochvil <jan.kratochvil@redhat.com>
* gdb.base/valgrind-infcall.exp: Relax the UNSUPPORTED check for more

View File

@ -603,13 +603,15 @@ proc test_watch_location {} {
proc test_wide_location_1 {} {
global no_hw
global gdb_prompt
# This test watches two words on most 32-bit ABIs, and one word on
# most 64-bit ABIs.
# Platforms where the target can't watch such a large region
# should clear hw_expected below.
if { $no_hw || [target_info exists gdb,no_hardware_watchpoints] } {
if { $no_hw || [target_info exists gdb,no_hardware_watchpoints]
|| [istarget arm*-*-*] } {
set hw_expected 0
} else {
set hw_expected 1
@ -625,9 +627,21 @@ proc test_wide_location_1 {} {
"continue with watch foo2"
} else {
gdb_test "watch foo2" "atchpoint .*: .*" "watch foo2"
gdb_test "continue" \
"Continuing.*\[Ww\]atchpoint .*: .*New value = \\\{val = \\\{0, 11\\\}\\\}.*" \
"continue with watch foo2"
set test "continue with watch foo2"
gdb_test_multiple "cont" $test {
-re "Continuing.*\[Ww\]atchpoint .*: .*New value = \\\{val = \\\{0, 11\\\}\\\}.*$gdb_prompt $" {
pass $test
}
-re "Could not insert hardware breakpoints:.*You may have requested too many hardware breakpoints/watchpoints.*$gdb_prompt $" {
# This may happen with remote targets that support
# hardware watchpoints. We only find out the
# watchpoint was too large, for example, at insert
# time. If GDB is ever adjusted to downgrade the
# watchpoint automatically in this case, this match
# should be removed.
pass $test
}
}
}
gdb_test_no_output "delete \$bpnum" "delete watch foo2"
@ -635,13 +649,15 @@ proc test_wide_location_1 {} {
proc test_wide_location_2 {} {
global no_hw
global gdb_prompt
# This test watches four words on most 32-bit ABIs, and two words
# on 64-bit ABIs.
# Platforms where the target can't watch such a large region
# should clear hw_expected below.
if { $no_hw || [target_info exists gdb,no_hardware_watchpoints] } {
if { $no_hw || [target_info exists gdb,no_hardware_watchpoints]
|| [istarget arm*-*-*] } {
set hw_expected 0
} else {
set hw_expected 1
@ -657,9 +673,21 @@ proc test_wide_location_2 {} {
"continue with watch foo4"
} else {
gdb_test "watch foo4" "atchpoint .*: .*" "watch foo4"
gdb_test "continue" \
"Continuing.*\[Ww\]atchpoint .*: .*New value = \\\{val = \\\{0, 0, 0, 33\\\}\\\}.*" \
"continue with watch foo4"
set test "continue with watch foo4"
gdb_test_multiple "cont" $test {
-re "Continuing.*\[Ww\]atchpoint .*: .*New value = \\\{val = \\\{0, 0, 0, 33\\\}\\\}.*$gdb_prompt $" {
pass $test
}
-re "Could not insert hardware breakpoints:.*You may have requested too many hardware breakpoints/watchpoints.*$gdb_prompt $" {
# This may happen with remote targets that support
# hardware watchpoints. We only find out the
# watchpoint was too large, for example, at insert
# time. If GDB is ever adjusted to downgrade the
# watchpoint automatically in this case, this match
# should be removed.
pass $test
}
}
}
gdb_test_no_output "delete \$bpnum" "delete watch foo4"