From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1JuT0g-0008P8-2t for qemu-devel@nongnu.org; Fri, 09 May 2008 09:51:42 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1JuT0b-0008OQ-WA for qemu-devel@nongnu.org; Fri, 09 May 2008 09:51:40 -0400 Received: from [199.232.76.173] (port=39469 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1JuT0b-0008ON-BC for qemu-devel@nongnu.org; Fri, 09 May 2008 09:51:37 -0400 Received: from mail.windriver.com ([147.11.1.11]:63599 helo=mail.wrs.com) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1JuT0b-0001Id-2m for qemu-devel@nongnu.org; Fri, 09 May 2008 09:51:37 -0400 Received: from ALA-MAIL03.corp.ad.wrs.com (ala-mail03 [147.11.57.144]) by mail.wrs.com (8.13.6/8.13.6) with ESMTP id m49DpZeo005520 for ; Fri, 9 May 2008 06:51:35 -0700 (PDT) Message-ID: <482456EA.8020108@windriver.com> Date: Fri, 09 May 2008 08:51:38 -0500 From: Jason Wessel MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------080701020206040506080506" Subject: [Qemu-devel] [PATCH] gdbstub improvements for gdb kill/detach/quit Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org This is a multi-part message in MIME format. --------------080701020206040506080506 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Attached is a patch to improve the gdb stub 'D' 'k' and '?' packets. See the patch header for details. Jason. --------------080701020206040506080506 Content-Type: text/x-patch; name="gdb_k_and_D_packet_support.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="gdb_k_and_D_packet_support.patch" From: Jason Wessel Subject: [PATCH] support for gdb "detach/kill/quit" 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 function to cleanup all the breakpoints prior to leaving the gdb stub else simulation can stop with no debugger attached. On a '?' packet remove all the breakpoints. 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 --- cpu-all.h | 1 + exec.c | 14 ++++++++++++++ gdbstub.c | 16 ++++++++++++++++ 3 files changed, 31 insertions(+) --- a/cpu-all.h +++ b/cpu-all.h @@ -759,6 +759,7 @@ void cpu_interrupt(CPUState *s, int mask void cpu_reset_interrupt(CPUState *env, int mask); int cpu_watchpoint_insert(CPUState *env, target_ulong addr); +int cpu_breakpoint_remove_all(CPUState *env); int cpu_watchpoint_remove(CPUState *env, target_ulong addr); int cpu_breakpoint_insert(CPUState *env, target_ulong pc); int cpu_breakpoint_remove(CPUState *env, target_ulong pc); --- a/gdbstub.c +++ b/gdbstub.c @@ -901,6 +901,11 @@ static int gdb_handle_packet(GDBState *s /* 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); break; case 'c': if (*p != '\0') { @@ -924,6 +929,17 @@ static int gdb_handle_packet(GDBState *s } gdb_continue(s); return RS_IDLE; + case 'k': + /* Kill the target */ + fprintf(stderr, "\nQEMU: Terminated via GDBstub\n"); + exit(0); + case 'D': + /* Detach packet */ + if (!cpu_breakpoint_remove_all(env)) { + gdb_continue(s); + put_packet(s, "OK"); + break; + } case 's': if (*p != '\0') { addr = strtoull(p, (char **)&p, 16); --- a/exec.c +++ b/exec.c @@ -1150,6 +1150,20 @@ int cpu_breakpoint_insert(CPUState *env, #endif } +/* remove all breakpoints */ +int 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; + return 0; +#else + return -1; +#endif +} + /* remove a breakpoint */ int cpu_breakpoint_remove(CPUState *env, target_ulong pc) { --------------080701020206040506080506--