From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LDRbD-0000op-OZ for qemu-devel@nongnu.org; Thu, 18 Dec 2008 17:44:07 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LDRbC-0000ns-SL for qemu-devel@nongnu.org; Thu, 18 Dec 2008 17:44:07 -0500 Received: from [199.232.76.173] (port=59896 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LDRbC-0000nc-LG for qemu-devel@nongnu.org; Thu, 18 Dec 2008 17:44:06 -0500 Received: from savannah.gnu.org ([199.232.41.3]:43687 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LDRbC-00088R-82 for qemu-devel@nongnu.org; Thu, 18 Dec 2008 17:44:06 -0500 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.63) (envelope-from ) id 1LDRbB-0002Tq-Lx for qemu-devel@nongnu.org; Thu, 18 Dec 2008 22:44:05 +0000 Received: from aurel32 by cvs.savannah.gnu.org with local (Exim 4.63) (envelope-from ) id 1LDRbB-0002Tm-Bh for qemu-devel@nongnu.org; Thu, 18 Dec 2008 22:44:05 +0000 MIME-Version: 1.0 Errors-To: aurel32 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Aurelien Jarno Message-Id: Date: Thu, 18 Dec 2008 22:44:05 +0000 Subject: [Qemu-devel] [6095] User-mode GDB stub improvements - handle fork 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 Revision: 6095 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=6095 Author: aurel32 Date: 2008-12-18 22:44:04 +0000 (Thu, 18 Dec 2008) Log Message: ----------- User-mode GDB stub improvements - handle fork Close gdbserver in child processes, so that only one stub tries to talk to GDB at a time. Updated from an earlier patch by Paul Brook. Signed-off-by: Daniel Jacobowitz Signed-off-by: Aurelien Jarno Modified Paths: -------------- trunk/gdbstub.c trunk/gdbstub.h trunk/linux-user/main.c trunk/linux-user/syscall.c Modified: trunk/gdbstub.c =================================================================== --- trunk/gdbstub.c 2008-12-18 22:43:56 UTC (rev 6094) +++ trunk/gdbstub.c 2008-12-18 22:44:04 UTC (rev 6095) @@ -1996,6 +1996,18 @@ gdb_accept(); return 0; } + +/* Disable gdb stub for child processes. */ +void gdbserver_fork(CPUState *env) +{ + GDBState *s = gdbserver_state; + if (s->fd < 0) + return; + close(s->fd); + s->fd = -1; + cpu_breakpoint_remove_all(env, BP_GDB); + cpu_watchpoint_remove_all(env, BP_GDB); +} #else static int gdb_chr_can_receive(void *opaque) { Modified: trunk/gdbstub.h =================================================================== --- trunk/gdbstub.h 2008-12-18 22:43:56 UTC (rev 6094) +++ trunk/gdbstub.h 2008-12-18 22:44:04 UTC (rev 6095) @@ -13,6 +13,7 @@ int gdb_handlesig (CPUState *, int); void gdb_exit(CPUState *, int); int gdbserver_start(int); +void gdbserver_fork(CPUState *); #else int gdbserver_start(const char *port); #endif Modified: trunk/linux-user/main.c =================================================================== --- trunk/linux-user/main.c 2008-12-18 22:43:56 UTC (rev 6094) +++ trunk/linux-user/main.c 2008-12-18 22:44:04 UTC (rev 6095) @@ -162,6 +162,7 @@ pthread_cond_init(&exclusive_cond, NULL); pthread_cond_init(&exclusive_resume, NULL); pthread_mutex_init(&tb_lock, NULL); + gdbserver_fork(thread_env); } else { pthread_mutex_unlock(&exclusive_lock); pthread_mutex_unlock(&tb_lock); @@ -254,6 +255,9 @@ void fork_end(int child) { + if (child) { + gdbserver_fork(thread_env); + } } #endif Modified: trunk/linux-user/syscall.c =================================================================== --- trunk/linux-user/syscall.c 2008-12-18 22:43:56 UTC (rev 6094) +++ trunk/linux-user/syscall.c 2008-12-18 22:44:04 UTC (rev 6095) @@ -2960,17 +2960,17 @@ return -EINVAL; fork_start(); ret = fork(); -#if defined(USE_NPTL) - /* There is a race condition here. The parent process could - theoretically read the TID in the child process before the child - tid is set. This would require using either ptrace - (not implemented) or having *_tidptr to point at a shared memory - mapping. We can't repeat the spinlock hack used above because - the child process gets its own copy of the lock. */ if (ret == 0) { + /* Child Process. */ cpu_clone_regs(env, newsp); fork_end(1); - /* Child Process. */ +#if defined(USE_NPTL) + /* There is a race condition here. The parent process could + theoretically read the TID in the child process before the child + tid is set. This would require using either ptrace + (not implemented) or having *_tidptr to point at a shared memory + mapping. We can't repeat the spinlock hack used above because + the child process gets its own copy of the lock. */ if (flags & CLONE_CHILD_SETTID) put_user_u32(gettid(), child_tidptr); if (flags & CLONE_PARENT_SETTID) @@ -2979,14 +2979,10 @@ if (flags & CLONE_SETTLS) cpu_set_tls (env, newtls); /* TODO: Implement CLONE_CHILD_CLEARTID. */ +#endif } else { fork_end(0); } -#else - if (ret == 0) { - cpu_clone_regs(env, newsp); - } -#endif } return ret; }