Subject: Re: bin/30756
To: None <gnats-admin@netbsd.org, netbsd-bugs@netbsd.org>
From: Nathan J. Williams <nathanw@wasabisystems.com>
List: netbsd-bugs
Date: 08/16/2005 22:08:02
The following reply was made to PR bin/30756; it has been noted by GNATS.

From: "Nathan J. Williams" <nathanw@wasabisystems.com>
To: M.Drochner@fz-juelich.de
Cc: gnats-bugs@NetBSD.org, gnats-admin@NetBSD.org,
	netbsd-bugs@NetBSD.org
Subject: Re: bin/30756
Date: 16 Aug 2005 18:07:15 -0400

 Matthias Drochner <M.Drochner@fz-juelich.de> writes:
 
 > rpaulo@NetBSD.org said:
 > > thread_resume_suspend_cb: td_thr_suspend(0xa3bc2c0): generic error
 > 
 > The appended patch helps for this problem.
 > It seems that the thread debugging stuff needs some cleanup...
 
 That happens to work but it's not right at all. nbsd_thread_resume()
 is being called with a ptid argument of {<pid>, 1, 0}; that is, the
 upper levels are trying to single-step an LWP rather than a thread (we
 don't currently have a mechanism for that in the ptrace
 interface). This causes thread_resume_suspend_cb() to try to suspend
 the only thread in the program... which is a bad enough idea, but it
 happens early enough that the idle queue isn't even set up, and so
 there's no thread to replace the suspended thread in the register
 set. This causes td_thr_suspend() to bail out with the error seen
 above.
 
 However, this does point out a partial solution, which I've gone ahead
 and committed:
 
 Index: nbsd-thread.c
 ===================================================================
 RCS file: /cvsroot/src/gnu/dist/gdb/gdb/nbsd-thread.c,v
 retrieving revision 1.15
 diff -p -u -r1.15 nbsd-thread.c
 --- nbsd-thread.c	12 Oct 2004 22:16:34 -0000	1.15
 +++ nbsd-thread.c	16 Aug 2005 22:02:38 -0000
 @@ -262,11 +262,14 @@ static void
  nbsd_thread_resume (ptid_t ptid, int step, enum target_signal signo)
  {
  
 -  /* If a particular ptid is specified, then gdb wants to resume or
 +  /* If a particular thread is specified, then gdb wants to resume or
       step just that thread. If it isn't on a processor, then it needs
 -     to be put on one, and nothing else can be on the runnable
 -     list. */
 -  if (GET_PID (ptid) != -1)
 +     to be put on one, and nothing else can be on the runnable list.
 +     XXX If GDB asks us to step a LWP rather than a thread, there
 +     isn't anything we can do but pass it down to the ptrace call;
 +     given the flexibility of the LWP-to-thread mapping, this might or
 +     might not accomplish what the user wanted. */
 +  if (GET_PID (ptid) != -1 && IS_THREAD (ptid))
      {
        int val;
  
 
 
 This seems to get things limping along again.
 
         - Nathan