Arch-specific remote follow fork
[deliverable/binutils-gdb.git] / gdb / gdbserver / linux-low.c
index 923ee14367439288cdf8a963c66270d8e1d49468..d9053ad6048e000a501f0a3869bceb946e8a283d 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 "tdesc.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,6 +137,49 @@ typedef struct
 } Elf64_auxv_t;
 #endif
 
+/* LWP accessors.  */
+
+/* See nat/linux-nat.h.  */
+
+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;
+}
+
+/* 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
    children momentarily.  */
@@ -214,15 +256,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 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.  */
 
@@ -276,7 +323,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.  */
 
@@ -335,7 +382,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));
+  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);
 }
@@ -349,34 +401,37 @@ 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).  */
+   event, we need to add the new LWP to our list (and return 0 so as
+   not to report the trap to higher layers).  */
 
-static void
-handle_extended_wait (struct lwp_info *event_child, int wstat)
+static int
+handle_extended_wait (struct lwp_info *event_lwp, int wstat)
 {
-  int event = wstat >> 16;
-  struct thread_info *event_thr = get_lwp_thread (event_child);
+  int event = linux_ptrace_get_extended_event (wstat);
+  struct thread_info *event_thr = get_lwp_thread (event_lwp);
   struct lwp_info *new_lwp;
 
-  if (event == PTRACE_EVENT_CLONE)
+  if ((event == PTRACE_EVENT_FORK) || (event == PTRACE_EVENT_CLONE))
     {
       ptid_t ptid;
       unsigned long new_pid;
       int ret, status;
 
+      /* Get the pid of the new lwp.  */
       ptrace (PTRACE_GETEVENTMSG, lwpid_of (event_thr), (PTRACE_TYPE_ARG3) 0,
              &new_pid);
 
@@ -396,6 +451,66 @@ handle_extended_wait (struct lwp_info *event_child, int wstat)
            warning ("wait returned unexpected status 0x%x", status);
        }
 
+      if (event == PTRACE_EVENT_FORK)
+       {
+         struct process_info *parent_proc;
+         struct process_info *child_proc;
+         struct lwp_info *child_lwp;
+         struct target_desc *tdesc;
+
+         ptid = ptid_build (new_pid, new_pid, 0);
+
+         if (debug_threads)
+           {
+             debug_printf ("HEW: Got fork event from LWP %ld, "
+                           "new child is %d\n",
+                           ptid_get_lwp (ptid_of (event_thr)),
+                           ptid_get_pid (ptid));
+           }
+
+         /* Add the new process to the tables and clone the breakpoint
+            lists of the parent.  We need to do this even if the new process
+            will be detached, since we will need the process object and the
+            breakpoints to remove any breakpoints from memory when we
+            detach, and the client side will access registers.  */
+         child_proc = linux_add_process (new_pid, 0);
+         gdb_assert (child_proc != NULL);
+         child_lwp = add_lwp (ptid);
+         gdb_assert (child_lwp != NULL);
+         child_lwp->stopped = 1;
+         parent_proc = get_thread_process (event_thr);
+         child_proc->attached = parent_proc->attached;
+         clone_all_breakpoints (&child_proc->breakpoints,
+                                &child_proc->raw_breakpoints,
+                                parent_proc->breakpoints);
+
+         tdesc = xmalloc (sizeof (struct target_desc));
+         copy_target_description (tdesc, parent_proc->tdesc);
+         child_proc->tdesc = tdesc;
+         child_lwp->must_set_ptrace_flags = 1;
+
+         /* Clone arch-specific process data.  */
+         if (the_low_target.new_fork != NULL)
+           the_low_target.new_fork (parent_proc, child_proc);
+
+         /* Save fork info in the parent thread.  */
+         event_lwp->waitstatus.kind = TARGET_WAITKIND_FORKED;
+         event_lwp->waitstatus.value.related_pid = ptid;
+         /* The status_pending field contains bits denoting the
+            extended event, so when the pending event is handled,
+            the handler will look at lwp->waitstatus.  */
+         event_lwp->status_pending_p = 1;
+         event_lwp->status_pending = wstat;
+
+         /* Report the event.  */
+         return 0;
+       }
+
+      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);
 
@@ -413,34 +528,18 @@ 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);
+      /* Don't report the event.  */
+      return 1;
     }
+
+  internal_error (__FILE__, __LINE__, _("unknown ptrace event %d"), event);
 }
 
 /* Return the PC as read from the regcache of LWP, without any
@@ -449,23 +548,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)
     debug_printf ("pc is 0x%lx\n", (long) pc);
 
-  current_inferior = saved_inferior;
+  current_thread = saved_thread;
   return pc;
 }
 
@@ -473,44 +572,152 @@ 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)
-    debug_printf ("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: %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;
+           }
+         else if (siginfo.si_code == TRAP_HWBKPT)
+           {
+             if (debug_threads)
+               {
+                 struct thread_info *thr = get_lwp_thread (lwp);
+
+                 debug_printf ("CSBB: %s stopped by hardware "
+                               "breakpoint/watchpoint\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 if (siginfo.si_code == TRAP_TRACE)
+           {
+             if (debug_threads)
+               {
+                 struct thread_info *thr = get_lwp_thread (lwp);
+
+                 debug_printf ("CSBB: %s stopped by trace\n",
+                               target_pid_to_str (ptid_of (thr)));
+               }
+           }
+       }
+    }
+#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
 
-  return stop_pc;
+  current_thread = saved_thread;
+  return 0;
 }
 
 static struct lwp_info *
@@ -522,7 +729,7 @@ add_lwp (ptid_t ptid)
   memset (lwp, 0, sizeof (*lwp));
 
   if (the_low_target.new_thread != NULL)
-    lwp->arch_private = the_low_target.new_thread ();
+    the_low_target.new_thread (lwp);
 
   lwp->thread = add_thread (ptid, lwp);
 
@@ -535,29 +742,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 ();
@@ -603,16 +792,7 @@ 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);
 
@@ -623,49 +803,18 @@ linux_create_inferior (char *program, char **allargs)
   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 (current_inferior);
-      ptid = ptid_build (pid, lwpid, 0);
-    }
+    return errno;
 
   new_lwp = add_lwp (ptid);
 
@@ -735,12 +884,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
@@ -749,9 +938,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)
@@ -764,65 +960,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)
-                       debug_printf ("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;
 }
 
@@ -847,10 +994,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 = thread->entry.id;
-  int pid = ptid_get_pid (ptid);
   struct counter counter = { pid , 0 };
 
   return (find_inferior (&all_threads,
@@ -880,18 +1025,66 @@ linux_kill_one_lwp (struct lwp_info *lwp)
      everywhere.  */
 
   errno = 0;
