Mirror of the gdb mailing list
 help / color / mirror / Atom feed
From: Matthias Pfaller <leo@marco.de>
To: gdb@sourceware.org
Subject: Re: embedded system and "target remote"
Date: Wed, 09 Nov 2016 09:52:00 -0000	[thread overview]
Message-ID: <5822F1B0.6040403@marco.de> (raw)
In-Reply-To: <CAH=s-PNcjGoBwwXMBrsbgtaCEx73g=h_fR8-L7fYM1RM4z4J1w@mail.gmail.com>


[-- Attachment #1.1: Type: text/plain, Size: 1132 bytes --]

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

[-- Attachment #1.2: gdb-patch --]
[-- Type: text/plain, Size: 4417 bytes --]

--- ../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);

[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4349 bytes --]

      parent reply	other threads:[~2016-11-09  9:52 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-08 10:31 Matthias Pfaller
2016-11-08 11:14 ` Yao Qi
2016-11-08 12:17   ` Matthias Pfaller
2016-11-09  9:52   ` Matthias Pfaller [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5822F1B0.6040403@marco.de \
    --to=leo@marco.de \
    --cc=gdb@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox