mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-30 00:52:16 +08:00
2005-05-12 Orjan Friberg <orjanf@axis.com>
* target.h (struct target_ops): Add insert_watchpoint, remove_watchpoint, stopped_by_watchpoint, stopped_data_address function pointers for hardware watchpoint support. * linux-low.h (struct linux_target_ops): Ditto. * linux-low.c (linux_insert_watchpoint, linux_remove_watchpoint) (linux_stopped_by_watchpoint, linux_stopped_data_address): New. Add to linux_target_ops. * remote-utils.c (prepare_resume_reply): Add watchpoint information to reply packet. * server.c (main): Recognize 'Z' and 'z' packets.
This commit is contained in:
@ -1,3 +1,16 @@
|
|||||||
|
2005-05-12 Orjan Friberg <orjanf@axis.com>
|
||||||
|
|
||||||
|
* target.h (struct target_ops): Add insert_watchpoint,
|
||||||
|
remove_watchpoint, stopped_by_watchpoint, stopped_data_address function
|
||||||
|
pointers for hardware watchpoint support.
|
||||||
|
* linux-low.h (struct linux_target_ops): Ditto.
|
||||||
|
* linux-low.c (linux_insert_watchpoint, linux_remove_watchpoint)
|
||||||
|
(linux_stopped_by_watchpoint, linux_stopped_data_address): New. Add
|
||||||
|
to linux_target_ops.
|
||||||
|
* remote-utils.c (prepare_resume_reply): Add watchpoint information to
|
||||||
|
reply packet.
|
||||||
|
* server.c (main): Recognize 'Z' and 'z' packets.
|
||||||
|
|
||||||
2005-05-10 Ulrich Weigand <uweigand@de.ibm.com>
|
2005-05-10 Ulrich Weigand <uweigand@de.ibm.com>
|
||||||
|
|
||||||
* linux-s390-low.c (s390_breakpoint, s390_breakpoint_len): Define.
|
* linux-s390-low.c (s390_breakpoint, s390_breakpoint_len): Define.
|
||||||
|
@ -1467,7 +1467,47 @@ linux_read_auxv (CORE_ADDR offset, char *myaddr, unsigned int len)
|
|||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* These watchpoint related wrapper functions simply pass on the function call
|
||||||
|
if the target has registered a corresponding function. */
|
||||||
|
|
||||||
|
static int
|
||||||
|
linux_insert_watchpoint (char type, CORE_ADDR addr, int len)
|
||||||
|
{
|
||||||
|
if (the_low_target.insert_watchpoint != NULL)
|
||||||
|
return the_low_target.insert_watchpoint (type, addr, len);
|
||||||
|
else
|
||||||
|
/* Unsupported (see target.h). */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
linux_remove_watchpoint (char type, CORE_ADDR addr, int len)
|
||||||
|
{
|
||||||
|
if (the_low_target.remove_watchpoint != NULL)
|
||||||
|
return the_low_target.remove_watchpoint (type, addr, len);
|
||||||
|
else
|
||||||
|
/* Unsupported (see target.h). */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
linux_stopped_by_watchpoint (void)
|
||||||
|
{
|
||||||
|
if (the_low_target.stopped_by_watchpoint != NULL)
|
||||||
|
return the_low_target.stopped_by_watchpoint ();
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static CORE_ADDR
|
||||||
|
linux_stopped_data_address (void)
|
||||||
|
{
|
||||||
|
if (the_low_target.stopped_data_address != NULL)
|
||||||
|
return the_low_target.stopped_data_address ();
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static struct target_ops linux_target_ops = {
|
static struct target_ops linux_target_ops = {
|
||||||
linux_create_inferior,
|
linux_create_inferior,
|
||||||
linux_attach,
|
linux_attach,
|
||||||
@ -1483,6 +1523,10 @@ static struct target_ops linux_target_ops = {
|
|||||||
linux_look_up_symbols,
|
linux_look_up_symbols,
|
||||||
linux_send_signal,
|
linux_send_signal,
|
||||||
linux_read_auxv,
|
linux_read_auxv,
|
||||||
|
linux_insert_watchpoint,
|
||||||
|
linux_remove_watchpoint,
|
||||||
|
linux_stopped_by_watchpoint,
|
||||||
|
linux_stopped_data_address,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -57,6 +57,13 @@ struct linux_target_ops
|
|||||||
|
|
||||||
int decr_pc_after_break;
|
int decr_pc_after_break;
|
||||||
int (*breakpoint_at) (CORE_ADDR pc);
|
int (*breakpoint_at) (CORE_ADDR pc);
|
||||||
|
|
||||||
|
/* Watchpoint related functions. See target.h for comments. */
|
||||||
|
int (*insert_watchpoint) (char type, CORE_ADDR addr, int len);
|
||||||
|
int (*remove_watchpoint) (char type, CORE_ADDR addr, int len);
|
||||||
|
int (*stopped_by_watchpoint) (void);
|
||||||
|
CORE_ADDR (*stopped_data_address) (void);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct linux_target_ops the_low_target;
|
extern struct linux_target_ops the_low_target;
|
||||||
|
@ -639,6 +639,28 @@ prepare_resume_reply (char *buf, char status, unsigned char signo)
|
|||||||
if (status == 'T')
|
if (status == 'T')
|
||||||
{
|
{
|
||||||
const char **regp = gdbserver_expedite_regs;
|
const char **regp = gdbserver_expedite_regs;
|
||||||
|
|
||||||
|
if (the_target->stopped_by_watchpoint != NULL
|
||||||
|
&& (*the_target->stopped_by_watchpoint) ())
|
||||||
|
{
|
||||||
|
CORE_ADDR addr;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
strncpy (buf, "watch:", 6);
|
||||||
|
buf += 6;
|
||||||
|
|
||||||
|
addr = (*the_target->stopped_data_address) ();
|
||||||
|
|
||||||
|
/* Convert each byte of the address into two hexadecimal chars.
|
||||||
|
Note that we take sizeof (void *) instead of sizeof (addr);
|
||||||
|
this is to avoid sending a 64-bit address to a 32-bit GDB. */
|
||||||
|
for (i = sizeof (void *) * 2; i > 0; i--)
|
||||||
|
{
|
||||||
|
*buf++ = tohex ((addr >> (i - 1) * 4) & 0xf);
|
||||||
|
}
|
||||||
|
*buf++ = ';';
|
||||||
|
}
|
||||||
|
|
||||||
while (*regp)
|
while (*regp)
|
||||||
{
|
{
|
||||||
buf = outreg (find_regno (*regp), buf);
|
buf = outreg (find_regno (*regp), buf);
|
||||||
|
@ -509,6 +509,66 @@ main (int argc, char *argv[])
|
|||||||
signal = mywait (&status, 1);
|
signal = mywait (&status, 1);
|
||||||
prepare_resume_reply (own_buf, status, signal);
|
prepare_resume_reply (own_buf, status, signal);
|
||||||
break;
|
break;
|
||||||
|
case 'Z':
|
||||||
|
{
|
||||||
|
char *lenptr;
|
||||||
|
char *dataptr;
|
||||||
|
CORE_ADDR addr = strtoul (&own_buf[3], &lenptr, 16);
|
||||||
|
int len = strtol (lenptr + 1, &dataptr, 16);
|
||||||
|
char type = own_buf[1];
|
||||||
|
|
||||||
|
if (the_target->insert_watchpoint == NULL
|
||||||
|
|| (type < '2' || type > '4'))
|
||||||
|
{
|
||||||
|
/* No watchpoint support or not a watchpoint command;
|
||||||
|
unrecognized either way. */
|
||||||
|
own_buf[0] = '\0';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
|
||||||
|
res = (*the_target->insert_watchpoint) (type, addr, len);
|
||||||
|
if (res == 0)
|
||||||
|
write_ok (own_buf);
|
||||||
|
else if (res == 1)
|
||||||
|
/* Unsupported. */
|
||||||
|
own_buf[0] = '\0';
|
||||||
|
else
|
||||||
|
write_enn (own_buf);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'z':
|
||||||
|
{
|
||||||
|
char *lenptr;
|
||||||
|
char *dataptr;
|
||||||
|
CORE_ADDR addr = strtoul (&own_buf[3], &lenptr, 16);
|
||||||
|
int len = strtol (lenptr + 1, &dataptr, 16);
|
||||||
|
char type = own_buf[1];
|
||||||
|
|
||||||
|
if (the_target->remove_watchpoint == NULL
|
||||||
|
|| (type < '2' || type > '4'))
|
||||||
|
{
|
||||||
|
/* No watchpoint support or not a watchpoint command;
|
||||||
|
unrecognized either way. */
|
||||||
|
own_buf[0] = '\0';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
|
||||||
|
res = (*the_target->remove_watchpoint) (type, addr, len);
|
||||||
|
if (res == 0)
|
||||||
|
write_ok (own_buf);
|
||||||
|
else if (res == 1)
|
||||||
|
/* Unsupported. */
|
||||||
|
own_buf[0] = '\0';
|
||||||
|
else
|
||||||
|
write_enn (own_buf);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case 'k':
|
case 'k':
|
||||||
fprintf (stderr, "Killing inferior\n");
|
fprintf (stderr, "Killing inferior\n");
|
||||||
kill_inferior ();
|
kill_inferior ();
|
||||||
|
@ -133,6 +133,27 @@ struct target_ops
|
|||||||
Read LEN bytes at OFFSET into a buffer at MYADDR. */
|
Read LEN bytes at OFFSET into a buffer at MYADDR. */
|
||||||
|
|
||||||
int (*read_auxv) (CORE_ADDR offset, char *myaddr, unsigned int len);
|
int (*read_auxv) (CORE_ADDR offset, char *myaddr, unsigned int len);
|
||||||
|
|
||||||
|
/* Insert and remove a hardware watchpoint.
|
||||||
|
Returns 0 on success, -1 on failure and 1 on unsupported.
|
||||||
|
The type is coded as follows:
|
||||||
|
2 = write watchpoint
|
||||||
|
3 = read watchpoint
|
||||||
|
4 = access watchpoint
|
||||||
|
*/
|
||||||
|
|
||||||
|
int (*insert_watchpoint) (char type, CORE_ADDR addr, int len);
|
||||||
|
int (*remove_watchpoint) (char type, CORE_ADDR addr, int len);
|
||||||
|
|
||||||
|
/* Returns 1 if target was stopped due to a watchpoint hit, 0 otherwise. */
|
||||||
|
|
||||||
|
int (*stopped_by_watchpoint) (void);
|
||||||
|
|
||||||
|
/* Returns the address associated with the watchpoint that hit, if any;
|
||||||
|
returns 0 otherwise. */
|
||||||
|
|
||||||
|
CORE_ADDR (*stopped_data_address) (void);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct target_ops *the_target;
|
extern struct target_ops *the_target;
|
||||||
|
Reference in New Issue
Block a user