/* Restore any bytes overwritten by tracepoints. */
for (tpoint = tracepoints; tpoint; tpoint = tpoint->next)
{
- if (!tpoint->enabled)
- continue;
-
/* Catch the case where we might try to remove a tracepoint that
was never actually installed. */
if (tpoint->handle == NULL)
write_ok (own_buf);
}
+static void
+cmd_qtenable_disable (char *own_buf, int enable)
+{
+ char *packet = own_buf;
+ ULONGEST num, addr;
+ struct tracepoint *tp;
+
+ packet += strlen (enable ? "QTEnable:" : "QTDisable:");
+ packet = unpack_varlen_hex (packet, &num);
+ ++packet; /* skip a colon */
+ packet = unpack_varlen_hex (packet, &addr);
+
+ tp = find_tracepoint (num, addr);
+
+ if (tp)
+ {
+ if ((enable && tp->enabled) || (!enable && !tp->enabled))
+ {
+ trace_debug ("Tracepoint %d at 0x%s is already %s",
+ (int) num, paddress (addr),
+ enable ? "enabled" : "disabled");
+ write_ok (own_buf);
+ return;
+ }
+
+ trace_debug ("%s tracepoint %d at 0x%s",
+ enable ? "Enabling" : "Disabling",
+ (int) num, paddress (addr));
+
+ tp->enabled = enable;
+
+ if (tp->type == fast_tracepoint || tp->type == static_tracepoint)
+ {
+ int ret;
+ int offset = offsetof (struct tracepoint, enabled);
+ CORE_ADDR obj_addr = tp->obj_addr_on_target + offset;
+
+ ret = prepare_to_access_memory ();
+ if (ret)
+ {
+ trace_debug ("Failed to temporarily stop inferior threads");
+ write_enn (own_buf);
+ return;
+ }
+
+ ret = write_inferior_integer (obj_addr, enable);
+ done_accessing_memory ();
+
+ if (ret)
+ {
+ trace_debug ("Cannot write enabled flag into "
+ "inferior process memory");
+ write_enn (own_buf);
+ return;
+ }
+ }
+
+ write_ok (own_buf);
+ }
+ else
+ {
+ trace_debug ("Tracepoint %d at 0x%s not found",
+ (int) num, paddress (addr));
+ write_enn (own_buf);
+ }
+}
+
static void
cmd_qtv (char *own_buf)
{
char *packet = own_buf;
packet += strlen ("qTV:");
- packet = unpack_varlen_hex (packet, &num);
+ unpack_varlen_hex (packet, &num);
if (current_traceframe >= 0)
{
/* Ensure all the hit counts start at zero. */
tpoint->hit_count = 0;
- if (!tpoint->enabled)
- continue;
-
if (tpoint->type == trap_tracepoint)
{
++slow_tracepoint_count;
if (strncmp (packet, "pc:", strlen ("pc:")) == 0)
{
packet += strlen ("pc:");
- packet = unpack_varlen_hex (packet, &pc);
+ unpack_varlen_hex (packet, &pc);
trace_debug ("Want to find next traceframe at pc=0x%s", paddress (pc));
tframe = find_next_traceframe_in_range (pc, pc, 1, &tfnum);
}
packet += strlen ("range:");
packet = unpack_varlen_hex (packet, &lo);
++packet;
- packet = unpack_varlen_hex (packet, &hi);
+ unpack_varlen_hex (packet, &hi);
trace_debug ("Want to find next traceframe in the range 0x%s to 0x%s",
paddress (lo), paddress (hi));
tframe = find_next_traceframe_in_range (lo, hi, 1, &tfnum);
packet += strlen ("outside:");
packet = unpack_varlen_hex (packet, &lo);
++packet;
- packet = unpack_varlen_hex (packet, &hi);
+ unpack_varlen_hex (packet, &hi);
trace_debug ("Want to find next traceframe "
"outside the range 0x%s to 0x%s",
paddress (lo), paddress (hi));
else if (strncmp (packet, "tdp:", strlen ("tdp:")) == 0)
{
packet += strlen ("tdp:");
- packet = unpack_varlen_hex (packet, &num);
+ unpack_varlen_hex (packet, &num);
tpnum = (int) num;
trace_debug ("Want to find next traceframe for tracepoint %d", tpnum);
tframe = find_next_traceframe_by_tracepoint (tpnum, &tfnum);
packet = unpack_varlen_hex (packet, &offset);
++packet; /* skip a comma */
- packet = unpack_varlen_hex (packet, &num);
+ unpack_varlen_hex (packet, &num);
trace_debug ("Want to get trace buffer, %d bytes at offset 0x%s",
(int) num, pulongest (offset));
if (strncmp ("circular:", packet, strlen ("circular:")) == 0)
{
packet += strlen ("circular:");
- packet = unpack_varlen_hex (packet, &val);
+ unpack_varlen_hex (packet, &val);
circular_trace_buffer = val;
trace_debug ("Trace buffer is now %s",
circular_trace_buffer ? "circular" : "linear");
cmd_qtdpsrc (packet);
return 1;
}
+ else if (strncmp ("QTEnable:", packet, strlen ("QTEnable:")) == 0)
+ {
+ cmd_qtenable_disable (packet, 1);
+ return 1;
+ }
+ else if (strncmp ("QTDisable:", packet, strlen ("QTDisable:")) == 0)
+ {
+ cmd_qtenable_disable (packet, 0);
+ return 1;
+ }
else if (strncmp ("QTDV:", packet, strlen ("QTDV:")) == 0)
{
cmd_qtdv (packet);
if (!tracing)
return;
+ if (!tpoint->enabled)
+ return;
+
ctx.base.type = fast_tracepoint;
ctx.regs = regs;
ctx.regcache_initted = 0;
for (tpoint = tracepoints; tpoint; tpoint = tpoint->next)
{
- if (!tpoint->enabled || tpoint->type != static_tracepoint)
+ if (tpoint->type != static_tracepoint)
continue;
if (tpoint->address == (uintptr_t) mdata->location)
return;
}
+ if (!tpoint->enabled)
+ {
+ trace_debug ("gdb_probe: tracepoint disabled");
+ return;
+ }
+
ctx.tpoint = tpoint;
trace_debug ("gdb_probe: collecting marker: "