embedded system and "target remote"

Matthias Pfaller leo@marco.de
Wed Nov 9 09:52:00 GMT 2016


Hi,

I have done a patch that hands down thread information to remote.c.
As this is the first time I had a look at the gdb sources I'm pretty
sure my code is not suitable for integration...

The patch has (at least) the following problems:

- the thread id is needed in bp_target_info because this is what
remote.c will get. Because of this I now have the thread id in three
places (bp_location.thread, bp_location.overlay_target_info.thread and
bp_location.target_info.thread).

- there is no way to turn this off (I have no idea how this would
normally be handled)

- I have extended the Z0/Z1/z0/z1 to provide an additional parameter
(the thread id) when target_info.thread is >= 0.


regards, Matthias

PS: The stub code will hopefully follow in a couple of days.
-- 
Matthias Pfaller                          Software Entwicklung
marco Systemanalyse und Entwicklung GmbH  Tel   +49 8131 5161 41
Hans-Böckler-Str. 2, D 85221 Dachau       Fax   +49 8131 5161 66
http://www.marco.de/                      Email leo@marco.de
Geschäftsführer Martin Reuter             HRB 171775 Amtsgericht München
-------------- next part --------------
--- ../orig/gdb/breakpoint.c
+++ ./gdb/breakpoint.c
@@ -7267,7 +7267,8 @@
     /* We compare bp_location.length in order to cover ranged breakpoints.  */
     return (breakpoint_address_match (loc1->pspace->aspace, loc1->address,
 				     loc2->pspace->aspace, loc2->address)
-	    && loc1->length == loc2->length);
+	    && loc1->length == loc2->length
+	    && loc1->thread == loc2->thread);
 }
 
 static void
@@ -7354,6 +7355,10 @@
   loc->cond_bytecode = NULL;
   loc->shlib_disabled = 0;
   loc->enabled = 1;
+  loc->thread = owner->thread;
+  loc->target_info.thread = owner->thread;
+  loc->overlay_target_info.thread = owner->thread;
+  loc->thread = owner->thread;
 
   switch (owner->type)
     {
@@ -8984,6 +8989,9 @@
   copy->loc->line_number = orig->loc->line_number;
   copy->loc->symtab = orig->loc->symtab;
   copy->loc->enabled = loc_enabled;
+  copy->loc->thread = orig->loc->thread;
+  copy->loc->target_info.thread = orig->loc->thread;
+  copy->loc->overlay_target_info.thread = orig->loc->thread;
   copy->frame_id = orig->frame_id;
   copy->thread = orig->thread;
   copy->pspace = orig->pspace;
@@ -9302,6 +9310,9 @@
 	{
 	  init_raw_breakpoint (b, gdbarch, sal, type, ops);
 	  b->thread = thread;
+	  b->loc->thread = thread;
+	  b->loc->target_info.thread = thread;
+	  b->loc->overlay_target_info.thread = thread;
 	  b->task = task;
 
 	  b->cond_string = cond_string;
@@ -9655,6 +9666,10 @@
   *task = 0;
   *rest = NULL;
 
+  /* default to current thread on non-stop targets */
+  if (target_is_non_stop_p ())
+    *thread = inferior_thread ()->global_num;
+
   while (tok && *tok)
     {
       const char *end_tok;
@@ -9946,6 +9961,9 @@
 	    }
 	  b->cond_string = cond_string;
 	  b->thread = thread;
+	  b->loc->thread = thread;
+	  b->loc->target_info.thread = thread;
+	  b->loc->overlay_target_info.thread = thread;
 	}
 
       /* Create a private copy of any extra string.  */
--- ../orig/gdb/breakpoint.h
+++ ./gdb/breakpoint.h
@@ -279,6 +279,9 @@
   /* Flag that is true if the breakpoint should be left in place even
      when GDB is not connected.  */
   int persist;
+
+  /* Thread identifier for which this breakpoint should be activated */
+  int thread;
 };
 
 /* GDB maintains two types of information about each breakpoint (or
@@ -399,7 +402,8 @@
   char duplicate;
 
   /* If we someday support real thread-specific breakpoints, then
-     the breakpoint location will need a thread identifier.  */
+     the breakpoint location will need a thread identifier. */
+  int thread;
 
   /* Data for specific breakpoint types.  These could be a union, but
      simplicity is more important than memory usage for breakpoints.  */
--- ../orig/gdb/remote.c
+++ ./gdb/remote.c
@@ -9300,7 +9300,12 @@
       addr = (ULONGEST) remote_address_masked (addr);
       p += hexnumstr (p, addr);
       xsnprintf (p, endbuf - p, ",%d", bpsize);
-
+      p += strlen(p);
+      if (bp_tgt->thread >= 0)
+        {
+	  *(p++) = ',';
+	  write_ptid (p, endbuf, global_thread_id_to_ptid (bp_tgt->thread));
+        }
       if (remote_supports_cond_breakpoints (ops))
 	remote_add_target_side_condition (gdbarch, bp_tgt, p, endbuf);
 
@@ -9358,6 +9363,12 @@
       addr = (ULONGEST) remote_address_masked (bp_tgt->placed_address);
       p += hexnumstr (p, addr);
       xsnprintf (p, endbuf - p, ",%d", bp_tgt->placed_size);
+      p += strlen(p);
+      if (bp_tgt->thread >= 0)
+        {
+	  *(p++) = ',';
+	  write_ptid (p, endbuf, global_thread_id_to_ptid (bp_tgt->thread));
+        }
 
       putpkt (rs->buf);
       getpkt (&rs->buf, &rs->buf_size, 0);
@@ -9619,6 +9630,12 @@
   addr = remote_address_masked (addr);
   p += hexnumstr (p, (ULONGEST) addr);
   xsnprintf (p, endbuf - p, ",%x", bpsize);
+  p += strlen(p);
+  if (bp_tgt->thread >= 0)
+    {
+      *(p++) = ',';
+      write_ptid (p, endbuf, global_thread_id_to_ptid (bp_tgt->thread));
+    }
 
   if (remote_supports_cond_breakpoints (self))
     remote_add_target_side_condition (gdbarch, bp_tgt, p, endbuf);
@@ -9675,6 +9692,12 @@
   addr = remote_address_masked (bp_tgt->placed_address);
   p += hexnumstr (p, (ULONGEST) addr);
   xsnprintf (p, endbuf  - p, ",%x", bp_tgt->placed_size);
+  p += strlen(p);
+  if (bp_tgt->thread >= 0)
+    {
+      *(p++) = ',';
+      write_ptid (p, endbuf, global_thread_id_to_ptid (bp_tgt->thread));
+    }
 
   putpkt (rs->buf);
   getpkt (&rs->buf, &rs->buf_size, 0);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 4349 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://sourceware.org/pipermail/gdb/attachments/20161109/dbf3ab36/attachment.p7s>


More information about the Gdb mailing list