-  kill (pid, SIGKILL);
+  kill_lwp (pid, SIGKILL);
   if (debug_threads)
-    debug_printf ("LKL:  kill (SIGKILL) %s, 0, 0 (%s)\n",
-                 target_pid_to_str (ptid_of (thr)),
-                 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)
-    debug_printf ("LKL:  PTRACE_KILL %s, 0, 0 (%s)\n",
-                 target_pid_to_str (ptid_of (thr)),
-                 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,
@@ -902,7 +1095,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)
@@ -921,14 +1113,7 @@ kill_one_lwp_callback (struct inferior_list_entry *entry, void *args)
       return 0;
     }
 
-  do
-    {
-      linux_kill_one_lwp (lwp);
-
-      /* Make sure it died.  The loop is most likely unnecessary.  */
-      pid = linux_wait_for_event (thread->entry.id, &wstat, __WALL);
-    } while (pid > 0 && WIFSTOPPED (wstat));
-
+  kill_wait_lwp (lwp);
   return 0;
 }
 
@@ -937,8 +1122,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)
@@ -961,21 +1144,7 @@ linux_kill (int pid)
                      pid);
     }
   else
-    {
-      struct thread_info *thr = get_lwp_thread (lwp);
-
-      if (debug_threads)
-       debug_printf ("lk_1: killing lwp %ld, for pid: %d\n",
-                     lwpid_of (thr), pid);
-
-      do
-       {
-         linux_kill_one_lwp (lwp);
-
-         /* Make sure it died.  The loop is most likely unnecessary.  */
-         lwpid = linux_wait_for_event (thr->entry.id, &wstat, __WALL);
-       } while (lwpid > 0 && WIFSTOPPED (wstat));
-    }
+    kill_wait_lwp (lwp);
 
   the_target->mourn (process);
 
@@ -1021,7 +1190,7 @@ get_detach_signal (struct thread_info *thread)
     }
 
   /* 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)
        debug_printf ("GPS: lwp %s had stopped with extended "
@@ -1165,10 +1334,10 @@ linux_mourn (struct process_info *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);
 }
@@ -1200,18 +1369,16 @@ 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 thread_info *thread = (struct thread_info *) entry;
-  struct lwp_info *lwp = get_thread_lwp (thread);
-  ptid_t ptid = * (ptid_t *) arg;
+  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 (thread->entry.id))
+  if (!lp->status_pending_p)
     return 0;
 
   /* If we got a `vCont;t', but we haven't reported a stop yet, do
@@ -1220,19 +1387,95 @@ status_pending_p_callback (struct inferior_list_entry *entry, void *arg)
       && 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);
+
+      saved_thread = current_thread;
+      current_thread = thread;
+
+      if (pc != lp->stop_pc)
+       {
+         if (debug_threads)
+           debug_printf ("PC of %ld changed\n",
+                         lwpid_of (thread));
+         discard = 1;
+       }
+
+#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
+
+      current_thread = saved_thread;
+
+      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;
+    }
+
+  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
+    lwp = ptid_get_pid (ptid);
 
   if (ptid_get_lwp (entry->id) == lwp)
     return 1;
@@ -1252,152 +1495,161 @@ find_lwp_pid (ptid_t ptid)
   return get_thread_lwp ((struct thread_info *) thread);
 }
 
-static struct lwp_info *
-linux_wait_for_lwp (ptid_t ptid, int *wstatp, int options)
+/* Return the number of known LWPs in the tgid given by PID.  */
+
+static int
+num_lwps (int pid)
 {
-  int ret;
-  int to_wait_for = -1;
-  struct lwp_info *child;
-  struct thread_info *thread;
+  struct inferior_list_entry *inf, *tmp;
+  int count = 0;
 
-  if (debug_threads)
-    debug_printf ("linux_wait_for_lwp: %s\n", target_pid_to_str (ptid));
+  ALL_INFERIORS (&all_threads, inf, tmp)
+    {
+      if (ptid_get_pid (inf->id) == pid)
+       count++;
+    }
 
-  if (ptid_equal (ptid, minus_one_ptid))
-    to_wait_for = -1;                  /* any child */
-  else
-    to_wait_for = ptid_get_lwp (ptid); /* this lwp only */
+  return count;
+}
 
-  options |= __WALL;
+/* The arguments passed to iterate_over_lwps.  */
 
-retry:
+struct iterate_over_lwps_args
+{
+  /* The FILTER argument passed to iterate_over_lwps.  */
+  ptid_t filter;
 
-  ret = my_waitpid (to_wait_for, wstatp, options);
-  if (ret == 0 || (ret == -1 && errno == ECHILD && (options & WNOHANG)))
-    return NULL;
-  else if (ret == -1)
-    perror_with_name ("waitpid");
-
-  if (debug_threads
-      && (!WIFSTOPPED (*wstatp)
-         || (WSTOPSIG (*wstatp) != 32
-             && WSTOPSIG (*wstatp) != 33)))
-    debug_printf ("Got an event from %d (%x)\n", ret, *wstatp);
-
-  child = find_lwp_pid (pid_to_ptid (ret));
-  if (child != NULL)
-    thread = get_lwp_thread (child);
-  else
-    thread = NULL;
+  /* The CALLBACK argument passed to iterate_over_lwps.  */
+  iterate_over_lwps_ftype *callback;
 
-  /* 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))
-    {
-      add_to_pid_list (&stopped_pids, ret, *wstatp);
-      goto retry;
-    }
-  else if (child == NULL)
-    goto retry;
+  /* The DATA argument passed to iterate_over_lwps.  */
+  void *data;
+};
 
