From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1JwklS-0003e2-Ls for qemu-devel@nongnu.org; Thu, 15 May 2008 17:13:26 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1JwklS-0003df-33 for qemu-devel@nongnu.org; Thu, 15 May 2008 17:13:26 -0400 Received: from [199.232.76.173] (port=56958 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1JwklR-0003da-UU for qemu-devel@nongnu.org; Thu, 15 May 2008 17:13:25 -0400 Received: from miranda.se.axis.com ([193.13.178.8]:48382) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1JwklR-0004WP-HR for qemu-devel@nongnu.org; Thu, 15 May 2008 17:13:25 -0400 Received: from axis.com (edgar.se.axis.com [10.93.151.1]) by miranda.se.axis.com (8.13.4/8.13.4/Debian-3sarge3) with ESMTP id m4FLDF3V031631 for ; Thu, 15 May 2008 23:13:15 +0200 Date: Thu, 15 May 2008 23:13:15 +0200 From: "Edgar E. Iglesias" Subject: Re: [Qemu-devel] [PATCH 4/5] gdbstub: support for gdb "detach/kill/quit" Message-ID: <20080515211315.GA27300@edgar.se.axis.com> References: <1210860693-22245-1-git-send-email-jason.wessel@windriver.com> <1210860693-22245-2-git-send-email-jason.wessel@windriver.com> <1210860693-22245-3-git-send-email-jason.wessel@windriver.com> <1210860693-22245-4-git-send-email-jason.wessel@windriver.com> <1210860693-22245-5-git-send-email-jason.wessel@windriver.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1210860693-22245-5-git-send-email-jason.wessel@windriver.com> Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Jason Wessel Cc: qemu-devel@nongnu.org On Thu, May 15, 2008 at 09:11:32AM -0500, Jason Wessel wrote: > Implement the 'k' gdbserial packet which kills the qemu instance via > the debugger stub. > > Implement the 'D' detach packet for the gdb stub such that you can > disconnect gdb with the "detach" command. This required implementing > a cpu_breakpoint_remove_all() and a cpu_watchpoint_remove_all() > function to cleanup all the breakpoints and watchpoints prior to > leaving the gdb stub else simulation can stop with no debugger > attached. > > On a '?' packet remove all the breakpoints and watchpoints. This is > considered more of a safety net in case you force killed gdb or it > crashed and you are reconnecting. The identical behavior exists for > kgdb in the linux kernel. > > Signed-off-by: Jason Wessel Thanks Jason, this one looks good to me. > --- > cpu-all.h | 2 ++ > exec.c | 21 +++++++++++++++++++++ > gdbstub.c | 17 +++++++++++++++++ > 3 files changed, 40 insertions(+), 0 deletions(-) > > diff --git a/cpu-all.h b/cpu-all.h > index 7e77f76..d71166c 100644 > --- a/cpu-all.h > +++ b/cpu-all.h > @@ -760,8 +760,10 @@ void cpu_reset_interrupt(CPUState *env, int mask); > > int cpu_watchpoint_insert(CPUState *env, target_ulong addr); > int cpu_watchpoint_remove(CPUState *env, target_ulong addr); > +void cpu_watchpoint_remove_all(CPUState *env); > int cpu_breakpoint_insert(CPUState *env, target_ulong pc); > int cpu_breakpoint_remove(CPUState *env, target_ulong pc); > +void cpu_breakpoint_remove_all(CPUState *env); > > #define SSTEP_ENABLE 0x1 /* Enable simulated HW single stepping */ > #define SSTEP_NOIRQ 0x2 /* Do not use IRQ while single stepping */ > diff --git a/exec.c b/exec.c > index 2fd0078..8f5c868 100644 > --- a/exec.c > +++ b/exec.c > @@ -1139,6 +1139,16 @@ int cpu_watchpoint_remove(CPUState *env, target_ulong addr) > return -1; > } > > +/* Remove all watchpoints. */ > +void cpu_watchpoint_remove_all(CPUState *env) { > + int i; > + > + for (i = 0; i < env->nb_watchpoints; i++) { > + tlb_flush_page(env, env->watchpoint[i].vaddr); > + } > + env->nb_watchpoints = 0; > +} > + > /* add a breakpoint. EXCP_DEBUG is returned by the CPU loop if a > breakpoint is reached */ > int cpu_breakpoint_insert(CPUState *env, target_ulong pc) > @@ -1162,6 +1172,17 @@ int cpu_breakpoint_insert(CPUState *env, target_ulong pc) > #endif > } > > +/* remove all breakpoints */ > +void cpu_breakpoint_remove_all(CPUState *env) { > +#if defined(TARGET_HAS_ICE) > + int i; > + for(i = 0; i < env->nb_breakpoints; i++) { > + breakpoint_invalidate(env, env->breakpoints[i]); > + } > + env->nb_breakpoints = 0; > +#endif > +} > + > /* remove a breakpoint */ > int cpu_breakpoint_remove(CPUState *env, target_ulong pc) > { > diff --git a/gdbstub.c b/gdbstub.c > index 833cdd9..fb2d948 100644 > --- a/gdbstub.c > +++ b/gdbstub.c > @@ -1035,6 +1035,12 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf) > /* TODO: Make this return the correct value for user-mode. */ > snprintf(buf, sizeof(buf), "S%02x", SIGTRAP); > put_packet(s, buf); > + /* Remove all the breakpoints when this query is issued, > + * because gdb is doing and initial connect and the state > + * should be cleaned up. > + */ > + cpu_breakpoint_remove_all(env); > + cpu_watchpoint_remove_all(env); > break; > case 'c': > if (*p != '\0') { > @@ -1058,6 +1064,17 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf) > } > gdb_continue(s); > return RS_IDLE; > + case 'k': > + /* Kill the target */ > + fprintf(stderr, "\nQEMU: Terminated via GDBstub\n"); > + exit(0); > + case 'D': > + /* Detach packet */ > + cpu_breakpoint_remove_all(env); > + cpu_watchpoint_remove_all(env); > + gdb_continue(s); > + put_packet(s, "OK"); > + break; > case 's': > if (*p != '\0') { > addr = strtoull(p, (char **)&p, 16); > -- > 1.5.5.1 > > -- Edgar E. Iglesias Axis Communications AB