diff mbox series

[v3,14/16] gdbstub: gdb_set_stop_cpu: ignore request when process is not attached

Message ID 20181026081653.24602-15-luc.michel@greensocs.com
State New
Headers show
Series gdbstub: support for the multiprocess extension | expand

Commit Message

Luc Michel Oct. 26, 2018, 8:16 a.m. UTC
When gdb_set_stop_cpu() is called with a CPU associated to a process
currently not attached by the GDB client, return without modifying the
stop CPU. Otherwise, GDB get confused if it receives packets with a
thread-id it does not know about.

Signed-off-by: Luc Michel <luc.michel@greensocs.com>
---
 gdbstub.c | 9 +++++++++
 1 file changed, 9 insertions(+)

Comments

Alistair Francis Oct. 31, 2018, 11:50 p.m. UTC | #1
On 10/26/18 1:16 AM, Luc Michel wrote:
> When gdb_set_stop_cpu() is called with a CPU associated to a process
> currently not attached by the GDB client, return without modifying the
> stop CPU. Otherwise, GDB get confused if it receives packets with a

s/get/gets/g

Acked-by: Alistair Francis <alistair.francis@wdc.com>

Alistair

> thread-id it does not know about.
> 
> Signed-off-by: Luc Michel <luc.michel@greensocs.com>
> ---
>   gdbstub.c | 9 +++++++++
>   1 file changed, 9 insertions(+)
> 
> diff --git a/gdbstub.c b/gdbstub.c
> index b3461eff9e..09480df2bf 100644
> --- a/gdbstub.c
> +++ b/gdbstub.c
> @@ -1784,10 +1784,19 @@ static int gdb_handle_packet(GDBState *s, const char *line_buf)
>       return RS_IDLE;
>   }
>   
>   void gdb_set_stop_cpu(CPUState *cpu)
>   {
> +    GDBProcess *p = gdb_get_cpu_process(gdbserver_state, cpu);
> +
> +    if (!p->attached) {
> +        /* Having a stop CPU corresponding to a process that is not attached
> +         * confuses GDB. So we ignore the request.
> +         */
> +        return;
> +    }
> +
>       gdbserver_state->c_cpu = cpu;
>       gdbserver_state->g_cpu = cpu;
>   }
>   
>   #ifndef CONFIG_USER_ONLY
>
diff mbox series

Patch

diff --git a/gdbstub.c b/gdbstub.c
index b3461eff9e..09480df2bf 100644
--- a/gdbstub.c
+++ b/gdbstub.c
@@ -1784,10 +1784,19 @@  static int gdb_handle_packet(GDBState *s, const char *line_buf)
     return RS_IDLE;
 }
 
 void gdb_set_stop_cpu(CPUState *cpu)
 {
+    GDBProcess *p = gdb_get_cpu_process(gdbserver_state, cpu);
+
+    if (!p->attached) {
+        /* Having a stop CPU corresponding to a process that is not attached
+         * confuses GDB. So we ignore the request.
+         */
+        return;
+    }
+
     gdbserver_state->c_cpu = cpu;
     gdbserver_state->g_cpu = cpu;
 }
 
 #ifndef CONFIG_USER_ONLY