-  child->stopped = 1;
+/* 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.  */
 
-  child->last_status = *wstatp;
+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;
 
-  if (WIFSTOPPED (*wstatp))
+  if (ptid_match (entry->id, args->filter))
     {
-      struct process_info *proc;
+      struct thread_info *thr = (struct thread_info *) entry;
+      struct lwp_info *lwp = get_thread_lwp (thr);
 
-      /* 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->private->new_inferior)
-       {
-         struct thread_info *saved_inferior;
+      return (*args->callback) (lwp, args->data);
+    }
 
-         saved_inferior = current_inferior;
-         current_inferior = thread;
+  return 0;
+}
 
-         the_low_target.arch_setup ();
+/* 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;
 
-         current_inferior = saved_inferior;
+  entry = find_inferior (&all_threads, iterate_over_lwps_filter, &args);
+  if (entry == NULL)
+    return NULL;
 
-         proc->private->new_inferior = 0;
-       }
-    }
+  return get_thread_lwp ((struct thread_info *) entry);
+}
 
-  /* Fetch the possibly triggered data watchpoint info and store it in
-     CHILD.
+/* Detect zombie thread group leaders, and "exit" them.  We can't reap
+   their exits until all other threads in the group have exited.  */
 
-     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 void
+check_zombie_leaders (void)
+{
+  struct process_info *proc, *tmp;
 
-  if (WIFSTOPPED (*wstatp) && WSTOPSIG (*wstatp) == SIGTRAP)
+  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);
-      debug_printf ("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.
@@ -1411,6 +1663,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
@@ -1477,10 +1731,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))
@@ -1493,7 +1747,7 @@ maybe_move_out_of_jump_pad (struct lwp_info *lwp, int *wstat)
       if (debug_threads)
        debug_printf ("Checking whether LWP %ld needs to move out of the "
                      "jump pad.\n",
-                     lwpid_of (current_inferior));
+                     lwpid_of (current_thread));
 
       r = linux_fast_tracepoint_collecting (lwp, &status);
 
@@ -1519,8 +1773,8 @@ maybe_move_out_of_jump_pad (struct lwp_info *lwp, int *wstat)
              if (debug_threads)
                debug_printf ("Checking whether LWP %ld needs to move out of "
                              "the jump pad...it does\n",
-                             lwpid_of (current_inferior));
-             current_inferior = saved_inferior;
+                             lwpid_of (current_thread));
+             current_thread = saved_thread;
 
              return 1;
            }
@@ -1549,18 +1803,18 @@ maybe_move_out_of_jump_pad (struct lwp_info *lwp, int *wstat)
                   || WSTOPSIG (*wstat) == SIGFPE
                   || WSTOPSIG (*wstat) == SIGBUS
                   || WSTOPSIG (*wstat) == SIGSEGV)
-                 && ptrace (PTRACE_GETSIGINFO, lwpid_of (current_inferior),
+                 && 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 (current_inferior),
+                 ptrace (PTRACE_SETSIGINFO, lwpid_of (current_thread),
                          (PTRACE_TYPE_ARG3) 0, &info);
                }
 
-             regcache = get_thread_regcache (current_inferior, 1);
+             regcache = get_thread_regcache (current_thread, 1);
              (*the_low_target.set_pc) (regcache, status.tpoint_addr);
              lwp->stop_pc = status.tpoint_addr;
 
@@ -1576,7 +1830,6 @@ maybe_move_out_of_jump_pad (struct lwp_info *lwp, int *wstat)
                              "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;
@@ -1591,9 +1844,9 @@ maybe_move_out_of_jump_pad (struct lwp_info *lwp, int *wstat)
   if (debug_threads)
     debug_printf ("Checking whether LWP %ld needs to move out of the "
                  "jump pad...no\n",
-                 lwpid_of (current_inferior));
+                 lwpid_of (current_thread));
 
-  current_inferior = saved_inferior;
+  current_thread = saved_thread;
   return 0;
 }
 
