Do not make "prop" field of struct dynamic_prop_list a pointer.
[deliverable/binutils-gdb.git] / gdb / gdbserver / linux-low.c
index 2bc619acc0eae7815aad94bacf15c2eb993c69f9..4743f7b96dd91f2953bcf574442e318ba2137da4 100644 (file)
@@ -1,5 +1,5 @@
 /* Low level interface to ptrace, for the remote server for GDB.
-   Copyright (C) 1995-2014 Free Software Foundation, Inc.
+   Copyright (C) 1995-2015 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 
 #include "server.h"
 #include "linux-low.h"
-#include "linux-osdata.h"
+#include "nat/linux-osdata.h"
 #include "agent.h"
 
 #include "nat/linux-nat.h"
 #include "nat/linux-waitpid.h"
 #include "gdb_wait.h"
-#include <stdio.h>
 #include <sys/ptrace.h>
-#include "linux-ptrace.h"
-#include "linux-procfs.h"
+#include "nat/linux-ptrace.h"
+#include "nat/linux-procfs.h"
+#include "nat/linux-personality.h"
 #include <signal.h>
 #include <sys/ioctl.h>
 #include <fcntl.h>
-#include <string.h>
-#include <stdlib.h>
 #include <unistd.h>
-#include <errno.h>
 #include <sys/syscall.h>
 #include <sched.h>
 #include <ctype.h>
 #endif
 
 #ifdef HAVE_LINUX_BTRACE
-# include "linux-btrace.h"
+# include "nat/linux-btrace.h"
+# include "btrace-common.h"
 #endif
 
 #ifndef HAVE_ELF32_AUXV_T
@@ -138,16 +136,48 @@ typedef struct
 } Elf64_auxv_t;
 #endif
 
-/* ``all_threads'' is keyed by the LWP ID, which we use as the GDB protocol
-   representation of the thread ID.
+/* LWP accessors.  */
 
-   ``all_lwps'' is keyed by the process ID - which on Linux is (presently)
-   the same as the LWP ID.
+/* See nat/linux-nat.h.  */
 
-   ``all_processes'' is keyed by the "overall process ID", which
-   GNU/Linux calls tgid, "thread group ID".  */
+ptid_t
+ptid_of_lwp (struct lwp_info *lwp)
+{
+  return ptid_of (get_lwp_thread (lwp));
+}
+
+/* See nat/linux-nat.h.  */
+
+void
+lwp_set_arch_private_info (struct lwp_info *lwp,
+                          struct arch_lwp_info *info)
+{
+  lwp->arch_private = info;
+}
+
+/* See nat/linux-nat.h.  */
+
+struct arch_lwp_info *
+lwp_arch_private_info (struct lwp_info *lwp)
+{
+  return lwp->arch_private;
+}
+
+/* See nat/linux-nat.h.  */
+
+int
+lwp_is_stopped (struct lwp_info *lwp)
+{
+  return lwp->stopped;
+}
 
-struct inferior_list all_lwps;
+/* See nat/linux-nat.h.  */
+
+enum target_stop_reason
+lwp_stop_reason (struct lwp_info *lwp)
+{
+  return lwp->stop_reason;
+}
 
 /* A list of all unknown processes which receive stop signals.  Some
    other process will presumably claim each of these as forked
@@ -225,15 +255,20 @@ static void linux_resume_one_lwp (struct lwp_info *lwp,
 static void linux_resume (struct thread_resume *resume_info, size_t n);
 static void stop_all_lwps (int suspend, struct lwp_info *except);
 static void unstop_all_lwps (int unsuspend, struct lwp_info *except);
+static int linux_wait_for_event_filtered (ptid_t wait_ptid, ptid_t filter_ptid,
+                                         int *wstat, int options);
 static int linux_wait_for_event (ptid_t ptid, int *wstat, int options);
-static void *add_lwp (ptid_t ptid);
+static struct lwp_info *add_lwp (ptid_t ptid);
 static int linux_stopped_by_watchpoint (void);
 static void mark_lwp_dead (struct lwp_info *lwp, int wstat);
 static void proceed_all_lwps (void);
 static int finish_step_over (struct lwp_info *lwp);
-static CORE_ADDR get_stop_pc (struct lwp_info *lwp);
 static int kill_lwp (unsigned long lwpid, int signo);
 
+/* When the event-loop is doing a step-over, this points at the thread
+   being stepped.  */
+ptid_t step_over_bkpt;
+
 /* True if the low target can hardware single-step.  Such targets
    don't need a BREAKPOINT_REINSERT_ADDR callback.  */
 
@@ -287,7 +322,7 @@ static int linux_event_pipe[2] = { -1, -1 };
 #define target_is_async_p() (linux_event_pipe[0] != -1)
 
 static void send_sigstop (struct lwp_info *lwp);
-static void wait_for_sigstop (struct inferior_list_entry *entry);
+static void wait_for_sigstop (void);
 
 /* Return non-zero if HEADER is a 64-bit ELF file.  */
 
@@ -346,8 +381,12 @@ linux_pid_exe_is_elf_64_file (int pid, unsigned int *machine)
 static void
 delete_lwp (struct lwp_info *lwp)
 {
-  remove_thread (get_lwp_thread (lwp));
-  remove_inferior (&all_lwps, &lwp->head);
+  struct thread_info *thr = get_lwp_thread (lwp);
+
+  if (debug_threads)
+    debug_printf ("deleting %ld\n", lwpid_of (thr));
+
+  remove_thread (thr);
   free (lwp->arch_private);
   free (lwp);
 }
@@ -361,17 +400,19 @@ linux_add_process (int pid, int attached)
   struct process_info *proc;
 
   proc = add_process (pid, attached);
-  proc->private = xcalloc (1, sizeof (*proc->private));
+  proc->priv = xcalloc (1, sizeof (*proc->priv));
 
   /* Set the arch when the first LWP stops.  */
-  proc->private->new_inferior = 1;
+  proc->priv->new_inferior = 1;
 
   if (the_low_target.new_process != NULL)
-    proc->private->arch_private = the_low_target.new_process ();
+    proc->priv->arch_private = the_low_target.new_process ();
 
   return proc;
 }
 
+static CORE_ADDR get_pc (struct lwp_info *lwp);
+
 /* Handle a GNU/Linux extended wait response.  If we see a clone
    event, we need to add the new LWP to our list (and not report the
    trap to higher layers).  */
@@ -379,7 +420,8 @@ linux_add_process (int pid, int attached)
 static void
 handle_extended_wait (struct lwp_info *event_child, int wstat)
 {
-  int event = wstat >> 16;
+  int event = linux_ptrace_get_extended_event (wstat);
+  struct thread_info *event_thr = get_lwp_thread (event_child);
   struct lwp_info *new_lwp;
 
   if (event == PTRACE_EVENT_CLONE)
@@ -388,7 +430,7 @@ handle_extended_wait (struct lwp_info *event_child, int wstat)
       unsigned long new_pid;
       int ret, status;
 
-      ptrace (PTRACE_GETEVENTMSG, lwpid_of (event_child), (PTRACE_TYPE_ARG3) 0,
+      ptrace (PTRACE_GETEVENTMSG, lwpid_of (event_thr), (PTRACE_TYPE_ARG3) 0,
              &new_pid);
 
       /* If we haven't already seen the new PID stop, wait for it now.  */
@@ -407,9 +449,13 @@ handle_extended_wait (struct lwp_info *event_child, int wstat)
            warning ("wait returned unexpected status 0x%x", status);
        }
 
-      ptid = ptid_build (pid_of (event_child), new_pid, 0);
-      new_lwp = (struct lwp_info *) add_lwp (ptid);
-      add_thread (ptid, new_lwp);
+      if (debug_threads)
+       debug_printf ("HEW: Got clone event "
+                     "from LWP %ld, new child is LWP %ld\n",
+                     lwpid_of (event_thr), new_pid);
+
+      ptid = ptid_build (pid_of (event_thr), new_pid, 0);
+      new_lwp = add_lwp (ptid);
 
       /* Either we're going to immediately resume the new thread
         or leave it stopped.  linux_resume_one_lwp is a nop if it
@@ -425,33 +471,12 @@ handle_extended_wait (struct lwp_info *event_child, int wstat)
       /* Normally we will get the pending SIGSTOP.  But in some cases
         we might get another signal delivered to the group first.
         If we do get another signal, be sure not to lose it.  */
-      if (WSTOPSIG (status) == SIGSTOP)
-       {
-         if (stopping_threads != NOT_STOPPING_THREADS)
-           new_lwp->stop_pc = get_stop_pc (new_lwp);
-         else
-           linux_resume_one_lwp (new_lwp, 0, 0, NULL);
-       }
-      else
+      if (WSTOPSIG (status) != SIGSTOP)
        {
          new_lwp->stop_expected = 1;
-
-         if (stopping_threads != NOT_STOPPING_THREADS)
-           {
-             new_lwp->stop_pc = get_stop_pc (new_lwp);
-             new_lwp->status_pending_p = 1;
-             new_lwp->status_pending = status;
-           }
-         else
-           /* Pass the signal on.  This is what GDB does - except
-              shouldn't we really report it instead?  */
-           linux_resume_one_lwp (new_lwp, 0, WSTOPSIG (status), NULL);
+         new_lwp->status_pending_p = 1;
+         new_lwp->status_pending = status;
        }
-
-      /* Always resume the current thread.  If we are stopping
-        threads, it will have a pending SIGSTOP; we may as well
-        collect it now.  */
-      linux_resume_one_lwp (event_child, event_child->stepping, 0, NULL);
     }
 }
 
@@ -461,23 +486,23 @@ handle_extended_wait (struct lwp_info *event_child, int wstat)
 static CORE_ADDR
 get_pc (struct lwp_info *lwp)
 {
-  struct thread_info *saved_inferior;
+  struct thread_info *saved_thread;
   struct regcache *regcache;
   CORE_ADDR pc;
 
   if (the_low_target.get_pc == NULL)
     return 0;
 
-  saved_inferior = current_inferior;
-  current_inferior = get_lwp_thread (lwp);
+  saved_thread = current_thread;
+  current_thread = get_lwp_thread (lwp);
 
-  regcache = get_thread_regcache (current_inferior, 1);
+  regcache = get_thread_regcache (current_thread, 1);
   pc = (*the_low_target.get_pc) (regcache);
 
   if (debug_threads)
-    fprintf (stderr, "pc is 0x%lx\n", (long) pc);
+    debug_printf ("pc is 0x%lx\n", (long) pc);
 
-  current_inferior = saved_inferior;
+  current_thread = saved_thread;
   return pc;
 }
 
@@ -485,47 +510,145 @@ get_pc (struct lwp_info *lwp)
    The SIGTRAP could mean several things.
 
    On i386, where decr_pc_after_break is non-zero:
-   If we were single-stepping this process using PTRACE_SINGLESTEP,
-   we will get only the one SIGTRAP (even if the instruction we
-   stepped over was a breakpoint).  The value of $eip will be the
-   next instruction.
+
+   If we were single-stepping this process using PTRACE_SINGLESTEP, we
+   will get only the one SIGTRAP.  The value of $eip will be the next
+   instruction.  If the instruction we stepped over was a breakpoint,
+   we need to decrement the PC.
+
    If we continue the process using PTRACE_CONT, we will get a
    SIGTRAP when we hit a breakpoint.  The value of $eip will be
    the instruction after the breakpoint (i.e. needs to be
    decremented).  If we report the SIGTRAP to GDB, we must also
-   report the undecremented PC.  If we cancel the SIGTRAP, we
+   report the undecremented PC.  If the breakpoint is removed, we
    must resume at the decremented PC.
 
-   (Presumably, not yet tested) On a non-decr_pc_after_break machine
-   with hardware or kernel single-step:
-   If we single-step over a breakpoint instruction, our PC will
-   point at the following instruction.  If we continue and hit a
-   breakpoint instruction, our PC will point at the breakpoint
+   On a non-decr_pc_after_break machine with hardware or kernel
+   single-step:
+
+   If we either single-step a breakpoint instruction, or continue and
+   hit a breakpoint instruction, our PC will point at the breakpoint
    instruction.  */
 
-static CORE_ADDR
-get_stop_pc (struct lwp_info *lwp)
+static int
+check_stopped_by_breakpoint (struct lwp_info *lwp)
 {
-  CORE_ADDR stop_pc;
+  CORE_ADDR pc;
+  CORE_ADDR sw_breakpoint_pc;
+  struct thread_info *saved_thread;
+#if USE_SIGTRAP_SIGINFO
+  siginfo_t siginfo;
+#endif
 
   if (the_low_target.get_pc == NULL)
     return 0;
 
-  stop_pc = get_pc (lwp);
+  pc = get_pc (lwp);
+  sw_breakpoint_pc = pc - the_low_target.decr_pc_after_break;
 
-  if (WSTOPSIG (lwp->last_status) == SIGTRAP
-      && !lwp->stepping
-      && !lwp->stopped_by_watchpoint
-      && lwp->last_status >> 16 == 0)
-    stop_pc -= the_low_target.decr_pc_after_break;
+  /* breakpoint_at reads from the current thread.  */
+  saved_thread = current_thread;
+  current_thread = get_lwp_thread (lwp);
 
-  if (debug_threads)
-    fprintf (stderr, "stop pc is 0x%lx\n", (long) stop_pc);
+#if USE_SIGTRAP_SIGINFO
+  if (ptrace (PTRACE_GETSIGINFO, lwpid_of (current_thread),
+             (PTRACE_TYPE_ARG3) 0, &siginfo) == 0)
+    {
+      if (siginfo.si_signo == SIGTRAP)
+       {
+         if (siginfo.si_code == GDB_ARCH_TRAP_BRKPT)
+           {
+             if (debug_threads)
+               {
+                 struct thread_info *thr = get_lwp_thread (lwp);
+
+                 debug_printf ("CSBB: Push back software breakpoint for %s\n",
+                               target_pid_to_str (ptid_of (thr)));
+               }
+
+             /* Back up the PC if necessary.  */
+             if (pc != sw_breakpoint_pc)
+               {
+                 struct regcache *regcache
+                   = get_thread_regcache (current_thread, 1);
+                 (*the_low_target.set_pc) (regcache, sw_breakpoint_pc);
+               }
+
+             lwp->stop_pc = sw_breakpoint_pc;
+             lwp->stop_reason = TARGET_STOPPED_BY_SW_BREAKPOINT;
+             current_thread = saved_thread;
+             return 1;
+           }
+         else if (siginfo.si_code == TRAP_HWBKPT)
+           {
+             if (debug_threads)
+               {
+                 struct thread_info *thr = get_lwp_thread (lwp);
 
-  return stop_pc;
+                 debug_printf ("CSBB: Push back hardware "
+                               "breakpoint/watchpoint for %s\n",
+                               target_pid_to_str (ptid_of (thr)));
+               }
+
+             lwp->stop_pc = pc;
+             lwp->stop_reason = TARGET_STOPPED_BY_HW_BREAKPOINT;
+             current_thread = saved_thread;
+             return 1;
+           }
+       }
+    }
+#else
+  /* We may have just stepped a breakpoint instruction.  E.g., in
+     non-stop mode, GDB first tells the thread A to step a range, and
+     then the user inserts a breakpoint inside the range.  In that
+     case we need to report the breakpoint PC.  */
+  if ((!lwp->stepping || lwp->stop_pc == sw_breakpoint_pc)
+      && (*the_low_target.breakpoint_at) (sw_breakpoint_pc))
+    {
+      if (debug_threads)
+       {
+         struct thread_info *thr = get_lwp_thread (lwp);
+
+         debug_printf ("CSBB: %s stopped by software breakpoint\n",
+                       target_pid_to_str (ptid_of (thr)));
+       }
+
+      /* Back up the PC if necessary.  */
+      if (pc != sw_breakpoint_pc)
+        {
+         struct regcache *regcache
+           = get_thread_regcache (current_thread, 1);
+         (*the_low_target.set_pc) (regcache, sw_breakpoint_pc);
+       }
+
+      lwp->stop_pc = sw_breakpoint_pc;
+      lwp->stop_reason = TARGET_STOPPED_BY_SW_BREAKPOINT;
+      current_thread = saved_thread;
+      return 1;
+    }
+
+  if (hardware_breakpoint_inserted_here (pc))
+    {
+      if (debug_threads)
+       {
+         struct thread_info *thr = get_lwp_thread (lwp);
+
+         debug_printf ("CSBB: %s stopped by hardware breakpoint\n",
+                       target_pid_to_str (ptid_of (thr)));
+       }
+
+      lwp->stop_pc = pc;
+      lwp->stop_reason = TARGET_STOPPED_BY_HW_BREAKPOINT;
+      current_thread = saved_thread;
+      return 1;
+    }
+#endif
+
+  current_thread = saved_thread;
+  return 0;
 }
 
-static void *
+static struct lwp_info *
 add_lwp (ptid_t ptid)
 {
   struct lwp_info *lwp;
@@ -533,12 +656,10 @@ add_lwp (ptid_t ptid)
   lwp = (struct lwp_info *) xmalloc (sizeof (*lwp));
   memset (lwp, 0, sizeof (*lwp));
 
-  lwp->head.id = ptid;
-
   if (the_low_target.new_thread != NULL)
-    lwp->arch_private = the_low_target.new_thread ();
+    the_low_target.new_thread (lwp);
 
-  add_inferior_to_list (&all_lwps, &lwp->head);
+  lwp->thread = add_thread (ptid, lwp);
 
   return lwp;
 }
@@ -549,29 +670,11 @@ add_lwp (ptid_t ptid)
 static int
 linux_create_inferior (char *program, char **allargs)
 {
-#ifdef HAVE_PERSONALITY
-  int personality_orig = 0, personality_set = 0;
-#endif
   struct lwp_info *new_lwp;
   int pid;
   ptid_t ptid;
-
-#ifdef HAVE_PERSONALITY
-  if (disable_randomization)
-    {
-      errno = 0;
-      personality_orig = personality (0xffffffff);
-      if (errno == 0 && !(personality_orig & ADDR_NO_RANDOMIZE))
-       {
-         personality_set = 1;
-         personality (personality_orig | ADDR_NO_RANDOMIZE);
-       }
-      if (errno != 0 || (personality_set
-                        && !(personality (0xffffffff) & ADDR_NO_RANDOMIZE)))
-       warning ("Error disabling address space randomization: %s",
-                strerror (errno));
-    }
-#endif
+  struct cleanup *restore_personality
+    = maybe_disable_address_space_randomization (disable_randomization);
 
 #if defined(__UCLIBC__) && defined(HAS_NOMMU)
   pid = vfork ();
@@ -617,73 +720,31 @@ linux_create_inferior (char *program, char **allargs)
       _exit (0177);
     }
 
-#ifdef HAVE_PERSONALITY
-  if (personality_set)
-    {
-      errno = 0;
-      personality (personality_orig);
-      if (errno != 0)
-       warning ("Error restoring address space randomization: %s",
-                strerror (errno));
-    }
-#endif
+  do_cleanups (restore_personality);
 
   linux_add_process (pid, 0);
 
   ptid = ptid_build (pid, pid, 0);
   new_lwp = add_lwp (ptid);
-  add_thread (ptid, new_lwp);
   new_lwp->must_set_ptrace_flags = 1;
 
   return pid;
 }
 
-/* Attach to an inferior process.  */
+/* Attach to an inferior process.  Returns 0 on success, ERRNO on
+   error.  */
 
-static void
-linux_attach_lwp_1 (unsigned long lwpid, int initial)
+int
+linux_attach_lwp (ptid_t ptid)
 {
-  ptid_t ptid;
   struct lwp_info *new_lwp;
+  int lwpid = ptid_get_lwp (ptid);
 
   if (ptrace (PTRACE_ATTACH, lwpid, (PTRACE_TYPE_ARG3) 0, (PTRACE_TYPE_ARG4) 0)
       != 0)
-    {
-      struct buffer buffer;
-
-      if (!initial)
-       {
-         /* If we fail to attach to an LWP, just warn.  */
-         fprintf (stderr, "Cannot attach to lwp %ld: %s (%d)\n", lwpid,
-                  strerror (errno), errno);
-         fflush (stderr);
-         return;
-       }
-
-      /* If we fail to attach to a process, report an error.  */
-      buffer_init (&buffer);
-      linux_ptrace_attach_warnings (lwpid, &buffer);
-      buffer_grow_str0 (&buffer, "");
-      error ("%sCannot attach to lwp %ld: %s (%d)", buffer_finish (&buffer),
-            lwpid, strerror (errno), errno);
-    }
-
-  if (initial)
-    /* If lwp is the tgid, we handle adding existing threads later.
-       Otherwise we just add lwp without bothering about any other
-       threads.  */
-    ptid = ptid_build (lwpid, lwpid, 0);
-  else
-    {
-      /* Note that extracting the pid from the current inferior is
-        safe, since we're always called in the context of the same
-        process as this new thread.  */
-      int pid = pid_of (get_thread_lwp (current_inferior));
-      ptid = ptid_build (pid, lwpid, 0);
-    }
+    return errno;
 
-  new_lwp = (struct lwp_info *) add_lwp (ptid);
-  add_thread (ptid, new_lwp);
+  new_lwp = add_lwp (ptid);
 
   /* We need to wait for SIGSTOP before being able to make the next
      ptrace call on this LWP.  */
@@ -692,8 +753,7 @@ linux_attach_lwp_1 (unsigned long lwpid, int initial)
   if (linux_proc_pid_is_stopped (lwpid))
     {
       if (debug_threads)
-       fprintf (stderr,
-                "Attached to a stopped process\n");
+       debug_printf ("Attached to a stopped process\n");
 
       /* The process is definitely stopped.  It is in a job control
         stop, unless the kernel predates the TASK_STOPPED /
@@ -752,12 +812,52 @@ linux_attach_lwp_1 (unsigned long lwpid, int initial)
      end of the list, and so the new thread has not yet reached
      wait_for_sigstop (but will).  */
   new_lwp->stop_expected = 1;
+
+  return 0;
 }
 
-void
-linux_attach_lwp (unsigned long lwpid)
+/* Callback for linux_proc_attach_tgid_threads.  Attach to PTID if not
+   already attached.  Returns true if a new LWP is found, false
+   otherwise.  */
+
+static int
+attach_proc_task_lwp_callback (ptid_t ptid)
 {
-  linux_attach_lwp_1 (lwpid, 0);
+  /* Is this a new thread?  */
+  if (find_thread_ptid (ptid) == NULL)
+    {
+      int lwpid = ptid_get_lwp (ptid);
+      int err;
+
+      if (debug_threads)
+       debug_printf ("Found new lwp %d\n", lwpid);
+
+      err = linux_attach_lwp (ptid);
+
+      /* Be quiet if we simply raced with the thread exiting.  EPERM
+        is returned if the thread's task still exists, and is marked
+        as exited or zombie, as well as other conditions, so in that
+        case, confirm the status in /proc/PID/status.  */
+      if (err == ESRCH
+         || (err == EPERM && linux_proc_pid_is_gone (lwpid)))
+       {
+         if (debug_threads)
+           {
+             debug_printf ("Cannot attach to lwp %d: "
+                           "thread is gone (%d: %s)\n",
+                           lwpid, err, strerror (err));
+           }
+       }
+      else if (err != 0)
+       {
+         warning (_("Cannot attach to lwp %d: %s"),
+                  lwpid,
+                  linux_ptrace_attach_fail_reason_string (ptid, err));
+       }
+
+      return 1;
+    }
+  return 0;
 }
 
 /* Attach to PID.  If PID is the tgid, attach to it and all
@@ -766,9 +866,16 @@ linux_attach_lwp (unsigned long lwpid)
 static int
 linux_attach (unsigned long pid)
 {
+  ptid_t ptid = ptid_build (pid, pid, 0);
+  int err;
+
   /* Attach to PID.  We will check for other threads
      soon.  */
-  linux_attach_lwp_1 (pid, 1);
+  err = linux_attach_lwp (ptid);
+  if (err != 0)
+    error ("Cannot attach to process %ld: %s",
+          pid, linux_ptrace_attach_fail_reason_string (ptid, err));
+
   linux_add_process (pid, 1);
 
   if (!non_stop)
@@ -781,65 +888,16 @@ linux_attach (unsigned long pid)
       thread->last_resume_kind = resume_stop;
     }
 
