qemu-devel
[Top][All Lists]
Advanced

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

RE: [Qemu-devel] [PATCH -v2] gdbstub: Add vCont support


From: Krumme, Chris
Subject: RE: [Qemu-devel] [PATCH -v2] gdbstub: Add vCont support
Date: Wed, 14 Jan 2009 10:38:56 -0800

 

> -----Original Message-----
> From: 
> address@hidden 
> [mailto:address@hidden
> rg] On Behalf Of Jan Kiszka
> Sent: Wednesday, January 14, 2009 10:57 AM
> To: address@hidden
> Subject: [Qemu-devel] [PATCH -v2] gdbstub: Add vCont support
> 
> [ Fix signal forwarding, properly handle unknown v-packets. ]
> 
> In order to set the VCPU for the next single-step command, 
> you need gdb
> 6.8 or better - and this patch. It enhances the existing support for
> representing VCPUs as threads to the gdb frontend by introducing the
> vCont remote gdb command. This is used by gdb to switch the debugging
> focus for single-stepping multi-threaded targets.
> 
> Signed-off-by: Jan Kiszka <address@hidden>
> ---
> 
>  gdbstub.c |   58 
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 58 insertions(+), 0 deletions(-)
> 
> diff --git a/gdbstub.c b/gdbstub.c
> index 0bcd5d5..d9f197f 100644
> --- a/gdbstub.c
> +++ b/gdbstub.c
> @@ -1542,6 +1542,64 @@ static int gdb_handle_packet(GDBState 
> *s, const char *line_buf)
>              s->signal = 0;
>          gdb_continue(s);
>          return RS_IDLE;
> +    case 'v':
> +        if (strncmp(p, "Cont", 4) == 0) {
> +            int res_signal, res_thread;
> +
> +            p += 4;
> +            if (*p == '?') {
> +                put_packet(s, "vCont;c;C;s;S");
> +                break;
> +            }
> +            res = 0;
> +            res_signal = 0;
> +            res_thread = 0;
> +            while (*p) {
> +                int action, signal;
> +
> +                if (*p++ != ';') {
> +                    res = 0;
> +                    break;
> +                }
> +                action = *p++;
> +                signal = 0;
> +                if (action == 'C' || action == 'S')
> +                    signal = strtoul(p, (char **)&p, 16);
> +                else if (action != 'c' && action != 's') {
> +                    res = 0;
> +                    break;
> +                }
> +                thread = 0;
> +                if (*p == ':')
> +                    thread = strtoull(p+1, (char **)&p, 16);
> +
> +                action = tolower(action);
> +                if (res == 0 || (res == 'c' && action == 's')) {
> +                    res = action;
> +                    res_signal = signal;
> +                    res_thread = thread;
> +                }
> +            }
> +            if (res) {
> +                if (res_thread != -1 && res_thread != 0) {
> +                    for (env = first_cpu; env != NULL; env = 
> env->next_cpu)
> +                        if (env->cpu_index + 1 == res_thread)
> +                            break;
> +                    if (env == NULL) {
> +                        put_packet(s, "E22");
> +                        break;
> +                    }
> +                    s->c_cpu = env;
> +                }
> +                if (res == 's')
> +                    cpu_single_step(s->c_cpu, sstep_flags);

Sorry I am not more familure with the code, but does cpu_single_step
need to know about the res_signal?

Thanks

Chris

> +                s->signal = res_signal;
> +                gdb_continue(s);
> +                return RS_IDLE;
> +            }
> +            break;
> +        } else
> +            goto unknown_command;
>      case 'k':
>          /* Kill the target */
>          fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
> 
> 
> 
> 




reply via email to

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