@@ -1702,70 +1955,279 @@ 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;
+    }
+
+  return child->stop_reason == TARGET_STOPPED_BY_WATCHPOINT;
+}
+
+/* Return the ptrace options that we want to try to enable.  */
+
+static int
+linux_low_ptrace_options (int attached)
+{
+  int options = 0;
 
-  if ((*the_low_target.breakpoint_at) (lwp->stop_pc))
+  if (!attached)
+    options |= PTRACE_O_EXITKILL;
+
+  if (report_fork_events)
+    options |= PTRACE_O_TRACEFORK;
+
+  return options;
+}
+
+/* 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)
-       debug_printf ("CB: Push back breakpoint for %s\n",
-                     target_pid_to_str (ptid_of (current_inferior)));
+       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));
+      int options = linux_low_ptrace_options (proc->attached);
+
+      linux_enable_event_reporting (lwpid, options);
+      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);
+      if (handle_extended_wait (child, wstat))
+       {
+         /* The event has been handled, so just return without
+            reporting it.  */
+         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)
-       debug_printf ("CB: No breakpoint found at %s for [%s]\n",
-                     paddress (lwp->stop_pc),
-                     target_pid_to_str (ptid_of (current_inferior)));
+       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.  */
+         if (debug_threads)
+           debug_printf ("LLW: resume_stop SIGSTOP caught for %s.\n",
+                         target_pid_to_str (ptid_of (thread)));
+       }
+      else if (stopping_threads != NOT_STOPPING_THREADS)
+       {
+         /* Stopping threads.  We don't want this SIGSTOP to end up
+            pending.  */
+         if (debug_threads)
+           debug_printf ("LLW: SIGSTOP caught for %s "
+                         "while stopping threads.\n",
+                         target_pid_to_str (ptid_of (thread)));
+         return NULL;
+       }
+      else
+       {
+         /* This is a delayed SIGSTOP.  Filter out the event.  */
+         if (debug_threads)
+           debug_printf ("LLW: %s %s, 0, 0 (discard delayed SIGSTOP)\n",
+                         child->stepping ? "step" : "continue",
+                         target_pid_to_str (ptid_of (thread)));
+
+         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.  */
 
-/* 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 and update current_inferior otherwise.  */
+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);
+
+      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;
@@ -1774,18 +2236,18 @@ linux_wait_for_event (ptid_t ptid, int *wstat, int options)
 
   /* 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_thread = (struct thread_info *)
-       find_inferior (&all_threads, status_pending_p_callback, &ptid);
+       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
@@ -1800,7 +2262,11 @@ 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)
        {
@@ -1814,146 +2280,158 @@ linux_wait_for_event (ptid_t ptid, int *wstat, int options)
       if (debug_threads)
        debug_printf ("Got an event from pending child %ld (%04x)\n",
                      lwpid_of (event_thread), event_child->status_pending);
-      *wstat = event_child->status_pending;
+      *wstatp = event_child->status_pending;
       event_child->status_pending_p = 0;
       event_child->status_pending = 0;
-      current_inferior = event_thread;
+      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)
-           debug_printf ("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.
 
-      event_thread = get_lwp_thread (event_child);
-      if (ptid_is_pid (ptid)
-         && ptid_get_pid (ptid) != ptid_get_pid (ptid_of (event_thread)))
-       {
-         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 = event_thread;
+      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)
-           debug_printf ("LWP %ld exiting\n", lwpid_of (event_thread));
-
-         /* If the last thread is exiting, just return.  */
-         if (last_thread_of_process_p (current_inferior))
-           {
-             if (debug_threads)
-               debug_printf ("LWP %ld is last lwp of process\n",
-                             lwpid_of (event_thread));
-             return lwpid_of (event_thread);
-           }
-
-         if (!non_stop)
            {
-             current_inferior = get_first_thread ();
-             if (debug_threads)
-               debug_printf ("Current inferior is now %ld\n",
-                             lwpid_of (current_inferior));
-           }
-         else
-           {
-             current_inferior = NULL;
-             if (debug_threads)
-               debug_printf ("Current inferior is now <NULL>\n");
+             debug_printf ("LLW: waitpid %ld received %s\n",
+                           (long) ret, status_to_str (*wstatp));
            }
 
-         /* If we were waiting for this particular child to do something...
-            well, it did something.  */
-         if (requested_child != NULL)
-           {
-             int lwpid = lwpid_of (event_thread);
-
-             /* 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_thread));
-         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)
-           debug_printf ("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;
        }
 
+      /* 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;
+    }
+
+  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);
     }
 
-  /* NOTREACHED */
-  return 0;
+  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.  */
@@ -1967,14 +2445,9 @@ count_events_callback (struct inferior_list_entry *entry, void *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;
@@ -1996,8 +2469,7 @@ 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)
@@ -2008,61 +2480,15 @@ select_event_lwp_callback (struct inferior_list_entry *entry, void *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 thread_info *thread = (struct thread_info *) entry;
-  struct lwp_info *lp = get_thread_lwp (thread);
-  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_threads, cancel_breakpoints_callback, NULL);
-}
-
 /* Select one LWP out of those that have events pending.  */
 
 static void
