Re: embedded system and "target remote"

Matthias Pfaller
2016-11-09T09:52:00Z

[-- 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);