aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2020-08-07 10:26:45 -0600
committerTom Tromey <tromey@adacore.com>2020-08-07 10:26:47 -0600
commit39e2018a4e83522fef595d079c880c9097d70228 (patch)
treed1493fcd58ccd012745193687adf27ac8249eaab
parente09eef98a607f06b6de8165ce1e3ad00ce1c111a (diff)
downloadgdb-39e2018a4e83522fef595d079c880c9097d70228.zip
gdb-39e2018a4e83522fef595d079c880c9097d70228.tar.gz
gdb-39e2018a4e83522fef595d079c880c9097d70228.tar.bz2
Fix Ravenscar "process" resume
A coworker noticed that gdb would send the wrong vCont packet to qemu when debugging a Ravenscar program: > (gdb) thread 2 > [Switching to thread 2 (Thread 1.2)] > #0 0x0000000000001000 in ?? () > (gdb) c [...] > Sending packet: $vCont;c:p1.1#e2...Ack Here, we've switched to thread 2, but the packet says to resume thread 1. This turned out to be a bug in ravenscar_thread_target::resume, which did not properly handle the case of a "process" resume. In particular, the resume method would be passed a ptid of (1, 0, 0) -- but then rewrite this to its saved ptid. This patch fixes the problem by recognizing this case in the resume method. gdb/ChangeLog 2020-08-07 Tom Tromey <tromey@adacore.com> * ravenscar-thread.c (ravenscar_thread_target::resume): Handle "is_pid" case.
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/ravenscar-thread.c7
2 files changed, 11 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index e67b386..0d443a8 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,10 @@
2020-08-07 Tom Tromey <tromey@adacore.com>
+ * ravenscar-thread.c (ravenscar_thread_target::resume): Handle
+ "is_pid" case.
+
+2020-08-07 Tom Tromey <tromey@adacore.com>
+
* ravenscar-thread.c (xfer_partial, enable_btrace, add_thread):
New methods.
(ravenscar_thread_target::get_thread_base_cpu): Check m_cpu_map
diff --git a/gdb/ravenscar-thread.c b/gdb/ravenscar-thread.c
index a67a5e9..91f0920 100644
--- a/gdb/ravenscar-thread.c
+++ b/gdb/ravenscar-thread.c
@@ -363,7 +363,12 @@ ravenscar_thread_target::resume (ptid_t ptid, int step,
/* If we see a wildcard resume, we simply pass that on. Otherwise,
arrange to resume the base ptid. */
inferior_ptid = m_base_ptid;
- if (ptid != minus_one_ptid)
+ if (ptid.is_pid ())
+ {
+ /* We only have one process, so resume all threads of it. */
+ ptid = minus_one_ptid;
+ }
+ else if (ptid != minus_one_ptid)
ptid = m_base_ptid;
beneath ()->resume (ptid, step, siggnal);
}