@@ -2070,28 +2496,40 @@ select_event_lwp (struct lwp_info **orig_lp)
 {
   int num_events = 0;
   int random_selector;
-  struct thread_info *event_thread;
-
-  /* Give preference to any LWP that is being single-stepped.  */
-  event_thread
-    = (struct thread_info *) find_inferior (&all_threads,
-                                           select_singlestep_lwp_callback,
-                                           NULL);
-  if (event_thread != 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)
-       debug_printf ("SEL: Select single-step %s\n",
-                     target_pid_to_str (ptid_of (event_thread)));
+      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.  */
+      /* 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));
 
@@ -2182,7 +2620,7 @@ static ptid_t linux_wait_1 (ptid_t ptid,
 static void
 linux_stabilize_threads (void)
 {
-  struct thread_info *save_inferior;
+  struct thread_info *saved_thread;
   struct thread_info *thread_stuck;
 
   thread_stuck
@@ -2197,7 +2635,7 @@ linux_stabilize_threads (void)
       return;
     }
 
-  save_inferior = current_inferior;
+  saved_thread = current_thread;
 
   stabilizing_threads = 1;
 
@@ -2218,13 +2656,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);
@@ -2236,7 +2674,7 @@ linux_stabilize_threads (void)
 
   stabilizing_threads = 0;
 
-  current_inferior = save_inferior;
+  current_thread = saved_thread;
 
   if (debug_threads)
     {
@@ -2250,6 +2688,35 @@ linux_stabilize_threads (void)
     }
 }
 
+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;
+}
+
+/* Return non-zero if WAITSTATUS reflects an extended linux
+   event.  Otherwise, return zero.  */
+
+static int
+extended_event_reported (const struct target_waitstatus *waitstatus)
+{
+  if (waitstatus == NULL)
+    return 0;
+
+  return (waitstatus->kind == TARGET_WAITKIND_FORKED);
+}
+
 /* Wait for process, returns status.  */
 
 static ptid_t
@@ -2278,40 +2745,11 @@ linux_wait_1 (ptid_t ptid,
   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
@@ -2322,70 +2760,99 @@ retry:
       pid = linux_wait_for_event (step_over_bkpt, &w, options & ~WNOHANG);
     }
 
-  if (pid == 0) /* only if TARGET_WNOHANG */
+  if (pid == 0)
+    {
+      gdb_assert (target_options & TARGET_WNOHANG);
+
+      if (debug_threads)
+       {
+         debug_printf ("linux_wait_1 ret = null_ptid, "
+                       "TARGET_WAITKIND_IGNORE\n");
+         debug_exit ();
+       }
+
+      ourstatus->kind = TARGET_WAITKIND_IGNORE;
+      return null_ptid;
+    }
+  else if (pid == -1)
     {
       if (debug_threads)
        {
-         debug_printf ("linux_wait_1 ret = null_ptid\n");
+         debug_printf ("linux_wait_1 ret = null_ptid, "
+                       "TARGET_WAITKIND_NO_RESUMED\n");
          debug_exit ();
        }
+
+      ourstatus->kind = TARGET_WAITKIND_NO_RESUMED;
       return null_ptid;
     }
 
-  event_child = get_thread_lwp (current_inferior);
-
-  /* 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.
+  event_child = get_thread_lwp (current_thread);
 
-     Report the exit status of the last thread to exit.  This matches
-     LinuxThreads' behavior.  */
-
-  if (last_thread_of_process_p (current_inferior))
+  /* 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)
-               {
-                 debug_printf ("linux_wait_1 ret = %s, exited with "
-                               "retcode %d\n",
-                               target_pid_to_str (ptid_of (current_inferior)),
-                               WEXITSTATUS (w));
-                 debug_exit ();
-               }
-           }
-         else
+         if (debug_threads)
            {
-             ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
-             ourstatus->value.sig = gdb_signal_from_host (WTERMSIG (w));
-
-             if (debug_threads)
-               {
-                 debug_printf ("linux_wait_1 ret = %s, terminated with "
-                               "signal %d\n",
-                               target_pid_to_str (ptid_of (current_inferior)),
-                               WTERMSIG (w));
-                 debug_exit ();
-               }
+             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 (current_inferior);
+         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
@@ -2459,20 +2926,21 @@ retry:
       if (debug_threads)
        debug_printf ("Got signal %d for LWP %ld.  Check if we need "
                      "to defer or adjust it.\n",
-                     WSTOPSIG (w), lwpid_of (current_inferior));
+                     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)
            debug_printf ("Signal %d for LWP %ld deferred (in jump pad)\n",
-                         WSTOPSIG (w), lwpid_of (current_inferior));
+                         WSTOPSIG (w), lwpid_of (current_thread));
 
          linux_resume_one_lwp (event_child, 0, 0, NULL);
-         goto retry;
+
+         return ignore_event (ourstatus);
        }
     }
 
@@ -2481,7 +2949,7 @@ retry:
       if (debug_threads)
        debug_printf ("LWP %ld was trying to move out of the jump pad (%d). "
                      "Check if we're already there.\n",
-                     lwpid_of (current_inferior),
+                     lwpid_of (current_thread),
                      event_child->collecting_fast_tracepoint);
 
       trace_event = 1;
@@ -2506,7 +2974,6 @@ retry:
                 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;
@@ -2543,11 +3010,11 @@ retry:
                    {
                      debug_printf ("linux_wait_1 ret = %s, stopped "
                                    "while stabilizing threads\n",
-                                   target_pid_to_str (ptid_of (current_inferior)));
+                                   target_pid_to_str (ptid_of (current_thread)));
                      debug_exit ();
                    }
 
-                 return ptid_of (current_inferior);
+                 return ptid_of (current_thread);
                }
            }
        }
@@ -2561,36 +3028,38 @@ retry:
      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)
        debug_printf ("Ignored signal %d for LWP %ld.\n",
-                     WSTOPSIG (w), lwpid_of (current_inferior));
+                     WSTOPSIG (w), lwpid_of (current_thread));
 
-      if (ptrace (PTRACE_GETSIGINFO, lwpid_of (current_inferior),
+      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
@@ -2607,14 +3076,15 @@ retry:
      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)
                       && gdb_condition_true_at_breakpoint (event_child->stop_pc)
-                      && gdb_no_commands_at_breakpoint (event_child->stop_pc)));
+                      && gdb_no_commands_at_breakpoint (event_child->stop_pc))
+                  || extended_event_reported (&event_child->waitstatus));
 
   run_breakpoint_commands (event_child->stop_pc);
 
@@ -2636,6 +3106,13 @@ retry:
                          paddress (event_child->stop_pc),
                          paddress (event_child->step_range_start),
                          paddress (event_child->step_range_end));
+         if (extended_event_reported (&event_child->waitstatus))
+           {
+             char *str = target_waitstatus_to_string (ourstatus);
+             debug_printf ("LWP %ld: extended event with waitstatus %s\n",
+                           lwpid_of (get_lwp_thread (event_child)), str);
+             xfree (str);
+           }
        }
 
       /* We're not reporting this breakpoint to GDB, so apply the
@@ -2645,7 +3122,7 @@ retry:
       if (the_low_target.set_pc != NULL)
        {
          struct regcache *regcache
-           = get_thread_regcache (current_inferior, 1);
+           = get_thread_regcache (current_thread, 1);
          (*the_low_target.set_pc) (regcache, event_child->stop_pc);
        }
 
@@ -2661,21 +3138,21 @@ retry:
        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)
            debug_printf ("GDB wanted to single-step, reporting event.\n");
          else if (!lwp_in_step_range (event_child))
            debug_printf ("Out of step range, reporting event.\n");
        }
-      if (event_child->stopped_by_watchpoint)
+      if (event_child->stop_reason == TARGET_STOPPED_BY_WATCHPOINT)
        debug_printf ("Stopped by watchpoint.\n");
-      if (gdb_breakpoint_here (event_child->stop_pc))
+      else if (gdb_breakpoint_here (event_child->stop_pc))
        debug_printf ("Stopped by GDB breakpoint.\n");
       if (debug_threads)
        debug_printf ("Hit a non-gdbserver trap event.\n");
@@ -2683,10 +3160,11 @@ retry:
 
   /* 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
@@ -2699,30 +3177,40 @@ retry:
 
          select_event_lwp (&event_child);
 
-         /* current_inferior and event_child must stay in sync.  */
-         current_inferior = get_lwp_thread (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_threads, 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
     {
@@ -2734,9 +3222,35 @@ retry:
        unstop_all_lwps (1, event_child);
     }
 
-  ourstatus->kind = TARGET_WAITKIND_STOPPED;
+  if (extended_event_reported (&event_child->waitstatus))
+    {
+      /* If the reported event is a fork, vfork or exec, let GDB know.  */
+      ourstatus->kind = event_child->waitstatus.kind;
+      ourstatus->value = event_child->waitstatus.value;
+
+      /* Clear the event lwp's waitstatus since we handled it already.  */
+      event_child->waitstatus.kind = TARGET_WAITKIND_IGNORE;
+    }
+  else
+    ourstatus->kind = TARGET_WAITKIND_STOPPED;
+
+  /* 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_inferior->last_resume_kind == resume_stop
+  if (current_thread->last_resume_kind == resume_stop
       && WSTOPSIG (w) == SIGSTOP)
     {
       /* A thread that has been requested to stop by GDB with vCont;t,
@@ -2744,14 +3258,14 @@ retry:
         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,
         but, it stopped for other reasons.  */
       ourstatus->value.sig = gdb_signal_from_host (WSTOPSIG (w));
     }
-  else
+  else if (ourstatus->kind == TARGET_WAITKIND_STOPPED)
     {
       ourstatus->value.sig = gdb_signal_from_host (WSTOPSIG (w));
     }
@@ -2761,12 +3275,12 @@ retry:
   if (debug_threads)
     {
       debug_printf ("linux_wait_1 ret = %s, %d, %d\n",
-                   target_pid_to_str (ptid_of (current_inferior)),
+                   target_pid_to_str (ptid_of (current_thread)),
                    ourstatus->kind, ourstatus->value.sig);
       debug_exit ();
     }
 
-  return ptid_of (current_inferior);
+  return ptid_of (current_thread);
 }
 
 /* Get rid of any pending event in the pipe.  */
