From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12591 invoked by alias); 3 Mar 2015 14:39:37 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 12582 invoked by uid 89); 3 Mar 2015 14:39:37 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.2 required=5.0 tests=AWL,BAYES_00,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: glazunov.sibelius.xs4all.nl Received: from sibelius.xs4all.nl (HELO glazunov.sibelius.xs4all.nl) (83.163.83.176) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Tue, 03 Mar 2015 14:39:35 +0000 Received: from glazunov.sibelius.xs4all.nl (kettenis@localhost [127.0.0.1]) by glazunov.sibelius.xs4all.nl (8.14.5/8.14.3) with ESMTP id t23EdHfY007805; Tue, 3 Mar 2015 15:39:17 +0100 (CET) Received: (from kettenis@localhost) by glazunov.sibelius.xs4all.nl (8.14.5/8.14.3/Submit) id t23EdHZv020814; Tue, 3 Mar 2015 15:39:17 +0100 (CET) Date: Tue, 03 Mar 2015 14:39:00 -0000 Message-Id: <201503031439.t23EdHZv020814@glazunov.sibelius.xs4all.nl> From: Mark Kettenis To: palves@redhat.com CC: gdb-patches@sourceware.org In-reply-to: message from Pedro Alves on Tue, 3 Mar 2015 13:33:44 +0000 Subject: Re: [PATCH] Linux/ptrace: don't convert ptids when asking inf-ptrace layer to resume LWP References: X-SW-Source: 2015-03/txt/msg00084.txt.bz2 > From: Pedro Alves > Date: Tue, 3 Mar 2015 13:33:44 +0000 > > Tested on x86-64 Fedora 20, -m32. > > gdb/ChangeLog: > 2015-03-03 Pedro Alves > > * i386-linux-nat.c (i386_linux_resume): Get the ptrace PID out of > the lwp field of ptid. Pass the full ptid to get_thread_regcache. > * inf-ptrace.c (get_ptrace_pid): New function. > (inf_ptrace_resume): Use it. > * linux-nat.c (linux_resume_one_lwp): Pass the LWP's ptid ummodified > to the lower layer. > --- > gdb/ChangeLog | 9 +++++++++ > gdb/i386-linux-nat.c | 5 ++--- > gdb/inf-ptrace.c | 25 ++++++++++++++++++++++--- > gdb/linux-nat.c | 6 +----- > 4 files changed, 34 insertions(+), 11 deletions(-) I have some fear this is going to break non-Linux targets. > --- a/gdb/inf-ptrace.c > +++ b/gdb/inf-ptrace.c > @@ -289,6 +289,22 @@ inf_ptrace_stop (struct target_ops *self, ptid_t ptid) > kill (-inferior_process_group (), SIGINT); > } > > +/* Return which PID to pass to ptrace in order to observe/control the > + tracee identified by PTID. */ > + > +static pid_t > +get_ptrace_pid (ptid_t ptid) > +{ > + pid_t pid; > + > + /* If we have an LWPID to work with, use it. Otherwise, we're > + dealing with a non-threaded program/target. */ > + pid = ptid_get_lwp (ptid); > + if (pid == 0) > + pid = ptid_get_pid (ptid); > + return pid; > +} > + > /* Resume execution of thread PTID, or all threads if PTID is -1. If > STEP is nonzero, single-step it. If SIGNAL is nonzero, give it > that signal. */ > @@ -297,13 +313,16 @@ static void > inf_ptrace_resume (struct target_ops *ops, > ptid_t ptid, int step, enum gdb_signal signal) > { > - pid_t pid = ptid_get_pid (ptid); > + pid_t pid; > + > int request; Please don't introduce a blank line here. > - if (pid == -1) > + if (ptid_equal (minus_one_ptid, ptid)) > /* Resume all threads. Traditionally ptrace() only supports > single-threaded processes, so simply resume the inferior. */ > - pid = ptid_get_pid (inferior_ptid); > + pid = get_ptrace_pid (inferior_ptid); This defenitely should remain ptid_get_pid(); you want to resume the entire process and not an individual thread. > + else > + pid = get_ptrace_pid (ptid); This should work for OpenBSD, and probably works for FreeBSD. It won't work for NetBSD, but they will probably need their own implementation of this function, so it's probably fine.