From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LKEeH-0004oG-KL for qemu-devel@nongnu.org; Tue, 06 Jan 2009 11:19:21 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LKEeG-0004o4-2g for qemu-devel@nongnu.org; Tue, 06 Jan 2009 11:19:20 -0500 Received: from [199.232.76.173] (port=60320 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LKEeF-0004o1-UL for qemu-devel@nongnu.org; Tue, 06 Jan 2009 11:19:19 -0500 Received: from moutng.kundenserver.de ([212.227.126.177]:56806) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LKEeF-0007uC-DF for qemu-devel@nongnu.org; Tue, 06 Jan 2009 11:19:19 -0500 Message-ID: <49638483.4050701@opensuse.org> Date: Tue, 06 Jan 2009 17:19:15 +0100 From: Martin Mohring MIME-Version: 1.0 Subject: Re: [Qemu-devel] [6095] User-mode GDB stub improvements - handle fork References: In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit 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 I seem to have found the cause, why ARM user mode with nptl does not work as before. see below. Martin Aurelien Jarno wrote: > 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); > +} > In case of USE_NPTL is defined, it seems that either s or env can be NULL, so I get a exception (yes, nptl works on arm in user mode). My understanding is that this might be a race condition of the first fork() call coming even before env or gdbserver_state is initialised towards !NULL. > #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); > This gdbserver_fork(thread_env) call then causes the exception.