From: Aurelien Jarno <aurelien@aurel32.net>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] [6095] User-mode GDB stub improvements - handle fork
Date: Thu, 18 Dec 2008 22:44:05 +0000 [thread overview]
Message-ID: <E1LDRbB-0002Tm-Bh@cvs.savannah.gnu.org> (raw)
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 <dan@codesourcery.com>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
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;
}
next reply other threads:[~2008-12-18 22:44 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-12-18 22:44 Aurelien Jarno [this message]
2009-01-06 16:19 ` [Qemu-devel] [6095] User-mode GDB stub improvements - handle fork Martin Mohring
2009-01-06 17:27 ` Laurent Desnogues
2009-01-06 19:08 ` Martin Mohring
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=E1LDRbB-0002Tm-Bh@cvs.savannah.gnu.org \
--to=aurelien@aurel32.net \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).