forked from Imagelibrary/binutils-gdb
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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user