diff options
Diffstat (limited to 'gdb/gdbserver')
-rw-r--r-- | gdb/gdbserver/ChangeLog | 10 | ||||
-rw-r--r-- | gdb/gdbserver/linux-low.c | 36 | ||||
-rw-r--r-- | gdb/gdbserver/server.c | 11 | ||||
-rw-r--r-- | gdb/gdbserver/target.h | 9 |
4 files changed, 55 insertions, 11 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 7347f08..5884639 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,13 @@ +2014-01-16 Markus Metzger <markus.t.metzger@intel.com> + + * target.h (target_ops) <read_btrace>: Change parameters and + return type to allow error reporting. + * server.c (handle_qxfer_btrace): Support delta reads. Pass + trace reading errors on. + * linux-low.c (linux_low_read_btrace): Pass trace reading + errors on. + (linux_low_disable_btrace): New. + 2014-01-15 Doug Evans <dje@google.com> * inferiors.c (thread_id_to_gdb_id): Delete. diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 2bc619a..01d0e84 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -5705,7 +5705,7 @@ linux_qxfer_libraries_svr4 (const char *annex, unsigned char *readbuf, #ifdef HAVE_LINUX_BTRACE -/* Enable branch tracing. */ +/* See to_enable_btrace target method. */ static struct btrace_target_info * linux_low_enable_btrace (ptid_t ptid) @@ -5725,17 +5725,39 @@ linux_low_enable_btrace (ptid_t ptid) return tinfo; } -/* Read branch trace data as btrace xml document. */ +/* See to_disable_btrace target method. */ -static void +static int +linux_low_disable_btrace (struct btrace_target_info *tinfo) +{ + enum btrace_error err; + + err = linux_disable_btrace (tinfo); + return (err == BTRACE_ERR_NONE ? 0 : -1); +} + +/* See to_read_btrace target method. */ + +static int linux_low_read_btrace (struct btrace_target_info *tinfo, struct buffer *buffer, int type) { VEC (btrace_block_s) *btrace; struct btrace_block *block; + enum btrace_error err; int i; - btrace = linux_read_btrace (tinfo, type); + btrace = NULL; + err = linux_read_btrace (&btrace, tinfo, type); + if (err != BTRACE_ERR_NONE) + { + if (err == BTRACE_ERR_OVERFLOW) + buffer_grow_str0 (buffer, "E.Overflow."); + else + buffer_grow_str0 (buffer, "E.Generic Error."); + + return -1; + } buffer_grow_str (buffer, "<!DOCTYPE btrace SYSTEM \"btrace.dtd\">\n"); buffer_grow_str (buffer, "<btrace version=\"1.0\">\n"); @@ -5744,9 +5766,11 @@ linux_low_read_btrace (struct btrace_target_info *tinfo, struct buffer *buffer, buffer_xml_printf (buffer, "<block begin=\"0x%s\" end=\"0x%s\"/>\n", paddress (block->begin), paddress (block->end)); - buffer_grow_str (buffer, "</btrace>\n"); + buffer_grow_str0 (buffer, "</btrace>\n"); VEC_free (btrace_block_s, btrace); + + return 0; } #endif /* HAVE_LINUX_BTRACE */ @@ -5819,7 +5843,7 @@ static struct target_ops linux_target_ops = { #ifdef HAVE_LINUX_BTRACE linux_supports_btrace, linux_low_enable_btrace, - linux_disable_btrace, + linux_low_disable_btrace, linux_low_read_btrace, #else NULL, diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index 9ae28f8..28ea048 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -1348,7 +1348,7 @@ handle_qxfer_btrace (const char *annex, { static struct buffer cache; struct thread_info *thread; - int type; + int type, result; if (the_target->read_btrace == NULL || writebuf != NULL) return -2; @@ -1380,6 +1380,8 @@ handle_qxfer_btrace (const char *annex, type = BTRACE_READ_ALL; else if (strcmp (annex, "new") == 0) type = BTRACE_READ_NEW; + else if (strcmp (annex, "delta") == 0) + type = BTRACE_READ_DELTA; else { strcpy (own_buf, "E.Bad annex."); @@ -1390,7 +1392,12 @@ handle_qxfer_btrace (const char *annex, { buffer_free (&cache); - target_read_btrace (thread->btrace, &cache, type); + result = target_read_btrace (thread->btrace, &cache, type); + if (result != 0) + { + memcpy (own_buf, cache.buffer, cache.used_size); + return -3; + } } else if (offset > cache.used_size) { diff --git a/gdb/gdbserver/target.h b/gdb/gdbserver/target.h index d090a30..ae48cd7 100644 --- a/gdb/gdbserver/target.h +++ b/gdb/gdbserver/target.h @@ -356,12 +356,15 @@ struct target_ops information struct for reading and for disabling branch trace. */ struct btrace_target_info *(*enable_btrace) (ptid_t ptid); - /* Disable branch tracing. */ + /* Disable branch tracing. + Returns zero on success, non-zero otherwise. */ int (*disable_btrace) (struct btrace_target_info *tinfo); /* Read branch trace data into buffer. We use an int to specify the type - to break a cyclic dependency. */ - void (*read_btrace) (struct btrace_target_info *, struct buffer *, int type); + to break a cyclic dependency. + Return 0 on success; print an error message into BUFFER and return -1, + otherwise. */ + int (*read_btrace) (struct btrace_target_info *, struct buffer *, int type); /* Return true if target supports range stepping. */ int (*supports_range_stepping) (void); |