aboutsummaryrefslogtreecommitdiff
path: root/gdb/gdbserver/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/gdbserver/server.c')
-rw-r--r--gdb/gdbserver/server.c96
1 files changed, 82 insertions, 14 deletions
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index 568640e..0fd82ee 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -449,6 +449,10 @@ handle_general_set (char *own_buf)
return;
}
+ if (target_supports_tracepoints ()
+ && handle_tracepoint_general_set (own_buf))
+ return;
+
/* Otherwise we didn't know what packet it was. Say we didn't
understand it. */
own_buf[0] = 0;
@@ -506,6 +510,43 @@ monitor_show_help (void)
monitor_output (" Quit GDBserver\n");
}
+/* Read trace frame or inferior memory. */
+
+static int
+read_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len)
+{
+ if (current_traceframe >= 0)
+ {
+ ULONGEST nbytes;
+ ULONGEST length = len;
+
+ if (traceframe_read_mem (current_traceframe,
+ memaddr, myaddr, len, &nbytes))
+ return EIO;
+ /* Data read from trace buffer, we're done. */
+ if (nbytes == length)
+ return 0;
+ if (!in_readonly_region (memaddr, length))
+ return EIO;
+ /* Otherwise we have a valid readonly case, fall through. */
+ /* (assume no half-trace half-real blocks for now) */
+ }
+
+ return read_inferior_memory (memaddr, myaddr, len);
+}
+
+/* Write trace frame or inferior memory. Actually, writing to trace
+ frames is forbidden. */
+
+static int
+write_memory (CORE_ADDR memaddr, const unsigned char *myaddr, int len)
+{
+ if (current_traceframe >= 0)
+ return EIO;
+ else
+ return write_inferior_memory (memaddr, myaddr, len);
+}
+
/* Subroutine of handle_search_memory to simplify it. */
static int
@@ -517,7 +558,7 @@ handle_search_memory_1 (CORE_ADDR start_addr, CORE_ADDR search_space_len,
{
/* Prime the search buffer. */
- if (read_inferior_memory (start_addr, search_buf, search_buf_size) != 0)
+ if (read_memory (start_addr, search_buf, search_buf_size) != 0)
{
warning ("Unable to access target memory at 0x%lx, halting search.",
(long) start_addr);
@@ -568,7 +609,7 @@ handle_search_memory_1 (CORE_ADDR start_addr, CORE_ADDR search_space_len,
? search_space_len - keep_len
: chunk_size);
- if (read_inferior_memory (read_addr, search_buf + keep_len,
+ if (read_memory (read_addr, search_buf + keep_len,
nr_to_read) != 0)
{
warning ("Unable to access target memory at 0x%lx, halting search.",
@@ -1346,6 +1387,13 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
strcat (own_buf, ";qXfer:threads:read+");
+ if (target_supports_tracepoints ())
+ {
+ strcat (own_buf, ";ConditionalTracepoints+");
+ strcat (own_buf, ";TraceStateVariables+");
+ strcat (own_buf, ";TracepointSource+");
+ }
+
return;
}
@@ -1506,6 +1554,9 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
return;
}
+ if (target_supports_tracepoints () && handle_tracepoint_query (own_buf))
+ return;
+
/* Otherwise we didn't know what packet it was. Say we didn't
understand it. */
own_buf[0] = 0;
@@ -2275,6 +2326,8 @@ main (int argc, char *argv[])
initialize_inferiors ();
initialize_async_io ();
initialize_low ();
+ if (target_supports_tracepoints ())
+ initialize_tracepoint ();
own_buf = xmalloc (PBUFSIZ + 1);
mem_buf = xmalloc (PBUFSIZ);
@@ -2541,20 +2594,35 @@ process_serial_event (void)
}
break;
case 'g':
- {
- struct regcache *regcache;
+ require_running (own_buf);
+ if (current_traceframe >= 0)
+ {
+ struct regcache *regcache = new_register_cache ();
- require_running (own_buf);
- set_desired_inferior (1);
- regcache = get_thread_regcache (current_inferior, 1);
- registers_to_string (regcache, own_buf);
- }
+ if (fetch_traceframe_registers (current_traceframe,
+ regcache, -1) == 0)
+ registers_to_string (regcache, own_buf);
+ else
+ write_enn (own_buf);
+ free_register_cache (regcache);
+ }
+ else
+ {
+ struct regcache *regcache;
+
+ set_desired_inferior (1);
+ regcache = get_thread_regcache (current_inferior, 1);
+ registers_to_string (regcache, own_buf);
+ }
break;
case 'G':
- {
+ require_running (own_buf);
+ if (current_traceframe >= 0)
+ write_enn (own_buf);
+ else
+ {
struct regcache *regcache;
- require_running (own_buf);
set_desired_inferior (1);
regcache = get_thread_regcache (current_inferior, 1);
registers_from_string (regcache, &own_buf[1]);
@@ -2564,7 +2632,7 @@ process_serial_event (void)
case 'm':
require_running (own_buf);
decode_m_packet (&own_buf[1], &mem_addr, &len);
- if (read_inferior_memory (mem_addr, mem_buf, len) == 0)
+ if (read_memory (mem_addr, mem_buf, len) == 0)
convert_int_to_ascii (mem_buf, own_buf, len);
else
write_enn (own_buf);
@@ -2572,7 +2640,7 @@ process_serial_event (void)
case 'M':
require_running (own_buf);
decode_M_packet (&own_buf[1], &mem_addr, &len, mem_buf);
- if (write_inferior_memory (mem_addr, mem_buf, len) == 0)
+ if (write_memory (mem_addr, mem_buf, len) == 0)
write_ok (own_buf);
else
write_enn (own_buf);
@@ -2581,7 +2649,7 @@ process_serial_event (void)
require_running (own_buf);
if (decode_X_packet (&own_buf[1], packet_len - 1,
&mem_addr, &len, mem_buf) < 0
- || write_inferior_memory (mem_addr, mem_buf, len) != 0)
+ || write_memory (mem_addr, mem_buf, len) != 0)
write_enn (own_buf);
else
write_ok (own_buf);