-  if (linux_proc_get_tgid (pid) == pid)
-    {
-      DIR *dir;
-      char pathname[128];
-
-      sprintf (pathname, "/proc/%ld/task", pid);
-
-      dir = opendir (pathname);
-
-      if (!dir)
-       {
-         fprintf (stderr, "Could not open /proc/%ld/task.\n", pid);
-         fflush (stderr);
-       }
-      else
-       {
-         /* At this point we attached to the tgid.  Scan the task for
-            existing threads.  */
-         unsigned long lwp;
-         int new_threads_found;
-         int iterations = 0;
-         struct dirent *dp;
-
-         while (iterations < 2)
-           {
-             new_threads_found = 0;
-             /* Add all the other threads.  While we go through the
-                threads, new threads may be spawned.  Cycle through
-                the list of threads until we have done two iterations without
-                finding new threads.  */
-             while ((dp = readdir (dir)) != NULL)
-               {
-                 /* Fetch one lwp.  */
-                 lwp = strtoul (dp->d_name, NULL, 10);
-
-                 /* Is this a new thread?  */
-                 if (lwp
-                     && find_thread_ptid (ptid_build (pid, lwp, 0)) == NULL)
-                   {
-                     linux_attach_lwp_1 (lwp, 0);
-                     new_threads_found++;
-
-                     if (debug_threads)
-                       fprintf (stderr, "\
-Found and attached to new lwp %ld\n", lwp);
-                   }
-               }
-
-             if (!new_threads_found)
-               iterations++;
-             else
-               iterations = 0;
-
-             rewinddir (dir);
-           }
-         closedir (dir);
-       }
-    }
-
+  /* We must attach to every LWP.  If /proc is mounted, use that to
+     find them now.  On the one hand, the inferior may be using raw
+     clone instead of using pthreads.  On the other hand, even if it
+     is using pthreads, GDB may not be connected yet (thread_db needs
+     to do symbol lookups, through qSymbol).  Also, thread_db walks
+     structures in the inferior's address space to find the list of
+     threads/LWPs, and those structures may well be corrupted.  Note
+     that once thread_db is loaded, we'll still use it to list threads
+     and associate pthread info with each LWP.  */
+  linux_proc_attach_tgid_threads (pid, attach_proc_task_lwp_callback);
   return 0;
 }
 
@@ -864,10 +922,8 @@ second_thread_of_pid_p (struct inferior_list_entry *entry, void *args)
 }
 
 static int
