qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH] Fix for RSP vCont packet


From: Lucien Anti-Spam
Subject: [Qemu-devel] [PATCH] Fix for RSP vCont packet
Date: Thu, 31 Jan 2019 00:41:21 +0000 (UTC)

This fixes a regression in rsp packet vCont due to recently added multiprocess 
support. (Short commit hash: e40e520).

The result is that vCont now does not recognise the case where no 
process/thread is provided after the action.
This may not show up with GDB, but using Lauterbach Trace32, and Hexrays IDA 
Pro this issue is immediately seen.The response is a "$#00" empty packet, 
showing it is unsupported packet.
This is defined in the RSP document as "An action with no thread-id matches all 
threads."(https://sourceware.org/gdb/current/onlinedocs/gdb/Packets.html#vCont-packet
 )
Thus the valid vCont packets now are as below, however parsing is still not 
very strict.  vCont;c/s                 - Step/Continue all threads  
vCont;c/s:[pX.]Y          - Step/Continue optional process X, thread Y  
vCont;C##/S##:[pX.]Y      - Step/Continue with signal ## on optional process X, 
thread Y  * If X or Y are -1 then it applies the action to all 
processes/threads.
Signed-off-by: Lucien Murray-Pitts <address@hidden>--- gdbstub.c | 16 
++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/gdbstub.c b/gdbstub.cindex bfc7afb509..ce0dde2e24 100644--- 
a/gdbstub.c+++ b/gdbstub.c@@ -1169,6 +1169,7 @@ static int 
is_query_packet(const char *p, const char *query, char separator)  */ static 
int gdb_handle_vcont(GDBState *s, const char *p) {+    GDBThreadIdKind 
vcontThreadType ;     int res, signal = 0;     char cur_action;     char 
*newstates;@@ -1218,12 +1219,23 @@ static int gdb_handle_vcont(GDBState *s, 
const char *p)             goto out;         } -        if (*p++ != ':') {+     
   /*+         * In the case we have vCont;c or vCont;s - action is on all 
threads+         * Alternatively vCont;c;s:p1.1 is a possible, but meaningless 
format,+         * And in the else the "vCont;c:p1.1;... format is supported.+  
       */+        if (*p == '\0' || *p == ';') {+            vcontThreadType = 
GDB_ALL_THREADS ;+            pid = 1 ;+            tid = 1 ;+        } else if 
(*p++ == ':') {+            vcontThreadType = read_thread_id(p, &p, &pid, &tid) 
;+        } else {             res = -ENOTSUP;             goto out;         } 
-        switch (read_thread_id(p, &p, &pid, &tid)) {+        switch 
(vcontThreadType) {         case GDB_READ_THREAD_ERR:             res = 
-EINVAL;             goto out;-- 2.17.2

reply via email to

[Prev in Thread] Current Thread [Next in Thread]