@@ -2807,7 +3321,13 @@ linux_wait (ptid_t ptid,
   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.  */
@@ -2929,78 +3449,34 @@ 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 thread_info *thread = (struct thread_info *) entry;
-  struct lwp_info *lwp = get_thread_lwp (thread);
-  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)
-       debug_printf ("wait_for_sigstop: LWP %ld already stopped\n",
-                     lwpid_of (thread));
-      return;
-    }
+  int wstat;
+  int ret;
 
-  saved_inferior = current_inferior;
-  if (saved_inferior != NULL)
-    saved_tid = saved_inferior->entry.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 = thread->entry.id;
-
   if (debug_threads)
-    debug_printf ("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)
-       debug_printf ("LWP %ld stopped with signal %d\n",
-                     lwpid_of (thread), WSTOPSIG (wstat));
-
-      if (WSTOPSIG (wstat) != SIGSTOP)
-       {
-         if (debug_threads)
-           debug_printf ("LWP %ld stopped with non-sigstop status %06x\n",
-                         lwpid_of (thread), wstat);
-
-         lwp->status_pending_p = 1;
-         lwp->status_pending = wstat;
-       }
-    }
-  else
-    {
-      if (debug_threads)
-       debug_printf ("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)
@@ -3011,12 +3487,12 @@ wait_for_sigstop (struct inferior_list_entry *entry)
          /* 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);
        }
     }
 }
@@ -3039,7 +3515,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));
 }
@@ -3058,7 +3534,7 @@ 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))
     {
@@ -3124,7 +3600,7 @@ stop_all_lwps (int suspend, struct lwp_info *except)
     find_inferior (&all_threads, suspend_and_send_sigstop_callback, except);
   else
     find_inferior (&all_threads, send_sigstop_callback, except);
-  for_each_inferior (&all_threads, wait_for_sigstop);
+  wait_for_sigstop ();
   stopping_threads = NOT_STOPPING_THREADS;
 
   if (debug_threads)
@@ -3135,16 +3611,15 @@ stop_all_lwps (int suspend, struct lwp_info *except)
     }
 }
 
-/* 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 *thread = get_lwp_thread (lwp);
-  struct thread_info *saved_inferior;
+  struct thread_info *saved_thread;
   int fast_tp_collecting;
 
   if (lwp->stopped == 0)
@@ -3193,8 +3668,8 @@ linux_resume_one_lwp (struct lwp_info *lwp,
       return;
     }
 
-  saved_inferior = current_inferior;
-  current_inferior = thread;
+  saved_thread = current_thread;
+  current_thread = thread;
 
   if (debug_threads)
     debug_printf ("Resuming lwp %ld (%s, signal %d, stop %s)\n",
@@ -3255,8 +3730,11 @@ linux_resume_one_lwp (struct lwp_info *lwp,
       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;
@@ -3279,11 +3757,17 @@ linux_resume_one_lwp (struct lwp_info *lwp,
       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);
-      debug_printf ("  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
@@ -3313,8 +3797,6 @@ linux_resume_one_lwp (struct lwp_info *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 (thread),
          (PTRACE_TYPE_ARG3) 0,
@@ -3322,21 +3804,70 @@ linux_resume_one_lwp (struct lwp_info *lwp,
             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;
+}
+
+/* Like linux_resume_one_lwp_throw, but no error is thrown if the LWP
+   disappears while we try to resume it.  */
 
-      perror_with_name ("ptrace");
+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
@@ -3435,7 +3966,7 @@ resume_status_pending_p (struct inferior_list_entry *entry, void *flag_p)
   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;
@@ -3451,7 +3982,7 @@ need_step_over_p (struct inferior_list_entry *entry, void *dummy)
 {
   struct thread_info *thread = (struct thread_info *) entry;
   struct lwp_info *lwp = get_thread_lwp (thread);
-  struct thread_info *saved_inferior;
+  struct thread_info *saved_thread;
   CORE_ADDR pc;
 
   /* LWPs which will not be resumed are not interesting, because we
@@ -3520,8 +4051,8 @@ need_step_over_p (struct inferior_list_entry *entry, void *dummy)
       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))
@@ -3538,7 +4069,7 @@ need_step_over_p (struct inferior_list_entry *entry, void *dummy)
                          " 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
@@ -3550,7 +4081,7 @@ need_step_over_p (struct inferior_list_entry *entry, void *dummy)
 
          /* 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;
@@ -3558,7 +4089,7 @@ need_step_over_p (struct inferior_list_entry *entry, void *dummy)
        }
     }
 
-  current_inferior = saved_inferior;
+  current_thread = saved_thread;
 
   if (debug_threads)
     debug_printf ("Need step over [LWP %ld]? No, no breakpoint found"
@@ -3590,7 +4121,7 @@ static int
 start_step_over (struct lwp_info *lwp)
 {
   struct thread_info *thread = get_lwp_thread (lwp);
-  struct thread_info *saved_inferior;
+  struct thread_info *saved_thread;
   CORE_ADDR pc;
   int step;
 
@@ -3610,8 +4141,8 @@ start_step_over (struct lwp_info *lwp)
      shouldn't care about.  */
   pc = get_pc (lwp);
 
-  saved_inferior = current_inferior;
-  current_inferior = thread;
+  saved_thread = current_thread;
+  current_thread = thread;
 
   lwp->bp_reinsert = pc;
   uninsert_breakpoints_at (pc);
@@ -3628,7 +4159,7 @@ 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);
 
@@ -4057,19 +4588,14 @@ regsets_fetch_inferior_registers (struct regsets_info *regsets_info,
   int pid;
   struct iovec iov;
 
-  regset = regsets_info->regsets;
-
-  pid = lwpid_of (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);
 
@@ -4096,8 +4622,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
            {
@@ -4107,10 +4637,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)
@@ -4128,19 +4660,15 @@ regsets_store_inferior_registers (struct regsets_info *regsets_info,
   int pid;
   struct iovec iov;
 
-  regset = regsets_info->regsets;
-
-  pid = lwpid_of (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);
 
@@ -4186,8 +4714,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)
            {
@@ -4205,7 +4731,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)
@@ -4275,7 +4800,7 @@ fetch_register (const struct usrregs_info *usrregs,
          & -sizeof (PTRACE_XFER_TYPE));
   buf = alloca (size);
 
-  pid = lwpid_of (current_inferior);
+  pid = lwpid_of (current_thread);
   for (i = 0; i < size; i += sizeof (PTRACE_XFER_TYPE))
     {
       errno = 0;
@@ -4325,7 +4850,7 @@ store_register (const struct usrregs_info *usrregs,
   else
     collect_register (regcache, regno, buf);
 
-  pid = lwpid_of (current_inferior);
+  pid = lwpid_of (current_thread);
   for (i = 0; i < size; i += sizeof (PTRACE_XFER_TYPE))
     {
       errno = 0;
@@ -4465,7 +4990,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 (current_inferior);
+  int pid = lwpid_of (current_thread);
   register PTRACE_XFER_TYPE *buffer;
   register CORE_ADDR addr;
   register int count;
@@ -4566,7 +5091,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 (current_inferior);
+  int pid = lwpid_of (current_thread);
 
   if (len == 0)
     {
@@ -4584,8 +5109,8 @@ linux_write_memory (CORE_ADDR memaddr, const unsigned char *myaddr, int len)
        val = val & 0xffff;
       else if (len == 3)
        val = val & 0xffffff;
-      debug_printf ("Writing %0*x to 0x%08lx\n", 2 * ((len < 4) ? len : 4),
-                   val, (long)memaddr);
+      debug_printf ("Writing %0*x to 0x%08lx in process %d\n",
+                   2 * ((len < 4) ? len : 4), val, (long)memaddr, pid);
     }
 
   /* Fill start and end extra bytes of buffer with existing memory data.  */
@@ -4641,7 +5166,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
@@ -4656,16 +5181,9 @@ linux_request_interrupt (void)
 {
   extern unsigned long signal_pid;
 
-  if (!ptid_equal (cont_thread, null_ptid)
-      && !ptid_equal (cont_thread, minus_one_ptid))
-    {
-      int lwpid;
-
-      lwpid = lwpid_of (current_inferior);
-      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
@@ -4676,7 +5194,7 @@ linux_read_auxv (CORE_ADDR offset, unsigned char *myaddr, unsigned int len)
 {
   char filename[PATH_MAX];
   int fd, n;
-  int pid = lwpid_of (current_inferior);
+  int pid = lwpid_of (current_thread);
 
   xsnprintf (filename, sizeof filename, "/proc/%d/auxv", pid);
 
@@ -4700,37 +5218,103 @@ 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);
+  if (type == raw_bkpt_type_sw)
+    return insert_memory_breakpoint (bp);
+  else if (the_low_target.insert_point != NULL)
+    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);
+  if (type == raw_bkpt_type_sw)
+    return remove_memory_breakpoint (bp);
+  else if (the_low_target.remove_point != NULL)
+    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;
+}
+
+/* Implement the supports_conditional_breakpoints target_ops
+   method.  */
+
+static int
+linux_supports_conditional_breakpoints (void)
+{
+  /* GDBserver needs to step over the breakpoint if the condition is
+     false.  GDBserver software single step is too simple, so disable
+     conditional breakpoints if the target doesn't have hardware single
+     step.  */
+  return can_hardware_single_step ();
+}
+
 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;
 }
@@ -4751,7 +5335,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 (current_thread);
 
   errno = 0;
 
@@ -4820,10 +5404,10 @@ 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 (current_inferior);
+  pid = lwpid_of (current_thread);
 
   if (debug_threads)
     debug_printf ("%s siginfo for lwp %d.\n",
@@ -4897,7 +5481,7 @@ 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)
     debug_printf ("linux_async (%d), previous=%d\n",
@@ -4914,7 +5498,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);
@@ -4947,6 +5538,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;
 }
 
@@ -4956,6 +5551,64 @@ linux_supports_multi_process (void)
   return 1;
 }
 
+/* Check if fork events are supported.  */
+
+static int
+linux_supports_fork_events (void)
+{
+  return linux_supports_tracefork ();
+}
+
+/* Check if vfork events are supported.  */
+
+static int
+linux_supports_vfork_events (void)
+{
+  return linux_supports_tracefork ();
+}
+
+/* Callback for 'find_inferior'.  Set the (possibly changed) ptrace
+   options for the specified lwp.  */
+
+static int
+reset_lwp_ptrace_options_callback (struct inferior_list_entry *entry,
+                                  void *args)
+{
+  struct thread_info *thread = (struct thread_info *) entry;
+  struct lwp_info *lwp = get_thread_lwp (thread);
+
+  if (!lwp->stopped)
+    {
+      /* Stop the lwp so we can modify its ptrace options.  */
+      lwp->must_set_ptrace_flags = 1;
+      linux_stop_lwp (lwp);
+    }
+  else
+    {
+      /* Already stopped; go ahead and set the ptrace options.  */
+      struct process_info *proc = find_process_pid (pid_of (thread));
+      int options = linux_low_ptrace_options (proc->attached);
+
+      linux_enable_event_reporting (lwpid_of (thread), options);
+      lwp->must_set_ptrace_flags = 0;
+    }
+
+  return 0;
+}
+
+/* Target hook for 'handle_new_gdb_connection'.  Causes a reset of the
+   ptrace flags for all inferiors.  This is in case the new GDB connection
+   doesn't support the same set of events that the previous one did.  */
+
+static void
+linux_handle_new_gdb_connection (void)
+{
+  pid_t pid;
+
+  /* Request that all the lwps reset their ptrace options.  */
+  find_inferior (&all_threads, reset_lwp_ptrace_options_callback , &pid);
+}
+
 static int
 linux_supports_disable_randomization (void)
 {
@@ -5037,7 +5690,7 @@ linux_qxfer_spu (const char *annex, unsigned char *readbuf,
                 unsigned const char *writebuf,
                 CORE_ADDR offset, int len)
 {
-  long pid = lwpid_of (current_inferior);
+  long pid = lwpid_of (current_thread);
   char buf[128];
   int fd = 0;
   int ret = 0;
@@ -5120,7 +5773,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;
@@ -5548,7 +6201,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;
 
@@ -5587,7 +6240,7 @@ linux_qxfer_libraries_svr4 (const char *annex, unsigned char *readbuf,
   if (readbuf == NULL)
     return -1;
 
-  pid = lwpid_of (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;
@@ -5604,9 +6257,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
        {
@@ -5757,13 +6410,13 @@ linux_qxfer_libraries_svr4 (const char *annex, unsigned char *readbuf,
 /* 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);
@@ -5791,12 +6444,13 @@ 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 = NULL;
+  btrace_data_init (&btrace);
+
   err = linux_read_btrace (&btrace, tinfo, type);
   if (err != BTRACE_ERR_NONE)
     {
@@ -5805,24 +6459,80 @@ linux_low_read_btrace (struct btrace_target_info *tinfo, struct buffer *buffer,
       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;
     }
 
-  buffer_grow_str (buffer, "<!DOCTYPE btrace SYSTEM \"btrace.dtd\">\n");
-  buffer_grow_str (buffer, "<btrace version=\"1.0\">\n");
+  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;
 
-  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));
+  buffer_grow_str (buffer, "<!DOCTYPE btrace-conf SYSTEM \"btrace-conf.dtd\">\n");
+  buffer_grow_str (buffer, "<btrace-conf version=\"1.0\">\n");
 
-  buffer_grow_str0 (buffer, "</btrace>\n");
+  conf = linux_btrace_conf (tinfo);
+  if (conf != NULL)
+    {
+      switch (conf->format)
+       {
+       case BTRACE_FORMAT_NONE:
+         break;
 
-  VEC_free (btrace_block_s, btrace);
+       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;
+       }
+    }
 
+  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,
@@ -5842,8 +6552,14 @@ 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_supports_conditional_breakpoints,
   linux_stopped_by_watchpoint,
   linux_stopped_data_address,
 #if defined(__UCLIBC__) && defined(HAS_NOMMU)        \
@@ -5866,6 +6582,9 @@ static struct target_ops linux_target_ops = {
   linux_async,
   linux_start_non_stop,
   linux_supports_multi_process,
+  linux_supports_fork_events,
+  linux_supports_vfork_events,
+  linux_handle_new_gdb_connection,
 #ifdef USE_THREAD_DB
   thread_db_handle_monitor_command,
 #else
@@ -5881,7 +6600,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,
@@ -5894,13 +6612,16 @@ static struct target_ops linux_target_ops = {
   linux_low_enable_btrace,
   linux_low_disable_btrace,
   linux_low_read_btrace,
+  linux_low_btrace_conf,
 #else
   NULL,
   NULL,
   NULL,
   NULL,
+  NULL,
 #endif
   linux_supports_range_stepping,
+  linux_proc_pid_to_exec_file,
 };
 
 static void
@@ -5941,4 +6662,6 @@ initialize_low (void)
   sigaction (SIGCHLD, &sigchld_action, NULL);
 
   initialize_low_arch ();
+
+  linux_check_ptrace_features ();
 }
This page took 0.067912 seconds and 4 git commands to generate.