-last_thread_of_process_p (struct thread_info *thread)
+last_thread_of_process_p (int pid)
 {
-  ptid_t ptid = ((struct inferior_list_entry *)thread)->id;
-  int pid = ptid_get_pid (ptid);
   struct counter counter = { pid , 0 };
 
   return (find_inferior (&all_threads,
@@ -879,7 +935,8 @@ last_thread_of_process_p (struct thread_info *thread)
 static void
 linux_kill_one_lwp (struct lwp_info *lwp)
 {
-  int pid = lwpid_of (lwp);
+  struct thread_info *thr = get_lwp_thread (lwp);
+  int pid = lwpid_of (thr);
 
   /* PTRACE_KILL is unreliable.  After stepping into a signal handler,
      there is no signal context, and ptrace(PTRACE_KILL) (or
@@ -896,20 +953,66 @@ linux_kill_one_lwp (struct lwp_info *lwp)
      everywhere.  */
 
   errno = 0;
-  kill (pid, SIGKILL);
+  kill_lwp (pid, SIGKILL);
   if (debug_threads)
-    fprintf (stderr,
-            "LKL:  kill (SIGKILL) %s, 0, 0 (%s)\n",
-            target_pid_to_str (ptid_of (lwp)),
-            errno ? strerror (errno) : "OK");
+    {
+      int save_errno = errno;
+
+      debug_printf ("LKL:  kill_lwp (SIGKILL) %s, 0, 0 (%s)\n",
+                   target_pid_to_str (ptid_of (thr)),
+                   save_errno ? strerror (save_errno) : "OK");
+    }
 
   errno = 0;
   ptrace (PTRACE_KILL, pid, (PTRACE_TYPE_ARG3) 0, (PTRACE_TYPE_ARG4) 0);
   if (debug_threads)
-    fprintf (stderr,
-            "LKL:  PTRACE_KILL %s, 0, 0 (%s)\n",
-            target_pid_to_str (ptid_of (lwp)),
-            errno ? strerror (errno) : "OK");
+    {
+      int save_errno = errno;
+
+      debug_printf ("LKL:  PTRACE_KILL %s, 0, 0 (%s)\n",
+                   target_pid_to_str (ptid_of (thr)),
+                   save_errno ? strerror (save_errno) : "OK");
+    }
+}
+
+/* Kill LWP and wait for it to die.  */
+
+static void
+kill_wait_lwp (struct lwp_info *lwp)
+{
+  struct thread_info *thr = get_lwp_thread (lwp);
+  int pid = ptid_get_pid (ptid_of (thr));
+  int lwpid = ptid_get_lwp (ptid_of (thr));
+  int wstat;
+  int res;
+
+  if (debug_threads)
+    debug_printf ("kwl: killing lwp %d, for pid: %d\n", lwpid, pid);
+
+  do
+    {
+      linux_kill_one_lwp (lwp);
+
+      /* Make sure it died.  Notes:
+
+        - The loop is most likely unnecessary.
+
+        - We don't use linux_wait_for_event as that could delete lwps
+          while we're iterating over them.  We're not interested in
+          any pending status at this point, only in making sure all
+          wait status on the kernel side are collected until the
+          process is reaped.
+
+        - We don't use __WALL here as the __WALL emulation relies on
+          SIGCHLD, and killing a stopped process doesn't generate
+          one, nor an exit status.
+      */
+      res = my_waitpid (lwpid, &wstat, 0);
+      if (res == -1 && errno == ECHILD)
+       res = my_waitpid (lwpid, &wstat, __WCLONE);
+    } while (res > 0 && WIFSTOPPED (wstat));
+
+  gdb_assert (res > 0);
 }
 
 /* Callback for `find_inferior'.  Kills an lwp of a given process,
@@ -920,7 +1023,6 @@ kill_one_lwp_callback (struct inferior_list_entry *entry, void *args)
 {
   struct thread_info *thread = (struct thread_info *) entry;
   struct lwp_info *lwp = get_thread_lwp (thread);
-  int wstat;
   int pid = * (int *) args;
 
   if (ptid_get_pid (entry->id) != pid)
@@ -931,22 +1033,15 @@ kill_one_lwp_callback (struct inferior_list_entry *entry, void *args)
      the children get a chance to be reaped, it will remain a zombie
      forever.  */
 
-  if (lwpid_of (lwp) == pid)
+  if (lwpid_of (thread) == pid)
     {
       if (debug_threads)
-       fprintf (stderr, "lkop: is last of process %s\n",
-                target_pid_to_str (entry->id));
+       debug_printf ("lkop: is last of process %s\n",
+                     target_pid_to_str (entry->id));
       return 0;
     }
 
-  do
-    {
-      linux_kill_one_lwp (lwp);
-
-      /* Make sure it died.  The loop is most likely unnecessary.  */
-      pid = linux_wait_for_event (lwp->head.id, &wstat, __WALL);
-    } while (pid > 0 && WIFSTOPPED (wstat));
-
+  kill_wait_lwp (lwp);
   return 0;
 }
 
@@ -955,8 +1050,6 @@ linux_kill (int pid)
 {
   struct process_info *process;
   struct lwp_info *lwp;
-  int wstat;
-  int lwpid;
 
   process = find_process_pid (pid);
   if (process == NULL)
@@ -975,23 +1068,11 @@ linux_kill (int pid)
   if (lwp == NULL)
     {
       if (debug_threads)
-       fprintf (stderr, "lk_1: cannot find lwp %ld, for pid: %d\n",
-                lwpid_of (lwp), pid);
+       debug_printf ("lk_1: cannot find lwp for pid: %d\n",
+                     pid);
     }
   else
-    {
-      if (debug_threads)
-       fprintf (stderr, "lk_1: killing lwp %ld, for pid: %d\n",
-                lwpid_of (lwp), pid);
-
-      do
-       {
-         linux_kill_one_lwp (lwp);
-
-         /* Make sure it died.  The loop is most likely unnecessary.  */
-         lwpid = linux_wait_for_event (lwp->head.id, &wstat, __WALL);
-       } while (lwpid > 0 && WIFSTOPPED (wstat));
-    }
+    kill_wait_lwp (lwp);
 
   the_target->mourn (process);
 
@@ -1031,20 +1112,18 @@ get_detach_signal (struct thread_info *thread)
   if (!WIFSTOPPED (status))
     {
       if (debug_threads)
-       fprintf (stderr,
-                "GPS: lwp %s hasn't stopped: no pending signal\n",
-                target_pid_to_str (ptid_of (lp)));
+       debug_printf ("GPS: lwp %s hasn't stopped: no pending signal\n",
+                     target_pid_to_str (ptid_of (thread)));
       return 0;
     }
 
   /* Extended wait statuses aren't real SIGTRAPs.  */
-  if (WSTOPSIG (status) == SIGTRAP && status >> 16 != 0)
+  if (WSTOPSIG (status) == SIGTRAP && linux_is_extended_waitstatus (status))
     {
       if (debug_threads)
-       fprintf (stderr,
-                "GPS: lwp %s had stopped with extended "
-                "status: no pending signal\n",
-                target_pid_to_str (ptid_of (lp)));
+       debug_printf ("GPS: lwp %s had stopped with extended "
+                     "status: no pending signal\n",
+                     target_pid_to_str (ptid_of (thread)));
       return 0;
     }
 
@@ -1053,10 +1132,9 @@ get_detach_signal (struct thread_info *thread)
   if (program_signals_p && !program_signals[signo])
     {
       if (debug_threads)
-       fprintf (stderr,
-                "GPS: lwp %s had signal %s, but it is in nopass state\n",
-                target_pid_to_str (ptid_of (lp)),
-                gdb_signal_to_string (signo));
+       debug_printf ("GPS: lwp %s had signal %s, but it is in nopass state\n",
+                     target_pid_to_str (ptid_of (thread)),
+                     gdb_signal_to_string (signo));
       return 0;
     }
   else if (!program_signals_p
@@ -1066,20 +1144,19 @@ get_detach_signal (struct thread_info *thread)
           && (signo == GDB_SIGNAL_TRAP || signo == GDB_SIGNAL_INT))
     {
       if (debug_threads)
-       fprintf (stderr,
-                "GPS: lwp %s had signal %s, "
-                "but we don't know if we should pass it.  Default to not.\n",
-                target_pid_to_str (ptid_of (lp)),
-                gdb_signal_to_string (signo));
+       debug_printf ("GPS: lwp %s had signal %s, "
+                     "but we don't know if we should pass it. "
+                     "Default to not.\n",
+                     target_pid_to_str (ptid_of (thread)),
+                     gdb_signal_to_string (signo));
       return 0;
     }
   else
     {
       if (debug_threads)
-       fprintf (stderr,
-                "GPS: lwp %s has pending signal %s: delivering it.\n",
-                target_pid_to_str (ptid_of (lp)),
-                gdb_signal_to_string (signo));
+       debug_printf ("GPS: lwp %s has pending signal %s: delivering it.\n",
+                     target_pid_to_str (ptid_of (thread)),
+                     gdb_signal_to_string (signo));
 
       return WSTOPSIG (status);
     }
@@ -1100,16 +1177,15 @@ linux_detach_one_lwp (struct inferior_list_entry *entry, void *args)
   if (lwp->stop_expected)
     {
       if (debug_threads)
-       fprintf (stderr,
-                "Sending SIGCONT to %s\n",
-                target_pid_to_str (ptid_of (lwp)));
+       debug_printf ("Sending SIGCONT to %s\n",
+                     target_pid_to_str (ptid_of (thread)));
 
-      kill_lwp (lwpid_of (lwp), SIGCONT);
+      kill_lwp (lwpid_of (thread), SIGCONT);
       lwp->stop_expected = 0;
     }
 
   /* Flush any pending changes to the process's registers.  */
-  regcache_invalidate_thread (get_lwp_thread (lwp));
+  regcache_invalidate_thread (thread);
 
   /* Pass on any pending signal for this thread.  */
   sig = get_detach_signal (thread);
@@ -1117,10 +1193,10 @@ linux_detach_one_lwp (struct inferior_list_entry *entry, void *args)
   /* Finally, let it resume.  */
   if (the_low_target.prepare_to_resume != NULL)
     the_low_target.prepare_to_resume (lwp);
-  if (ptrace (PTRACE_DETACH, lwpid_of (lwp), (PTRACE_TYPE_ARG3) 0,
+  if (ptrace (PTRACE_DETACH, lwpid_of (thread), (PTRACE_TYPE_ARG3) 0,
              (PTRACE_TYPE_ARG4) (long) sig) < 0)
     error (_("Can't detach %s: %s"),
-          target_pid_to_str (ptid_of (lwp)),
+          target_pid_to_str (ptid_of (thread)),
           strerror (errno));
 
   delete_lwp (lwp);
@@ -1164,10 +1240,11 @@ linux_detach (int pid)
 static int
 delete_lwp_callback (struct inferior_list_entry *entry, void *proc)
 {
-  struct lwp_info *lwp = (struct lwp_info *) entry;
+  struct thread_info *thread = (struct thread_info *) entry;
+  struct lwp_info *lwp = get_thread_lwp (thread);
   struct process_info *process = proc;
 
-  if (pid_of (lwp) == pid_of (process))
+  if (pid_of (thread) == pid_of (process))
     delete_lwp (lwp);
 
   return 0;
@@ -1182,13 +1259,13 @@ linux_mourn (struct process_info *process)
   thread_db_mourn (process);
 #endif
 
-  find_inferior (&all_lwps, delete_lwp_callback, process);
+  find_inferior (&all_threads, delete_lwp_callback, process);
 
   /* Freeing all private data.  */
-  priv = process->private;
+  priv = process->priv;
   free (priv->arch_private);
   free (priv);
-  process->private = NULL;
+  process->priv = NULL;
 
   remove_process (process);
 }
@@ -1220,195 +1297,287 @@ linux_thread_alive (ptid_t ptid)
     return 0;
 }
 
-/* Return 1 if this lwp has an interesting status pending.  */
+/* Return 1 if this lwp still has an interesting status pending.  If
+   not (e.g., it had stopped for a breakpoint that is gone), return
+   false.  */
+
 static int
-status_pending_p_callback (struct inferior_list_entry *entry, void *arg)
+thread_still_has_status_pending_p (struct thread_info *thread)
 {
-  struct lwp_info *lwp = (struct lwp_info *) entry;
-  ptid_t ptid = * (ptid_t *) arg;
-  struct thread_info *thread;
+  struct lwp_info *lp = get_thread_lwp (thread);
 
-  /* Check if we're only interested in events from a specific process
-     or its lwps.  */
-  if (!ptid_equal (minus_one_ptid, ptid)
-      && ptid_get_pid (ptid) != ptid_get_pid (lwp->head.id))
+  if (!lp->status_pending_p)
     return 0;
 
-  thread = get_lwp_thread (lwp);
-
   /* If we got a `vCont;t', but we haven't reported a stop yet, do
      report any status pending the LWP may have.  */
   if (thread->last_resume_kind == resume_stop
       && thread->last_status.kind != TARGET_WAITKIND_IGNORE)
     return 0;
 
-  return lwp->status_pending_p;
-}
+  if (thread->last_resume_kind != resume_stop
+      && (lp->stop_reason == TARGET_STOPPED_BY_SW_BREAKPOINT
+         || lp->stop_reason == TARGET_STOPPED_BY_HW_BREAKPOINT))
+    {
+      struct thread_info *saved_thread;
+      CORE_ADDR pc;
+      int discard = 0;
 
-static int
-same_lwp (struct inferior_list_entry *entry, void *data)
-{
-  ptid_t ptid = *(ptid_t *) data;
-  int lwp;
+      gdb_assert (lp->last_status != 0);
 
-  if (ptid_get_lwp (ptid) != 0)
-    lwp = ptid_get_lwp (ptid);
-  else
-    lwp = ptid_get_pid (ptid);
+      pc = get_pc (lp);
 
-  if (ptid_get_lwp (entry->id) == lwp)
-    return 1;
+      saved_thread = current_thread;
+      current_thread = thread;
 
-  return 0;
-}
+      if (pc != lp->stop_pc)
+       {
+         if (debug_threads)
+           debug_printf ("PC of %ld changed\n",
+                         lwpid_of (thread));
+         discard = 1;
+       }
 
-struct lwp_info *
-find_lwp_pid (ptid_t ptid)
-{
-  return (struct lwp_info*) find_inferior (&all_lwps, same_lwp, &ptid);
-}
+#if !USE_SIGTRAP_SIGINFO
+      else if (lp->stop_reason == TARGET_STOPPED_BY_SW_BREAKPOINT
+              && !(*the_low_target.breakpoint_at) (pc))
+       {
+         if (debug_threads)
+           debug_printf ("previous SW breakpoint of %ld gone\n",
+                         lwpid_of (thread));
+         discard = 1;
+       }
+      else if (lp->stop_reason == TARGET_STOPPED_BY_HW_BREAKPOINT
+              && !hardware_breakpoint_inserted_here (pc))
+       {
+         if (debug_threads)
+           debug_printf ("previous HW breakpoint of %ld gone\n",
+                         lwpid_of (thread));
+         discard = 1;
+       }
+#endif
 
-static struct lwp_info *
-linux_wait_for_lwp (ptid_t ptid, int *wstatp, int options)
-{
-  int ret;
-  int to_wait_for = -1;
-  struct lwp_info *child = NULL;
+      current_thread = saved_thread;
 
-  if (debug_threads)
-    fprintf (stderr, "linux_wait_for_lwp: %s\n", target_pid_to_str (ptid));
+      if (discard)
+       {
+         if (debug_threads)
+           debug_printf ("discarding pending breakpoint status\n");
+         lp->status_pending_p = 0;
+         return 0;
+       }
+    }
+
+  return 1;
+}
+
+/* Return 1 if this lwp has an interesting status pending.  */
+static int
+status_pending_p_callback (struct inferior_list_entry *entry, void *arg)
+{
+  struct thread_info *thread = (struct thread_info *) entry;
+  struct lwp_info *lp = get_thread_lwp (thread);
+  ptid_t ptid = * (ptid_t *) arg;
+
+  /* Check if we're only interested in events from a specific process
+     or a specific LWP.  */
+  if (!ptid_match (ptid_of (thread), ptid))
+    return 0;
+
+  if (lp->status_pending_p
+      && !thread_still_has_status_pending_p (thread))
+    {
+      linux_resume_one_lwp (lp, lp->stepping, GDB_SIGNAL_0, NULL);
+      return 0;
+    }
 
-  if (ptid_equal (ptid, minus_one_ptid))
-    to_wait_for = -1;                  /* any child */
+  return lp->status_pending_p;
+}
+
+static int
+same_lwp (struct inferior_list_entry *entry, void *data)
+{
+  ptid_t ptid = *(ptid_t *) data;
+  int lwp;
+
+  if (ptid_get_lwp (ptid) != 0)
+    lwp = ptid_get_lwp (ptid);
   else
-    to_wait_for = ptid_get_lwp (ptid); /* this lwp only */
+    lwp = ptid_get_pid (ptid);
 
-  options |= __WALL;
+  if (ptid_get_lwp (entry->id) == lwp)
+    return 1;
 
-retry:
+  return 0;
+}
 
-  ret = my_waitpid (to_wait_for, wstatp, options);
-  if (ret == 0 || (ret == -1 && errno == ECHILD && (options & WNOHANG)))
+struct lwp_info *
+find_lwp_pid (ptid_t ptid)
+{
+  struct inferior_list_entry *thread
+    = find_inferior (&all_threads, same_lwp, &ptid);
+
+  if (thread == NULL)
     return NULL;
-  else if (ret == -1)
-    perror_with_name ("waitpid");
 
-  if (debug_threads
-      && (!WIFSTOPPED (*wstatp)
-         || (WSTOPSIG (*wstatp) != 32
-             && WSTOPSIG (*wstatp) != 33)))
-    fprintf (stderr, "Got an event from %d (%x)\n", ret, *wstatp);
+  return get_thread_lwp ((struct thread_info *) thread);
+}
 
-  child = find_lwp_pid (pid_to_ptid (ret));
+/* Return the number of known LWPs in the tgid given by PID.  */
 
-  /* If we didn't find a process, one of two things presumably happened:
-     - A process we started and then detached from has exited.  Ignore it.
-     - A process we are controlling has forked and the new child's stop
-     was reported to us by the kernel.  Save its PID.  */
-  if (child == NULL && WIFSTOPPED (*wstatp))
+static int
+num_lwps (int pid)
+{
+  struct inferior_list_entry *inf, *tmp;
+  int count = 0;
+
+  ALL_INFERIORS (&all_threads, inf, tmp)
     {
-      add_to_pid_list (&stopped_pids, ret, *wstatp);
-      goto retry;
+      if (ptid_get_pid (inf->id) == pid)
+       count++;
     }
-  else if (child == NULL)
-    goto retry;
 
-  child->stopped = 1;
+  return count;
+}
 
-  child->last_status = *wstatp;
+/* The arguments passed to iterate_over_lwps.  */
 
-  if (WIFSTOPPED (*wstatp))
-    {
-      struct process_info *proc;
+struct iterate_over_lwps_args
+{
+  /* The FILTER argument passed to iterate_over_lwps.  */
+  ptid_t filter;
 
-      /* Architecture-specific setup after inferior is running.  This
-        needs to happen after we have attached to the inferior and it
-        is stopped for the first time, but before we access any
-        inferior registers.  */
-      proc = find_process_pid (pid_of (child));
-      if (proc->private->new_inferior)
-       {
-         struct thread_info *saved_inferior;
+  /* The CALLBACK argument passed to iterate_over_lwps.  */
+  iterate_over_lwps_ftype *callback;
 
-         saved_inferior = current_inferior;
-         current_inferior = get_lwp_thread (child);
+  /* The DATA argument passed to iterate_over_lwps.  */
+  void *data;
+};
 
-         the_low_target.arch_setup ();
+/* Callback for find_inferior used by iterate_over_lwps to filter
+   calls to the callback supplied to that function.  Returning a
+   nonzero value causes find_inferiors to stop iterating and return
+   the current inferior_list_entry.  Returning zero indicates that
+   find_inferiors should continue iterating.  */
 
-         current_inferior = saved_inferior;
+static int
+iterate_over_lwps_filter (struct inferior_list_entry *entry, void *args_p)
+{
+  struct iterate_over_lwps_args *args
+    = (struct iterate_over_lwps_args *) args_p;
 
-         proc->private->new_inferior = 0;
-       }
+  if (ptid_match (entry->id, args->filter))
+    {
+      struct thread_info *thr = (struct thread_info *) entry;
+      struct lwp_info *lwp = get_thread_lwp (thr);
+
+      return (*args->callback) (lwp, args->data);
     }
 
-  /* Fetch the possibly triggered data watchpoint info and store it in
-     CHILD.
+  return 0;
+}
+
+/* See nat/linux-nat.h.  */
+
+struct lwp_info *
+iterate_over_lwps (ptid_t filter,
+                  iterate_over_lwps_ftype callback,
+                  void *data)
+{
+  struct iterate_over_lwps_args args = {filter, callback, data};
+  struct inferior_list_entry *entry;
 
-     On some archs, like x86, that use debug registers to set
-     watchpoints, it's possible that the way to know which watched
-     address trapped, is to check the register that is used to select
-     which address to watch.  Problem is, between setting the
-     watchpoint and reading back which data address trapped, the user
-     may change the set of watchpoints, and, as a consequence, GDB
-     changes the debug registers in the inferior.  To avoid reading
-     back a stale stopped-data-address when that happens, we cache in
-     LP the fact that a watchpoint trapped, and the corresponding data
-     address, as soon as we see CHILD stop with a SIGTRAP.  If GDB
-     changes the debug registers meanwhile, we have the cached data we
-     can rely on.  */
+  entry = find_inferior (&all_threads, iterate_over_lwps_filter, &args);
+  if (entry == NULL)
+    return NULL;
+
+  return get_thread_lwp ((struct thread_info *) entry);
+}
 
-  if (WIFSTOPPED (*wstatp) && WSTOPSIG (*wstatp) == SIGTRAP)
+/* Detect zombie thread group leaders, and "exit" them.  We can't reap
+   their exits until all other threads in the group have exited.  */
+
+static void
+check_zombie_leaders (void)
+{
+  struct process_info *proc, *tmp;
+
+  ALL_PROCESSES (proc, tmp)
     {
-      if (the_low_target.stopped_by_watchpoint == NULL)
-       {
-         child->stopped_by_watchpoint = 0;
-       }
-      else
-       {
-         struct thread_info *saved_inferior;
+      pid_t leader_pid = pid_of (proc);
+      struct lwp_info *leader_lp;
 
-         saved_inferior = current_inferior;
-         current_inferior = get_lwp_thread (child);
+      leader_lp = find_lwp_pid (pid_to_ptid (leader_pid));
 
-         child->stopped_by_watchpoint
-           = the_low_target.stopped_by_watchpoint ();
+      if (debug_threads)
+       debug_printf ("leader_pid=%d, leader_lp!=NULL=%d, "
+                     "num_lwps=%d, zombie=%d\n",
+                     leader_pid, leader_lp!= NULL, num_lwps (leader_pid),
+                     linux_proc_pid_is_zombie (leader_pid));
+
+      if (leader_lp != NULL
+         /* Check if there are other threads in the group, as we may
+            have raced with the inferior simply exiting.  */
+         && !last_thread_of_process_p (leader_pid)
+         && linux_proc_pid_is_zombie (leader_pid))
+       {
+         /* A leader zombie can mean one of two things:
+
+            - It exited, and there's an exit status pending
+            available, or only the leader exited (not the whole
+            program).  In the latter case, we can't waitpid the
+            leader's exit status until all other threads are gone.
+
+            - There are 3 or more threads in the group, and a thread
+            other than the leader exec'd.  On an exec, the Linux
+            kernel destroys all other threads (except the execing
+            one) in the thread group, and resets the execing thread's
+            tid to the tgid.  No exit notification is sent for the
+            execing thread -- from the ptracer's perspective, it
+            appears as though the execing thread just vanishes.
+            Until we reap all other threads except the leader and the
+            execing thread, the leader will be zombie, and the
+            execing thread will be in `D (disc sleep)'.  As soon as
+            all other threads are reaped, the execing thread changes
+            it's tid to the tgid, and the previous (zombie) leader
+            vanishes, giving place to the "new" leader.  We could try
+            distinguishing the exit and exec cases, by waiting once
+            more, and seeing if something comes out, but it doesn't
+            sound useful.  The previous leader _does_ go away, and
+            we'll re-add the new one once we see the exec event
+            (which is just the same as what would happen if the
+            previous leader did exit voluntarily before some other
+            thread execs).  */
 
-         if (child->stopped_by_watchpoint)
-           {
-             if (the_low_target.stopped_data_address != NULL)
-               child->stopped_data_address
-                 = the_low_target.stopped_data_address ();
-             else
-               child->stopped_data_address = 0;
-           }
+         if (debug_threads)
+           fprintf (stderr,
+                    "CZL: Thread group leader %d zombie "
+                    "(it exited, or another thread execd).\n",
+                    leader_pid);
 
-         current_inferior = saved_inferior;
+         delete_lwp (leader_lp);
        }
     }
+}
 
-  /* Store the STOP_PC, with adjustment applied.  This depends on the
-     architecture being defined already (so that CHILD has a valid
-     regcache), and on LAST_STATUS being set (to check for SIGTRAP or
-     not).  */
-  if (WIFSTOPPED (*wstatp))
-    child->stop_pc = get_stop_pc (child);
+/* Callback for `find_inferior'.  Returns the first LWP that is not
+   stopped.  ARG is a PTID filter.  */
 
-  if (debug_threads
-      && WIFSTOPPED (*wstatp)
-      && the_low_target.get_pc != NULL)
-    {
-      struct thread_info *saved_inferior = current_inferior;
-      struct regcache *regcache;
-      CORE_ADDR pc;
+static int
+not_stopped_callback (struct inferior_list_entry *entry, void *arg)
+{
+  struct thread_info *thr = (struct thread_info *) entry;
+  struct lwp_info *lwp;
+  ptid_t filter = *(ptid_t *) arg;
 
-      current_inferior = get_lwp_thread (child);
-      regcache = get_thread_regcache (current_inferior, 1);
-      pc = (*the_low_target.get_pc) (regcache);
-      fprintf (stderr, "linux_wait_for_lwp: pc is 0x%lx\n", (long) pc);
-      current_inferior = saved_inferior;
-    }
+  if (!ptid_match (ptid_of (thr), filter))
+    return 0;
 
-  return child;
+  lwp = get_thread_lwp (thr);
+  if (!lwp->stopped)
+    return 1;
+
+  return 0;
 }
 
 /* This function should only be called if the LWP got a SIGTRAP.
@@ -1422,6 +1591,8 @@ handle_tracepoints (struct lwp_info *lwp)
   struct thread_info *tinfo = get_lwp_thread (lwp);
   int tpoint_related_event = 0;
 
+  gdb_assert (lwp->suspended == 0);
+
   /* If this tracepoint hit causes a tracing stop, we'll immediately
      uninsert tracepoints.  To do this, we temporarily pause all
      threads, unpatch away, and then unpause threads.  We need to make
@@ -1450,7 +1621,7 @@ handle_tracepoints (struct lwp_info *lwp)
   if (tpoint_related_event)
     {
       if (debug_threads)
-       fprintf (stderr, "got a tracepoint event\n");
+       debug_printf ("got a tracepoint event\n");
       return 1;
     }
 
@@ -1465,6 +1636,7 @@ linux_fast_tracepoint_collecting (struct lwp_info *lwp,
                                  struct fast_tpoint_collect_status *status)
 {
   CORE_ADDR thread_area;
+  struct thread_info *thread = get_lwp_thread (lwp);
 
   if (the_low_target.get_thread_area == NULL)
     return 0;
@@ -1473,7 +1645,7 @@ linux_fast_tracepoint_collecting (struct lwp_info *lwp,
      thread is which when tracing with the in-process agent library.
      We don't read anything from the address, and treat it as opaque;
      it's the address itself that we assume is unique per-thread.  */
-  if ((*the_low_target.get_thread_area) (lwpid_of (lwp), &thread_area) == -1)
+  if ((*the_low_target.get_thread_area) (lwpid_of (thread), &thread_area) == -1)
     return 0;
 
   return fast_tracepoint_collecting (thread_area, lwp->stop_pc, status);
@@ -1487,10 +1659,10 @@ linux_fast_tracepoint_collecting (struct lwp_info *lwp,
 static int
 maybe_move_out_of_jump_pad (struct lwp_info *lwp, int *wstat)
 {
-  struct thread_info *saved_inferior;
+  struct thread_info *saved_thread;
 
-  saved_inferior = current_inferior;
-  current_inferior = get_lwp_thread (lwp);
+  saved_thread = current_thread;
+  current_thread = get_lwp_thread (lwp);
 
   if ((wstat == NULL
        || (WIFSTOPPED (*wstat) && WSTOPSIG (*wstat) != SIGTRAP))
@@ -1501,9 +1673,9 @@ maybe_move_out_of_jump_pad (struct lwp_info *lwp, int *wstat)
       int r;
 
       if (debug_threads)
-       fprintf (stderr, "\
-Checking whether LWP %ld needs to move out of the jump pad.\n",
-                lwpid_of (lwp));
+       debug_printf ("Checking whether LWP %ld needs to move out of the "
+                     "jump pad.\n",
+                     lwpid_of (current_thread));
 
       r = linux_fast_tracepoint_collecting (lwp, &status);
 
@@ -1527,10 +1699,10 @@ Checking whether LWP %ld needs to move out of the jump pad.\n",
                }
 
              if (debug_threads)
-               fprintf (stderr, "\
-Checking whether LWP %ld needs to move out of the jump pad...it does\n",
-                lwpid_of (lwp));
-             current_inferior = saved_inferior;
+               debug_printf ("Checking whether LWP %ld needs to move out of "
+                             "the jump pad...it does\n",
+                             lwpid_of (current_thread));
+             current_thread = saved_thread;
 
              return 1;
            }
@@ -1559,18 +1731,18 @@ Checking whether LWP %ld needs to move out of the jump pad...it does\n",
                   || WSTOPSIG (*wstat) == SIGFPE
                   || WSTOPSIG (*wstat) == SIGBUS
                   || WSTOPSIG (*wstat) == SIGSEGV)
-                 && ptrace (PTRACE_GETSIGINFO, lwpid_of (lwp),
+                 && ptrace (PTRACE_GETSIGINFO, lwpid_of (current_thread),
                             (PTRACE_TYPE_ARG3) 0, &info) == 0
                  /* Final check just to make sure we don't clobber
                     the siginfo of non-kernel-sent signals.  */
                  && (uintptr_t) info.si_addr == lwp->stop_pc)
                {
                  info.si_addr = (void *) (uintptr_t) status.tpoint_addr;
-                 ptrace (PTRACE_SETSIGINFO, lwpid_of (lwp),
+                 ptrace (PTRACE_SETSIGINFO, lwpid_of (current_thread),
                          (PTRACE_TYPE_ARG3) 0, &info);
                }
 
-             regcache = get_thread_regcache (get_lwp_thread (lwp), 1);
+             regcache = get_thread_regcache (current_thread, 1);
              (*the_low_target.set_pc) (regcache, status.tpoint_addr);
              lwp->stop_pc = status.tpoint_addr;
 
@@ -1582,12 +1754,10 @@ Checking whether LWP %ld needs to move out of the jump pad...it does\n",
          if (lwp->exit_jump_pad_bkpt != NULL)
            {
              if (debug_threads)
-               fprintf (stderr,
-                        "Cancelling fast exit-jump-pad: removing bkpt. "
-                        "stopping all threads momentarily.\n");
+               debug_printf ("Cancelling fast exit-jump-pad: removing bkpt. "
+                             "stopping all threads momentarily.\n");
 
              stop_all_lwps (1, lwp);
-             cancel_breakpoints ();
 
              delete_breakpoint (lwp->exit_jump_pad_bkpt);
              lwp->exit_jump_pad_bkpt = NULL;
@@ -1600,11 +1770,11 @@ Checking whether LWP %ld needs to move out of the jump pad...it does\n",
     }
 
   if (debug_threads)
-    fprintf (stderr, "\
-Checking whether LWP %ld needs to move out of the jump pad...no\n",
-            lwpid_of (lwp));
+    debug_printf ("Checking whether LWP %ld needs to move out of the "
+                 "jump pad...no\n",
+                 lwpid_of (current_thread));
 
-  current_inferior = saved_inferior;
+  current_thread = saved_thread;
   return 0;
 }
 
@@ -1615,10 +1785,11 @@ static void
 enqueue_one_deferred_signal (struct lwp_info *lwp, int *wstat)
 {
   struct pending_signals *p_sig;
+  struct thread_info *thread = get_lwp_thread (lwp);
 
   if (debug_threads)
-    fprintf (stderr, "\
-Deferring signal %d for LWP %ld.\n", WSTOPSIG (*wstat), lwpid_of (lwp));
+    debug_printf ("Deferring signal %d for LWP %ld.\n",
+                 WSTOPSIG (*wstat), lwpid_of (thread));
 
   if (debug_threads)
     {
@@ -1627,11 +1798,10 @@ Deferring signal %d for LWP %ld.\n", WSTOPSIG (*wstat), lwpid_of (lwp));
       for (sig = lwp->pending_signals_to_report;
           sig != NULL;
           sig = sig->prev)
-       fprintf (stderr,
-                "   Already queued %d\n",
-                sig->signal);
+       debug_printf ("   Already queued %d\n",
+                     sig->signal);
 
-      fprintf (stderr, "   (no more currently queued signals)\n");
+      debug_printf ("   (no more currently queued signals)\n");
     }
 
   /* Don't enqueue non-RT signals if they are already in the deferred
@@ -1648,11 +1818,10 @@ Deferring signal %d for LWP %ld.\n", WSTOPSIG (*wstat), lwpid_of (lwp));
          if (sig->signal == WSTOPSIG (*wstat))
            {
              if (debug_threads)
-               fprintf (stderr,
-                        "Not requeuing already queued non-RT signal %d"
-                        " for LWP %ld\n",
-                        sig->signal,
-                        lwpid_of (lwp));
+               debug_printf ("Not requeuing already queued non-RT signal %d"
+                             " for LWP %ld\n",
+                             sig->signal,
+                             lwpid_of (thread));
              return;
            }
        }
@@ -1662,7 +1831,7 @@ Deferring signal %d for LWP %ld.\n", WSTOPSIG (*wstat), lwpid_of (lwp));
   p_sig->prev = lwp->pending_signals_to_report;
   p_sig->signal = WSTOPSIG (*wstat);
   memset (&p_sig->info, 0, sizeof (siginfo_t));
-  ptrace (PTRACE_GETSIGINFO, lwpid_of (lwp), (PTRACE_TYPE_ARG3) 0,
+  ptrace (PTRACE_GETSIGINFO, lwpid_of (thread), (PTRACE_TYPE_ARG3) 0,
          &p_sig->info);
 
   lwp->pending_signals_to_report = p_sig;
@@ -1674,6 +1843,8 @@ Deferring signal %d for LWP %ld.\n", WSTOPSIG (*wstat), lwpid_of (lwp));
 static int
 dequeue_one_deferred_signal (struct lwp_info *lwp, int *wstat)
 {
+  struct thread_info *thread = get_lwp_thread (lwp);
+
   if (lwp->pending_signals_to_report != NULL)
     {
       struct pending_signals **p_sig;
@@ -1684,14 +1855,14 @@ dequeue_one_deferred_signal (struct lwp_info *lwp, int *wstat)
 
       *wstat = W_STOPCODE ((*p_sig)->signal);
       if ((*p_sig)->info.si_signo != 0)
-       ptrace (PTRACE_SETSIGINFO, lwpid_of (lwp), (PTRACE_TYPE_ARG3) 0,
+       ptrace (PTRACE_SETSIGINFO, lwpid_of (thread), (PTRACE_TYPE_ARG3) 0,
                &(*p_sig)->info);
       free (*p_sig);
       *p_sig = NULL;
 
       if (debug_threads)
-       fprintf (stderr, "Reporting deferred signal %d for LWP %ld.\n",
-                WSTOPSIG (*wstat), lwpid_of (lwp));
+       debug_printf ("Reporting deferred signal %d for LWP %ld.\n",
+                     WSTOPSIG (*wstat), lwpid_of (thread));
 
       if (debug_threads)
        {
@@ -1700,11 +1871,10 @@ dequeue_one_deferred_signal (struct lwp_info *lwp, int *wstat)
          for (sig = lwp->pending_signals_to_report;
               sig != NULL;
               sig = sig->prev)
-           fprintf (stderr,
-                    "   Still queued %d\n",
-                    sig->signal);
+           debug_printf ("   Still queued %d\n",
+                         sig->signal);
 
-         fprintf (stderr, "   (no more queued signals)\n");
+         debug_printf ("   (no more queued signals)\n");
        }
 
       return 1;
@@ -1713,86 +1883,266 @@ dequeue_one_deferred_signal (struct lwp_info *lwp, int *wstat)
   return 0;
 }
 
-/* Arrange for a breakpoint to be hit again later.  We don't keep the
-   SIGTRAP status and don't forward the SIGTRAP signal to the LWP.  We
-   will handle the current event, eventually we will resume this LWP,
-   and this breakpoint will trap again.  */
+/* Fetch the possibly triggered data watchpoint info and store it in
+   CHILD.
+
+   On some archs, like x86, that use debug registers to set
+   watchpoints, it's possible that the way to know which watched
+   address trapped, is to check the register that is used to select
+   which address to watch.  Problem is, between setting the watchpoint
+   and reading back which data address trapped, the user may change
+   the set of watchpoints, and, as a consequence, GDB changes the
+   debug registers in the inferior.  To avoid reading back a stale
+   stopped-data-address when that happens, we cache in LP the fact
+   that a watchpoint trapped, and the corresponding data address, as
+   soon as we see CHILD stop with a SIGTRAP.  If GDB changes the debug
+   registers meanwhile, we have the cached data we can rely on.  */
 
 static int
-cancel_breakpoint (struct lwp_info *lwp)
+check_stopped_by_watchpoint (struct lwp_info *child)
 {
-  struct thread_info *saved_inferior;
+  if (the_low_target.stopped_by_watchpoint != NULL)
+    {
+      struct thread_info *saved_thread;
 
-  /* There's nothing to do if we don't support breakpoints.  */
-  if (!supports_breakpoints ())
-    return 0;
+      saved_thread = current_thread;
+      current_thread = get_lwp_thread (child);
 
-  /* breakpoint_at reads from current inferior.  */
-  saved_inferior = current_inferior;
-  current_inferior = get_lwp_thread (lwp);
+      if (the_low_target.stopped_by_watchpoint ())
+       {
+         child->stop_reason = TARGET_STOPPED_BY_WATCHPOINT;
+
+         if (the_low_target.stopped_data_address != NULL)
+           child->stopped_data_address
+             = the_low_target.stopped_data_address ();
+         else
+           child->stopped_data_address = 0;
+       }
+
+      current_thread = saved_thread;
+    }
 
-  if ((*the_low_target.breakpoint_at) (lwp->stop_pc))
+  return child->stop_reason == TARGET_STOPPED_BY_WATCHPOINT;
+}
+
+/* Do low-level handling of the event, and check if we should go on
+   and pass it to caller code.  Return the affected lwp if we are, or
+   NULL otherwise.  */
+
+static struct lwp_info *
+linux_low_filter_event (int lwpid, int wstat)
+{
+  struct lwp_info *child;
+  struct thread_info *thread;
+  int have_stop_pc = 0;
+
+  child = find_lwp_pid (pid_to_ptid (lwpid));
+
+  /* If we didn't find a process, one of two things presumably happened:
+     - A process we started and then detached from has exited.  Ignore it.
+     - A process we are controlling has forked and the new child's stop
+     was reported to us by the kernel.  Save its PID.  */
+  if (child == NULL && WIFSTOPPED (wstat))
+    {
+      add_to_pid_list (&stopped_pids, lwpid, wstat);
+      return NULL;
+    }
+  else if (child == NULL)
+    return NULL;
+
+  thread = get_lwp_thread (child);
+
+  child->stopped = 1;
+
+  child->last_status = wstat;
+
+  /* Check if the thread has exited.  */
+  if ((WIFEXITED (wstat) || WIFSIGNALED (wstat)))
     {
       if (debug_threads)
-       fprintf (stderr,
-                "CB: Push back breakpoint for %s\n",
-                target_pid_to_str (ptid_of (lwp)));
+       debug_printf ("LLFE: %d exited.\n", lwpid);
+      if (num_lwps (pid_of (thread)) > 1)
+       {
 
-      /* Back up the PC if necessary.  */
-      if (the_low_target.decr_pc_after_break)
+         /* If there is at least one more LWP, then the exit signal was
+            not the end of the debugged application and should be
+            ignored.  */
+         delete_lwp (child);
+         return NULL;
+       }
+      else
        {
-         struct regcache *regcache
-           = get_thread_regcache (current_inferior, 1);
-         (*the_low_target.set_pc) (regcache, lwp->stop_pc);
+         /* This was the last lwp in the process.  Since events are
+            serialized to GDB core, and we can't report this one
+            right now, but GDB core and the other target layers will
+            want to be notified about the exit code/signal, leave the
+            status pending for the next time we're able to report
+            it.  */
+         mark_lwp_dead (child, wstat);
+         return child;
        }
+    }
 
-      current_inferior = saved_inferior;
-      return 1;
+  gdb_assert (WIFSTOPPED (wstat));
+
+  if (WIFSTOPPED (wstat))
+    {
+      struct process_info *proc;
+
+      /* Architecture-specific setup after inferior is running.  This
+        needs to happen after we have attached to the inferior and it
+        is stopped for the first time, but before we access any
+        inferior registers.  */
+      proc = find_process_pid (pid_of (thread));
+      if (proc->priv->new_inferior)
+       {
+         struct thread_info *saved_thread;
+
+         saved_thread = current_thread;
+         current_thread = thread;
+
+         the_low_target.arch_setup ();
+
+         current_thread = saved_thread;
+
+         proc->priv->new_inferior = 0;
+       }
     }
-  else
+
+  if (WIFSTOPPED (wstat) && child->must_set_ptrace_flags)
+    {
+      struct process_info *proc = find_process_pid (pid_of (thread));
+
+      linux_enable_event_reporting (lwpid, proc->attached);
+      child->must_set_ptrace_flags = 0;
+    }
+
+  /* Be careful to not overwrite stop_pc until
+     check_stopped_by_breakpoint is called.  */
+  if (WIFSTOPPED (wstat) && WSTOPSIG (wstat) == SIGTRAP
+      && linux_is_extended_waitstatus (wstat))
+    {
+      child->stop_pc = get_pc (child);
+      handle_extended_wait (child, wstat);
+      return NULL;
+    }
+
+  /* Check first whether this was a SW/HW breakpoint before checking
+     watchpoints, because at least s390 can't tell the data address of
+     hardware watchpoint hits, and returns stopped-by-watchpoint as
+     long as there's a watchpoint set.  */
+  if (WIFSTOPPED (wstat) && linux_wstatus_maybe_breakpoint (wstat))
+    {
+      if (check_stopped_by_breakpoint (child))
+       have_stop_pc = 1;
+    }
+
+  /* Note that TRAP_HWBKPT can indicate either a hardware breakpoint
+     or hardware watchpoint.  Check which is which if we got
+     TARGET_STOPPED_BY_HW_BREAKPOINT.  */
+  if (WIFSTOPPED (wstat) && WSTOPSIG (wstat) == SIGTRAP
+      && (child->stop_reason == TARGET_STOPPED_BY_NO_REASON
+         || child->stop_reason == TARGET_STOPPED_BY_HW_BREAKPOINT))
+    check_stopped_by_watchpoint (child);
+
+  if (!have_stop_pc)
+    child->stop_pc = get_pc (child);
+
+  if (WIFSTOPPED (wstat) && WSTOPSIG (wstat) == SIGSTOP
+      && child->stop_expected)
     {
       if (debug_threads)
-       fprintf (stderr,
-                "CB: No breakpoint found at %s for [%s]\n",
-                paddress (lwp->stop_pc),
-                target_pid_to_str (ptid_of (lwp)));
+       debug_printf ("Expected stop.\n");
+      child->stop_expected = 0;
+
+      if (thread->last_resume_kind == resume_stop)
+       {
+         /* We want to report the stop to the core.  Treat the
+            SIGSTOP as a normal event.  */
+       }
+      else if (stopping_threads != NOT_STOPPING_THREADS)
+       {
+         /* Stopping threads.  We don't want this SIGSTOP to end up
+            pending.  */
+         return NULL;
+       }
+      else
+       {
+         /* Filter out the event.  */
+         linux_resume_one_lwp (child, child->stepping, 0, NULL);
+         return NULL;
+       }
     }
 
-  current_inferior = saved_inferior;
-  return 0;
+  child->status_pending_p = 1;
+  child->status_pending = wstat;
+  return child;
 }
 
-/* When the event-loop is doing a step-over, this points at the thread
-   being stepped.  */
-ptid_t step_over_bkpt;
+/* Resume LWPs that are currently stopped without any pending status
+   to report, but are resumed from the core's perspective.  */
+
+static void
+resume_stopped_resumed_lwps (struct inferior_list_entry *entry)
+{
+  struct thread_info *thread = (struct thread_info *) entry;
+  struct lwp_info *lp = get_thread_lwp (thread);
+
+  if (lp->stopped
+      && !lp->status_pending_p
+      && thread->last_resume_kind != resume_stop
+      && thread->last_status.kind == TARGET_WAITKIND_IGNORE)
+    {
+      int step = thread->last_resume_kind == resume_step;
+
+      if (debug_threads)
+       debug_printf ("RSRL: resuming stopped-resumed LWP %s at %s: step=%d\n",
+                     target_pid_to_str (ptid_of (thread)),
+                     paddress (lp->stop_pc),
+                     step);
 
-/* Wait for an event from child PID.  If PID is -1, wait for any
-   child.  Store the stop status through the status pointer WSTAT.
-   OPTIONS is passed to the waitpid call.  Return 0 if no child stop
-   event was found and OPTIONS contains WNOHANG.  Return the PID of
-   the stopped child otherwise.  */
+      linux_resume_one_lwp (lp, step, GDB_SIGNAL_0, NULL);
+    }
+}
+
+/* Wait for an event from child(ren) WAIT_PTID, and return any that
+   match FILTER_PTID (leaving others pending).  The PTIDs can be:
+   minus_one_ptid, to specify any child; a pid PTID, specifying all
+   lwps of a thread group; or a PTID representing a single lwp.  Store
+   the stop status through the status pointer WSTAT.  OPTIONS is
+   passed to the waitpid call.  Return 0 if no event was found and
+   OPTIONS contains WNOHANG.  Return -1 if no unwaited-for children
+   was found.  Return the PID of the stopped child otherwise.  */
 
 static int
-linux_wait_for_event (ptid_t ptid, int *wstat, int options)
+linux_wait_for_event_filtered (ptid_t wait_ptid, ptid_t filter_ptid,
+                              int *wstatp, int options)
 {
+  struct thread_info *event_thread;
   struct lwp_info *event_child, *requested_child;
-  ptid_t wait_ptid;
+  sigset_t block_mask, prev_mask;
 
+ retry:
+  /* N.B. event_thread points to the thread_info struct that contains
+     event_child.  Keep them in sync.  */
+  event_thread = NULL;
   event_child = NULL;
   requested_child = NULL;
 
   /* Check for a lwp with a pending status.  */
 
-  if (ptid_equal (ptid, minus_one_ptid) || ptid_is_pid (ptid))
+  if (ptid_equal (filter_ptid, minus_one_ptid) || ptid_is_pid (filter_ptid))
     {
-      event_child = (struct lwp_info *)
-       find_inferior (&all_lwps, status_pending_p_callback, &ptid);
-      if (debug_threads && event_child)
-       fprintf (stderr, "Got a pending child %ld\n", lwpid_of (event_child));
+      event_thread = (struct thread_info *)
+       find_inferior (&all_threads, status_pending_p_callback, &filter_ptid);
+      if (event_thread != NULL)
+       event_child = get_thread_lwp (event_thread);
+      if (debug_threads && event_thread)
+       debug_printf ("Got a pending child %ld\n", lwpid_of (event_thread));
     }
-  else
+  else if (!ptid_equal (filter_ptid, null_ptid))
     {
-      requested_child = find_lwp_pid (ptid);
+      requested_child = find_lwp_pid (filter_ptid);
 
       if (stopping_threads == NOT_STOPPING_THREADS
          && requested_child->status_pending_p
@@ -1807,156 +2157,176 @@ linux_wait_for_event (ptid_t ptid, int *wstat, int options)
 
       if (requested_child->suspended
          && requested_child->status_pending_p)
-       fatal ("requesting an event out of a suspended child?");
+       {
+         internal_error (__FILE__, __LINE__,
+                         "requesting an event out of a"
+                         " suspended child?");
+       }
 
       if (requested_child->status_pending_p)
-       event_child = requested_child;
+       {
+         event_child = requested_child;
+         event_thread = get_lwp_thread (event_child);
+       }
     }
 
   if (event_child != NULL)
     {
       if (debug_threads)
-       fprintf (stderr, "Got an event from pending child %ld (%04x)\n",
-                lwpid_of (event_child), event_child->status_pending);
-      *wstat = event_child->status_pending;
+       debug_printf ("Got an event from pending child %ld (%04x)\n",
+                     lwpid_of (event_thread), event_child->status_pending);
+      *wstatp = event_child->status_pending;
       event_child->status_pending_p = 0;
       event_child->status_pending = 0;
-      current_inferior = get_lwp_thread (event_child);
-      return lwpid_of (event_child);
+      current_thread = event_thread;
+      return lwpid_of (event_thread);
     }
 
-  if (ptid_is_pid (ptid))
-    {
-      /* A request to wait for a specific tgid.  This is not possible
-        with waitpid, so instead, we wait for any child, and leave
-        children we're not interested in right now with a pending
-        status to report later.  */
-      wait_ptid = minus_one_ptid;
-    }
-  else
-    wait_ptid = ptid;
+  /* But if we don't find a pending event, we'll have to wait.
+
+     We only enter this loop if no process has a pending wait status.
+     Thus any action taken in response to a wait status inside this
+     loop is responding as soon as we detect the status, not after any
+     pending events.  */
 
-  /* We only enter this loop if no process has a pending wait status.  Thus
-     any action taken in response to a wait status inside this loop is
-     responding as soon as we detect the status, not after any pending
-     events.  */
-  while (1)
+  /* Make sure SIGCHLD is blocked until the sigsuspend below.  Block
+     all signals while here.  */
+  sigfillset (&block_mask);
+  sigprocmask (SIG_BLOCK, &block_mask, &prev_mask);
+
+  /* Always pull all events out of the kernel.  We'll randomly select
+     an event LWP out of all that have events, to prevent
+     starvation.  */
+  while (event_child == NULL)
     {
-      event_child = linux_wait_for_lwp (wait_ptid, wstat, options);
+      pid_t ret = 0;
 
-      if ((options & WNOHANG) && event_child == NULL)
-       {
-         if (debug_threads)
-           fprintf (stderr, "WNOHANG set, no event found\n");
-         return 0;
-       }
+      /* Always use -1 and WNOHANG, due to couple of a kernel/ptrace
+        quirks:
 
-      if (event_child == NULL)
-       error ("event from unknown child");
+        - If the thread group leader exits while other threads in the
+          thread group still exist, waitpid(TGID, ...) hangs.  That
+          waitpid won't return an exit status until the other threads
+          in the group are reaped.
 
-      if (ptid_is_pid (ptid)
-         && ptid_get_pid (ptid) != ptid_get_pid (ptid_of (event_child)))
-       {
-         if (! WIFSTOPPED (*wstat))
-           mark_lwp_dead (event_child, *wstat);
-         else
-           {
-             event_child->status_pending_p = 1;
-             event_child->status_pending = *wstat;
-           }
-         continue;
-       }
+        - When a non-leader thread execs, that thread just vanishes
+          without reporting an exit (so we'd hang if we waited for it
+          explicitly in that case).  The exec event is reported to
+          the TGID pid (although we don't currently enable exec
+          events).  */
+      errno = 0;
+      ret = my_waitpid (-1, wstatp, options | WNOHANG);
 
-      current_inferior = get_lwp_thread (event_child);
+      if (debug_threads)
+       debug_printf ("LWFE: waitpid(-1, ...) returned %d, %s\n",
+                     ret, errno ? strerror (errno) : "ERRNO-OK");
 
-      /* Check for thread exit.  */
-      if (! WIFSTOPPED (*wstat))
+      if (ret > 0)
        {
          if (debug_threads)
-           fprintf (stderr, "LWP %ld exiting\n", lwpid_of (event_child));
-
-         /* If the last thread is exiting, just return.  */
-         if (last_thread_of_process_p (current_inferior))
            {
-             if (debug_threads)
-               fprintf (stderr, "LWP %ld is last lwp of process\n",
-                        lwpid_of (event_child));
-             return lwpid_of (event_child);
+             debug_printf ("LLW: waitpid %ld received %s\n",
+                           (long) ret, status_to_str (*wstatp));
            }
 
-         if (!non_stop)
-           {
-             current_inferior = (struct thread_info *) all_threads.head;
-             if (debug_threads)
-               fprintf (stderr, "Current inferior is now %ld\n",
-                        lwpid_of (get_thread_lwp (current_inferior)));
-           }
-         else
-           {
-             current_inferior = NULL;
-             if (debug_threads)
-               fprintf (stderr, "Current inferior is now <NULL>\n");
-           }
-
-         /* If we were waiting for this particular child to do something...
-            well, it did something.  */
-         if (requested_child != NULL)
-           {
-             int lwpid = lwpid_of (event_child);
-
-             /* Cancel the step-over operation --- the thread that
-                started it is gone.  */
-             if (finish_step_over (event_child))
-               unstop_all_lwps (1, event_child);
-             delete_lwp (event_child);
-             return lwpid;
-           }
-
-         delete_lwp (event_child);
-
-         /* Wait for a more interesting event.  */
+         /* Filter all events.  IOW, leave all events pending.  We'll
+            randomly select an event LWP out of all that have events
+            below.  */
+         linux_low_filter_event (ret, *wstatp);
+         /* Retry until nothing comes out of waitpid.  A single
+            SIGCHLD can indicate more than one child stopped.  */
          continue;
        }
 
-      if (event_child->must_set_ptrace_flags)
+      /* Now that we've pulled all events out of the kernel, resume
+        LWPs that don't have an interesting event to report.  */
+      if (stopping_threads == NOT_STOPPING_THREADS)
+       for_each_inferior (&all_threads, resume_stopped_resumed_lwps);
+
+      /* ... and find an LWP with a status to report to the core, if
+        any.  */
+      event_thread = (struct thread_info *)
+       find_inferior (&all_threads, status_pending_p_callback, &filter_ptid);
+      if (event_thread != NULL)
        {
-         linux_enable_event_reporting (lwpid_of (event_child));
-         event_child->must_set_ptrace_flags = 0;
+         event_child = get_thread_lwp (event_thread);
+         *wstatp = event_child->status_pending;
+         event_child->status_pending_p = 0;
+         event_child->status_pending = 0;
+         break;
        }
 
-      if (WIFSTOPPED (*wstat) && WSTOPSIG (*wstat) == SIGTRAP
-         && *wstat >> 16 != 0)
+      /* Check for zombie thread group leaders.  Those can't be reaped
+        until all other threads in the thread group are.  */
+      check_zombie_leaders ();
+
+      /* If there are no resumed children left in the set of LWPs we
+        want to wait for, bail.  We can't just block in
+        waitpid/sigsuspend, because lwps might have been left stopped
+        in trace-stop state, and we'd be stuck forever waiting for
+        their status to change (which would only happen if we resumed
+        them).  Even if WNOHANG is set, this return code is preferred
+        over 0 (below), as it is more detailed.  */
+      if ((find_inferior (&all_threads,
+                         not_stopped_callback,
+                         &wait_ptid) == NULL))
        {
-         handle_extended_wait (event_child, *wstat);
-         continue;
+         if (debug_threads)
+           debug_printf ("LLW: exit (no unwaited-for LWP)\n");
+         sigprocmask (SIG_SETMASK, &prev_mask, NULL);
+         return -1;
        }
 
-      if (WIFSTOPPED (*wstat)
-         && WSTOPSIG (*wstat) == SIGSTOP
-         && event_child->stop_expected)
+      /* No interesting event to report to the caller.  */
+      if ((options & WNOHANG))
        {
-         int should_stop;
-
          if (debug_threads)
-           fprintf (stderr, "Expected stop.\n");
-         event_child->stop_expected = 0;
-
-         should_stop = (current_inferior->last_resume_kind == resume_stop
-                        || stopping_threads != NOT_STOPPING_THREADS);
+           debug_printf ("WNOHANG set, no event found\n");
 
-         if (!should_stop)
-           {
-             linux_resume_one_lwp (event_child,
-                                   event_child->stepping, 0, NULL);
-             continue;
-           }
+         sigprocmask (SIG_SETMASK, &prev_mask, NULL);
+         return 0;
        }
 
-      return lwpid_of (event_child);
+      /* Block until we get an event reported with SIGCHLD.  */
+      if (debug_threads)
+       debug_printf ("sigsuspend'ing\n");
+
+      sigsuspend (&prev_mask);
+      sigprocmask (SIG_SETMASK, &prev_mask, NULL);
+      goto retry;
     }
 
-  /* NOTREACHED */
-  return 0;
+  sigprocmask (SIG_SETMASK, &prev_mask, NULL);
+
+  current_thread = event_thread;
+
+  /* Check for thread exit.  */
+  if (! WIFSTOPPED (*wstatp))
+    {
+      gdb_assert (last_thread_of_process_p (pid_of (event_thread)));
+
+      if (debug_threads)
+       debug_printf ("LWP %d is the last lwp of process.  "
+                     "Process %ld exiting.\n",
+                     pid_of (event_thread), lwpid_of (event_thread));
+      return lwpid_of (event_thread);
+    }
+
+  return lwpid_of (event_thread);
+}
+
+/* Wait for an event from child(ren) PTID.  PTIDs can be:
+   minus_one_ptid, to specify any child; a pid PTID, specifying all
+   lwps of a thread group; or a PTID representing a single lwp.  Store
+   the stop status through the status pointer WSTAT.  OPTIONS is
+   passed to the waitpid call.  Return 0 if no event was found and
+   OPTIONS contains WNOHANG.  Return -1 if no unwaited-for children
+   was found.  Return the PID of the stopped child otherwise.  */
+
+static int
+linux_wait_for_event (ptid_t ptid, int *wstatp, int options)
+{
+  return linux_wait_for_event_filtered (ptid, ptid, wstatp, options);
 }
 
 /* Count the LWP's that have had events.  */
@@ -1964,20 +2334,15 @@ linux_wait_for_event (ptid_t ptid, int *wstat, int options)
 static int
 count_events_callback (struct inferior_list_entry *entry, void *data)
 {
-  struct lwp_info *lp = (struct lwp_info *) entry;
-  struct thread_info *thread = get_lwp_thread (lp);
+  struct thread_info *thread = (struct thread_info *) entry;
+  struct lwp_info *lp = get_thread_lwp (thread);
   int *count = data;
 
   gdb_assert (count != NULL);
 
-  /* Count only resumed LWPs that have a SIGTRAP event pending that
-     should be reported to GDB.  */
+  /* Count only resumed LWPs that have an event pending. */
   if (thread->last_status.kind == TARGET_WAITKIND_IGNORE
-      && thread->last_resume_kind != resume_stop
-      && lp->status_pending_p
-      && WIFSTOPPED (lp->status_pending)
-      && WSTOPSIG (lp->status_pending) == SIGTRAP
-      && !breakpoint_inserted_here (lp->stop_pc))
+      && lp->status_pending_p)
     (*count)++;
 
   return 0;
@@ -1988,8 +2353,8 @@ count_events_callback (struct inferior_list_entry *entry, void *data)
 static int
 select_singlestep_lwp_callback (struct inferior_list_entry *entry, void *data)
 {
-  struct lwp_info *lp = (struct lwp_info *) entry;
-  struct thread_info *thread = get_lwp_thread (lp);
+  struct thread_info *thread = (struct thread_info *) entry;
+  struct lwp_info *lp = get_thread_lwp (thread);
 
   if (thread->last_status.kind == TARGET_WAITKIND_IGNORE
       && thread->last_resume_kind == resume_step
@@ -1999,73 +2364,26 @@ select_singlestep_lwp_callback (struct inferior_list_entry *entry, void *data)
     return 0;
 }
 
-/* Select the Nth LWP that has had a SIGTRAP event that should be
-   reported to GDB.  */
+/* Select the Nth LWP that has had an event.  */
 
 static int
 select_event_lwp_callback (struct inferior_list_entry *entry, void *data)
 {
-  struct lwp_info *lp = (struct lwp_info *) entry;
-  struct thread_info *thread = get_lwp_thread (lp);
+  struct thread_info *thread = (struct thread_info *) entry;
+  struct lwp_info *lp = get_thread_lwp (thread);
   int *selector = data;
 
   gdb_assert (selector != NULL);
 
-  /* Select only resumed LWPs that have a SIGTRAP event pending. */
-  if (thread->last_resume_kind != resume_stop
-      && thread->last_status.kind == TARGET_WAITKIND_IGNORE
-      && lp->status_pending_p
-      && WIFSTOPPED (lp->status_pending)
-      && WSTOPSIG (lp->status_pending) == SIGTRAP
-      && !breakpoint_inserted_here (lp->stop_pc))
+  /* Select only resumed LWPs that have an event pending. */
+  if (thread->last_status.kind == TARGET_WAITKIND_IGNORE
+      && lp->status_pending_p)
     if ((*selector)-- == 0)
       return 1;
 
   return 0;
 }
 
-static int
-cancel_breakpoints_callback (struct inferior_list_entry *entry, void *data)
-{
-  struct lwp_info *lp = (struct lwp_info *) entry;
-  struct thread_info *thread = get_lwp_thread (lp);
-  struct lwp_info *event_lp = data;
-
-  /* Leave the LWP that has been elected to receive a SIGTRAP alone.  */
-  if (lp == event_lp)
-    return 0;
-
-  /* If a LWP other than the LWP that we're reporting an event for has
-     hit a GDB breakpoint (as opposed to some random trap signal),
-     then just arrange for it to hit it again later.  We don't keep
-     the SIGTRAP status and don't forward the SIGTRAP signal to the
-     LWP.  We will handle the current event, eventually we will resume
-     all LWPs, and this one will get its breakpoint trap again.
-
-     If we do not do this, then we run the risk that the user will
-     delete or disable the breakpoint, but the LWP will have already
-     tripped on it.  */
-
-  if (thread->last_resume_kind != resume_stop
-      && thread->last_status.kind == TARGET_WAITKIND_IGNORE
-      && lp->status_pending_p
-      && WIFSTOPPED (lp->status_pending)
-      && WSTOPSIG (lp->status_pending) == SIGTRAP
-      && !lp->stepping
-      && !lp->stopped_by_watchpoint
-      && cancel_breakpoint (lp))
-    /* Throw away the SIGTRAP.  */
-    lp->status_pending_p = 0;
-
-  return 0;
-}
-
-static void
-linux_cancel_breakpoints (void)
-{
-  find_inferior (&all_lwps, cancel_breakpoints_callback, NULL);
-}
-
 /* Select one LWP out of those that have events pending.  */
 
 static void
@@ -2073,43 +2391,57 @@ select_event_lwp (struct lwp_info **orig_lp)
 {
   int num_events = 0;
   int random_selector;
-  struct lwp_info *event_lp;
-
-  /* Give preference to any LWP that is being single-stepped.  */
-  event_lp
-    = (struct lwp_info *) find_inferior (&all_lwps,
-                                        select_singlestep_lwp_callback, NULL);
-  if (event_lp != NULL)
+  struct thread_info *event_thread = NULL;
+
+  /* In all-stop, give preference to the LWP that is being
+     single-stepped.  There will be at most one, and it's the LWP that
+     the core is most interested in.  If we didn't do this, then we'd
+     have to handle pending step SIGTRAPs somehow in case the core
+     later continues the previously-stepped thread, otherwise we'd
+     report the pending SIGTRAP, and the core, not having stepped the
+     thread, wouldn't understand what the trap was for, and therefore
+     would report it to the user as a random signal.  */
+  if (!non_stop)
     {
-      if (debug_threads)
-       fprintf (stderr,
-                "SEL: Select single-step %s\n",
-                target_pid_to_str (ptid_of (event_lp)));
+      event_thread
+       = (struct thread_info *) find_inferior (&all_threads,
+                                               select_singlestep_lwp_callback,
+                                               NULL);
+      if (event_thread != NULL)
+       {
+         if (debug_threads)
+           debug_printf ("SEL: Select single-step %s\n",
+                         target_pid_to_str (ptid_of (event_thread)));
+       }
     }
-  else
+  if (event_thread == NULL)
     {
       /* No single-stepping LWP.  Select one at random, out of those
-         which have had SIGTRAP events.  */
+         which have had events.  */
 
-      /* First see how many SIGTRAP events we have.  */
-      find_inferior (&all_lwps, count_events_callback, &num_events);
+      /* First see how many events we have.  */
+      find_inferior (&all_threads, count_events_callback, &num_events);
+      gdb_assert (num_events > 0);
 
-      /* Now randomly pick a LWP out of those that have had a SIGTRAP.  */
+      /* Now randomly pick a LWP out of those that have had
+        events.  */
       random_selector = (int)
        ((num_events * (double) rand ()) / (RAND_MAX + 1.0));
 
       if (debug_threads && num_events > 1)
-       fprintf (stderr,
-                "SEL: Found %d SIGTRAP events, selecting #%d\n",
-                num_events, random_selector);
+       debug_printf ("SEL: Found %d SIGTRAP events, selecting #%d\n",
+                     num_events, random_selector);
 
-      event_lp = (struct lwp_info *) find_inferior (&all_lwps,
-                                                   select_event_lwp_callback,
-                                                   &random_selector);
+      event_thread
+       = (struct thread_info *) find_inferior (&all_threads,
+                                               select_event_lwp_callback,
+                                               &random_selector);
     }
 
-  if (event_lp != NULL)
+  if (event_thread != NULL)
     {
+      struct lwp_info *event_lp = get_thread_lwp (event_thread);
+
       /* Switch the event LWP.  */
       *orig_lp = event_lp;
     }
@@ -2120,7 +2452,8 @@ select_event_lwp (struct lwp_info **orig_lp)
 static int
 unsuspend_one_lwp (struct inferior_list_entry *entry, void *except)
 {
-  struct lwp_info *lwp = (struct lwp_info *) entry;
+  struct thread_info *thread = (struct thread_info *) entry;
+  struct lwp_info *lwp = get_thread_lwp (thread);
 
   /* Ignore EXCEPT.  */
   if (lwp == except)
@@ -2138,7 +2471,7 @@ unsuspend_one_lwp (struct inferior_list_entry *entry, void *except)
 static void
 unsuspend_all_lwps (struct lwp_info *except)
 {
-  find_inferior (&all_lwps, unsuspend_one_lwp, except);
+  find_inferior (&all_threads, unsuspend_one_lwp, except);
 }
 
 static void move_out_of_jump_pad_callback (struct inferior_list_entry *entry);
@@ -2182,29 +2515,30 @@ static ptid_t linux_wait_1 (ptid_t ptid,
 static void
 linux_stabilize_threads (void)
 {
-  struct thread_info *save_inferior;
-  struct lwp_info *lwp_stuck;
+  struct thread_info *saved_thread;
+  struct thread_info *thread_stuck;
 
-  lwp_stuck
-    = (struct lwp_info *) find_inferior (&all_lwps,
-                                        stuck_in_jump_pad_callback, NULL);
-  if (lwp_stuck != NULL)
+  thread_stuck
+    = (struct thread_info *) find_inferior (&all_threads,
+                                           stuck_in_jump_pad_callback,
+                                           NULL);
+  if (thread_stuck != NULL)
     {
       if (debug_threads)
-       fprintf (stderr, "can't stabilize, LWP %ld is stuck in jump pad\n",
-                lwpid_of (lwp_stuck));
+       debug_printf ("can't stabilize, LWP %ld is stuck in jump pad\n",
+                     lwpid_of (thread_stuck));
       return;
     }
 
-  save_inferior = current_inferior;
+  saved_thread = current_thread;
 
   stabilizing_threads = 1;
 
   /* Kick 'em all.  */
-  for_each_inferior (&all_lwps, move_out_of_jump_pad_callback);
+  for_each_inferior (&all_threads, move_out_of_jump_pad_callback);
 
   /* Loop until all are stopped out of the jump pads.  */
-  while (find_inferior (&all_lwps, lwp_running, NULL) != NULL)
+  while (find_inferior (&all_threads, lwp_running, NULL) != NULL)
     {
       struct target_waitstatus ourstatus;
       struct lwp_info *lwp;
@@ -2217,13 +2551,13 @@ linux_stabilize_threads (void)
 
       if (ourstatus.kind == TARGET_WAITKIND_STOPPED)
        {
-         lwp = get_thread_lwp (current_inferior);
+         lwp = get_thread_lwp (current_thread);
 
          /* Lock it.  */
          lwp->suspended++;
 
          if (ourstatus.value.sig != GDB_SIGNAL_0
-             || current_inferior->last_resume_kind == resume_stop)
+             || current_thread->last_resume_kind == resume_stop)
            {
              wstat = W_STOPCODE (gdb_signal_to_host (ourstatus.value.sig));
              enqueue_one_deferred_signal (lwp, &wstat);
@@ -2231,23 +2565,41 @@ linux_stabilize_threads (void)
        }
     }
 
-  find_inferior (&all_lwps, unsuspend_one_lwp, NULL);
+  find_inferior (&all_threads, unsuspend_one_lwp, NULL);
 
   stabilizing_threads = 0;
 
-  current_inferior = save_inferior;
+  current_thread = saved_thread;
 
   if (debug_threads)
     {
-      lwp_stuck
-       = (struct lwp_info *) find_inferior (&all_lwps,
-                                        stuck_in_jump_pad_callback, NULL);
-      if (lwp_stuck != NULL)
-       fprintf (stderr, "couldn't stabilize, LWP %ld got stuck in jump pad\n",
-                lwpid_of (lwp_stuck));
+      thread_stuck
+       = (struct thread_info *) find_inferior (&all_threads,
+                                               stuck_in_jump_pad_callback,
+                                               NULL);
+      if (thread_stuck != NULL)
+       debug_printf ("couldn't stabilize, LWP %ld got stuck in jump pad\n",
+                     lwpid_of (thread_stuck));
     }
 }
 
+static void async_file_mark (void);
+
+/* Convenience function that is called when the kernel reports an
+   event that is not passed out to GDB.  */
+
+static ptid_t
+ignore_event (struct target_waitstatus *ourstatus)
+{
+  /* If we got an event, there may still be others, as a single
+     SIGCHLD can indicate more than one child stopped.  This forces
+     another target_wait call.  */
+  async_file_mark ();
+
+  ourstatus->kind = TARGET_WAITKIND_IGNORE;
+  return null_ptid;
+}
+
 /* Wait for process, returns status.  */
 
 static ptid_t
@@ -2265,105 +2617,125 @@ linux_wait_1 (ptid_t ptid,
   int trace_event;
   int in_step_range;
 
+  if (debug_threads)
+    {
+      debug_enter ();
+      debug_printf ("linux_wait_1: [%s]\n", target_pid_to_str (ptid));
+    }
+
   /* Translate generic target options into linux options.  */
   options = __WALL;
   if (target_options & TARGET_WNOHANG)
     options |= WNOHANG;
 
-retry:
   bp_explains_trap = 0;
   trace_event = 0;
   in_step_range = 0;
   ourstatus->kind = TARGET_WAITKIND_IGNORE;
 
-  /* If we were only supposed to resume one thread, only wait for
-     that thread - if it's still alive.  If it died, however - which
-     can happen if we're coming from the thread death case below -
-     then we need to make sure we restart the other threads.  We could
-     pick a thread at random or restart all; restarting all is less
-     arbitrary.  */
-  if (!non_stop
-      && !ptid_equal (cont_thread, null_ptid)
-      && !ptid_equal (cont_thread, minus_one_ptid))
-    {
-      struct thread_info *thread;
-
-      thread = (struct thread_info *) find_inferior_id (&all_threads,
-                                                       cont_thread);
-
-      /* No stepping, no signal - unless one is pending already, of course.  */
-      if (thread == NULL)
-       {
-         struct thread_resume resume_info;
-         resume_info.thread = minus_one_ptid;
-         resume_info.kind = resume_continue;
-         resume_info.sig = 0;
-         linux_resume (&resume_info, 1);
-       }
-      else
-       ptid = cont_thread;
-    }
-
   if (ptid_equal (step_over_bkpt, null_ptid))
     pid = linux_wait_for_event (ptid, &w, options);
   else
     {
       if (debug_threads)
-       fprintf (stderr, "step_over_bkpt set [%s], doing a blocking wait\n",
-                target_pid_to_str (step_over_bkpt));
+       debug_printf ("step_over_bkpt set [%s], doing a blocking wait\n",
+                     target_pid_to_str (step_over_bkpt));
       pid = linux_wait_for_event (step_over_bkpt, &w, options & ~WNOHANG);
     }
 
-  if (pid == 0) /* only if TARGET_WNOHANG */
-    return null_ptid;
+  if (pid == 0)
+    {
+      gdb_assert (target_options & TARGET_WNOHANG);
 
-  event_child = get_thread_lwp (current_inferior);
+      if (debug_threads)
+       {
+         debug_printf ("linux_wait_1 ret = null_ptid, "
+                       "TARGET_WAITKIND_IGNORE\n");
+         debug_exit ();
+       }
 
-  /* If we are waiting for a particular child, and it exited,
-     linux_wait_for_event will return its exit status.  Similarly if
-     the last child exited.  If this is not the last child, however,
-     do not report it as exited until there is a 'thread exited' response
-     available in the remote protocol.  Instead, just wait for another event.
-     This should be safe, because if the thread crashed we will already
-     have reported the termination signal to GDB; that should stop any
-     in-progress stepping operations, etc.
+      ourstatus->kind = TARGET_WAITKIND_IGNORE;
+      return null_ptid;
+    }
+  else if (pid == -1)
+    {
+      if (debug_threads)
+       {
+         debug_printf ("linux_wait_1 ret = null_ptid, "
+                       "TARGET_WAITKIND_NO_RESUMED\n");
+         debug_exit ();
+       }
 
-     Report the exit status of the last thread to exit.  This matches
-     LinuxThreads' behavior.  */
+      ourstatus->kind = TARGET_WAITKIND_NO_RESUMED;
+      return null_ptid;
+    }
 
-  if (last_thread_of_process_p (current_inferior))
+  event_child = get_thread_lwp (current_thread);
+
+  /* linux_wait_for_event only returns an exit status for the last
+     child of a process.  Report it.  */
+  if (WIFEXITED (w) || WIFSIGNALED (w))
     {
-      if (WIFEXITED (w) || WIFSIGNALED (w))
+      if (WIFEXITED (w))
        {
-         if (WIFEXITED (w))
-           {
-             ourstatus->kind = TARGET_WAITKIND_EXITED;
-             ourstatus->value.integer = WEXITSTATUS (w);
+         ourstatus->kind = TARGET_WAITKIND_EXITED;
+         ourstatus->value.integer = WEXITSTATUS (w);
 
-             if (debug_threads)
-               fprintf (stderr,
-                        "\nChild exited with retcode = %x \n",
-                        WEXITSTATUS (w));
-           }
-         else
+         if (debug_threads)
            {
-             ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
-             ourstatus->value.sig = gdb_signal_from_host (WTERMSIG (w));
-
-             if (debug_threads)
-               fprintf (stderr,
-                        "\nChild terminated with signal = %x \n",
-                        WTERMSIG (w));
-
+             debug_printf ("linux_wait_1 ret = %s, exited with "
+                           "retcode %d\n",
+                           target_pid_to_str (ptid_of (current_thread)),
+                           WEXITSTATUS (w));
+             debug_exit ();
            }
+       }
+      else
+       {
+         ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
+         ourstatus->value.sig = gdb_signal_from_host (WTERMSIG (w));
 
-         return ptid_of (event_child);
+         if (debug_threads)
+           {
+             debug_printf ("linux_wait_1 ret = %s, terminated with "
+                           "signal %d\n",
+                           target_pid_to_str (ptid_of (current_thread)),
+                           WTERMSIG (w));
+             debug_exit ();
+           }
        }
+
+      return ptid_of (current_thread);
     }
-  else
+
+  /* If step-over executes a breakpoint instruction, it means a
+     gdb/gdbserver breakpoint had been planted on top of a permanent
+     breakpoint.  The PC has been adjusted by
+     check_stopped_by_breakpoint to point at the breakpoint address.
+     Advance the PC manually past the breakpoint, otherwise the
+     program would keep trapping the permanent breakpoint forever.  */
+  if (!ptid_equal (step_over_bkpt, null_ptid)
+      && event_child->stop_reason == TARGET_STOPPED_BY_SW_BREAKPOINT)
     {
-      if (!WIFSTOPPED (w))
-       goto retry;
+      unsigned int increment_pc = the_low_target.breakpoint_len;
+
+      if (debug_threads)
+       {
+         debug_printf ("step-over for %s executed software breakpoint\n",
+                       target_pid_to_str (ptid_of (current_thread)));
+       }
+
+      if (increment_pc != 0)
+       {
+         struct regcache *regcache
+           = get_thread_regcache (current_thread, 1);
+
+         event_child->stop_pc += increment_pc;
+         (*the_low_target.set_pc) (regcache, event_child->stop_pc);
+
+         if (!(*the_low_target.breakpoint_at) (event_child->stop_pc))
+           event_child->stop_reason = TARGET_STOPPED_BY_NO_REASON;
+       }
     }
 
   /* If this event was not handled before, and is not a SIGTRAP, we
@@ -2409,7 +2781,7 @@ retry:
             already handled it.  So next time we resume (from this
             PC), we should step over it.  */
          if (debug_threads)
-           fprintf (stderr, "Hit a gdbserver breakpoint.\n");
+           debug_printf ("Hit a gdbserver breakpoint.\n");
 
          if (breakpoint_here (event_child->stop_pc))
            event_child->need_step_over = 1;
@@ -2435,35 +2807,33 @@ retry:
       && agent_loaded_p ())
     {
       if (debug_threads)
-       fprintf (stderr,
-                "Got signal %d for LWP %ld.  Check if we need "
-                "to defer or adjust it.\n",
-                WSTOPSIG (w), lwpid_of (event_child));
+       debug_printf ("Got signal %d for LWP %ld.  Check if we need "
+                     "to defer or adjust it.\n",
+                     WSTOPSIG (w), lwpid_of (current_thread));
 
       /* Allow debugging the jump pad itself.  */
-      if (current_inferior->last_resume_kind != resume_step
+      if (current_thread->last_resume_kind != resume_step
          && maybe_move_out_of_jump_pad (event_child, &w))
        {
          enqueue_one_deferred_signal (event_child, &w);
 
          if (debug_threads)
-           fprintf (stderr,
-                    "Signal %d for LWP %ld deferred (in jump pad)\n",
-                    WSTOPSIG (w), lwpid_of (event_child));
+           debug_printf ("Signal %d for LWP %ld deferred (in jump pad)\n",
+                         WSTOPSIG (w), lwpid_of (current_thread));
 
          linux_resume_one_lwp (event_child, 0, 0, NULL);
-         goto retry;
+
+         return ignore_event (ourstatus);
        }
     }
 
   if (event_child->collecting_fast_tracepoint)
     {
       if (debug_threads)
-       fprintf (stderr, "\
-LWP %ld was trying to move out of the jump pad (%d).  \
-Check if we're already there.\n",
-                lwpid_of (event_child),
-                event_child->collecting_fast_tracepoint);
+       debug_printf ("LWP %ld was trying to move out of the jump pad (%d). "
+                     "Check if we're already there.\n",
+                     lwpid_of (current_thread),
+                     event_child->collecting_fast_tracepoint);
 
       trace_event = 1;
 
@@ -2476,9 +2846,8 @@ Check if we're already there.\n",
          if (event_child->exit_jump_pad_bkpt != NULL)
            {
              if (debug_threads)
-               fprintf (stderr,
-                        "No longer need exit-jump-pad bkpt; removing it."
-                        "stopping all threads momentarily.\n");
+               debug_printf ("No longer need exit-jump-pad bkpt; removing it."
+                             "stopping all threads momentarily.\n");
 
              /* Other running threads could hit this breakpoint.
                 We don't handle moribund locations like GDB does,
@@ -2488,7 +2857,6 @@ Check if we're already there.\n",
                 care of while the breakpoint is still
                 inserted.  */
              stop_all_lwps (1, event_child);
-             cancel_breakpoints ();
 
              delete_breakpoint (event_child->exit_jump_pad_bkpt);
              event_child->exit_jump_pad_bkpt = NULL;
@@ -2502,26 +2870,34 @@ Check if we're already there.\n",
       if (event_child->collecting_fast_tracepoint == 0)
        {
          if (debug_threads)
-           fprintf (stderr,
-                    "fast tracepoint finished "
-                    "collecting successfully.\n");
+           debug_printf ("fast tracepoint finished "
+                         "collecting successfully.\n");
 
          /* We may have a deferred signal to report.  */
          if (dequeue_one_deferred_signal (event_child, &w))
            {
              if (debug_threads)
-               fprintf (stderr, "dequeued one signal.\n");
+               debug_printf ("dequeued one signal.\n");
            }
          else
            {
              if (debug_threads)
-               fprintf (stderr, "no deferred signals.\n");
+               debug_printf ("no deferred signals.\n");
 
              if (stabilizing_threads)
                {
                  ourstatus->kind = TARGET_WAITKIND_STOPPED;
                  ourstatus->value.sig = GDB_SIGNAL_0;
-                 return ptid_of (event_child);
+
+                 if (debug_threads)
+                   {
+                     debug_printf ("linux_wait_1 ret = %s, stopped "
+                                   "while stabilizing threads\n",
+                                   target_pid_to_str (ptid_of (current_thread)));
+                     debug_exit ();
+                   }
+
+                 return ptid_of (current_thread);
                }
            }
        }
@@ -2535,36 +2911,38 @@ Check if we're already there.\n",
      any that GDB specifically requested we ignore.  But never ignore
      SIGSTOP if we sent it ourselves, and do not ignore signals when
      stepping - they may require special handling to skip the signal
-     handler.  */
+     handler. Also never ignore signals that could be caused by a
+     breakpoint.  */
   /* FIXME drow/2002-06-09: Get signal numbers from the inferior's
      thread library?  */
   if (WIFSTOPPED (w)
-      && current_inferior->last_resume_kind != resume_step
+      && current_thread->last_resume_kind != resume_step
       && (
 #if defined (USE_THREAD_DB) && !defined (__ANDROID__)
-         (current_process ()->private->thread_db != NULL
+         (current_process ()->priv->thread_db != NULL
           && (WSTOPSIG (w) == __SIGRTMIN
               || WSTOPSIG (w) == __SIGRTMIN + 1))
          ||
 #endif
          (pass_signals[gdb_signal_from_host (WSTOPSIG (w))]
           && !(WSTOPSIG (w) == SIGSTOP
-               && current_inferior->last_resume_kind == resume_stop))))
+               && current_thread->last_resume_kind == resume_stop)
+          && !linux_wstatus_maybe_breakpoint (w))))
     {
       siginfo_t info, *info_p;
 
       if (debug_threads)
-       fprintf (stderr, "Ignored signal %d for LWP %ld.\n",
-                WSTOPSIG (w), lwpid_of (event_child));
+       debug_printf ("Ignored signal %d for LWP %ld.\n",
+                     WSTOPSIG (w), lwpid_of (current_thread));
 
-      if (ptrace (PTRACE_GETSIGINFO, lwpid_of (event_child),
+      if (ptrace (PTRACE_GETSIGINFO, lwpid_of (current_thread),
                  (PTRACE_TYPE_ARG3) 0, &info) == 0)
        info_p = &info;
       else
        info_p = NULL;
       linux_resume_one_lwp (event_child, event_child->stepping,
                            WSTOPSIG (w), info_p);
-      goto retry;
+      return ignore_event (ourstatus);
     }
 
   /* Note that all addresses are always "out of the step range" when
@@ -2581,9 +2959,9 @@ Check if we're already there.\n",
      reporting the event to GDB.  If we don't, we're out of luck, GDB
      won't see the breakpoint hit.  */
   report_to_gdb = (!maybe_internal_trap
-                  || (current_inferior->last_resume_kind == resume_step
+                  || (current_thread->last_resume_kind == resume_step
                       && !in_step_range)
-                  || event_child->stopped_by_watchpoint
+                  || event_child->stop_reason == TARGET_STOPPED_BY_WATCHPOINT
                   || (!step_over_finished && !in_step_range
                       && !bp_explains_trap && !trace_event)
                   || (gdb_breakpoint_here (event_child->stop_pc)
@@ -2600,16 +2978,16 @@ Check if we're already there.\n",
       if (debug_threads)
        {
          if (bp_explains_trap)
-           fprintf (stderr, "Hit a gdbserver breakpoint.\n");
+           debug_printf ("Hit a gdbserver breakpoint.\n");
          if (step_over_finished)
-           fprintf (stderr, "Step-over finished.\n");
+           debug_printf ("Step-over finished.\n");
          if (trace_event)
-           fprintf (stderr, "Tracepoint event.\n");
+           debug_printf ("Tracepoint event.\n");
          if (lwp_in_step_range (event_child))
-           fprintf (stderr, "Range stepping pc 0x%s [0x%s, 0x%s).\n",
-                    paddress (event_child->stop_pc),
-                    paddress (event_child->step_range_start),
-                    paddress (event_child->step_range_end));
+           debug_printf ("Range stepping pc 0x%s [0x%s, 0x%s).\n",
+                         paddress (event_child->stop_pc),
+                         paddress (event_child->step_range_start),
+                         paddress (event_child->step_range_end));
        }
 
       /* We're not reporting this breakpoint to GDB, so apply the
@@ -2619,7 +2997,7 @@ Check if we're already there.\n",
       if (the_low_target.set_pc != NULL)
        {
          struct regcache *regcache
-           = get_thread_regcache (get_lwp_thread (event_child), 1);
+           = get_thread_regcache (current_thread, 1);
          (*the_low_target.set_pc) (regcache, event_child->stop_pc);
        }
 
@@ -2629,38 +3007,39 @@ Check if we're already there.\n",
         going to keep waiting, so use proceed, which handles stepping
         over the next breakpoint.  */
       if (debug_threads)
-       fprintf (stderr, "proceeding all threads.\n");
+       debug_printf ("proceeding all threads.\n");
 
       if (step_over_finished)
        unsuspend_all_lwps (event_child);
 
       proceed_all_lwps ();
-      goto retry;
+      return ignore_event (ourstatus);
     }
 
   if (debug_threads)
     {
-      if (current_inferior->last_resume_kind == resume_step)
+      if (current_thread->last_resume_kind == resume_step)
        {
          if (event_child->step_range_start == event_child->step_range_end)
-           fprintf (stderr, "GDB wanted to single-step, reporting event.\n");
+           debug_printf ("GDB wanted to single-step, reporting event.\n");
          else if (!lwp_in_step_range (event_child))
-           fprintf (stderr, "Out of step range, reporting event.\n");
+           debug_printf ("Out of step range, reporting event.\n");
        }
-      if (event_child->stopped_by_watchpoint)
-       fprintf (stderr, "Stopped by watchpoint.\n");
-      if (gdb_breakpoint_here (event_child->stop_pc))
-       fprintf (stderr, "Stopped by GDB breakpoint.\n");
+      if (event_child->stop_reason == TARGET_STOPPED_BY_WATCHPOINT)
+       debug_printf ("Stopped by watchpoint.\n");
+      else if (gdb_breakpoint_here (event_child->stop_pc))
+       debug_printf ("Stopped by GDB breakpoint.\n");
       if (debug_threads)
-       fprintf (stderr, "Hit a non-gdbserver trap event.\n");
+       debug_printf ("Hit a non-gdbserver trap event.\n");
     }
 
   /* Alright, we're going to report a stop.  */
 
-  if (!non_stop && !stabilizing_threads)
+  if (!stabilizing_threads)
     {
       /* In all-stop, stop all threads.  */
-      stop_all_lwps (0, NULL);
+      if (!non_stop)
+       stop_all_lwps (0, NULL);
 
       /* If we're not waiting for a specific LWP, choose an event LWP
         from among those that have had events.  Giving equal priority
@@ -2673,27 +3052,40 @@ Check if we're already there.\n",
 
          select_event_lwp (&event_child);
 
+         /* current_thread and event_child must stay in sync.  */
+         current_thread = get_lwp_thread (event_child);
+
          event_child->status_pending_p = 0;
          w = event_child->status_pending;
        }
 
-      /* Now that we've selected our final event LWP, cancel any
-        breakpoints in other LWPs that have hit a GDB breakpoint.
-        See the comment in cancel_breakpoints_callback to find out
-        why.  */
-      find_inferior (&all_lwps, cancel_breakpoints_callback, event_child);
-
-      /* If we were going a step-over, all other threads but the stepping one
-        had been paused in start_step_over, with their suspend counts
-        incremented.  We don't want to do a full unstop/unpause, because we're
-        in all-stop mode (so we want threads stopped), but we still need to
-        unsuspend the other threads, to decrement their `suspended' count
-        back.  */
       if (step_over_finished)
-       unsuspend_all_lwps (event_child);
+       {
+         if (!non_stop)
+           {
+             /* If we were doing a step-over, all other threads but
+                the stepping one had been paused in start_step_over,
+                with their suspend counts incremented.  We don't want
+                to do a full unstop/unpause, because we're in
+                all-stop mode (so we want threads stopped), but we
+                still need to unsuspend the other threads, to
+                decrement their `suspended' count back.  */
+             unsuspend_all_lwps (event_child);
+           }
+         else
+           {
+             /* If we just finished a step-over, then all threads had
+                been momentarily paused.  In all-stop, that's fine,
+                we want threads stopped by now anyway.  In non-stop,
+                we need to re-resume threads that GDB wanted to be
+                running.  */
+             unstop_all_lwps (1, event_child);
+           }
+       }
 
       /* Stabilize threads (move out of jump pads).  */
-      stabilize_threads ();
+      if (!non_stop)
+       stabilize_threads ();
     }
   else
     {
@@ -2707,7 +3099,23 @@ Check if we're already there.\n",
 
   ourstatus->kind = TARGET_WAITKIND_STOPPED;
 
-  if (current_inferior->last_resume_kind == resume_stop
+  /* Now that we've selected our final event LWP, un-adjust its PC if
+     it was a software breakpoint, and the client doesn't know we can
+     adjust the breakpoint ourselves.  */
+  if (event_child->stop_reason == TARGET_STOPPED_BY_SW_BREAKPOINT
+      && !swbreak_feature)
+    {
+      int decr_pc = the_low_target.decr_pc_after_break;
+
+      if (decr_pc != 0)
+       {
+         struct regcache *regcache
+           = get_thread_regcache (current_thread, 1);
+         (*the_low_target.set_pc) (regcache, event_child->stop_pc + decr_pc);
+       }
+    }
+
+  if (current_thread->last_resume_kind == resume_stop
       && WSTOPSIG (w) == SIGSTOP)
     {
       /* A thread that has been requested to stop by GDB with vCont;t,
@@ -2715,7 +3123,7 @@ Check if we're already there.\n",
         SIGSTOP is an implementation detail.  */
       ourstatus->value.sig = GDB_SIGNAL_0;
     }
-  else if (current_inferior->last_resume_kind == resume_stop
+  else if (current_thread->last_resume_kind == resume_stop
           && WSTOPSIG (w) != SIGSTOP)
     {
       /* A thread that has been requested to stop by GDB with vCont;t,
@@ -2730,12 +3138,14 @@ Check if we're already there.\n",
   gdb_assert (ptid_equal (step_over_bkpt, null_ptid));
 
   if (debug_threads)
-    fprintf (stderr, "linux_wait ret = %s, %d, %d\n",
-            target_pid_to_str (ptid_of (event_child)),
-            ourstatus->kind,
-            ourstatus->value.sig);
+    {
+      debug_printf ("linux_wait_1 ret = %s, %d, %d\n",
+                   target_pid_to_str (ptid_of (current_thread)),
+                   ourstatus->kind, ourstatus->value.sig);
+      debug_exit ();
+    }
 
-  return ptid_of (event_child);
+  return ptid_of (current_thread);
 }
 
 /* Get rid of any pending event in the pipe.  */
@@ -2772,14 +3182,17 @@ linux_wait (ptid_t ptid,
 {
   ptid_t event_ptid;
 
-  if (debug_threads)
-    fprintf (stderr, "linux_wait: [%s]\n", target_pid_to_str (ptid));
-
   /* Flush the async file first.  */
   if (target_is_async_p ())
     async_file_flush ();
 
-  event_ptid = linux_wait_1 (ptid, ourstatus, target_options);
+  do
+    {
+      event_ptid = linux_wait_1 (ptid, ourstatus, target_options);
+    }
+  while ((target_options & TARGET_WNOHANG) == 0
+        && ptid_equal (event_ptid, null_ptid)
+        && ourstatus->kind == TARGET_WAITKIND_IGNORE);
 
   /* If at least one stop was reported, there may be more.  A single
      SIGCHLD can signal more than one child stop.  */
@@ -2830,20 +3243,20 @@ send_sigstop (struct lwp_info *lwp)
 {
   int pid;
 
-  pid = lwpid_of (lwp);
+  pid = lwpid_of (get_lwp_thread (lwp));
 
   /* If we already have a pending stop signal for this process, don't
      send another.  */
   if (lwp->stop_expected)
     {
       if (debug_threads)
-       fprintf (stderr, "Have pending sigstop for lwp %d\n", pid);
+       debug_printf ("Have pending sigstop for lwp %d\n", pid);
 
       return;
     }
 
   if (debug_threads)
-    fprintf (stderr, "Sending sigstop to lwp %d\n", pid);
+    debug_printf ("Sending sigstop to lwp %d\n", pid);
 
   lwp->stop_expected = 1;
   kill_lwp (pid, SIGSTOP);
@@ -2852,7 +3265,8 @@ send_sigstop (struct lwp_info *lwp)
 static int
 send_sigstop_callback (struct inferior_list_entry *entry, void *except)
 {
-  struct lwp_info *lwp = (struct lwp_info *) entry;
+  struct thread_info *thread = (struct thread_info *) entry;
+  struct lwp_info *lwp = get_thread_lwp (thread);
 
   /* Ignore EXCEPT.  */
   if (lwp == except)
@@ -2871,7 +3285,8 @@ static int
 suspend_and_send_sigstop_callback (struct inferior_list_entry *entry,
                                   void *except)
 {
-  struct lwp_info *lwp = (struct lwp_info *) entry;
+  struct thread_info *thread = (struct thread_info *) entry;
+  struct lwp_info *lwp = get_thread_lwp (thread);
 
   /* Ignore EXCEPT.  */
   if (lwp == except)
@@ -2899,93 +3314,50 @@ mark_lwp_dead (struct lwp_info *lwp, int wstat)
   lwp->stop_expected = 0;
 }
 
+/* Wait for all children to stop for the SIGSTOPs we just queued.  */
+
 static void
-wait_for_sigstop (struct inferior_list_entry *entry)
+wait_for_sigstop (void)
 {
-  struct lwp_info *lwp = (struct lwp_info *) entry;
-  struct thread_info *saved_inferior;
-  int wstat;
+  struct thread_info *saved_thread;
   ptid_t saved_tid;
-  ptid_t ptid;
-  int pid;
-
-  if (lwp->stopped)
-    {
-      if (debug_threads)
-       fprintf (stderr, "wait_for_sigstop: LWP %ld already stopped\n",
-                lwpid_of (lwp));
-      return;
-    }
+  int wstat;
+  int ret;
 
-  saved_inferior = current_inferior;
-  if (saved_inferior != NULL)
-    saved_tid = ((struct inferior_list_entry *) saved_inferior)->id;
+  saved_thread = current_thread;
+  if (saved_thread != NULL)
+    saved_tid = saved_thread->entry.id;
   else
     saved_tid = null_ptid; /* avoid bogus unused warning */
 
-  ptid = lwp->head.id;
-
   if (debug_threads)
-    fprintf (stderr, "wait_for_sigstop: pulling one event\n");
-
-  pid = linux_wait_for_event (ptid, &wstat, __WALL);
-
-  /* If we stopped with a non-SIGSTOP signal, save it for later
-     and record the pending SIGSTOP.  If the process exited, just
-     return.  */
-  if (WIFSTOPPED (wstat))
-    {
-      if (debug_threads)
-       fprintf (stderr, "LWP %ld stopped with signal %d\n",
-                lwpid_of (lwp), WSTOPSIG (wstat));
-
-      if (WSTOPSIG (wstat) != SIGSTOP)
-       {
-         if (debug_threads)
-           fprintf (stderr, "LWP %ld stopped with non-sigstop status %06x\n",
-                    lwpid_of (lwp), wstat);
-
-         lwp->status_pending_p = 1;
-         lwp->status_pending = wstat;
-       }
-    }
-  else
-    {
-      if (debug_threads)
-       fprintf (stderr, "Process %d exited while stopping LWPs\n", pid);
+    debug_printf ("wait_for_sigstop: pulling events\n");
 
-      lwp = find_lwp_pid (pid_to_ptid (pid));
-      if (lwp)
-       {
-         /* Leave this status pending for the next time we're able to
-            report it.  In the mean time, we'll report this lwp as
-            dead to GDB, so GDB doesn't try to read registers and
-            memory from it.  This can only happen if this was the
-            last thread of the process; otherwise, PID is removed
-            from the thread tables before linux_wait_for_event
-            returns.  */
-         mark_lwp_dead (lwp, wstat);
-       }
-    }
+  /* Passing NULL_PTID as filter indicates we want all events to be
+     left pending.  Eventually this returns when there are no
+     unwaited-for children left.  */
+  ret = linux_wait_for_event_filtered (minus_one_ptid, null_ptid,
+                                      &wstat, __WALL);
+  gdb_assert (ret == -1);
 
-  if (saved_inferior == NULL || linux_thread_alive (saved_tid))
-    current_inferior = saved_inferior;
+  if (saved_thread == NULL || linux_thread_alive (saved_tid))
+    current_thread = saved_thread;
   else
     {
       if (debug_threads)
-       fprintf (stderr, "Previously current thread died.\n");
+       debug_printf ("Previously current thread died.\n");
 
       if (non_stop)
        {
          /* We can't change the current inferior behind GDB's back,
             otherwise, a subsequent command may apply to the wrong
             process.  */
-         current_inferior = NULL;
+         current_thread = NULL;
        }
       else
        {
          /* Set a valid thread as current.  */
-         set_desired_inferior (0);
+         set_desired_thread (0);
        }
     }
 }
@@ -2998,8 +3370,8 @@ wait_for_sigstop (struct inferior_list_entry *entry)
 static int
 stuck_in_jump_pad_callback (struct inferior_list_entry *entry, void *data)
 {
-  struct lwp_info *lwp = (struct lwp_info *) entry;
-  struct thread_info *thread = get_lwp_thread (lwp);
+  struct thread_info *thread = (struct thread_info *) entry;
+  struct lwp_info *lwp = get_thread_lwp (thread);
 
   gdb_assert (lwp->suspended == 0);
   gdb_assert (lwp->stopped);
@@ -3008,7 +3380,7 @@ stuck_in_jump_pad_callback (struct inferior_list_entry *entry, void *data)
   return (supports_fast_tracepoints ()
          && agent_loaded_p ()
          && (gdb_breakpoint_here (lwp->stop_pc)
-             || lwp->stopped_by_watchpoint
+             || lwp->stop_reason == TARGET_STOPPED_BY_WATCHPOINT
              || thread->last_resume_kind == resume_step)
          && linux_fast_tracepoint_collecting (lwp, NULL));
 }
@@ -3016,8 +3388,8 @@ stuck_in_jump_pad_callback (struct inferior_list_entry *entry, void *data)
 static void
 move_out_of_jump_pad_callback (struct inferior_list_entry *entry)
 {
-  struct lwp_info *lwp = (struct lwp_info *) entry;
-  struct thread_info *thread = get_lwp_thread (lwp);
+  struct thread_info *thread = (struct thread_info *) entry;
+  struct lwp_info *lwp = get_thread_lwp (thread);
   int *wstat;
 
   gdb_assert (lwp->suspended == 0);
@@ -3027,14 +3399,13 @@ move_out_of_jump_pad_callback (struct inferior_list_entry *entry)
 
   /* Allow debugging the jump pad, gdb_collect, etc.  */
   if (!gdb_breakpoint_here (lwp->stop_pc)
-      && !lwp->stopped_by_watchpoint
+      && lwp->stop_reason != TARGET_STOPPED_BY_WATCHPOINT
       && thread->last_resume_kind != resume_step
       && maybe_move_out_of_jump_pad (lwp, wstat))
     {
       if (debug_threads)
-       fprintf (stderr,
-                "LWP %ld needs stabilizing (in jump pad)\n",
-                lwpid_of (lwp));
+       debug_printf ("LWP %ld needs stabilizing (in jump pad)\n",
+                     lwpid_of (thread));
 
       if (wstat)
        {
@@ -3042,10 +3413,9 @@ move_out_of_jump_pad_callback (struct inferior_list_entry *entry)
          enqueue_one_deferred_signal (lwp, wstat);
 
          if (debug_threads)
-           fprintf (stderr,
-                    "Signal %d for LWP %ld deferred "
-                    "(in jump pad)\n",
-                    WSTOPSIG (*wstat), lwpid_of (lwp));
+           debug_printf ("Signal %d for LWP %ld deferred "
+                         "(in jump pad)\n",
+                         WSTOPSIG (*wstat), lwpid_of (thread));
        }
 
       linux_resume_one_lwp (lwp, 0, 0, NULL);
@@ -3057,7 +3427,8 @@ move_out_of_jump_pad_callback (struct inferior_list_entry *entry)
 static int
 lwp_running (struct inferior_list_entry *entry, void *data)
 {
-  struct lwp_info *lwp = (struct lwp_info *) entry;
+  struct thread_info *thread = (struct thread_info *) entry;
+  struct lwp_info *lwp = get_thread_lwp (thread);
 
   if (lwp->dead)
     return 0;
@@ -3076,27 +3447,44 @@ stop_all_lwps (int suspend, struct lwp_info *except)
   /* Should not be called recursively.  */
   gdb_assert (stopping_threads == NOT_STOPPING_THREADS);
 
+  if (debug_threads)
+    {
+      debug_enter ();
+      debug_printf ("stop_all_lwps (%s, except=%s)\n",
+                   suspend ? "stop-and-suspend" : "stop",
+                   except != NULL
+                   ? target_pid_to_str (ptid_of (get_lwp_thread (except)))
+                   : "none");
+    }
+
   stopping_threads = (suspend
                      ? STOPPING_AND_SUSPENDING_THREADS
                      : STOPPING_THREADS);
 
   if (suspend)
-    find_inferior (&all_lwps, suspend_and_send_sigstop_callback, except);
+    find_inferior (&all_threads, suspend_and_send_sigstop_callback, except);
   else
-    find_inferior (&all_lwps, send_sigstop_callback, except);
-  for_each_inferior (&all_lwps, wait_for_sigstop);
+    find_inferior (&all_threads, send_sigstop_callback, except);
+  wait_for_sigstop ();
   stopping_threads = NOT_STOPPING_THREADS;
+
+  if (debug_threads)
+    {
+      debug_printf ("stop_all_lwps done, setting stopping_threads "
+                   "back to !stopping\n");
+      debug_exit ();
+    }
 }
 
-/* Resume execution of the inferior process.
-   If STEP is nonzero, single-step it.
-   If SIGNAL is nonzero, give it that signal.  */
+/* Resume execution of LWP.  If STEP is nonzero, single-step it.  If
+   SIGNAL is nonzero, give it that signal.  */
 
 static void
-linux_resume_one_lwp (struct lwp_info *lwp,
-                     int step, int signal, siginfo_t *info)
+linux_resume_one_lwp_throw (struct lwp_info *lwp,
+                           int step, int signal, siginfo_t *info)
 {
-  struct thread_info *saved_inferior;
+  struct thread_info *thread = get_lwp_thread (lwp);
+  struct thread_info *saved_thread;
   int fast_tp_collecting;
 
   if (lwp->stopped == 0)
@@ -3112,7 +3500,7 @@ linux_resume_one_lwp (struct lwp_info *lwp,
     {
       /* Collecting 'while-stepping' actions doesn't make sense
         anymore.  */
-      release_while_stepping_state_list (get_lwp_thread (lwp));
+      release_while_stepping_state_list (thread);
     }
 
   /* If we have pending signals or status, and a new signal, enqueue the
@@ -3138,20 +3526,20 @@ linux_resume_one_lwp (struct lwp_info *lwp,
   if (lwp->status_pending_p)
     {
       if (debug_threads)
-       fprintf (stderr, "Not resuming lwp %ld (%s, signal %d, stop %s);"
-                " has pending status\n",
-                lwpid_of (lwp), step ? "step" : "continue", signal,
-                lwp->stop_expected ? "expected" : "not expected");
+       debug_printf ("Not resuming lwp %ld (%s, signal %d, stop %s);"
+                     " has pending status\n",
+                     lwpid_of (thread), step ? "step" : "continue", signal,
+                     lwp->stop_expected ? "expected" : "not expected");
       return;
     }
 
-  saved_inferior = current_inferior;
-  current_inferior = get_lwp_thread (lwp);
+  saved_thread = current_thread;
+  current_thread = thread;
 
   if (debug_threads)
-    fprintf (stderr, "Resuming lwp %ld (%s, signal %d, stop %s)\n",
-            lwpid_of (lwp), step ? "step" : "continue", signal,
-            lwp->stop_expected ? "expected" : "not expected");
+    debug_printf ("Resuming lwp %ld (%s, signal %d, stop %s)\n",
+                 lwpid_of (thread), step ? "step" : "continue", signal,
+                 lwp->stop_expected ? "expected" : "not expected");
 
   /* This bit needs some thinking about.  If we get a signal that
      we must report while a single-step reinsert is still pending,
@@ -3166,8 +3554,8 @@ linux_resume_one_lwp (struct lwp_info *lwp,
   if (lwp->bp_reinsert != 0)
     {
       if (debug_threads)
-       fprintf (stderr, "  pending reinsert at 0x%s\n",
-                paddress (lwp->bp_reinsert));
+       debug_printf ("  pending reinsert at 0x%s\n",
+                     paddress (lwp->bp_reinsert));
 
       if (can_hardware_single_step ())
        {
@@ -3190,9 +3578,9 @@ linux_resume_one_lwp (struct lwp_info *lwp,
   if (fast_tp_collecting == 1)
     {
       if (debug_threads)
-       fprintf (stderr, "\
-lwp %ld wants to get out of fast tracepoint jump pad (exit-jump-pad-bkpt)\n",
-                lwpid_of (lwp));
+       debug_printf ("lwp %ld wants to get out of fast tracepoint jump pad"
+                     " (exit-jump-pad-bkpt)\n",
+                     lwpid_of (thread));
 
       /* Postpone any pending signal.  It was enqueued above.  */
       signal = 0;
@@ -3200,15 +3588,18 @@ lwp %ld wants to get out of fast tracepoint jump pad (exit-jump-pad-bkpt)\n",
   else if (fast_tp_collecting == 2)
     {
       if (debug_threads)
-       fprintf (stderr, "\
-lwp %ld wants to get out of fast tracepoint jump pad single-stepping\n",
-                lwpid_of (lwp));
+       debug_printf ("lwp %ld wants to get out of fast tracepoint jump pad"
+                     " single-stepping\n",
+                     lwpid_of (thread));
 
       if (can_hardware_single_step ())
        step = 1;
       else
-       fatal ("moving out of jump pad single-stepping"
-              " not implemented on this target");
+       {
+         internal_error (__FILE__, __LINE__,
+                         "moving out of jump pad single-stepping"
+                         " not implemented on this target");
+       }
 
       /* Postpone any pending signal.  It was enqueued above.  */
       signal = 0;
@@ -3222,21 +3613,26 @@ lwp %ld wants to get out of fast tracepoint jump pad single-stepping\n",
      address, continue, and carry on catching this while-stepping
      action only when that breakpoint is hit.  A future
      enhancement.  */
-  if (get_lwp_thread (lwp)->while_stepping != NULL
+  if (thread->while_stepping != NULL
       && can_hardware_single_step ())
     {
       if (debug_threads)
-       fprintf (stderr,
-                "lwp %ld has a while-stepping action -> forcing step.\n",
-                lwpid_of (lwp));
+       debug_printf ("lwp %ld has a while-stepping action -> forcing step.\n",
+                     lwpid_of (thread));
       step = 1;
     }
 
-  if (debug_threads && the_low_target.get_pc != NULL)
+  if (the_low_target.get_pc != NULL)
     {
-      struct regcache *regcache = get_thread_regcache (current_inferior, 1);
-      CORE_ADDR pc = (*the_low_target.get_pc) (regcache);
-      fprintf (stderr, "  resuming from pc 0x%lx\n", (long) pc);
+      struct regcache *regcache = get_thread_regcache (current_thread, 1);
+
+      lwp->stop_pc = (*the_low_target.get_pc) (regcache);
+
+      if (debug_threads)
+       {
+         debug_printf ("  %s from pc 0x%lx\n", step ? "step" : "continue",
+                       (long) lwp->stop_pc);
+       }
     }
 
   /* If we have pending signals, consume one unless we are trying to
@@ -3254,7 +3650,7 @@ lwp %ld wants to get out of fast tracepoint jump pad single-stepping\n",
 
       signal = (*p_sig)->signal;
       if ((*p_sig)->info.si_signo != 0)
-       ptrace (PTRACE_SETSIGINFO, lwpid_of (lwp), (PTRACE_TYPE_ARG3) 0,
+       ptrace (PTRACE_SETSIGINFO, lwpid_of (thread), (PTRACE_TYPE_ARG3) 0,
                &(*p_sig)->info);
 
       free (*p_sig);
@@ -3264,32 +3660,79 @@ lwp %ld wants to get out of fast tracepoint jump pad single-stepping\n",
   if (the_low_target.prepare_to_resume != NULL)
     the_low_target.prepare_to_resume (lwp);
 
-  regcache_invalidate_thread (get_lwp_thread (lwp));
+  regcache_invalidate_thread (thread);
   errno = 0;
-  lwp->stopped = 0;
-  lwp->stopped_by_watchpoint = 0;
   lwp->stepping = step;
-  ptrace (step ? PTRACE_SINGLESTEP : PTRACE_CONT, lwpid_of (lwp),
+  ptrace (step ? PTRACE_SINGLESTEP : PTRACE_CONT, lwpid_of (thread),
          (PTRACE_TYPE_ARG3) 0,
          /* Coerce to a uintptr_t first to avoid potential gcc warning
             of coercing an 8 byte integer to a 4 byte pointer.  */
          (PTRACE_TYPE_ARG4) (uintptr_t) signal);
 
-  current_inferior = saved_inferior;
+  current_thread = saved_thread;
   if (errno)
+    perror_with_name ("resuming thread");
+
+  /* Successfully resumed.  Clear state that no longer makes sense,
+     and mark the LWP as running.  Must not do this before resuming
+     otherwise if that fails other code will be confused.  E.g., we'd
+     later try to stop the LWP and hang forever waiting for a stop
+     status.  Note that we must not throw after this is cleared,
+     otherwise handle_zombie_lwp_error would get confused.  */
+  lwp->stopped = 0;
+  lwp->stop_reason = TARGET_STOPPED_BY_NO_REASON;
+}
+
+/* Called when we try to resume a stopped LWP and that errors out.  If
+   the LWP is no longer in ptrace-stopped state (meaning it's zombie,
+   or about to become), discard the error, clear any pending status
+   the LWP may have, and return true (we'll collect the exit status
+   soon enough).  Otherwise, return false.  */
+
+static int
+check_ptrace_stopped_lwp_gone (struct lwp_info *lp)
+{
+  struct thread_info *thread = get_lwp_thread (lp);
+
+  /* If we get an error after resuming the LWP successfully, we'd
+     confuse !T state for the LWP being gone.  */
+  gdb_assert (lp->stopped);
+
+  /* We can't just check whether the LWP is in 'Z (Zombie)' state,
+     because even if ptrace failed with ESRCH, the tracee may be "not
+     yet fully dead", but already refusing ptrace requests.  In that
+     case the tracee has 'R (Running)' state for a little bit
+     (observed in Linux 3.18).  See also the note on ESRCH in the
+     ptrace(2) man page.  Instead, check whether the LWP has any state
+     other than ptrace-stopped.  */
+
+  /* Don't assume anything if /proc/PID/status can't be read.  */
+  if (linux_proc_pid_is_trace_stopped_nowarn (lwpid_of (thread)) == 0)
     {
-      /* ESRCH from ptrace either means that the thread was already
-        running (an error) or that it is gone (a race condition).  If
-        it's gone, we will get a notification the next time we wait,
-        so we can ignore the error.  We could differentiate these
-        two, but it's tricky without waiting; the thread still exists
-        as a zombie, so sending it signal 0 would succeed.  So just
-        ignore ESRCH.  */
-      if (errno == ESRCH)
-       return;
+      lp->stop_reason = TARGET_STOPPED_BY_NO_REASON;
+      lp->status_pending_p = 0;
+      return 1;
+    }
+  return 0;
+}
 
-      perror_with_name ("ptrace");
+/* Like linux_resume_one_lwp_throw, but no error is thrown if the LWP
+   disappears while we try to resume it.  */
+
+static void
+linux_resume_one_lwp (struct lwp_info *lwp,
+                     int step, int signal, siginfo_t *info)
+{
+  TRY
+    {
+      linux_resume_one_lwp_throw (lwp, step, signal, info);
+    }
+  CATCH (ex, RETURN_MASK_ERROR)
+    {
+      if (!check_ptrace_stopped_lwp_gone (lwp))
+       throw_exception (ex);
     }
+  END_CATCH
 }
 
 struct thread_resume_array
@@ -3310,13 +3753,11 @@ struct thread_resume_array
 static int
 linux_set_resume_request (struct inferior_list_entry *entry, void *arg)
 {
-  struct lwp_info *lwp;
-  struct thread_info *thread;
+  struct thread_info *thread = (struct thread_info *) entry;
+  struct lwp_info *lwp = get_thread_lwp (thread);
   int ndx;
   struct thread_resume_array *r;
 
-  thread = (struct thread_info *) entry;
-  lwp = get_thread_lwp (thread);
   r = arg;
 
   for (ndx = 0; ndx < r->n; ndx++)
@@ -3326,7 +3767,7 @@ linux_set_resume_request (struct inferior_list_entry *entry, void *arg)
          || ptid_equal (ptid, entry->id)
          /* Handle both 'pPID' and 'pPID.-1' as meaning 'all threads
             of PID'.  */
-         || (ptid_get_pid (ptid) == pid_of (lwp)
+         || (ptid_get_pid (ptid) == pid_of (thread)
              && (ptid_is_pid (ptid)
                  || ptid_get_lwp (ptid) == -1)))
        {
@@ -3334,11 +3775,12 @@ linux_set_resume_request (struct inferior_list_entry *entry, void *arg)
              && thread->last_resume_kind == resume_stop)
            {
              if (debug_threads)
-               fprintf (stderr, "already %s LWP %ld at GDB's request\n",
-                        thread->last_status.kind == TARGET_WAITKIND_STOPPED
-                        ? "stopped"
-                        : "stopping",
-                        lwpid_of (lwp));
+               debug_printf ("already %s LWP %ld at GDB's request\n",
+                             (thread->last_status.kind
+                              == TARGET_WAITKIND_STOPPED)
+                             ? "stopped"
+                             : "stopping",
+                             lwpid_of (thread));
 
              continue;
            }
@@ -3359,10 +3801,10 @@ linux_set_resume_request (struct inferior_list_entry *entry, void *arg)
              lwp->status_pending_p = 1;
 
              if (debug_threads)
-               fprintf (stderr,
-                        "Dequeueing deferred signal %d for LWP %ld, "
-                        "leaving status pending.\n",
-                        WSTOPSIG (lwp->status_pending), lwpid_of (lwp));
+               debug_printf ("Dequeueing deferred signal %d for LWP %ld, "
+                             "leaving status pending.\n",
+                             WSTOPSIG (lwp->status_pending),
+                             lwpid_of (thread));
            }
 
          return 0;
@@ -3381,14 +3823,15 @@ linux_set_resume_request (struct inferior_list_entry *entry, void *arg)
 static int
 resume_status_pending_p (struct inferior_list_entry *entry, void *flag_p)
 {
-  struct lwp_info *lwp = (struct lwp_info *) entry;
+  struct thread_info *thread = (struct thread_info *) entry;
+  struct lwp_info *lwp = get_thread_lwp (thread);
 
   /* LWPs which will not be resumed are not interesting, because
      we might not wait for them next time through linux_wait.  */
   if (lwp->resume == NULL)
     return 0;
 
-  if (lwp->status_pending_p)
+  if (thread_still_has_status_pending_p (thread))
     * (int *) flag_p = 1;
 
   return 0;
@@ -3402,9 +3845,9 @@ resume_status_pending_p (struct inferior_list_entry *entry, void *flag_p)
 static int
 need_step_over_p (struct inferior_list_entry *entry, void *dummy)
 {
-  struct lwp_info *lwp = (struct lwp_info *) entry;
-  struct thread_info *thread;
-  struct thread_info *saved_inferior;
+  struct thread_info *thread = (struct thread_info *) entry;
+  struct lwp_info *lwp = get_thread_lwp (thread);
+  struct thread_info *saved_thread;
   CORE_ADDR pc;
 
   /* LWPs which will not be resumed are not interesting, because we
@@ -3413,20 +3856,17 @@ need_step_over_p (struct inferior_list_entry *entry, void *dummy)
   if (!lwp->stopped)
     {
       if (debug_threads)
-       fprintf (stderr,
-                "Need step over [LWP %ld]? Ignoring, not stopped\n",
-                lwpid_of (lwp));
+       debug_printf ("Need step over [LWP %ld]? Ignoring, not stopped\n",
+                     lwpid_of (thread));
       return 0;
     }
 
-  thread = get_lwp_thread (lwp);
-
   if (thread->last_resume_kind == resume_stop)
     {
       if (debug_threads)
-       fprintf (stderr,
-                "Need step over [LWP %ld]? Ignoring, should remain stopped\n",
-                lwpid_of (lwp));
+       debug_printf ("Need step over [LWP %ld]? Ignoring, should remain"
+                     " stopped\n",
+                     lwpid_of (thread));
       return 0;
     }
 
@@ -3435,25 +3875,23 @@ need_step_over_p (struct inferior_list_entry *entry, void *dummy)
   if (lwp->suspended)
     {
       if (debug_threads)
-       fprintf (stderr,
-                "Need step over [LWP %ld]? Ignoring, suspended\n",
-                lwpid_of (lwp));
+       debug_printf ("Need step over [LWP %ld]? Ignoring, suspended\n",
+                     lwpid_of (thread));
       return 0;
     }
 
   if (!lwp->need_step_over)
     {
       if (debug_threads)
-       fprintf (stderr,
-                "Need step over [LWP %ld]? No\n", lwpid_of (lwp));
+       debug_printf ("Need step over [LWP %ld]? No\n", lwpid_of (thread));
     }
 
   if (lwp->status_pending_p)
     {
       if (debug_threads)
-       fprintf (stderr,
-                "Need step over [LWP %ld]? Ignoring, has pending status.\n",
-                lwpid_of (lwp));
+       debug_printf ("Need step over [LWP %ld]? Ignoring, has pending"
+                     " status.\n",
+                     lwpid_of (thread));
       return 0;
     }
 
@@ -3469,17 +3907,17 @@ need_step_over_p (struct inferior_list_entry *entry, void *dummy)
   if (pc != lwp->stop_pc)
     {
       if (debug_threads)
-       fprintf (stderr,
-                "Need step over [LWP %ld]? Cancelling, PC was changed.  "
-                "Old stop_pc was 0x%s, PC is now 0x%s\n",
-                lwpid_of (lwp), paddress (lwp->stop_pc), paddress (pc));
+       debug_printf ("Need step over [LWP %ld]? Cancelling, PC was changed. "
+                     "Old stop_pc was 0x%s, PC is now 0x%s\n",
+                     lwpid_of (thread),
+                     paddress (lwp->stop_pc), paddress (pc));
 
       lwp->need_step_over = 0;
       return 0;
     }
 
-  saved_inferior = current_inferior;
-  current_inferior = thread;
+  saved_thread = current_thread;
+  current_thread = thread;
 
   /* We can only step over breakpoints we know about.  */
   if (breakpoint_here (pc) || fast_tracepoint_jump_here (pc))
@@ -3492,25 +3930,23 @@ need_step_over_p (struct inferior_list_entry *entry, void *dummy)
          && gdb_no_commands_at_breakpoint (pc))
        {
          if (debug_threads)
-           fprintf (stderr,
-                    "Need step over [LWP %ld]? yes, but found"
-                    " GDB breakpoint at 0x%s; skipping step over\n",
-                    lwpid_of (lwp), paddress (pc));
+           debug_printf ("Need step over [LWP %ld]? yes, but found"
+                         " GDB breakpoint at 0x%s; skipping step over\n",
+                         lwpid_of (thread), paddress (pc));
 
-         current_inferior = saved_inferior;
+         current_thread = saved_thread;
          return 0;
        }
       else
        {
          if (debug_threads)
-           fprintf (stderr,
-                    "Need step over [LWP %ld]? yes, "
-                    "found breakpoint at 0x%s\n",
-                    lwpid_of (lwp), paddress (pc));
+           debug_printf ("Need step over [LWP %ld]? yes, "
+                         "found breakpoint at 0x%s\n",
+                         lwpid_of (thread), paddress (pc));
 
          /* We've found an lwp that needs stepping over --- return 1 so
             that find_inferior stops looking.  */
-         current_inferior = saved_inferior;
+         current_thread = saved_thread;
 
          /* If the step over is cancelled, this is set again.  */
          lwp->need_step_over = 0;
@@ -3518,12 +3954,12 @@ need_step_over_p (struct inferior_list_entry *entry, void *dummy)
        }
     }
 
-  current_inferior = saved_inferior;
+  current_thread = saved_thread;
 
   if (debug_threads)
-    fprintf (stderr,
-            "Need step over [LWP %ld]? No, no breakpoint found at 0x%s\n",
-            lwpid_of (lwp), paddress (pc));
+    debug_printf ("Need step over [LWP %ld]? No, no breakpoint found"
+                 " at 0x%s\n",
+                 lwpid_of (thread), paddress (pc));
 
   return 0;
 }
@@ -3549,20 +3985,20 @@ need_step_over_p (struct inferior_list_entry *entry, void *dummy)
 static int
 start_step_over (struct lwp_info *lwp)
 {
-  struct thread_info *saved_inferior;
+  struct thread_info *thread = get_lwp_thread (lwp);
+  struct thread_info *saved_thread;
   CORE_ADDR pc;
   int step;
 
   if (debug_threads)
-    fprintf (stderr,
-            "Starting step-over on LWP %ld.  Stopping all threads\n",
-            lwpid_of (lwp));
+    debug_printf ("Starting step-over on LWP %ld.  Stopping all threads\n",
+                 lwpid_of (thread));
 
   stop_all_lwps (1, lwp);
   gdb_assert (lwp->suspended == 0);
 
   if (debug_threads)
-    fprintf (stderr, "Done stopping all threads for step-over.\n");
+    debug_printf ("Done stopping all threads for step-over.\n");
 
   /* Note, we should always reach here with an already adjusted PC,
      either by GDB (if we're resuming due to GDB's request), or by our
@@ -3570,8 +4006,8 @@ start_step_over (struct lwp_info *lwp)
      shouldn't care about.  */
   pc = get_pc (lwp);
 
-  saved_inferior = current_inferior;
-  current_inferior = get_lwp_thread (lwp);
+  saved_thread = current_thread;
+  current_thread = thread;
 
   lwp->bp_reinsert = pc;
   uninsert_breakpoints_at (pc);
@@ -3588,12 +4024,12 @@ start_step_over (struct lwp_info *lwp)
       step = 0;
     }
 
-  current_inferior = saved_inferior;
+  current_thread = saved_thread;
 
   linux_resume_one_lwp (lwp, step, 0, NULL);
 
   /* Require next event from this LWP.  */
-  step_over_bkpt = lwp->head.id;
+  step_over_bkpt = thread->entry.id;
   return 1;
 }
 
@@ -3607,7 +4043,7 @@ finish_step_over (struct lwp_info *lwp)
   if (lwp->bp_reinsert != 0)
     {
       if (debug_threads)
-       fprintf (stderr, "Finished step over.\n");
+       debug_printf ("Finished step over.\n");
 
       /* Reinsert any breakpoint at LWP->BP_REINSERT.  Note that there
         may be no breakpoint to reinsert there by now.  */
@@ -3647,27 +4083,24 @@ finish_step_over (struct lwp_info *lwp)
 static int
 linux_resume_one_thread (struct inferior_list_entry *entry, void *arg)
 {
-  struct lwp_info *lwp;
-  struct thread_info *thread;
+  struct thread_info *thread = (struct thread_info *) entry;
+  struct lwp_info *lwp = get_thread_lwp (thread);
   int step;
   int leave_all_stopped = * (int *) arg;
   int leave_pending;
 
-  thread = (struct thread_info *) entry;
-  lwp = get_thread_lwp (thread);
-
   if (lwp->resume == NULL)
     return 0;
 
   if (lwp->resume->kind == resume_stop)
     {
       if (debug_threads)
-       fprintf (stderr, "resume_stop request for LWP %ld\n", lwpid_of (lwp));
+       debug_printf ("resume_stop request for LWP %ld\n", lwpid_of (thread));
 
       if (!lwp->stopped)
        {
          if (debug_threads)
-           fprintf (stderr, "stopping LWP %ld\n", lwpid_of (lwp));
+           debug_printf ("stopping LWP %ld\n", lwpid_of (thread));
 
          /* Stop the thread, and wait for the event asynchronously,
             through the event loop.  */
@@ -3676,8 +4109,8 @@ linux_resume_one_thread (struct inferior_list_entry *entry, void *arg)
       else
        {
          if (debug_threads)
-           fprintf (stderr, "already stopped LWP %ld\n",
-                    lwpid_of (lwp));
+           debug_printf ("already stopped LWP %ld\n",
+                         lwpid_of (thread));
 
          /* The LWP may have been stopped in an internal event that
             was not meant to be notified back to GDB (e.g., gdbserver
@@ -3719,7 +4152,7 @@ linux_resume_one_thread (struct inferior_list_entry *entry, void *arg)
   if (!leave_pending)
     {
       if (debug_threads)
-       fprintf (stderr, "resuming LWP %ld\n", lwpid_of (lwp));
+       debug_printf ("resuming LWP %ld\n", lwpid_of (thread));
 
       step = (lwp->resume->kind == resume_step);
       linux_resume_one_lwp (lwp, step, lwp->resume->sig, NULL);
@@ -3727,7 +4160,7 @@ linux_resume_one_thread (struct inferior_list_entry *entry, void *arg)
   else
     {
       if (debug_threads)
-       fprintf (stderr, "leaving LWP %ld stopped\n", lwpid_of (lwp));
+       debug_printf ("leaving LWP %ld stopped\n", lwpid_of (thread));
 
       /* If we have a new signal, enqueue the signal.  */
       if (lwp->resume->sig != 0)
@@ -3744,7 +4177,7 @@ linux_resume_one_thread (struct inferior_list_entry *entry, void *arg)
             PTRACE_SETSIGINFO.  */
          if (WIFSTOPPED (lwp->last_status)
              && WSTOPSIG (lwp->last_status) == lwp->resume->sig)
-           ptrace (PTRACE_GETSIGINFO, lwpid_of (lwp), (PTRACE_TYPE_ARG3) 0,
+           ptrace (PTRACE_GETSIGINFO, lwpid_of (thread), (PTRACE_TYPE_ARG3) 0,
                    &p_sig->info);
 
          lwp->pending_signals = p_sig;
@@ -3760,10 +4193,16 @@ static void
 linux_resume (struct thread_resume *resume_info, size_t n)
 {
   struct thread_resume_array array = { resume_info, n };
-  struct lwp_info *need_step_over = NULL;
+  struct thread_info *need_step_over = NULL;
   int any_pending;
   int leave_all_stopped;
 
+  if (debug_threads)
+    {
+      debug_enter ();
+      debug_printf ("linux_resume:\n");
+    }
+
   find_inferior (&all_threads, linux_set_resume_request, &array);
 
   /* If there is a thread which would otherwise be resumed, which has
@@ -3774,7 +4213,7 @@ linux_resume (struct thread_resume *resume_info, size_t n)
      before considering to start a step-over (in all-stop).  */
   any_pending = 0;
   if (!non_stop)
-    find_inferior (&all_lwps, resume_status_pending_p, &any_pending);
+    find_inferior (&all_threads, resume_status_pending_p, &any_pending);
 
   /* If there is a thread which would otherwise be resumed, which is
      stopped at a breakpoint that needs stepping over, then don't
@@ -3784,21 +4223,20 @@ linux_resume (struct thread_resume *resume_info, size_t n)
      queued.  */
   if (!any_pending && supports_breakpoints ())
     need_step_over
-      = (struct lwp_info *) find_inferior (&all_lwps,
-                                          need_step_over_p, NULL);
+      = (struct thread_info *) find_inferior (&all_threads,
+                                             need_step_over_p, NULL);
 
   leave_all_stopped = (need_step_over != NULL || any_pending);
 
   if (debug_threads)
     {
       if (need_step_over != NULL)
-       fprintf (stderr, "Not resuming all, need step over\n");
+       debug_printf ("Not resuming all, need step over\n");
       else if (any_pending)
-       fprintf (stderr,
-                "Not resuming, all-stop and found "
-                "an LWP with pending status\n");
+       debug_printf ("Not resuming, all-stop and found "
+                     "an LWP with pending status\n");
       else
-       fprintf (stderr, "Resuming, no pending status or step over needed\n");
+       debug_printf ("Resuming, no pending status or step over needed\n");
     }
 
   /* Even if we're leaving threads stopped, queue all signals we'd
@@ -3806,7 +4244,13 @@ linux_resume (struct thread_resume *resume_info, size_t n)
   find_inferior (&all_threads, linux_resume_one_thread, &leave_all_stopped);
 
   if (need_step_over)
-    start_step_over (need_step_over);
+    start_step_over (get_thread_lwp (need_step_over));
+
+  if (debug_threads)
+    {
+      debug_printf ("linux_resume done\n");
+      debug_exit ();
+    }
 }
 
 /* This function is called once per thread.  We check the thread's
@@ -3821,40 +4265,37 @@ linux_resume (struct thread_resume *resume_info, size_t n)
 static int
 proceed_one_lwp (struct inferior_list_entry *entry, void *except)
 {
-  struct lwp_info *lwp = (struct lwp_info *) entry;
-  struct thread_info *thread;
+  struct thread_info *thread = (struct thread_info *) entry;
+  struct lwp_info *lwp = get_thread_lwp (thread);
   int step;
 
   if (lwp == except)
     return 0;
 
   if (debug_threads)
-    fprintf (stderr,
-            "proceed_one_lwp: lwp %ld\n", lwpid_of (lwp));
+    debug_printf ("proceed_one_lwp: lwp %ld\n", lwpid_of (thread));
 
   if (!lwp->stopped)
     {
       if (debug_threads)
-       fprintf (stderr, "   LWP %ld already running\n", lwpid_of (lwp));
+       debug_printf ("   LWP %ld already running\n", lwpid_of (thread));
       return 0;
     }
 
-  thread = get_lwp_thread (lwp);
-
   if (thread->last_resume_kind == resume_stop
       && thread->last_status.kind != TARGET_WAITKIND_IGNORE)
     {
       if (debug_threads)
-       fprintf (stderr, "   client wants LWP to remain %ld stopped\n",
-                lwpid_of (lwp));
+       debug_printf ("   client wants LWP to remain %ld stopped\n",
+                     lwpid_of (thread));
       return 0;
     }
 
   if (lwp->status_pending_p)
     {
       if (debug_threads)
-       fprintf (stderr, "   LWP %ld has pending status, leaving stopped\n",
-                lwpid_of (lwp));
+       debug_printf ("   LWP %ld has pending status, leaving stopped\n",
+                     lwpid_of (thread));
       return 0;
     }
 
@@ -3863,7 +4304,7 @@ proceed_one_lwp (struct inferior_list_entry *entry, void *except)
   if (lwp->suspended)
     {
       if (debug_threads)
-       fprintf (stderr, "   LWP %ld is suspended\n", lwpid_of (lwp));
+       debug_printf ("   LWP %ld is suspended\n", lwpid_of (thread));
       return 0;
     }
 
@@ -3882,10 +4323,9 @@ proceed_one_lwp (struct inferior_list_entry *entry, void *except)
         pending, this is a no-op.  */
 
       if (debug_threads)
-       fprintf (stderr,
-                "Client wants LWP %ld to stop. "
-                "Making sure it has a SIGSTOP pending\n",
-                lwpid_of (lwp));
+       debug_printf ("Client wants LWP %ld to stop. "
+                     "Making sure it has a SIGSTOP pending\n",
+                     lwpid_of (thread));
 
       send_sigstop (lwp);
     }
@@ -3898,7 +4338,8 @@ proceed_one_lwp (struct inferior_list_entry *entry, void *except)
 static int
 unsuspend_and_proceed_one_lwp (struct inferior_list_entry *entry, void *except)
 {
-  struct lwp_info *lwp = (struct lwp_info *) entry;
+  struct thread_info *thread = (struct thread_info *) entry;
+  struct lwp_info *lwp = get_thread_lwp (thread);
 
   if (lwp == except)
     return 0;
@@ -3916,7 +4357,7 @@ unsuspend_and_proceed_one_lwp (struct inferior_list_entry *entry, void *except)
 static void
 proceed_all_lwps (void)
 {
-  struct lwp_info *need_step_over;
+  struct thread_info *need_step_over;
 
   /* If there is a thread which would otherwise be resumed, which is
      stopped at a breakpoint that needs stepping over, then don't
@@ -3926,25 +4367,25 @@ proceed_all_lwps (void)
   if (supports_breakpoints ())
     {
       need_step_over
-       = (struct lwp_info *) find_inferior (&all_lwps,
-                                            need_step_over_p, NULL);
+       = (struct thread_info *) find_inferior (&all_threads,
+                                               need_step_over_p, NULL);
 
       if (need_step_over != NULL)
        {
          if (debug_threads)
-           fprintf (stderr, "proceed_all_lwps: found "
-                    "thread %ld needing a step-over\n",
-                    lwpid_of (need_step_over));
+           debug_printf ("proceed_all_lwps: found "
+                         "thread %ld needing a step-over\n",
+                         lwpid_of (need_step_over));
 
-         start_step_over (need_step_over);
+         start_step_over (get_thread_lwp (need_step_over));
          return;
        }
     }
 
   if (debug_threads)
-    fprintf (stderr, "Proceeding, no step-over needed\n");
+    debug_printf ("Proceeding, no step-over needed\n");
 
-  find_inferior (&all_lwps, proceed_one_lwp, NULL);
+  find_inferior (&all_threads, proceed_one_lwp, NULL);
 }
 
 /* Stopped LWPs that the client wanted to be running, that don't have
@@ -3956,18 +4397,24 @@ unstop_all_lwps (int unsuspend, struct lwp_info *except)
 {
   if (debug_threads)
     {
+      debug_enter ();
       if (except)
-       fprintf (stderr,
-                "unstopping all lwps, except=(LWP %ld)\n", lwpid_of (except));
+       debug_printf ("unstopping all lwps, except=(LWP %ld)\n",
+                     lwpid_of (get_lwp_thread (except)));
       else
-       fprintf (stderr,
-                "unstopping all lwps\n");
+       debug_printf ("unstopping all lwps\n");
     }
 
   if (unsuspend)
-    find_inferior (&all_lwps, unsuspend_and_proceed_one_lwp, except);
+    find_inferior (&all_threads, unsuspend_and_proceed_one_lwp, except);
   else
-    find_inferior (&all_lwps, proceed_one_lwp, except);
+    find_inferior (&all_threads, proceed_one_lwp, except);
+
+  if (debug_threads)
+    {
+      debug_printf ("unstop_all_lwps done\n");
+      debug_exit ();
+    }
 }
 
 
@@ -4006,19 +4453,14 @@ regsets_fetch_inferior_registers (struct regsets_info *regsets_info,
   int pid;
   struct iovec iov;
 
-  regset = regsets_info->regsets;
-
-  pid = lwpid_of (get_thread_lwp (current_inferior));
-  while (regset->size >= 0)
+  pid = lwpid_of (current_thread);
+  for (regset = regsets_info->regsets; regset->size >= 0; regset++)
     {
       void *buf, *data;
       int nt_type, res;
 
       if (regset->size == 0 || regset_disabled (regsets_info, regset))
-       {
-         regset ++;
-         continue;
-       }
+       continue;
 
       buf = xmalloc (regset->size);
 
@@ -4045,8 +4487,12 @@ regsets_fetch_inferior_registers (struct regsets_info *regsets_info,
              /* If we get EIO on a regset, do not try it again for
                 this process mode.  */
              disable_regset (regsets_info, regset);
-             free (buf);
-             continue;
+           }
+         else if (errno == ENODATA)
+           {
+             /* ENODATA may be returned if the regset is currently
+                not "active".  This can happen in normal operation,
+                so suppress the warning in this case.  */
            }
          else
            {
@@ -4056,10 +4502,12 @@ regsets_fetch_inferior_registers (struct regsets_info *regsets_info,
              perror (s);
            }
        }
-      else if (regset->type == GENERAL_REGS)
-       saw_general_regs = 1;
-      regset->store_function (regcache, buf);
-      regset ++;
+      else
+       {
+         if (regset->type == GENERAL_REGS)
+           saw_general_regs = 1;
+         regset->store_function (regcache, buf);
+       }
       free (buf);
     }
   if (saw_general_regs)
@@ -4077,19 +4525,15 @@ regsets_store_inferior_registers (struct regsets_info *regsets_info,
   int pid;
   struct iovec iov;
 
-  regset = regsets_info->regsets;
-
-  pid = lwpid_of (get_thread_lwp (current_inferior));
-  while (regset->size >= 0)
+  pid = lwpid_of (current_thread);
+  for (regset = regsets_info->regsets; regset->size >= 0; regset++)
     {
       void *buf, *data;
       int nt_type, res;
 
-      if (regset->size == 0 || regset_disabled (regsets_info, regset))
-       {
-         regset ++;
-         continue;
-       }
+      if (regset->size == 0 || regset_disabled (regsets_info, regset)
+         || regset->fill_function == NULL)
+       continue;
 
       buf = xmalloc (regset->size);
 
@@ -4135,8 +4579,6 @@ regsets_store_inferior_registers (struct regsets_info *regsets_info,
              /* If we get EIO on a regset, do not try it again for
                 this process mode.  */
              disable_regset (regsets_info, regset);
-             free (buf);
-             continue;
            }
          else if (errno == ESRCH)
            {
@@ -4154,7 +4596,6 @@ regsets_store_inferior_registers (struct regsets_info *regsets_info,
        }
       else if (regset->type == GENERAL_REGS)
        saw_general_regs = 1;
-      regset ++;
       free (buf);
     }
   if (saw_general_regs)
@@ -4224,7 +4665,7 @@ fetch_register (const struct usrregs_info *usrregs,
          & -sizeof (PTRACE_XFER_TYPE));
   buf = alloca (size);
 
-  pid = lwpid_of (get_thread_lwp (current_inferior));
+  pid = lwpid_of (current_thread);
   for (i = 0; i < size; i += sizeof (PTRACE_XFER_TYPE))
     {
       errno = 0;
@@ -4274,7 +4715,7 @@ store_register (const struct usrregs_info *usrregs,
   else
     collect_register (regcache, regno, buf);
 
-  pid = lwpid_of (get_thread_lwp (current_inferior));
+  pid = lwpid_of (current_thread);
   for (i = 0; i < size; i += sizeof (PTRACE_XFER_TYPE))
     {
       errno = 0;
@@ -4414,7 +4855,7 @@ linux_store_registers (struct regcache *regcache, int regno)
 static int
 linux_read_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len)
 {
-  int pid = lwpid_of (get_thread_lwp (current_inferior));
+  int pid = lwpid_of (current_thread);
   register PTRACE_XFER_TYPE *buffer;
   register CORE_ADDR addr;
   register int count;
@@ -4515,7 +4956,7 @@ linux_write_memory (CORE_ADDR memaddr, const unsigned char *myaddr, int len)
   register PTRACE_XFER_TYPE *buffer = (PTRACE_XFER_TYPE *)
     alloca (count * sizeof (PTRACE_XFER_TYPE));
 
-  int pid = lwpid_of (get_thread_lwp (current_inferior));
+  int pid = lwpid_of (current_thread);
 
   if (len == 0)
     {
@@ -4533,8 +4974,8 @@ linux_write_memory (CORE_ADDR memaddr, const unsigned char *myaddr, int len)
        val = val & 0xffff;
       else if (len == 3)
        val = val & 0xffffff;
-      fprintf (stderr, "Writing %0*x to 0x%08lx\n", 2 * ((len < 4) ? len : 4),
-              val, (long)memaddr);
+      debug_printf ("Writing %0*x to 0x%08lx\n", 2 * ((len < 4) ? len : 4),
+                   val, (long)memaddr);
     }
 
   /* Fill start and end extra bytes of buffer with existing memory data.  */
@@ -4590,7 +5031,7 @@ linux_look_up_symbols (void)
 #ifdef USE_THREAD_DB
   struct process_info *proc = current_process ();
 
-  if (proc->private->thread_db != NULL)
+  if (proc->priv->thread_db != NULL)
     return;
 
   /* If the kernel supports tracing clones, then we don't need to
@@ -4605,18 +5046,9 @@ linux_request_interrupt (void)
 {
   extern unsigned long signal_pid;
 
-  if (!ptid_equal (cont_thread, null_ptid)
-      && !ptid_equal (cont_thread, minus_one_ptid))
-    {
-      struct lwp_info *lwp;
-      int lwpid;
-
-      lwp = get_thread_lwp (current_inferior);
-      lwpid = lwpid_of (lwp);
-      kill_lwp (lwpid, SIGINT);
-    }
-  else
-    kill_lwp (signal_pid, SIGINT);
+  /* Send a SIGINT to the process group.  This acts just like the user
+     typed a ^C on the controlling terminal.  */
+  kill (-signal_pid, SIGINT);
 }
 
 /* Copy LEN bytes from inferior's auxiliary vector starting at OFFSET
@@ -4627,7 +5059,7 @@ linux_read_auxv (CORE_ADDR offset, unsigned char *myaddr, unsigned int len)
 {
   char filename[PATH_MAX];
   int fd, n;
-  int pid = lwpid_of (get_thread_lwp (current_inferior));
+  int pid = lwpid_of (current_thread);
 
   xsnprintf (filename, sizeof filename, "/proc/%d/auxv", pid);
 
@@ -4651,37 +5083,86 @@ linux_read_auxv (CORE_ADDR offset, unsigned char *myaddr, unsigned int len)
    corresponding function.  */
 
 static int
-linux_insert_point (char type, CORE_ADDR addr, int len)
+linux_supports_z_point_type (char z_type)
+{
+  return (the_low_target.supports_z_point_type != NULL
+         && the_low_target.supports_z_point_type (z_type));
+}
+
+static int
+linux_insert_point (enum raw_bkpt_type type, CORE_ADDR addr,
+                   int size, struct raw_breakpoint *bp)
 {
   if (the_low_target.insert_point != NULL)
-    return the_low_target.insert_point (type, addr, len);
+    return the_low_target.insert_point (type, addr, size, bp);
   else
     /* Unsupported (see target.h).  */
     return 1;
 }
 
 static int
-linux_remove_point (char type, CORE_ADDR addr, int len)
+linux_remove_point (enum raw_bkpt_type type, CORE_ADDR addr,
+                   int size, struct raw_breakpoint *bp)
 {
   if (the_low_target.remove_point != NULL)
-    return the_low_target.remove_point (type, addr, len);
+    return the_low_target.remove_point (type, addr, size, bp);
   else
     /* Unsupported (see target.h).  */
     return 1;
 }
 
+/* Implement the to_stopped_by_sw_breakpoint target_ops
+   method.  */
+
+static int
+linux_stopped_by_sw_breakpoint (void)
+{
+  struct lwp_info *lwp = get_thread_lwp (current_thread);
+
+  return (lwp->stop_reason == TARGET_STOPPED_BY_SW_BREAKPOINT);
+}
+
+/* Implement the to_supports_stopped_by_sw_breakpoint target_ops
+   method.  */
+
+static int
+linux_supports_stopped_by_sw_breakpoint (void)
+{
+  return USE_SIGTRAP_SIGINFO;
+}
+
+/* Implement the to_stopped_by_hw_breakpoint target_ops
+   method.  */
+
+static int
+linux_stopped_by_hw_breakpoint (void)
+{
+  struct lwp_info *lwp = get_thread_lwp (current_thread);
+
+  return (lwp->stop_reason == TARGET_STOPPED_BY_HW_BREAKPOINT);
+}
+
+/* Implement the to_supports_stopped_by_hw_breakpoint target_ops
+   method.  */
+
+static int
+linux_supports_stopped_by_hw_breakpoint (void)
+{
+  return USE_SIGTRAP_SIGINFO;
+}
+
 static int
 linux_stopped_by_watchpoint (void)
 {
-  struct lwp_info *lwp = get_thread_lwp (current_inferior);
+  struct lwp_info *lwp = get_thread_lwp (current_thread);
 
-  return lwp->stopped_by_watchpoint;
+  return lwp->stop_reason == TARGET_STOPPED_BY_WATCHPOINT;
 }
 
 static CORE_ADDR
 linux_stopped_data_address (void)
 {
-  struct lwp_info *lwp = get_thread_lwp (current_inferior);
+  struct lwp_info *lwp = get_thread_lwp (current_thread);
 
   return lwp->stopped_data_address;
 }
@@ -4702,7 +5183,7 @@ static int
 linux_read_offsets (CORE_ADDR *text_p, CORE_ADDR *data_p)
 {
   unsigned long text, text_end, data;
-  int pid = lwpid_of (get_thread_lwp (current_inferior));
+  int pid = lwpid_of (get_thread_lwp (current_thread));
 
   errno = 0;
 
@@ -4771,15 +5252,15 @@ linux_xfer_siginfo (const char *annex, unsigned char *readbuf,
   siginfo_t siginfo;
   char inf_siginfo[sizeof (siginfo_t)];
 
-  if (current_inferior == NULL)
+  if (current_thread == NULL)
     return -1;
 
-  pid = lwpid_of (get_thread_lwp (current_inferior));
+  pid = lwpid_of (current_thread);
 
   if (debug_threads)
-    fprintf (stderr, "%s siginfo for lwp %d.\n",
-            readbuf != NULL ? "Reading" : "Writing",
-            pid);
+    debug_printf ("%s siginfo for lwp %d.\n",
+                 readbuf != NULL ? "Reading" : "Writing",
+                 pid);
 
   if (offset >= sizeof (siginfo))
     return -1;
@@ -4848,11 +5329,11 @@ linux_supports_non_stop (void)
 static int
 linux_async (int enable)
 {
-  int previous = (linux_event_pipe[0] != -1);
+  int previous = target_is_async_p ();
 
   if (debug_threads)
-    fprintf (stderr, "linux_async (%d), previous=%d\n",
-            enable, previous);
+    debug_printf ("linux_async (%d), previous=%d\n",
+                 enable, previous);
 
   if (previous != enable)
     {
@@ -4865,7 +5346,14 @@ linux_async (int enable)
       if (enable)
        {
          if (pipe (linux_event_pipe) == -1)
-           fatal ("creating event pipe failed.");
+           {
+             linux_event_pipe[0] = -1;
+             linux_event_pipe[1] = -1;
+             sigprocmask (SIG_UNBLOCK, &mask, NULL);
+
+             warning ("creating event pipe failed.");
+             return previous;
+           }
 
          fcntl (linux_event_pipe[0], F_SETFL, O_NONBLOCK);
          fcntl (linux_event_pipe[1], F_SETFL, O_NONBLOCK);
@@ -4898,6 +5386,10 @@ linux_start_non_stop (int nonstop)
 {
   /* Register or unregister from event-loop accordingly.  */
   linux_async (nonstop);
+
+  if (target_is_async_p () != (nonstop != 0))
+    return -1;
+
   return 0;
 }
 
@@ -4988,7 +5480,7 @@ linux_qxfer_spu (const char *annex, unsigned char *readbuf,
                 unsigned const char *writebuf,
                 CORE_ADDR offset, int len)
 {
-  long pid = lwpid_of (get_thread_lwp (current_inferior));
+  long pid = lwpid_of (current_thread);
   char buf[128];
   int fd = 0;
   int ret = 0;
@@ -5071,7 +5563,7 @@ static int
 linux_read_loadmap (const char *annex, CORE_ADDR offset,
                    unsigned char *myaddr, unsigned int len)
 {
-  int pid = lwpid_of (get_thread_lwp (current_inferior));
+  int pid = lwpid_of (current_thread);
   int addr = -1;
   struct target_loadmap *data = NULL;
   unsigned int actual_length, copy_length;
@@ -5499,7 +5991,7 @@ linux_qxfer_libraries_svr4 (const char *annex, unsigned char *readbuf,
 {
   char *document;
   unsigned document_len;
-  struct process_info_private *const priv = current_process ()->private;
+  struct process_info_private *const priv = current_process ()->priv;
   char filename[PATH_MAX];
   int pid, is_elf64;
 
@@ -5538,7 +6030,7 @@ linux_qxfer_libraries_svr4 (const char *annex, unsigned char *readbuf,
   if (readbuf == NULL)
     return -1;
 
-  pid = lwpid_of (get_thread_lwp (current_inferior));
+  pid = lwpid_of (current_thread);
   xsnprintf (filename, sizeof filename, "/proc/%d/exe", pid);
   is_elf64 = elf_64_file_p (filename, &machine);
   lmo = is_elf64 ? &lmo_64bit_offsets : &lmo_32bit_offsets;
@@ -5555,9 +6047,9 @@ linux_qxfer_libraries_svr4 (const char *annex, unsigned char *readbuf,
        break;
 
       len = sep - annex;
-      if (len == 5 && strncmp (annex, "start", 5) == 0)
+      if (len == 5 && startswith (annex, "start"))
        addrp = &lm_addr;
-      else if (len == 4 && strncmp (annex, "prev", 4) == 0)
+      else if (len == 4 && startswith (annex, "prev"))
        addrp = &lm_prev;
       else
        {
@@ -5705,16 +6197,16 @@ linux_qxfer_libraries_svr4 (const char *annex, unsigned char *readbuf,
 
 #ifdef HAVE_LINUX_BTRACE
 
-/* Enable branch tracing.  */
+/* See to_enable_btrace target method.  */
 
 static struct btrace_target_info *
-linux_low_enable_btrace (ptid_t ptid)
+linux_low_enable_btrace (ptid_t ptid, const struct btrace_config *conf)
 {
   struct btrace_target_info *tinfo;
 
-  tinfo = linux_enable_btrace (ptid);
+  tinfo = linux_enable_btrace (ptid, conf);
 
-  if (tinfo != NULL)
+  if (tinfo != NULL && tinfo->ptr_bits == 0)
     {
       struct thread_info *thread = find_thread_ptid (ptid);
       struct regcache *regcache = get_thread_regcache (thread, 0);
@@ -5725,31 +6217,112 @@ linux_low_enable_btrace (ptid_t ptid)
   return tinfo;
 }
 
-/* Read branch trace data as btrace xml document.  */
+/* See to_disable_btrace target method.  */
 
-static void
+static int
+linux_low_disable_btrace (struct btrace_target_info *tinfo)
+{
+  enum btrace_error err;
+
+  err = linux_disable_btrace (tinfo);
+  return (err == BTRACE_ERR_NONE ? 0 : -1);
+}
+
+/* See to_read_btrace target method.  */
+
+static int
 linux_low_read_btrace (struct btrace_target_info *tinfo, struct buffer *buffer,
                       int type)
 {
-  VEC (btrace_block_s) *btrace;
+  struct btrace_data btrace;
   struct btrace_block *block;
+  enum btrace_error err;
   int i;
 
-  btrace = linux_read_btrace (tinfo, type);
+  btrace_data_init (&btrace);
+
+  err = linux_read_btrace (&btrace, tinfo, type);
+  if (err != BTRACE_ERR_NONE)
+    {
+      if (err == BTRACE_ERR_OVERFLOW)
+       buffer_grow_str0 (buffer, "E.Overflow.");
+      else
+       buffer_grow_str0 (buffer, "E.Generic Error.");
+
+      btrace_data_fini (&btrace);
+      return -1;
+    }
+
+  switch (btrace.format)
+    {
+    case BTRACE_FORMAT_NONE:
+      buffer_grow_str0 (buffer, "E.No Trace.");
+      break;
+
+    case BTRACE_FORMAT_BTS:
+      buffer_grow_str (buffer, "<!DOCTYPE btrace SYSTEM \"btrace.dtd\">\n");
+      buffer_grow_str (buffer, "<btrace version=\"1.0\">\n");
+
+      for (i = 0;
+          VEC_iterate (btrace_block_s, btrace.variant.bts.blocks, i, block);
+          i++)
+       buffer_xml_printf (buffer, "<block begin=\"0x%s\" end=\"0x%s\"/>\n",
+                          paddress (block->begin), paddress (block->end));
+
+      buffer_grow_str0 (buffer, "</btrace>\n");
+      break;
+
+    default:
+      buffer_grow_str0 (buffer, "E.Unknown Trace Format.");
+
+      btrace_data_fini (&btrace);
+      return -1;
+    }
+
+  btrace_data_fini (&btrace);
+  return 0;
+}
+
+/* See to_btrace_conf target method.  */
+
+static int
+linux_low_btrace_conf (const struct btrace_target_info *tinfo,
+                      struct buffer *buffer)
+{
+  const struct btrace_config *conf;
 
-  buffer_grow_str (buffer, "<!DOCTYPE btrace SYSTEM \"btrace.dtd\">\n");
-  buffer_grow_str (buffer, "<btrace version=\"1.0\">\n");
+  buffer_grow_str (buffer, "<!DOCTYPE btrace-conf SYSTEM \"btrace-conf.dtd\">\n");
+  buffer_grow_str (buffer, "<btrace-conf version=\"1.0\">\n");
 
-  for (i = 0; VEC_iterate (btrace_block_s, btrace, i, block); i++)
-    buffer_xml_printf (buffer, "<block begin=\"0x%s\" end=\"0x%s\"/>\n",
-                      paddress (block->begin), paddress (block->end));
+  conf = linux_btrace_conf (tinfo);
+  if (conf != NULL)
+    {
+      switch (conf->format)
+       {
+       case BTRACE_FORMAT_NONE:
+         break;
 
-  buffer_grow_str (buffer, "</btrace>\n");
+       case BTRACE_FORMAT_BTS:
+         buffer_xml_printf (buffer, "<bts");
+         buffer_xml_printf (buffer, " size=\"0x%x\"", conf->bts.size);
+         buffer_xml_printf (buffer, " />\n");
+         break;
+       }
+    }
 
-  VEC_free (btrace_block_s, btrace);
+  buffer_grow_str0 (buffer, "</btrace-conf>\n");
+  return 0;
 }
 #endif /* HAVE_LINUX_BTRACE */
 
+/* See nat/linux-nat.h.  */
+
+ptid_t
+current_lwp_ptid (void)
+{
+  return ptid_of (current_thread);
+}
+
 static struct target_ops linux_target_ops = {
   linux_create_inferior,
   linux_attach,
@@ -5769,8 +6342,13 @@ static struct target_ops linux_target_ops = {
   linux_look_up_symbols,
   linux_request_interrupt,
   linux_read_auxv,
+  linux_supports_z_point_type,
   linux_insert_point,
   linux_remove_point,
+  linux_stopped_by_sw_breakpoint,
+  linux_supports_stopped_by_sw_breakpoint,
+  linux_stopped_by_hw_breakpoint,
+  linux_supports_stopped_by_hw_breakpoint,
   linux_stopped_by_watchpoint,
   linux_stopped_data_address,
 #if defined(__UCLIBC__) && defined(HAS_NOMMU)        \
@@ -5808,7 +6386,6 @@ static struct target_ops linux_target_ops = {
   NULL,
   linux_pause_all,
   linux_unpause_all,
-  linux_cancel_breakpoints,
   linux_stabilize_threads,
   linux_install_fast_tracepoint_jump_pad,
   linux_emit_ops,
@@ -5819,13 +6396,15 @@ static struct target_ops linux_target_ops = {
 #ifdef HAVE_LINUX_BTRACE
   linux_supports_btrace,
   linux_low_enable_btrace,
-  linux_disable_btrace,
+  linux_low_disable_btrace,
   linux_low_read_btrace,
+  linux_low_btrace_conf,
 #else
   NULL,
   NULL,
   NULL,
   NULL,
+  NULL,
 #endif
   linux_supports_range_stepping,
 };
This page took 0.101477 seconds and 4 git commands to generate.