summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksandar Ristovski <aristovski@qnx.com>2009-06-23 15:12:44 +0000
committerAleksandar Ristovski <aristovski@qnx.com>2009-06-23 15:12:44 +0000
commitca3b67a156e97498ea3e8cb98d1f725b24a61a40 (patch)
tree74143d0891d8a17a7ea479ec691b14ed2dbb109a
parent41c784cebd8ccc2a95b58b4e6b17111c303efde7 (diff)
downloadgdb-ca3b67a156e97498ea3e8cb98d1f725b24a61a40.tar.gz
* server.c (process_serial_event): Add support for Z0 and Z1 packet.
* target.h (target_ops): Comment for *_watchpoint to make it clear the functions can get types '0' and '1'.
-rw-r--r--gdb/gdbserver/ChangeLog6
-rw-r--r--gdb/gdbserver/server.c88
-rw-r--r--gdb/gdbserver/target.h9
3 files changed, 50 insertions, 53 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index f2d55c45daf..6d60590733d 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,3 +1,9 @@
+2009-06-23 Aleksandar Ristovski <aristovski@qnx.com>
+
+ * server.c (process_serial_event): Add support for Z0 and Z1 packet.
+ * target.h (target_ops): Comment for *_watchpoint to make it clear
+ the functions can get types '0' and '1'.
+
2009-06-22 Aleksandar Ristovski <aristovski@qnx.com>
* linux-low.c (usr_fetch_inferior_registers): Remove check for regno 0.
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index a9bf4a82d5a..566e47dc222 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -2371,66 +2371,56 @@ process_serial_event (void)
signal = 0;
myresume (own_buf, 1, signal);
break;
- case 'Z':
+ case 'Z': /* insert_ ... */
+ /* Fallthrough. */
+ case 'z': /* remove_ ... */
{
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];
+ int res;
+ const int insert_ = ch == 'Z';
+
+ /* Type: '0' - software-breakpoint
+ '1' - hardware-breakpoint
+ '2' - write watchpoint
+ '3' - read watchpoint
+ '4' - access watchpoint */
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';
- }
+ || the_target->remove_watchpoint == NULL)
+ res = 1; /* Not supported. */
else
- {
- int res;
-
- require_running (own_buf);
- 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];
+ switch (type)
+ {
+ case '2':
+ /* Fallthrough. */
+ case '3':
+ /* Fallthrough. */
+ case '4':
+ require_running (own_buf);
+ /* Fallthrough. */
+ case '0':
+ /* Fallthrough. */
+ case '1':
+ res = insert_ ? (*the_target->insert_watchpoint) (type, addr,
+ len)
+ : (*the_target->remove_watchpoint) (type, addr,
+ len);
+ break;
+ default:
+ res = -1; /* Unrecognized type. */
+ }
- 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';
- }
+ if (res == 0)
+ write_ok (own_buf);
+ else if (res == 1)
+ /* Unsupported. */
+ own_buf[0] = '\0';
else
- {
- int res;
-
- require_running (own_buf);
- 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);
- }
+ write_enn (own_buf);
break;
}
case 'k':
diff --git a/gdb/gdbserver/target.h b/gdb/gdbserver/target.h
index 70b5d01e53a..5ca63901ab2 100644
--- a/gdb/gdbserver/target.h
+++ b/gdb/gdbserver/target.h
@@ -216,10 +216,11 @@ struct target_ops
/* 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
- */
+ '0' - software-breakpoint
+ '1' - hardware-breakpoint
+ '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);