]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - gdb/linux-nat.c
Warn when accessing binaries from remote targets
[thirdparty/binutils-gdb.git] / gdb / linux-nat.c
index 5bb89c1894706339a624a98cf36cf133fa5949e9..19e242a5ece718dcadf998bff1261a208949e013 100644 (file)
@@ -1,6 +1,6 @@
 /* GNU/Linux native-dependent code common to multiple platforms.
 
-   Copyright (C) 2001-2014 Free Software Foundation, Inc.
+   Copyright (C) 2001-2015 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 
 #include "defs.h"
 #include "inferior.h"
+#include "infrun.h"
 #include "target.h"
 #include "nat/linux-nat.h"
 #include "nat/linux-waitpid.h"
-#include <string.h>
 #include "gdb_wait.h"
-#include "gdb_assert.h"
 #ifdef HAVE_TKILL_SYSCALL
 #include <unistd.h>
 #include <sys/syscall.h>
 #endif
-#include <sys/ptrace.h>
+#include "nat/gdb_ptrace.h"
 #include "linux-nat.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 "linux-fork.h"
 #include "gdbthread.h"
 #include "gdbcmd.h"
 #include <sys/types.h>
 #include <dirent.h>
 #include "xml-support.h"
-#include "terminal.h"
 #include <sys/vfs.h>
 #include "solib.h"
-#include "linux-osdata.h"
+#include "nat/linux-osdata.h"
 #include "linux-tdep.h"
 #include "symfile.h"
 #include "agent.h"
 #include "tracepoint.h"
-#include "exceptions.h"
 #include "buffer.h"
 #include "target-descriptions.h"
 #include "filestuff.h"
+#include "objfiles.h"
+#include "nat/linux-namespaces.h"
+#include "fileio.h"
 
 #ifndef SPUFS_MAGIC
 #define SPUFS_MAGIC 0x23c9b64e
 #endif
 
-#ifdef HAVE_PERSONALITY
-# include <sys/personality.h>
-# if !HAVE_DECL_ADDR_NO_RANDOMIZE
-#  define ADDR_NO_RANDOMIZE 0x0040000
-# endif
-#endif /* HAVE_PERSONALITY */
-
 /* This comment documents high-level logic of this file.
 
 Waiting for events in sync mode
@@ -171,6 +165,9 @@ blocked.  */
 #define O_LARGEFILE 0
 #endif
 
+/* Does the current host support PTRACE_GETREGSET?  */
+enum tribool have_ptrace_getregset = TRIBOOL_UNKNOWN;
+
 /* The single-threaded native GNU/Linux target_ops.  We save a pointer for
    the use of the multi-threaded target.  */
 static struct target_ops *linux_ops;
@@ -200,6 +197,10 @@ static int (*linux_nat_siginfo_fixup) (siginfo_t *,
    Called by our to_xfer_partial.  */
 static target_xfer_partial_ftype *super_xfer_partial;
 
+/* The saved to_close method, inherited from inf-ptrace.c.
+   Called by our to_close.  */
+static void (*super_close) (struct target_ops *);
+
 static unsigned int debug_linux_nat;
 static void
 show_debug_linux_nat (struct ui_file *file, int from_tty,
@@ -223,6 +224,9 @@ struct simple_pid_list *stopped_pids;
    event loop.  */
 static int linux_nat_event_pipe[2] = { -1, -1 };
 
+/* True if we're currently in async mode.  */
+#define linux_is_async_p() (linux_nat_event_pipe[0] != -1)
+
 /* Flush the event pipe.  */
 
 static void
@@ -265,6 +269,7 @@ async_file_mark (void)
 static int kill_lwp (int lwpid, int signo);
 
 static int stop_callback (struct lwp_info *lp, void *data);
+static int resume_stopped_resumed_lwps (struct lwp_info *lp, void *data);
 
 static void block_child_signals (sigset_t *prev_mask);
 static void restore_child_signals_mask (sigset_t *prev_mask);
@@ -275,6 +280,56 @@ static void purge_lwp_list (int pid);
 static void delete_lwp (ptid_t ptid);
 static struct lwp_info *find_lwp_pid (ptid_t ptid);
 
+static int lwp_status_pending_p (struct lwp_info *lp);
+
+static int check_stopped_by_breakpoint (struct lwp_info *lp);
+static int sigtrap_is_event (int status);
+static int (*linux_nat_status_is_event) (int status) = sigtrap_is_event;
+
+\f
+/* LWP accessors.  */
+
+/* See nat/linux-nat.h.  */
+
+ptid_t
+ptid_of_lwp (struct lwp_info *lwp)
+{
+  return lwp->ptid;
+}
+
+/* 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;
+}
+
 \f
 /* Trivial list manipulation functions to keep track of a list of
    new stopped processes.  */
@@ -318,26 +373,49 @@ pull_pid_from_list (struct simple_pid_list **listp, int pid, int *statusp)
   return 0;
 }
 
+/* Return the ptrace options that we want to try to enable.  */
+
+static int
+linux_nat_ptrace_options (int attached)
+{
+  int options = 0;
+
+  if (!attached)
+    options |= PTRACE_O_EXITKILL;
+
+  options |= (PTRACE_O_TRACESYSGOOD
+             | PTRACE_O_TRACEVFORKDONE
+             | PTRACE_O_TRACEVFORK
+             | PTRACE_O_TRACEFORK
+             | PTRACE_O_TRACEEXEC);
+
+  return options;
+}
+
 /* Initialize ptrace warnings and check for supported ptrace
-   features given PID.  */
+   features given PID.
+
+   ATTACHED should be nonzero iff we attached to the inferior.  */
 
 static void
-linux_init_ptrace (pid_t pid)
+linux_init_ptrace (pid_t pid, int attached)
 {
-  linux_enable_event_reporting (pid);
+  int options = linux_nat_ptrace_options (attached);
+
+  linux_enable_event_reporting (pid, options);
   linux_ptrace_init_warnings ();
 }
 
 static void
 linux_child_post_attach (struct target_ops *self, int pid)
 {
-  linux_init_ptrace (pid);
+  linux_init_ptrace (pid, 1);
 }
 
 static void
 linux_child_post_startup_inferior (struct target_ops *self, ptid_t ptid)
 {
-  linux_init_ptrace (ptid_get_pid (ptid));
+  linux_init_ptrace (ptid_get_pid (ptid), 0);
 }
 
 /* Return the number of known LWPs in the tgid given by PID.  */
@@ -365,166 +443,90 @@ delete_lwp_cleanup (void *lp_voidp)
   delete_lwp (lp->ptid);
 }
 
+/* Target hook for follow_fork.  On entry inferior_ptid must be the
+   ptid of the followed inferior.  At return, inferior_ptid will be
+   unchanged.  */
+
 static int
 linux_child_follow_fork (struct target_ops *ops, int follow_child,
                         int detach_fork)
 {
-  int has_vforked;
-  int parent_pid, child_pid;
-
-  has_vforked = (inferior_thread ()->pending_follow.kind
-                == TARGET_WAITKIND_VFORKED);
-  parent_pid = ptid_get_lwp (inferior_ptid);
-  if (parent_pid == 0)
-    parent_pid = ptid_get_pid (inferior_ptid);
-  child_pid
-    = ptid_get_pid (inferior_thread ()->pending_follow.value.related_pid);
-
-  if (has_vforked
-      && !non_stop /* Non-stop always resumes both branches.  */
-      && (!target_is_async_p () || sync_execution)
-      && !(follow_child || detach_fork || sched_multi))
-    {
-      /* The parent stays blocked inside the vfork syscall until the
-        child execs or exits.  If we don't let the child run, then
-        the parent stays blocked.  If we're telling the parent to run
-        in the foreground, the user will not be able to ctrl-c to get
-        back the terminal, effectively hanging the debug session.  */
-      fprintf_filtered (gdb_stderr, _("\
-Can not resume the parent process over vfork in the foreground while\n\
-holding the child stopped.  Try \"set detach-on-fork\" or \
-\"set schedule-multiple\".\n"));
-      /* FIXME output string > 80 columns.  */
-      return 1;
-    }
-
-  if (! follow_child)
+  if (!follow_child)
     {
       struct lwp_info *child_lp = NULL;
+      int status = W_STOPCODE (0);
+      struct cleanup *old_chain;
+      int has_vforked;
+      ptid_t parent_ptid, child_ptid;
+      int parent_pid, child_pid;
+
+      has_vforked = (inferior_thread ()->pending_follow.kind
+                    == TARGET_WAITKIND_VFORKED);
+      parent_ptid = inferior_ptid;
+      child_ptid = inferior_thread ()->pending_follow.value.related_pid;
+      parent_pid = ptid_get_lwp (parent_ptid);
+      child_pid = ptid_get_lwp (child_ptid);
 
       /* We're already attached to the parent, by default.  */
+      old_chain = save_inferior_ptid ();
+      inferior_ptid = child_ptid;
+      child_lp = add_lwp (inferior_ptid);
+      child_lp->stopped = 1;
+      child_lp->last_resume_kind = resume_stop;
 
       /* Detach new forked process?  */
       if (detach_fork)
        {
-         struct cleanup *old_chain;
-
-         /* Before detaching from the child, remove all breakpoints
-            from it.  If we forked, then this has already been taken
-            care of by infrun.c.  If we vforked however, any
-            breakpoint inserted in the parent is visible in the
-            child, even those added while stopped in a vfork
-            catchpoint.  This will remove the breakpoints from the
-            parent also, but they'll be reinserted below.  */
-         if (has_vforked)
-           {
-             /* keep breakpoints list in sync.  */
-             remove_breakpoints_pid (ptid_get_pid (inferior_ptid));
-           }
-
-         if (info_verbose || debug_linux_nat)
-           {
-             target_terminal_ours ();
-             fprintf_filtered (gdb_stdlog,
-                               "Detaching after fork from "
-                               "child process %d.\n",
-                               child_pid);
-           }
-
-         old_chain = save_inferior_ptid ();
-         inferior_ptid = ptid_build (child_pid, child_pid, 0);
-
-         child_lp = add_lwp (inferior_ptid);
-         child_lp->stopped = 1;
-         child_lp->last_resume_kind = resume_stop;
          make_cleanup (delete_lwp_cleanup, child_lp);
 
          if (linux_nat_prepare_to_resume != NULL)
            linux_nat_prepare_to_resume (child_lp);
-         ptrace (PTRACE_DETACH, child_pid, 0, 0);
 
-         do_cleanups (old_chain);
-       }
-      else
-       {
-         struct inferior *parent_inf, *child_inf;
-         struct cleanup *old_chain;
-
-         /* Add process to GDB's tables.  */
-         child_inf = add_inferior (child_pid);
-
-         parent_inf = current_inferior ();
-         child_inf->attach_flag = parent_inf->attach_flag;
-         copy_terminal_info (child_inf, parent_inf);
-         child_inf->gdbarch = parent_inf->gdbarch;
-         copy_inferior_target_desc_info (child_inf, parent_inf);
-
-         old_chain = save_inferior_ptid ();
-         save_current_program_space ();
-
-         inferior_ptid = ptid_build (child_pid, child_pid, 0);
-         add_thread (inferior_ptid);
-         child_lp = add_lwp (inferior_ptid);
-         child_lp->stopped = 1;
-         child_lp->last_resume_kind = resume_stop;
-         child_inf->symfile_flags = SYMFILE_NO_READ;
-
-         /* If this is a vfork child, then the address-space is
-            shared with the parent.  */
-         if (has_vforked)
+         /* When debugging an inferior in an architecture that supports
+            hardware single stepping on a kernel without commit
+            6580807da14c423f0d0a708108e6df6ebc8bc83d, the vfork child
+            process starts with the TIF_SINGLESTEP/X86_EFLAGS_TF bits
+            set if the parent process had them set.
+            To work around this, single step the child process
+            once before detaching to clear the flags.  */
+
+         if (!gdbarch_software_single_step_p (target_thread_architecture
+                                                  (child_lp->ptid)))
            {
-             child_inf->pspace = parent_inf->pspace;
-             child_inf->aspace = parent_inf->aspace;
-
-             /* The parent will be frozen until the child is done
-                with the shared region.  Keep track of the
-                parent.  */
-             child_inf->vfork_parent = parent_inf;
-             child_inf->pending_detach = 0;
-             parent_inf->vfork_child = child_inf;
-             parent_inf->pending_detach = 0;
+             linux_disable_event_reporting (child_pid);
+             if (ptrace (PTRACE_SINGLESTEP, child_pid, 0, 0) < 0)
+               perror_with_name (_("Couldn't do single step"));
+             if (my_waitpid (child_pid, &status, 0) < 0)
+               perror_with_name (_("Couldn't wait vfork process"));
            }
-         else
+
+         if (WIFSTOPPED (status))
            {
-             child_inf->aspace = new_address_space ();
-             child_inf->pspace = add_program_space (child_inf->aspace);
-             child_inf->removable = 1;
-             set_current_program_space (child_inf->pspace);
-             clone_program_space (child_inf->pspace, parent_inf->pspace);
-
-             /* Let the shared library layer (solib-svr4) learn about
-                this new process, relocate the cloned exec, pull in
-                shared libraries, and install the solib event
-                breakpoint.  If a "cloned-VM" event was propagated
-                better throughout the core, this wouldn't be
-                required.  */
-             solib_create_inferior_hook (0);
+             int signo;
+
+             signo = WSTOPSIG (status);
+             if (signo != 0
+                 && !signal_pass_state (gdb_signal_from_host (signo)))
+               signo = 0;
+             ptrace (PTRACE_DETACH, child_pid, 0, signo);
            }
 
+         /* Resets value of inferior_ptid to parent ptid.  */
+         do_cleanups (old_chain);
+       }
+      else
+       {
          /* Let the thread_db layer learn about this new process.  */
          check_for_thread_db ();
-
-         do_cleanups (old_chain);
        }
 
+      do_cleanups (old_chain);
+
       if (has_vforked)
        {
          struct lwp_info *parent_lp;
-         struct inferior *parent_inf;
 
-         parent_inf = current_inferior ();
-
-         /* If we detached from the child, then we have to be careful
-            to not insert breakpoints in the parent until the child
-            is done with the shared memory region.  However, if we're
-            staying attached to the child, then we can and should
-            insert breakpoints, so that we can debug it.  A
-            subsequent child exec or exit is enough to know when does
-            the child stops using the parent's address space.  */
-         parent_inf->waiting_for_vfork_done = detach_fork;
-         parent_inf->pspace->breakpoints_not_allowed = detach_fork;
-
-         parent_lp = find_lwp_pid (pid_to_ptid (parent_pid));
+         parent_lp = find_lwp_pid (parent_ptid);
          gdb_assert (linux_supports_tracefork () >= 0);
 
          if (linux_supports_tracevforkdone ())
@@ -588,105 +590,19 @@ holding the child stopped.  Try \"set detach-on-fork\" or \
 
              /* If we're in async mode, need to tell the event loop
                 there's something here to process.  */
-             if (target_can_async_p ())
+             if (target_is_async_p ())
                async_file_mark ();
            }
        }
     }
   else
     {
-      struct inferior *parent_inf, *child_inf;
       struct lwp_info *child_lp;
-      struct program_space *parent_pspace;
-
-      if (info_verbose || debug_linux_nat)
-       {
-         target_terminal_ours ();
-         if (has_vforked)
-           fprintf_filtered (gdb_stdlog,
-                             _("Attaching after process %d "
-                               "vfork to child process %d.\n"),
-                             parent_pid, child_pid);
-         else
-           fprintf_filtered (gdb_stdlog,
-                             _("Attaching after process %d "
-                               "fork to child process %d.\n"),
-                             parent_pid, child_pid);
-       }
-
-      /* Add the new inferior first, so that the target_detach below
-        doesn't unpush the target.  */
 
-      child_inf = add_inferior (child_pid);
-
-      parent_inf = current_inferior ();
-      child_inf->attach_flag = parent_inf->attach_flag;
-      copy_terminal_info (child_inf, parent_inf);
-      child_inf->gdbarch = parent_inf->gdbarch;
-      copy_inferior_target_desc_info (child_inf, parent_inf);
-
-      parent_pspace = parent_inf->pspace;
-
-      /* If we're vforking, we want to hold on to the parent until the
-        child exits or execs.  At child exec or exit time we can
-        remove the old breakpoints from the parent and detach or
-        resume debugging it.  Otherwise, detach the parent now; we'll
-        want to reuse it's program/address spaces, but we can't set
-        them to the child before removing breakpoints from the
-        parent, otherwise, the breakpoints module could decide to
-        remove breakpoints from the wrong process (since they'd be
-        assigned to the same address space).  */
-
-      if (has_vforked)
-       {
-         gdb_assert (child_inf->vfork_parent == NULL);
-         gdb_assert (parent_inf->vfork_child == NULL);
-         child_inf->vfork_parent = parent_inf;
-         child_inf->pending_detach = 0;
-         parent_inf->vfork_child = child_inf;
-         parent_inf->pending_detach = detach_fork;
-         parent_inf->waiting_for_vfork_done = 0;
-       }
-      else if (detach_fork)
-       target_detach (NULL, 0);
-
-      /* Note that the detach above makes PARENT_INF dangling.  */
-
-      /* Add the child thread to the appropriate lists, and switch to
-        this new thread, before cloning the program space, and
-        informing the solib layer about this new process.  */
-
-      inferior_ptid = ptid_build (child_pid, child_pid, 0);
-      add_thread (inferior_ptid);
       child_lp = add_lwp (inferior_ptid);
       child_lp->stopped = 1;
       child_lp->last_resume_kind = resume_stop;
 
-      /* If this is a vfork child, then the address-space is shared
-        with the parent.  If we detached from the parent, then we can
-        reuse the parent's program/address spaces.  */
-      if (has_vforked || detach_fork)
-       {
-         child_inf->pspace = parent_pspace;
-         child_inf->aspace = child_inf->pspace->aspace;
-       }
-      else
-       {
-         child_inf->aspace = new_address_space ();
-         child_inf->pspace = add_program_space (child_inf->aspace);
-         child_inf->removable = 1;
-         child_inf->symfile_flags = SYMFILE_NO_READ;
-         set_current_program_space (child_inf->pspace);
-         clone_program_space (child_inf->pspace, parent_pspace);
-
-         /* Let the shared library layer (solib-svr4) learn about
-            this new process, relocate the cloned exec, pull in
-            shared libraries, and install the solib event breakpoint.
-            If a "cloned-VM" event was propagated better throughout
-            the core, this wouldn't be required.  */
-         solib_create_inferior_hook (0);
-       }
-
       /* Let the thread_db layer learn about this new process.  */
       check_for_thread_db ();
     }
@@ -845,33 +761,9 @@ linux_nat_pass_signals (struct target_ops *self,
 static int stop_wait_callback (struct lwp_info *lp, void *data);
 static int linux_thread_alive (ptid_t ptid);
 static char *linux_child_pid_to_exec_file (struct target_ops *self, int pid);
+static int resume_stopped_resumed_lwps (struct lwp_info *lp, void *data);
 
 \f
-/* Convert wait status STATUS to a string.  Used for printing debug
-   messages only.  */
-
-static char *
-status_to_str (int status)
-{
-  static char buf[64];
-
-  if (WIFSTOPPED (status))
-    {
-      if (WSTOPSIG (status) == SYSCALL_SIGTRAP)
-       snprintf (buf, sizeof (buf), "%s (stopped at syscall)",
-                 strsignal (SIGTRAP));
-      else
-       snprintf (buf, sizeof (buf), "%s (stopped)",
-                 strsignal (WSTOPSIG (status)));
-    }
-  else if (WIFSIGNALED (status))
-    snprintf (buf, sizeof (buf), "%s (terminated)",
-             strsignal (WTERMSIG (status)));
-  else
-    snprintf (buf, sizeof (buf), "%d (exited)", WEXITSTATUS (status));
-
-  return buf;
-}
 
 /* Destroy and free LP.  */
 
@@ -1012,14 +904,11 @@ find_lwp_pid (ptid_t ptid)
   return NULL;
 }
 
-/* Call CALLBACK with its second argument set to DATA for every LWP in
-   the list.  If CALLBACK returns 1 for a particular LWP, return a
-   pointer to the structure describing that LWP immediately.
-   Otherwise return NULL.  */
+/* See nat/linux-nat.h.  */
 
 struct lwp_info *
 iterate_over_lwps (ptid_t filter,
-                  int (*callback) (struct lwp_info *, void *),
+                  iterate_over_lwps_ftype callback,
                   void *data)
 {
   struct lwp_info *lp, *lpnext;
@@ -1030,7 +919,7 @@ iterate_over_lwps (ptid_t filter,
 
       if (ptid_match (lp->ptid, filter))
        {
-         if ((*callback) (lp, data))
+         if ((*callback) (lp, data) != 0)
            return lp;
        }
     }
@@ -1172,13 +1061,12 @@ lin_lwp_attach_lwp (ptid_t ptid)
   lp = find_lwp_pid (ptid);
   lwpid = ptid_get_lwp (ptid);
 
-  /* We assume that we're already attached to any LWP that has an id
-     equal to the overall process id, and to any LWP that is already
+  /* We assume that we're already attached to any LWP that is already
      in our list of LWPs.  If we're not seeing exit events from threads
      and we've had PID wraparound since we last tried to stop all threads,
      this assumption might be wrong; fortunately, this is very unlikely
      to happen.  */
-  if (lwpid != ptid_get_pid (ptid) && lp == NULL)
+  if (lp == NULL)
     {
       int status, cloned = 0, signalled = 0;
 
@@ -1196,22 +1084,50 @@ lin_lwp_attach_lwp (ptid_t ptid)
                  /* We've already seen this thread stop, but we
                     haven't seen the PTRACE_EVENT_CLONE extended
                     event yet.  */
-                 return 0;
+                 if (debug_linux_nat)
+                   fprintf_unfiltered (gdb_stdlog,
+                                       "LLAL: attach failed, but already seen "
+                                       "this thread %s stop\n",
+                                       target_pid_to_str (ptid));
+                 return 1;
                }
              else
                {
                  int new_pid;
                  int status;
 
-                 /* See if we've got a stop for this new child
-                    pending.  If so, we're already attached.  */
+                 if (debug_linux_nat)
+                   fprintf_unfiltered (gdb_stdlog,
+                                       "LLAL: attach failed, and haven't seen "
+                                       "this thread %s stop yet\n",
+                                       target_pid_to_str (ptid));
+
+                 /* We may or may not be attached to the LWP already.
+                    Try waitpid on it.  If that errors, we're not
+                    attached to the LWP yet.  Otherwise, we're
+                    already attached.  */
+                 gdb_assert (lwpid > 0);
                  new_pid = my_waitpid (lwpid, &status, WNOHANG);
                  if (new_pid == -1 && errno == ECHILD)
                    new_pid = my_waitpid (lwpid, &status, __WCLONE | WNOHANG);
                  if (new_pid != -1)
                    {
-                     if (WIFSTOPPED (status))
-                       add_to_pid_list (&stopped_pids, lwpid, status);
+                     if (new_pid == 0)
+                       {
+                         /* The child hasn't stopped for its initial
+                            SIGSTOP stop yet.  */
+                         if (debug_linux_nat)
+                           fprintf_unfiltered (gdb_stdlog,
+                                               "LLAL: child hasn't "
+                                               "stopped yet\n");
+                       }
+                     else if (WIFSTOPPED (status))
+                       {
+                         if (debug_linux_nat)
+                           fprintf_unfiltered (gdb_stdlog,
+                                               "LLAL: adding to stopped_pids\n");
+                         add_to_pid_list (&stopped_pids, lwpid, status);
+                       }
                      return 1;
                    }
                }
@@ -1238,6 +1154,7 @@ lin_lwp_attach_lwp (ptid_t ptid)
 
       lp = add_lwp (ptid);
       lp->stopped = 1;
+      lp->last_resume_kind = resume_stop;
       lp->cloned = cloned;
       lp->signalled = signalled;
       if (WSTOPSIG (status) != SIGSTOP)
@@ -1256,20 +1173,7 @@ lin_lwp_attach_lwp (ptid_t ptid)
                              status_to_str (status));
        }
     }
-  else
-    {
-      /* We assume that the LWP representing the original process is
-         already stopped.  Mark it as stopped in the data structure
-         that the GNU/linux ptrace layer uses to keep track of
-         threads.  Note that this won't have already been done since
-         the main thread will have, we assume, been stopped by an
-         attach from a different layer.  */
-      if (lp == NULL)
-       lp = add_lwp (ptid);
-      lp->stopped = 1;
-    }
 
-  lp->last_resume_kind = resume_stop;
   return 0;
 }
 
@@ -1278,63 +1182,102 @@ linux_nat_create_inferior (struct target_ops *ops,
                           char *exec_file, char *allargs, char **env,
                           int from_tty)
 {
-#ifdef HAVE_PERSONALITY
-  int personality_orig = 0, personality_set = 0;
-#endif /* HAVE_PERSONALITY */
+  struct cleanup *restore_personality
+    = maybe_disable_address_space_randomization (disable_randomization);
 
   /* The fork_child mechanism is synchronous and calls target_wait, so
      we have to mask the async mode.  */
 
-#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"),
-                safe_strerror (errno));
-    }
-#endif /* HAVE_PERSONALITY */
-
   /* Make sure we report all signals during startup.  */
   linux_nat_pass_signals (ops, 0, NULL);
 
   linux_ops->to_create_inferior (ops, exec_file, allargs, env, from_tty);
 
-#ifdef HAVE_PERSONALITY
-  if (personality_set)
+  do_cleanups (restore_personality);
+}
+
+/* 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)
+{
+  struct lwp_info *lp;
+
+  /* Ignore LWPs we're already attached to.  */
+  lp = find_lwp_pid (ptid);
+  if (lp == NULL)
     {
-      errno = 0;
-      personality (personality_orig);
-      if (errno != 0)
-       warning (_("Error restoring address space randomization: %s"),
-                safe_strerror (errno));
+      int lwpid = ptid_get_lwp (ptid);
+
+      if (ptrace (PTRACE_ATTACH, lwpid, 0, 0) < 0)
+       {
+         int err = errno;
+
+         /* 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_linux_nat)
+               {
+                 fprintf_unfiltered (gdb_stdlog,
+                                     "Cannot attach to lwp %d: "
+                                     "thread is gone (%d: %s)\n",
+                                     lwpid, err, safe_strerror (err));
+               }
+           }
+         else
+           {
+             warning (_("Cannot attach to lwp %d: %s"),
+                      lwpid,
+                      linux_ptrace_attach_fail_reason_string (ptid,
+                                                              err));
+           }
+       }
+      else
+       {
+         if (debug_linux_nat)
+           fprintf_unfiltered (gdb_stdlog,
+                               "PTRACE_ATTACH %s, 0, 0 (OK)\n",
+                               target_pid_to_str (ptid));
+
+         lp = add_lwp (ptid);
+         lp->cloned = 1;
+
+         /* The next time we wait for this LWP we'll see a SIGSTOP as
+            PTRACE_ATTACH brings it to a halt.  */
+         lp->signalled = 1;
+
+         /* We need to wait for a stop before being able to make the
+            next ptrace call on this LWP.  */
+         lp->must_set_ptrace_flags = 1;
+       }
+
+      return 1;
     }
-#endif /* HAVE_PERSONALITY */
+  return 0;
 }
 
 static void
-linux_nat_attach (struct target_ops *ops, char *args, int from_tty)
+linux_nat_attach (struct target_ops *ops, const char *args, int from_tty)
 {
   struct lwp_info *lp;
   int status;
   ptid_t ptid;
-  volatile struct gdb_exception ex;
 
   /* Make sure we report all signals during attach.  */
   linux_nat_pass_signals (ops, 0, NULL);
 
-  TRY_CATCH (ex, RETURN_MASK_ERROR)
+  TRY
     {
       linux_ops->to_attach (ops, args, from_tty);
     }
-  if (ex.reason < 0)
+  CATCH (ex, RETURN_MASK_ERROR)
     {
       pid_t pid = parse_pid_to_attach (args);
       struct buffer buffer;
@@ -1344,14 +1287,18 @@ linux_nat_attach (struct target_ops *ops, char *args, int from_tty)
       make_cleanup (xfree, message);
 
       buffer_init (&buffer);
-      linux_ptrace_attach_warnings (pid, &buffer);
+      linux_ptrace_attach_fail_reason (pid, &buffer);
 
       buffer_grow_str0 (&buffer, "");
       buffer_s = buffer_finish (&buffer);
       make_cleanup (xfree, buffer_s);
 
-      throw_error (ex.error, "%s%s", buffer_s, message);
+      if (*buffer_s != '\0')
+       throw_error (ex.error, "warning: %s\n%s", buffer_s, message);
+      else
+       throw_error (ex.error, "%s", message);
     }
+  END_CATCH
 
   /* The ptrace base target adds the main thread with (pid,0,0)
      format.  Decorate it with lwp info.  */
@@ -1409,8 +1356,18 @@ linux_nat_attach (struct target_ops *ops, char *args, int from_tty)
 
   lp->status = status;
 
+  /* We must attach to every LWP.  If /proc is mounted, use that to
+     find them now.  The inferior may be using raw clone instead of
+     using pthreads.  But even if it is using pthreads, 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 (ptid_get_pid (lp->ptid),
+                                 attach_proc_task_lwp_callback);
+
   if (target_can_async_p ())
-    target_async (inferior_event_handler, 0);
+    target_async (1);
 }
 
 /* Get pending status of LP.  */
@@ -1444,13 +1401,13 @@ get_pending_status (struct lwp_info *lp, int *status)
     signo = GDB_SIGNAL_0; /* a pending ptrace event, not a real signal.  */
   else if (lp->status)
     signo = gdb_signal_from_host (WSTOPSIG (lp->status));
-  else if (non_stop && !is_executing (lp->ptid))
+  else if (target_is_non_stop_p () && !is_executing (lp->ptid))
     {
       struct thread_info *tp = find_thread_ptid (lp->ptid);
 
       signo = tp->suspend.stop_signal;
     }
-  else if (!non_stop)
+  else if (!target_is_non_stop_p ())
     {
       struct target_waitstatus last;
       ptid_t last_ptid;
@@ -1609,6 +1566,92 @@ linux_nat_detach (struct target_ops *ops, const char *args, int from_tty)
     linux_ops->to_detach (ops, args, from_tty);
 }
 
+/* Resume execution of the inferior process.  If STEP is nonzero,
+   single-step it.  If SIGNAL is nonzero, give it that signal.  */
+
+static void
+linux_resume_one_lwp_throw (struct lwp_info *lp, int step,
+                           enum gdb_signal signo)
+{
+  lp->step = step;
+
+  /* stop_pc doubles as the PC the LWP had when it was last resumed.
+     We only presently need that if the LWP is stepped though (to
+     handle the case of stepping a breakpoint instruction).  */
+  if (step)
+    {
+      struct regcache *regcache = get_thread_regcache (lp->ptid);
+
+      lp->stop_pc = regcache_read_pc (regcache);
+    }
+  else
+    lp->stop_pc = 0;
+
+  if (linux_nat_prepare_to_resume != NULL)
+    linux_nat_prepare_to_resume (lp);
+  linux_ops->to_resume (linux_ops, lp->ptid, step, signo);
+
+  /* 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.  */
+  lp->stopped = 0;
+  lp->stop_reason = TARGET_STOPPED_BY_NO_REASON;
+  registers_changed_ptid (lp->ptid);
+}
+
+/* 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)
+{
+  /* 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 (ptid_get_lwp (lp->ptid)) == 0)
+    {
+      lp->stop_reason = TARGET_STOPPED_BY_NO_REASON;
+      lp->status = 0;
+      lp->waitstatus.kind = TARGET_WAITKIND_IGNORE;
+      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.  */
+
+static void
+linux_resume_one_lwp (struct lwp_info *lp, int step, enum gdb_signal signo)
+{
+  TRY
+    {
+      linux_resume_one_lwp_throw (lp, step, signo);
+    }
+  CATCH (ex, RETURN_MASK_ERROR)
+    {
+      if (!check_ptrace_stopped_lwp_gone (lp))
+       throw_exception (ex);
+    }
+  END_CATCH
+}
+
 /* Resume LP.  */
 
 static void
@@ -1616,7 +1659,7 @@ resume_lwp (struct lwp_info *lp, int step, enum gdb_signal signo)
 {
   if (lp->stopped)
     {
-      struct inferior *inf = find_inferior_pid (ptid_get_pid (lp->ptid));
+      struct inferior *inf = find_inferior_ptid (lp->ptid);
 
       if (inf->vfork_child != NULL)
        {
@@ -1625,8 +1668,7 @@ resume_lwp (struct lwp_info *lp, int step, enum gdb_signal signo)
                                "RC: Not resuming %s (vfork parent)\n",
                                target_pid_to_str (lp->ptid));
        }
-      else if (lp->status == 0
-              && lp->waitstatus.kind == TARGET_WAITKIND_IGNORE)
+      else if (!lwp_status_pending_p (lp))
        {
          if (debug_linux_nat)
            fprintf_unfiltered (gdb_stdlog,
@@ -1637,14 +1679,7 @@ resume_lwp (struct lwp_info *lp, int step, enum gdb_signal signo)
                                 : "0"),
                                step ? "step" : "resume");
 
-         if (linux_nat_prepare_to_resume != NULL)
-           linux_nat_prepare_to_resume (lp);
-         linux_ops->to_resume (linux_ops,
-                               pid_to_ptid (ptid_get_lwp (lp->ptid)),
-                               step, signo);
-         lp->stopped = 0;
-         lp->step = step;
-         lp->stopped_by_watchpoint = 0;
+         linux_resume_one_lwp (lp, step, signo);
        }
       else
        {
@@ -1663,13 +1698,17 @@ resume_lwp (struct lwp_info *lp, int step, enum gdb_signal signo)
     }
 }
 
-/* Resume LWP, with the last stop signal, if it is in pass state.  */
+/* Callback for iterate_over_lwps.  If LWP is EXCEPT, do nothing.
+   Resume LWP with the last stop signal, if it is in pass state.  */
 
 static int
-linux_nat_resume_callback (struct lwp_info *lp, void *data)
+linux_nat_resume_callback (struct lwp_info *lp, void *except)
 {
   enum gdb_signal signo = GDB_SIGNAL_0;
 
+  if (lp == except)
+    return 0;
+
   if (lp->stopped)
     {
       struct thread_info *thread;
@@ -1677,8 +1716,7 @@ linux_nat_resume_callback (struct lwp_info *lp, void *data)
       thread = find_thread_ptid (lp->ptid);
       if (thread != NULL)
        {
-         if (signal_pass_state (thread->suspend.stop_signal))
-           signo = thread->suspend.stop_signal;
+         signo = thread->suspend.stop_signal;
          thread->suspend.stop_signal = GDB_SIGNAL_0;
        }
     }
@@ -1735,7 +1773,6 @@ linux_nat_resume (struct target_ops *ops,
   gdb_assert (lp != NULL);
 
   /* Remember if we're stepping.  */
-  lp->step = step;
   lp->last_resume_kind = step ? resume_step : resume_continue;
 
   /* If we have a pending wait status for this thread, there is no
@@ -1765,7 +1802,7 @@ linux_nat_resume (struct target_ops *ops,
        }
     }
 
-  if (lp->status || lp->waitstatus.kind != TARGET_WAITKIND_IGNORE)
+  if (lwp_status_pending_p (lp))
     {
       /* FIXME: What should we do if we are supposed to continue
         this thread with a signal?  */
@@ -1778,38 +1815,28 @@ linux_nat_resume (struct target_ops *ops,
 
       if (target_can_async_p ())
        {
-         target_async (inferior_event_handler, 0);
+         target_async (1);
          /* Tell the event loop we have something to process.  */
          async_file_mark ();
        }
       return;
     }
 
-  /* Mark LWP as not stopped to prevent it from being continued by
-     linux_nat_resume_callback.  */
-  lp->stopped = 0;
-
   if (resume_many)
-    iterate_over_lwps (ptid, linux_nat_resume_callback, NULL);
-
-  /* Convert to something the lower layer understands.  */
-  ptid = pid_to_ptid (ptid_get_lwp (lp->ptid));
-
-  if (linux_nat_prepare_to_resume != NULL)
-    linux_nat_prepare_to_resume (lp);
-  linux_ops->to_resume (linux_ops, ptid, step, signo);
-  lp->stopped_by_watchpoint = 0;
+    iterate_over_lwps (ptid, linux_nat_resume_callback, lp);
 
   if (debug_linux_nat)
     fprintf_unfiltered (gdb_stdlog,
                        "LLR: %s %s, %s (resume event thread)\n",
                        step ? "PTRACE_SINGLESTEP" : "PTRACE_CONT",
-                       target_pid_to_str (ptid),
+                       target_pid_to_str (lp->ptid),
                        (signo != GDB_SIGNAL_0
                         ? strsignal (gdb_signal_to_host (signo)) : "0"));
 
+  linux_resume_one_lwp (lp, step, signo);
+
   if (target_can_async_p ())
-    target_async (inferior_event_handler, 0);
+    target_async (1);
 }
 
 /* Send a signal to an LWP.  */
@@ -1885,6 +1912,7 @@ linux_handle_syscall_trap (struct lwp_info *lp, int stopping)
 
       lp->syscall_state = TARGET_WAITKIND_IGNORE;
       ptrace (PTRACE_CONT, ptid_get_lwp (lp->ptid), 0, 0);
+      lp->stopped = 0;
       return 1;
     }
 
@@ -1961,13 +1989,7 @@ linux_handle_syscall_trap (struct lwp_info *lp, int stopping)
      subsequent syscall.  Simply resume using the inf-ptrace layer,
      which knows when to use PT_SYSCALL or PT_CONTINUE.  */
 
-  /* Note that gdbarch_get_syscall_number may access registers, hence
-     fill a regcache.  */
-  registers_changed ();
-  if (linux_nat_prepare_to_resume != NULL)
-    linux_nat_prepare_to_resume (lp);
-  linux_ops->to_resume (linux_ops, pid_to_ptid (ptid_get_lwp (lp->ptid)),
-                       lp->step, GDB_SIGNAL_0);
+  linux_resume_one_lwp (lp, lp->step, GDB_SIGNAL_0);
   return 1;
 }
 
@@ -1978,12 +2000,11 @@ linux_handle_syscall_trap (struct lwp_info *lp, int stopping)
    true, the new LWP remains stopped, otherwise it is continued.  */
 
 static int
-linux_handle_extended_wait (struct lwp_info *lp, int status,
-                           int stopping)
+linux_handle_extended_wait (struct lwp_info *lp, int status)
 {
   int pid = ptid_get_lwp (lp->ptid);
   struct target_waitstatus *ourstatus = &lp->waitstatus;
-  int event = status >> 16;
+  int event = linux_ptrace_get_extended_event (status);
 
   if (event == PTRACE_EVENT_FORK || event == PTRACE_EVENT_VFORK
       || event == PTRACE_EVENT_CLONE)
@@ -2049,7 +2070,7 @@ linux_handle_extended_wait (struct lwp_info *lp, int status,
        ourstatus->kind = TARGET_WAITKIND_FORKED;
       else if (event == PTRACE_EVENT_VFORK)
        ourstatus->kind = TARGET_WAITKIND_VFORKED;
-      else
+      else if (event == PTRACE_EVENT_CLONE)
        {
          struct lwp_info *new_lp;
 
@@ -2064,6 +2085,25 @@ linux_handle_extended_wait (struct lwp_info *lp, int status,
          new_lp = add_lwp (ptid_build (ptid_get_pid (lp->ptid), new_pid, 0));
          new_lp->cloned = 1;
          new_lp->stopped = 1;
+         new_lp->resumed = 1;
+
+         /* If the thread_db layer is active, let it record the user
+            level thread id and status, and add the thread to GDB's
+            list.  */
+         if (!thread_db_notice_clone (lp->ptid, new_lp->ptid))
+           {
+             /* The process is not using thread_db.  Add the LWP to
+                GDB's list.  */
+             target_post_attach (ptid_get_lwp (new_lp->ptid));
+             add_thread (new_lp->ptid);
+           }
+
+         /* Even if we're stopping the thread for some reason
+            internal to this module, from the perspective of infrun
+            and the user/frontend, this new thread is running until
+            it next reports a stop.  */
+         set_running (new_lp->ptid, 1);
+         set_executing (new_lp->ptid, 1);
 
          if (WSTOPSIG (status) != SIGSTOP)
            {
@@ -2072,68 +2112,10 @@ linux_handle_extended_wait (struct lwp_info *lp, int status,
                 have a lower number than SIGSTOP (e.g. SIGUSR1).
                 This is an unlikely case, and harder to handle for
                 fork / vfork than for clone, so we do not try - but
-                we handle it for clone events here.  We'll send
-                the other signal on to the thread below.  */
+                we handle it for clone events here.  */
 
              new_lp->signalled = 1;
-           }
-         else
-           {
-             struct thread_info *tp;
-
-             /* When we stop for an event in some other thread, and
-                pull the thread list just as this thread has cloned,
-                we'll have seen the new thread in the thread_db list
-                before handling the CLONE event (glibc's
-                pthread_create adds the new thread to the thread list
-                before clone'ing, and has the kernel fill in the
-                thread's tid on the clone call with
-                CLONE_PARENT_SETTID).  If that happened, and the core
-                had requested the new thread to stop, we'll have
-                killed it with SIGSTOP.  But since SIGSTOP is not an
-                RT signal, it can only be queued once.  We need to be
-                careful to not resume the LWP if we wanted it to
-                stop.  In that case, we'll leave the SIGSTOP pending.
-                It will later be reported as GDB_SIGNAL_0.  */
-             tp = find_thread_ptid (new_lp->ptid);
-             if (tp != NULL && tp->stop_requested)
-               new_lp->last_resume_kind = resume_stop;
-             else
-               status = 0;
-           }
-
-         if (non_stop)
-           {
-             /* Add the new thread to GDB's lists as soon as possible
-                so that:
-
-                1) the frontend doesn't have to wait for a stop to
-                display them, and,
-
-                2) we tag it with the correct running state.  */
-
-             /* If the thread_db layer is active, let it know about
-                this new thread, and add it to GDB's list.  */
-             if (!thread_db_attach_lwp (new_lp->ptid))
-               {
-                 /* We're not using thread_db.  Add it to GDB's
-                    list.  */
-                 target_post_attach (ptid_get_lwp (new_lp->ptid));
-                 add_thread (new_lp->ptid);
-               }
-
-             if (!stopping)
-               {
-                 set_running (new_lp->ptid, 1);
-                 set_executing (new_lp->ptid, 1);
-                 /* thread_db_attach_lwp -> lin_lwp_attach_lwp forced
-                    resume_stop.  */
-                 new_lp->last_resume_kind = resume_continue;
-               }
-           }
 
-         if (status != 0)
-           {
              /* We created NEW_LP so it cannot yet contain STATUS.  */
              gdb_assert (new_lp->status == 0);
 
@@ -2147,37 +2129,6 @@ linux_handle_extended_wait (struct lwp_info *lp, int status,
              new_lp->status = status;
            }
 
-         /* Note the need to use the low target ops to resume, to
-            handle resuming with PT_SYSCALL if we have syscall
-            catchpoints.  */
-         if (!stopping)
-           {
-             new_lp->resumed = 1;
-
-             if (status == 0)
-               {
-                 gdb_assert (new_lp->last_resume_kind == resume_continue);
-                 if (debug_linux_nat)
-                   fprintf_unfiltered (gdb_stdlog,
-                                       "LHEW: resuming new LWP %ld\n",
-                                       ptid_get_lwp (new_lp->ptid));
-                 if (linux_nat_prepare_to_resume != NULL)
-                   linux_nat_prepare_to_resume (new_lp);
-                 linux_ops->to_resume (linux_ops, pid_to_ptid (new_pid),
-                                       0, GDB_SIGNAL_0);
-                 new_lp->stopped = 0;
-               }
-           }
-
-         if (debug_linux_nat)
-           fprintf_unfiltered (gdb_stdlog,
-                               "LHEW: resuming parent LWP %d\n", pid);
-         if (linux_nat_prepare_to_resume != NULL)
-           linux_nat_prepare_to_resume (lp);
-         linux_ops->to_resume (linux_ops,
-                               pid_to_ptid (ptid_get_lwp (lp->ptid)),
-                               0, GDB_SIGNAL_0);
-
          return 1;
        }
 
@@ -2195,6 +2146,10 @@ linux_handle_extended_wait (struct lwp_info *lp, int status,
       ourstatus->value.execd_pathname
        = xstrdup (linux_child_pid_to_exec_file (NULL, pid));
 
+      /* The thread that execed must have been resumed, but, when a
+        thread execs, it changes its tid to the tgid, and the old
+        tgid thread might have not been resumed.  */
+      lp->resumed = 1;
       return 0;
     }
 
@@ -2215,9 +2170,8 @@ linux_handle_extended_wait (struct lwp_info *lp, int status,
       if (debug_linux_nat)
        fprintf_unfiltered (gdb_stdlog,
                            "LHEW: Got PTRACE_EVENT_VFORK_DONE "
-                           "from LWP %ld: resuming\n",
+                           "from LWP %ld: ignoring\n",
                            ptid_get_lwp (lp->ptid));
-      ptrace (PTRACE_CONT, ptid_get_lwp (lp->ptid), 0, 0);
       return 1;
     }
 
@@ -2298,6 +2252,8 @@ wait_lwp (struct lwp_info *lp)
         again before it gets to sigsuspend so we can safely let the handlers
         get executed here.  */
 
+      if (debug_linux_nat)
+       fprintf_unfiltered (gdb_stdlog, "WL: about to sigsuspend\n");
       sigsuspend (&suspend_mask);
     }
 
@@ -2318,6 +2274,20 @@ wait_lwp (struct lwp_info *lp)
       /* Check if the thread has exited.  */
       if (WIFEXITED (status) || WIFSIGNALED (status))
        {
+         if (ptid_get_pid (lp->ptid) == ptid_get_lwp (lp->ptid))
+           {
+             if (debug_linux_nat)
+               fprintf_unfiltered (gdb_stdlog, "WL: Process %d exited.\n",
+                                   ptid_get_pid (lp->ptid));
+
+             /* This is the leader exiting, it means the whole
+                process is gone.  Store the status to report to the
+                core.  Store it in lp->waitstatus, because lp->status
+                would be ambiguous (W_EXITCODE(0,0) == 0).  */
+             store_waitstatus (&lp->waitstatus, status);
+             return 0;
+           }
+
          thread_dead = 1;
          if (debug_linux_nat)
            fprintf_unfiltered (gdb_stdlog, "WL: %s exited.\n",
@@ -2332,6 +2302,16 @@ wait_lwp (struct lwp_info *lp)
     }
 
   gdb_assert (WIFSTOPPED (status));
+  lp->stopped = 1;
+
+  if (lp->must_set_ptrace_flags)
+    {
+      struct inferior *inf = find_inferior_pid (ptid_get_pid (lp->ptid));
+      int options = linux_nat_ptrace_options (inf->attach_flag);
+
+      linux_enable_event_reporting (ptid_get_lwp (lp->ptid), options);
+      lp->must_set_ptrace_flags = 0;
+    }
 
   /* Handle GNU/Linux's syscall SIGTRAPs.  */
   if (WIFSTOPPED (status) && WSTOPSIG (status) == SYSCALL_SIGTRAP)
@@ -2346,14 +2326,15 @@ wait_lwp (struct lwp_info *lp)
     }
 
   /* Handle GNU/Linux's extended waitstatus for trace events.  */
-  if (WIFSTOPPED (status) && WSTOPSIG (status) == SIGTRAP && status >> 16 != 0)
+  if (WIFSTOPPED (status) && WSTOPSIG (status) == SIGTRAP
+      && linux_is_extended_waitstatus (status))
     {
       if (debug_linux_nat)
        fprintf_unfiltered (gdb_stdlog,
                            "WL: Handling extended status 0x%06x\n",
                            status);
-      if (linux_handle_extended_wait (lp, status, 1))
-       return wait_lwp (lp);
+      linux_handle_extended_wait (lp, status);
+      return 0;
     }
 
   return status;
@@ -2399,6 +2380,28 @@ linux_stop_lwp (struct lwp_info *lwp)
   stop_callback (lwp, NULL);
 }
 
+/* See linux-nat.h  */
+
+void
+linux_stop_and_wait_all_lwps (void)
+{
+  /* Stop all LWP's ...  */
+  iterate_over_lwps (minus_one_ptid, stop_callback, NULL);
+
+  /* ... and wait until all of them have reported back that
+     they're no longer running.  */
+  iterate_over_lwps (minus_one_ptid, stop_wait_callback, NULL);
+}
+
+/* See linux-nat.h  */
+
+void
+linux_unstop_all_lwps (void)
+{
+  iterate_over_lwps (minus_one_ptid,
+                    resume_stopped_resumed_lwps, &minus_one_ptid);
+}
+
 /* Return non-zero if LWP PID has a pending SIGINT.  */
 
 static int
@@ -2468,24 +2471,21 @@ maybe_clear_ignore_sigint (struct lwp_info *lp)
    soon as we see LP stop with a SIGTRAP.  If GDB changes the debug
    registers meanwhile, we have the cached data we can rely on.  */
 
-static void
-save_sigtrap (struct lwp_info *lp)
+static int
+check_stopped_by_watchpoint (struct lwp_info *lp)
 {
   struct cleanup *old_chain;
 
   if (linux_ops->to_stopped_by_watchpoint == NULL)
-    {
-      lp->stopped_by_watchpoint = 0;
-      return;
-    }
+    return 0;
 
   old_chain = save_inferior_ptid ();
   inferior_ptid = lp->ptid;
 
-  lp->stopped_by_watchpoint = linux_ops->to_stopped_by_watchpoint (linux_ops);
-
-  if (lp->stopped_by_watchpoint)
+  if (linux_ops->to_stopped_by_watchpoint (linux_ops))
     {
+      lp->stop_reason = TARGET_STOPPED_BY_WATCHPOINT;
+
       if (linux_ops->to_stopped_data_address != NULL)
        lp->stopped_data_address_p =
          linux_ops->to_stopped_data_address (&current_target,
@@ -2495,9 +2495,35 @@ save_sigtrap (struct lwp_info *lp)
     }
 
   do_cleanups (old_chain);
+
+  return lp->stop_reason == TARGET_STOPPED_BY_WATCHPOINT;
 }
 
-/* See save_sigtrap.  */
+/* Called when the LWP stopped for a trap that could be explained by a
+   watchpoint or a breakpoint.  */
+
+static void
+save_sigtrap (struct lwp_info *lp)
+{
+  gdb_assert (lp->stop_reason == TARGET_STOPPED_BY_NO_REASON);
+  gdb_assert (lp->status != 0);
+
+  /* Check first if this was a SW/HW breakpoint before checking
+     watchpoints, because at least s390 can't tell the data address of
+     hardware watchpoint hits, and the kernel returns
+     stopped-by-watchpoint as long as there's a watchpoint set.  */
+  if (linux_nat_status_is_event (lp->status))
+    check_stopped_by_breakpoint (lp);
+
+  /* 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 (lp->stop_reason == TARGET_STOPPED_BY_NO_REASON
+      || lp->stop_reason == TARGET_STOPPED_BY_HW_BREAKPOINT)
+    check_stopped_by_watchpoint (lp);
+}
+
+/* Returns true if the LWP had stopped for a watchpoint.  */
 
 static int
 linux_nat_stopped_by_watchpoint (struct target_ops *ops)
@@ -2506,7 +2532,7 @@ linux_nat_stopped_by_watchpoint (struct target_ops *ops)
 
   gdb_assert (lp != NULL);
 
-  return lp->stopped_by_watchpoint;
+  return lp->stop_reason == TARGET_STOPPED_BY_WATCHPOINT;
 }
 
 static int
@@ -2529,24 +2555,6 @@ sigtrap_is_event (int status)
   return WIFSTOPPED (status) && WSTOPSIG (status) == SIGTRAP;
 }
 
-/* SIGTRAP-like events recognizer.  */
-
-static int (*linux_nat_status_is_event) (int status) = sigtrap_is_event;
-
-/* Check for SIGTRAP-like events in LP.  */
-
-static int
-linux_nat_lp_status_is_event (struct lwp_info *lp)
-{
-  /* We check for lp->waitstatus in addition to lp->status, because we can
-     have pending process exits recorded in lp->status
-     and W_EXITCODE(0,0) == 0.  We should probably have an additional
-     lp->status_p flag.  */
-
-  return (lp->waitstatus.kind == TARGET_WAITKIND_IGNORE
-         && linux_nat_status_is_event (lp->status));
-}
-
 /* Set alternative SIGTRAP-like events recognizer.  If
    breakpoint_inserted_here_p there then gdbarch_decr_pc_after_break will be
    applied.  */
@@ -2563,7 +2571,7 @@ linux_nat_set_status_is_event (struct target_ops *t,
 static int
 stop_wait_callback (struct lwp_info *lp, void *data)
 {
-  struct inferior *inf = find_inferior_pid (ptid_get_pid (lp->ptid));
+  struct inferior *inf = find_inferior_ptid (lp->ptid);
 
   /* If this is a vfork parent, bail out, it is not going to report
      any SIGSTOP until the vfork is done with.  */
@@ -2585,6 +2593,7 @@ stop_wait_callback (struct lwp_info *lp, void *data)
 
          errno = 0;
          ptrace (PTRACE_CONT, ptid_get_lwp (lp->ptid), 0, 0);
+         lp->stopped = 0;
          if (debug_linux_nat)
            fprintf_unfiltered (gdb_stdlog,
                                "PTRACE_CONT %s, 0, 0 (%s) "
@@ -2601,8 +2610,6 @@ stop_wait_callback (struct lwp_info *lp, void *data)
        {
          /* The thread was stopped with a signal other than SIGSTOP.  */
 
-         save_sigtrap (lp);
-
          if (debug_linux_nat)
            fprintf_unfiltered (gdb_stdlog,
                                "SWC: Pending event %s in %s\n",
@@ -2611,9 +2618,8 @@ stop_wait_callback (struct lwp_info *lp, void *data)
 
          /* Save the sigtrap event.  */
          lp->status = status;
-         gdb_assert (!lp->stopped);
          gdb_assert (lp->signalled);
-         lp->stopped = 1;
+         save_sigtrap (lp);
        }
       else
        {
@@ -2622,11 +2628,9 @@ stop_wait_callback (struct lwp_info *lp, void *data)
 
          if (debug_linux_nat)
            fprintf_unfiltered (gdb_stdlog,
-                               "SWC: Delayed SIGSTOP caught for %s.\n",
+                               "SWC: Expected SIGSTOP caught for %s.\n",
                                target_pid_to_str (lp->ptid));
 
-         lp->stopped = 1;
-
          /* Reset SIGNALLED only after the stop_wait_callback call
             above as it does gdb_assert on SIGNALLED.  */
          lp->signalled = 0;
@@ -2636,7 +2640,9 @@ stop_wait_callback (struct lwp_info *lp, void *data)
   return 0;
 }
 
-/* Return non-zero if LP has a wait status pending.  */
+/* Return non-zero if LP has a wait status pending.  Discard the
+   pending event and resume the LWP if the event that originally
+   caused the stop became uninteresting.  */
 
 static int
 status_callback (struct lwp_info *lp, void *data)
@@ -2646,20 +2652,57 @@ status_callback (struct lwp_info *lp, void *data)
   if (!lp->resumed)
     return 0;
 
-  if (lp->waitstatus.kind != TARGET_WAITKIND_IGNORE)
+  if (!lwp_status_pending_p (lp))
+    return 0;
+
+  if (lp->stop_reason == TARGET_STOPPED_BY_SW_BREAKPOINT
+      || lp->stop_reason == TARGET_STOPPED_BY_HW_BREAKPOINT)
     {
-      /* A ptrace event, like PTRACE_FORK|VFORK|EXEC, syscall event,
-        or a pending process exit.  Note that `W_EXITCODE(0,0) ==
-        0', so a clean process exit can not be stored pending in
-        lp->status, it is indistinguishable from
-        no-pending-status.  */
-      return 1;
-    }
+      struct regcache *regcache = get_thread_regcache (lp->ptid);
+      struct gdbarch *gdbarch = get_regcache_arch (regcache);
+      CORE_ADDR pc;
+      int discard = 0;
 
-  if (lp->status != 0)
-    return 1;
+      pc = regcache_read_pc (regcache);
 
-  return 0;
+      if (pc != lp->stop_pc)
+       {
+         if (debug_linux_nat)
+           fprintf_unfiltered (gdb_stdlog,
+                               "SC: PC of %s changed.  was=%s, now=%s\n",
+                               target_pid_to_str (lp->ptid),
+                               paddress (target_gdbarch (), lp->stop_pc),
+                               paddress (target_gdbarch (), pc));
+         discard = 1;
+       }
+
+#if !USE_SIGTRAP_SIGINFO
+      else if (!breakpoint_inserted_here_p (get_regcache_aspace (regcache), pc))
+       {
+         if (debug_linux_nat)
+           fprintf_unfiltered (gdb_stdlog,
+                               "SC: previous breakpoint of %s, at %s gone\n",
+                               target_pid_to_str (lp->ptid),
+                               paddress (target_gdbarch (), lp->stop_pc));
+
+         discard = 1;
+       }
+#endif
+
+      if (discard)
+       {
+         if (debug_linux_nat)
+           fprintf_unfiltered (gdb_stdlog,
+                               "SC: pending event of %s cancelled.\n",
+                               target_pid_to_str (lp->ptid));
+
+         lp->status = 0;
+         linux_resume_one_lwp (lp, lp->step, GDB_SIGNAL_0);
+         return 0;
+       }
+    }
+
+  return 1;
 }
 
 /* Return non-zero if LP isn't stopped.  */
@@ -2668,9 +2711,7 @@ static int
 running_callback (struct lwp_info *lp, void *data)
 {
   return (!lp->stopped
-         || ((lp->status != 0
-              || lp->waitstatus.kind != TARGET_WAITKIND_IGNORE)
-             && lp->resumed));
+         || (lwp_status_pending_p (lp) && lp->resumed));
 }
 
 /* Count the LWP's that have had events.  */
@@ -2682,8 +2723,8 @@ count_events_callback (struct lwp_info *lp, void *data)
 
   gdb_assert (count != NULL);
 
-  /* Count only resumed LWPs that have a SIGTRAP event pending.  */
-  if (lp->resumed && linux_nat_lp_status_is_event (lp))
+  /* Select only resumed LWPs that have an event pending.  */
+  if (lp->resumed && lwp_status_pending_p (lp))
     (*count)++;
 
   return 0;
@@ -2701,7 +2742,18 @@ select_singlestep_lwp_callback (struct lwp_info *lp, void *data)
     return 0;
 }
 
-/* Select the Nth LWP that has had a SIGTRAP event.  */
+/* Returns true if LP has a status pending.  */
+
+static int
+lwp_status_pending_p (struct lwp_info *lp)
+{
+  /* We check for lp->waitstatus in addition to lp->status, because we
+     can have pending process exits recorded in lp->status and
+     W_EXITCODE(0,0) happens to be 0.  */
+  return lp->status != 0 || lp->waitstatus.kind != TARGET_WAITKIND_IGNORE;
+}
+
+/* Select the Nth LWP that has had an event.  */
 
 static int
 select_event_lwp_callback (struct lwp_info *lp, void *data)
@@ -2710,16 +2762,19 @@ select_event_lwp_callback (struct lwp_info *lp, void *data)
 
   gdb_assert (selector != NULL);
 
-  /* Select only resumed LWPs that have a SIGTRAP event pending.  */
-  if (lp->resumed && linux_nat_lp_status_is_event (lp))
+  /* Select only resumed LWPs that have an event pending.  */
+  if (lp->resumed && lwp_status_pending_p (lp))
     if ((*selector)-- == 0)
       return 1;
 
   return 0;
 }
 
+/* Called when the LWP got a signal/trap that could be explained by a
+   software or hardware breakpoint.  */
+
 static int
-cancel_breakpoint (struct lwp_info *lp)
+check_stopped_by_breakpoint (struct lwp_info *lp)
 {
   /* 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
@@ -2733,50 +2788,133 @@ cancel_breakpoint (struct lwp_info *lp)
   struct regcache *regcache = get_thread_regcache (lp->ptid);
   struct gdbarch *gdbarch = get_regcache_arch (regcache);
   CORE_ADDR pc;
+  CORE_ADDR sw_bp_pc;
+#if USE_SIGTRAP_SIGINFO
+  siginfo_t siginfo;
+#endif
+
+  pc = regcache_read_pc (regcache);
+  sw_bp_pc = pc - gdbarch_decr_pc_after_break (gdbarch);
+
+#if USE_SIGTRAP_SIGINFO
+  if (linux_nat_get_siginfo (lp->ptid, &siginfo))
+    {
+      if (siginfo.si_signo == SIGTRAP)
+       {
+         if (siginfo.si_code == GDB_ARCH_TRAP_BRKPT)
+           {
+             if (debug_linux_nat)
+               fprintf_unfiltered (gdb_stdlog,
+                                   "CSBB: %s stopped by software "
+                                   "breakpoint\n",
+                                   target_pid_to_str (lp->ptid));
+
+             /* Back up the PC if necessary.  */
+             if (pc != sw_bp_pc)
+               regcache_write_pc (regcache, sw_bp_pc);
+
+             lp->stop_pc = sw_bp_pc;
+             lp->stop_reason = TARGET_STOPPED_BY_SW_BREAKPOINT;
+             return 1;
+           }
+         else if (siginfo.si_code == TRAP_HWBKPT)
+           {
+             if (debug_linux_nat)
+               fprintf_unfiltered (gdb_stdlog,
+                                   "CSBB: %s stopped by hardware "
+                                   "breakpoint/watchpoint\n",
+                                   target_pid_to_str (lp->ptid));
 
-  pc = regcache_read_pc (regcache) - target_decr_pc_after_break (gdbarch);
-  if (breakpoint_inserted_here_p (get_regcache_aspace (regcache), pc))
+             lp->stop_pc = pc;
+             lp->stop_reason = TARGET_STOPPED_BY_HW_BREAKPOINT;
+             return 1;
+           }
+         else if (siginfo.si_code == TRAP_TRACE)
+           {
+             if (debug_linux_nat)
+               fprintf_unfiltered (gdb_stdlog,
+                                   "CSBB: %s stopped by trace\n",
+                                   target_pid_to_str (lp->ptid));
+           }
+       }
+    }
+#else
+  if ((!lp->step || lp->stop_pc == sw_bp_pc)
+      && software_breakpoint_inserted_here_p (get_regcache_aspace (regcache),
+                                             sw_bp_pc))
     {
+      /* The LWP was either continued, or stepped a software
+        breakpoint instruction.  */
       if (debug_linux_nat)
        fprintf_unfiltered (gdb_stdlog,
-                           "CB: Push back breakpoint for %s\n",
+                           "CSBB: %s stopped by software breakpoint\n",
                            target_pid_to_str (lp->ptid));
 
       /* Back up the PC if necessary.  */
-      if (target_decr_pc_after_break (gdbarch))
-       regcache_write_pc (regcache, pc);
+      if (pc != sw_bp_pc)
+       regcache_write_pc (regcache, sw_bp_pc);
 
+      lp->stop_pc = sw_bp_pc;
+      lp->stop_reason = TARGET_STOPPED_BY_SW_BREAKPOINT;
       return 1;
     }
+
+  if (hardware_breakpoint_inserted_here_p (get_regcache_aspace (regcache), pc))
+    {
+      if (debug_linux_nat)
+       fprintf_unfiltered (gdb_stdlog,
+                           "CSBB: stopped by hardware breakpoint %s\n",
+                           target_pid_to_str (lp->ptid));
+
+      lp->stop_pc = pc;
+      lp->stop_reason = TARGET_STOPPED_BY_HW_BREAKPOINT;
+      return 1;
+    }
+#endif
+
   return 0;
 }
 
+
+/* Returns true if the LWP had stopped for a software breakpoint.  */
+
 static int
-cancel_breakpoints_callback (struct lwp_info *lp, void *data)
+linux_nat_stopped_by_sw_breakpoint (struct target_ops *ops)
 {
-  struct lwp_info *event_lp = data;
+  struct lwp_info *lp = find_lwp_pid (inferior_ptid);
 
-  /* Leave the LWP that has been elected to receive a SIGTRAP alone.  */
-  if (lp == event_lp)
-    return 0;
+  gdb_assert (lp != NULL);
 
-  /* 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.
+  return lp->stop_reason == TARGET_STOPPED_BY_SW_BREAKPOINT;
+}
 
-     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.  */
+/* Implement the supports_stopped_by_sw_breakpoint method.  */
 
-  if (linux_nat_lp_status_is_event (lp)
-      && cancel_breakpoint (lp))
-    /* Throw away the SIGTRAP.  */
-    lp->status = 0;
+static int
+linux_nat_supports_stopped_by_sw_breakpoint (struct target_ops *ops)
+{
+  return USE_SIGTRAP_SIGINFO;
+}
 
-  return 0;
+/* Returns true if the LWP had stopped for a hardware
+   breakpoint/watchpoint.  */
+
+static int
+linux_nat_stopped_by_hw_breakpoint (struct target_ops *ops)
+{
+  struct lwp_info *lp = find_lwp_pid (inferior_ptid);
+
+  gdb_assert (lp != NULL);
+
+  return lp->stop_reason == TARGET_STOPPED_BY_HW_BREAKPOINT;
+}
+
+/* Implement the supports_stopped_by_hw_breakpoint method.  */
+
+static int
+linux_nat_supports_stopped_by_hw_breakpoint (struct target_ops *ops)
+{
+  return USE_SIGTRAP_SIGINFO;
 }
 
 /* Select one LWP out of those that have events pending.  */
@@ -2786,36 +2924,49 @@ select_event_lwp (ptid_t filter, struct lwp_info **orig_lp, int *status)
 {
   int num_events = 0;
   int random_selector;
-  struct lwp_info *event_lp;
+  struct lwp_info *event_lp = NULL;
 
   /* Record the wait status for the original LWP.  */
   (*orig_lp)->status = *status;
 
-  /* Give preference to any LWP that is being single-stepped.  */
-  event_lp = iterate_over_lwps (filter,
-                               select_singlestep_lwp_callback, NULL);
-  if (event_lp != NULL)
+  /* In all-stop, give preference to the LWP that is being
+     single-stepped.  There will be at most one, and it will be 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, as
+     otherwise we'd report the pending SIGTRAP then, 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 (!target_is_non_stop_p ())
     {
-      if (debug_linux_nat)
-       fprintf_unfiltered (gdb_stdlog,
-                           "SEL: Select single-step %s\n",
-                           target_pid_to_str (event_lp->ptid));
+      event_lp = iterate_over_lwps (filter,
+                                   select_singlestep_lwp_callback, NULL);
+      if (event_lp != NULL)
+       {
+         if (debug_linux_nat)
+           fprintf_unfiltered (gdb_stdlog,
+                               "SEL: Select single-step %s\n",
+                               target_pid_to_str (event_lp->ptid));
+       }
     }
-  else
+
+  if (event_lp == NULL)
     {
-      /* No single-stepping LWP.  Select one at random, out of those
-         which have had SIGTRAP events.  */
+      /* Pick one at random, out of those which have had events.  */
 
-      /* First see how many SIGTRAP events we have.  */
+      /* First see how many events we have.  */
       iterate_over_lwps (filter, count_events_callback, &num_events);
+      gdb_assert (num_events > 0);
 
-      /* Now randomly pick a LWP out of those that have had a SIGTRAP.  */
+      /* Now randomly pick a LWP out of those that have had
+        events.  */
       random_selector = (int)
        ((num_events * (double) rand ()) / (RAND_MAX + 1.0));
 
       if (debug_linux_nat && num_events > 1)
        fprintf_unfiltered (gdb_stdlog,
-                           "SEL: Found %d SIGTRAP events, selecting #%d\n",
+                           "SEL: Found %d events, selecting #%d\n",
                            num_events, random_selector);
 
       event_lp = iterate_over_lwps (filter,
@@ -2849,8 +3000,6 @@ resumed_callback (struct lwp_info *lp, void *data)
 static int
 stop_and_resume_callback (struct lwp_info *lp, void *data)
 {
-  int *new_pending_p = data;
-
   if (!lp->stopped)
     {
       ptid_t ptid = lp->ptid;
@@ -2864,7 +3013,7 @@ stop_and_resume_callback (struct lwp_info *lp, void *data)
       if (lp != NULL)
        {
          if (lp->last_resume_kind == resume_stop
-             && lp->status == 0)
+             && !lwp_status_pending_p (lp))
            {
              /* The core wanted the LWP to stop.  Even if it stopped
                 cleanly (with SIGSTOP), leave the event pending.  */
@@ -2876,7 +3025,7 @@ stop_and_resume_callback (struct lwp_info *lp, void *data)
              lp->status = W_STOPCODE (SIGSTOP);
            }
 
-         if (lp->status == 0)
+         if (!lwp_status_pending_p (lp))
            {
              if (debug_linux_nat)
                fprintf_unfiltered (gdb_stdlog,
@@ -2891,8 +3040,6 @@ stop_and_resume_callback (struct lwp_info *lp, void *data)
                                    "SARC: not re-resuming LWP %ld "
                                    "(has pending)\n",
                                    ptid_get_lwp (lp->ptid));
-             if (new_pending_p)
-               *new_pending_p = 1;
            }
        }
     }
@@ -2900,16 +3047,13 @@ stop_and_resume_callback (struct lwp_info *lp, void *data)
 }
 
 /* Check if we should go on and pass this event to common code.
-   Return the affected lwp if we are, or NULL otherwise.  If we stop
-   all lwps temporarily, we may end up with new pending events in some
-   other lwp.  In that case set *NEW_PENDING_P to true.  */
+   Return the affected lwp if we are, or NULL otherwise.  */
 
 static struct lwp_info *
-linux_nat_filter_event (int lwpid, int status, int *new_pending_p)
+linux_nat_filter_event (int lwpid, int status)
 {
   struct lwp_info *lp;
-
-  *new_pending_p = 0;
+  int event = linux_ptrace_get_extended_event (status);
 
   lp = find_lwp_pid (pid_to_ptid (lwpid));
 
@@ -2927,7 +3071,7 @@ linux_nat_filter_event (int lwpid, int status, int *new_pending_p)
      thread changes its tid to the tgid.  */
 
   if (WIFSTOPPED (status) && lp == NULL
-      && (WSTOPSIG (status) == SIGTRAP && status >> 16 == PTRACE_EVENT_EXEC))
+      && (WSTOPSIG (status) == SIGTRAP && event == PTRACE_EVENT_EXEC))
     {
       /* A multi-thread exec after we had seen the leader exiting.  */
       if (debug_linux_nat)
@@ -2943,6 +3087,10 @@ linux_nat_filter_event (int lwpid, int status, int *new_pending_p)
 
   if (WIFSTOPPED (status) && !lp)
     {
+      if (debug_linux_nat)
+       fprintf_unfiltered (gdb_stdlog,
+                           "LHEW: saving LWP %ld status %s in stopped_pids list\n",
+                           (long) lwpid, status_to_str (status));
       add_to_pid_list (&stopped_pids, lwpid, status);
       return NULL;
     }
@@ -2954,6 +3102,19 @@ linux_nat_filter_event (int lwpid, int status, int *new_pending_p)
   if (!WIFSTOPPED (status) && !lp)
     return NULL;
 
+  /* This LWP is stopped now.  (And if dead, this prevents it from
+     ever being continued.)  */
+  lp->stopped = 1;
+
+  if (WIFSTOPPED (status) && lp->must_set_ptrace_flags)
+    {
+      struct inferior *inf = find_inferior_pid (ptid_get_pid (lp->ptid));
+      int options = linux_nat_ptrace_options (inf->attach_flag);
+
+      linux_enable_event_reporting (ptid_get_lwp (lp->ptid), options);
+      lp->must_set_ptrace_flags = 0;
+    }
+
   /* Handle GNU/Linux's syscall SIGTRAPs.  */
   if (WIFSTOPPED (status) && WSTOPSIG (status) == SYSCALL_SIGTRAP)
     {
@@ -2967,53 +3128,75 @@ linux_nat_filter_event (int lwpid, int status, int *new_pending_p)
     }
 
   /* Handle GNU/Linux's extended waitstatus for trace events.  */
-  if (WIFSTOPPED (status) && WSTOPSIG (status) == SIGTRAP && status >> 16 != 0)
+  if (WIFSTOPPED (status) && WSTOPSIG (status) == SIGTRAP
+      && linux_is_extended_waitstatus (status))
     {
       if (debug_linux_nat)
        fprintf_unfiltered (gdb_stdlog,
                            "LLW: Handling extended status 0x%06x\n",
                            status);
-      if (linux_handle_extended_wait (lp, status, 0))
+      if (linux_handle_extended_wait (lp, status))
        return NULL;
     }
 
-  if (linux_nat_status_is_event (status))
-    save_sigtrap (lp);
-
   /* Check if the thread has exited.  */
-  if ((WIFEXITED (status) || WIFSIGNALED (status))
-      && num_lwps (ptid_get_pid (lp->ptid)) > 1)
+  if (WIFEXITED (status) || WIFSIGNALED (status))
     {
-      /* If this is the main thread, we must stop all threads and verify
-        if they are still alive.  This is because in the nptl thread model
-        on Linux 2.4, there is no signal issued for exiting LWPs
-        other than the main thread.  We only get the main thread exit
-        signal once all child threads have already exited.  If we
-        stop all the threads and use the stop_wait_callback to check
-        if they have exited we can determine whether this signal
-        should be ignored or whether it means the end of the debugged
-        application, regardless of which threading model is being
-        used.  */
-      if (ptid_get_pid (lp->ptid) == ptid_get_lwp (lp->ptid))
+      if (num_lwps (ptid_get_pid (lp->ptid)) > 1)
        {
-         lp->stopped = 1;
-         iterate_over_lwps (pid_to_ptid (ptid_get_pid (lp->ptid)),
-                            stop_and_resume_callback, new_pending_p);
+         /* If this is the main thread, we must stop all threads and
+            verify if they are still alive.  This is because in the
+            nptl thread model on Linux 2.4, there is no signal issued
+            for exiting LWPs other than the main thread.  We only get
+            the main thread exit signal once all child threads have
+            already exited.  If we stop all the threads and use the
+            stop_wait_callback to check if they have exited we can
+            determine whether this signal should be ignored or
+            whether it means the end of the debugged application,
+            regardless of which threading model is being used.  */
+         if (ptid_get_pid (lp->ptid) == ptid_get_lwp (lp->ptid))
+           {
+             iterate_over_lwps (pid_to_ptid (ptid_get_pid (lp->ptid)),
+                                stop_and_resume_callback, NULL);
+           }
+
+         if (debug_linux_nat)
+           fprintf_unfiltered (gdb_stdlog,
+                               "LLW: %s exited.\n",
+                               target_pid_to_str (lp->ptid));
+
+         if (num_lwps (ptid_get_pid (lp->ptid)) > 1)
+           {
+             /* If there is at least one more LWP, then the exit signal
+                was not the end of the debugged application and should be
+                ignored.  */
+             exit_lwp (lp);
+             return NULL;
+           }
        }
 
+      /* Note that even if the leader was ptrace-stopped, it can still
+        exit, if e.g., some other thread brings down the whole
+        process (calls `exit').  So don't assert that the lwp is
+        resumed.  */
       if (debug_linux_nat)
        fprintf_unfiltered (gdb_stdlog,
-                           "LLW: %s exited.\n",
-                           target_pid_to_str (lp->ptid));
+                           "Process %ld exited (resumed=%d)\n",
+                           ptid_get_lwp (lp->ptid), lp->resumed);
 
-      if (num_lwps (ptid_get_pid (lp->ptid)) > 1)
-       {
-        /* If there is at least one more LWP, then the exit signal
-           was not the end of the debugged application and should be
-           ignored.  */
-        exit_lwp (lp);
-        return NULL;
-       }
+      /* This was the last lwp in the process.  Since events are
+        serialized to GDB core, we may not be able 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.  */
+
+      /* Dead LWP's aren't expected to reported a pending sigstop.  */
+      lp->signalled = 0;
+
+      /* Store the pending event in the waitstatus, because
+        W_EXITCODE(0,0) == 0.  */
+      store_waitstatus (&lp->waitstatus, status);
+      return lp;
     }
 
   /* Check if the current LWP has previously exited.  In the nptl
@@ -3043,35 +3226,28 @@ linux_nat_filter_event (int lwpid, int status, int *new_pending_p)
   if (lp->signalled
       && WIFSTOPPED (status) && WSTOPSIG (status) == SIGSTOP)
     {
-      if (debug_linux_nat)
-       fprintf_unfiltered (gdb_stdlog,
-                           "LLW: Delayed SIGSTOP caught for %s.\n",
-                           target_pid_to_str (lp->ptid));
-
       lp->signalled = 0;
 
-      if (lp->last_resume_kind != resume_stop)
+      if (lp->last_resume_kind == resume_stop)
        {
-         /* This is a delayed SIGSTOP.  */
-
-         registers_changed ();
+         if (debug_linux_nat)
+           fprintf_unfiltered (gdb_stdlog,
+                               "LLW: resume_stop SIGSTOP caught for %s.\n",
+                               target_pid_to_str (lp->ptid));
+       }
+      else
+       {
+         /* This is a delayed SIGSTOP.  Filter out the event.  */
 
-         if (linux_nat_prepare_to_resume != NULL)
-           linux_nat_prepare_to_resume (lp);
-         linux_ops->to_resume (linux_ops,
-                               pid_to_ptid (ptid_get_lwp (lp->ptid)),
-                               lp->step, GDB_SIGNAL_0);
          if (debug_linux_nat)
            fprintf_unfiltered (gdb_stdlog,
-                               "LLW: %s %s, 0, 0 (discard SIGSTOP)\n",
+                               "LLW: %s %s, 0, 0 (discard delayed SIGSTOP)\n",
                                lp->step ?
                                "PTRACE_SINGLESTEP" : "PTRACE_CONT",
                                target_pid_to_str (lp->ptid));
 
-         lp->stopped = 0;
+         linux_resume_one_lwp (lp, lp->step, GDB_SIGNAL_0);
          gdb_assert (lp->resumed);
-
-         /* Discard the event.  */
          return NULL;
        }
     }
@@ -3089,28 +3265,74 @@ linux_nat_filter_event (int lwpid, int status, int *new_pending_p)
       /* This is a delayed SIGINT.  */
       lp->ignore_sigint = 0;
 
-      registers_changed ();
-      if (linux_nat_prepare_to_resume != NULL)
-       linux_nat_prepare_to_resume (lp);
-      linux_ops->to_resume (linux_ops, pid_to_ptid (ptid_get_lwp (lp->ptid)),
-                           lp->step, GDB_SIGNAL_0);
+      linux_resume_one_lwp (lp, lp->step, GDB_SIGNAL_0);
       if (debug_linux_nat)
        fprintf_unfiltered (gdb_stdlog,
                            "LLW: %s %s, 0, 0 (discard SIGINT)\n",
                            lp->step ?
                            "PTRACE_SINGLESTEP" : "PTRACE_CONT",
                            target_pid_to_str (lp->ptid));
-
-      lp->stopped = 0;
       gdb_assert (lp->resumed);
 
       /* Discard the event.  */
       return NULL;
     }
 
+  /* Don't report signals that GDB isn't interested in, such as
+     signals that are neither printed nor stopped upon.  Stopping all
+     threads can be a bit time-consuming so if we want decent
+     performance with heavily multi-threaded programs, especially when
+     they're using a high frequency timer, we'd better avoid it if we
+     can.  */
+  if (WIFSTOPPED (status))
+    {
+      enum gdb_signal signo = gdb_signal_from_host (WSTOPSIG (status));
+
+      if (!target_is_non_stop_p ())
+       {
+         /* Only do the below in all-stop, as we currently use SIGSTOP
+            to implement target_stop (see linux_nat_stop) in
+            non-stop.  */
+         if (signo == GDB_SIGNAL_INT && signal_pass_state (signo) == 0)
+           {
+             /* If ^C/BREAK is typed at the tty/console, SIGINT gets
+                forwarded to the entire process group, that is, all LWPs
+                will receive it - unless they're using CLONE_THREAD to
+                share signals.  Since we only want to report it once, we
+                mark it as ignored for all LWPs except this one.  */
+             iterate_over_lwps (pid_to_ptid (ptid_get_pid (lp->ptid)),
+                                             set_ignore_sigint, NULL);
+             lp->ignore_sigint = 0;
+           }
+         else
+           maybe_clear_ignore_sigint (lp);
+       }
+
+      /* When using hardware single-step, we need to report every signal.
+        Otherwise, signals in pass_mask may be short-circuited
+        except signals that might be caused by a breakpoint.  */
+      if (!lp->step
+         && WSTOPSIG (status) && sigismember (&pass_mask, WSTOPSIG (status))
+         && !linux_wstatus_maybe_breakpoint (status))
+       {
+         linux_resume_one_lwp (lp, lp->step, signo);
+         if (debug_linux_nat)
+           fprintf_unfiltered (gdb_stdlog,
+                               "LLW: %s %s, %s (preempt 'handle')\n",
+                               lp->step ?
+                               "PTRACE_SINGLESTEP" : "PTRACE_CONT",
+                               target_pid_to_str (lp->ptid),
+                               (signo != GDB_SIGNAL_0
+                                ? strsignal (gdb_signal_to_host (signo))
+                                : "0"));
+         return NULL;
+       }
+    }
+
   /* An interesting event.  */
   gdb_assert (lp);
   lp->status = status;
+  save_sigtrap (lp);
   return lp;
 }
 
@@ -3184,7 +3406,7 @@ linux_nat_wait_1 (struct target_ops *ops,
                  ptid_t ptid, struct target_waitstatus *ourstatus,
                  int target_options)
 {
-  static sigset_t prev_mask;
+  sigset_t prev_mask;
   enum resume_kind last_resume_kind;
   struct lwp_info *lp;
   int status;
@@ -3209,56 +3431,26 @@ linux_nat_wait_1 (struct target_ops *ops,
   /* Make sure SIGCHLD is blocked until the sigsuspend below.  */
   block_child_signals (&prev_mask);
 
-retry:
-  lp = NULL;
-  status = 0;
-
   /* First check if there is a LWP with a wait status pending.  */
-  if (ptid_equal (ptid, minus_one_ptid) || ptid_is_pid (ptid))
-    {
-      /* Any LWP in the PTID group that's been resumed will do.  */
-      lp = iterate_over_lwps (ptid, status_callback, NULL);
-      if (lp)
-       {
-         if (debug_linux_nat && lp->status)
-           fprintf_unfiltered (gdb_stdlog,
-                               "LLW: Using pending wait status %s for %s.\n",
-                               status_to_str (lp->status),
-                               target_pid_to_str (lp->ptid));
-       }
-    }
-  else if (ptid_lwp_p (ptid))
+  lp = iterate_over_lwps (ptid, status_callback, NULL);
+  if (lp != NULL)
     {
       if (debug_linux_nat)
-       fprintf_unfiltered (gdb_stdlog,
-                           "LLW: Waiting for specific LWP %s.\n",
-                           target_pid_to_str (ptid));
-
-      /* We have a specific LWP to check.  */
-      lp = find_lwp_pid (ptid);
-      gdb_assert (lp);
-
-      if (debug_linux_nat && lp->status)
        fprintf_unfiltered (gdb_stdlog,
                            "LLW: Using pending wait status %s for %s.\n",
                            status_to_str (lp->status),
                            target_pid_to_str (lp->ptid));
-
-      /* We check for lp->waitstatus in addition to lp->status,
-        because we can have pending process exits recorded in
-        lp->status and W_EXITCODE(0,0) == 0.  We should probably have
-        an additional lp->status_p flag.  */
-      if (lp->status == 0 && lp->waitstatus.kind == TARGET_WAITKIND_IGNORE)
-       lp = NULL;
     }
 
-  if (!target_can_async_p ())
+  if (!target_is_async_p ())
     {
       /* Causes SIGINT to be passed on to the attached process.  */
       set_sigint_trap ();
     }
 
-  /* But if we don't find a pending event, we'll have to wait.  */
+  /* But if we don't find a pending event, we'll have to wait.  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 (lp == NULL)
     {
@@ -3267,139 +3459,52 @@ retry:
       /* Always use -1 and WNOHANG, due to couple of a kernel/ptrace
         quirks:
 
-        - 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 reapped.
-
-        - 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.  */
-
-      errno = 0;
-      lwpid = my_waitpid (-1, &status,  __WCLONE | WNOHANG);
-      if (lwpid == 0 || (lwpid == -1 && errno == ECHILD))
-       lwpid = my_waitpid (-1, &status, WNOHANG);
-
-      if (debug_linux_nat)
-       fprintf_unfiltered (gdb_stdlog,
-                           "LNW: waitpid(-1, ...) returned %d, %s\n",
-                           lwpid, errno ? safe_strerror (errno) : "ERRNO-OK");
-
-      if (lwpid > 0)
-       {
-         /* If this is true, then we paused LWPs momentarily, and may
-            now have pending events to handle.  */
-         int new_pending;
-
-         if (debug_linux_nat)
-           {
-             fprintf_unfiltered (gdb_stdlog,
-                                 "LLW: waitpid %ld received %s\n",
-                                 (long) lwpid, status_to_str (status));
-           }
-
-         lp = linux_nat_filter_event (lwpid, status, &new_pending);
-
-         /* STATUS is now no longer valid, use LP->STATUS instead.  */
-         status = 0;
-
-         if (lp && !ptid_match (lp->ptid, ptid))
-           {
-             gdb_assert (lp->resumed);
-
-             if (debug_linux_nat)
-               fprintf (stderr,
-                        "LWP %ld got an event %06x, leaving pending.\n",
-                        ptid_get_lwp (lp->ptid), lp->status);
-
-             if (WIFSTOPPED (lp->status))
-               {
-                 if (WSTOPSIG (lp->status) != SIGSTOP)
-                   {
-                     /* Cancel breakpoint hits.  The breakpoint may
-                        be removed before we fetch events from this
-                        process to report to the core.  It is best
-                        not to assume the moribund breakpoints
-                        heuristic always handles these cases --- it
-                        could be too many events go through to the
-                        core before this one is handled.  All-stop
-                        always cancels breakpoint hits in all
-                        threads.  */
-                     if (non_stop
-                         && linux_nat_lp_status_is_event (lp)
-                         && cancel_breakpoint (lp))
-                       {
-                         /* Throw away the SIGTRAP.  */
-                         lp->status = 0;
-
-                         if (debug_linux_nat)
-                           fprintf (stderr,
-                                    "LLW: LWP %ld hit a breakpoint while"
-                                    " waiting for another process;"
-                                    " cancelled it\n",
-                                    ptid_get_lwp (lp->ptid));
-                       }
-                     lp->stopped = 1;
-                   }
-                 else
-                   {
-                     lp->stopped = 1;
-                     lp->signalled = 0;
-                   }
-               }
-             else if (WIFEXITED (lp->status) || WIFSIGNALED (lp->status))
-               {
-                 if (debug_linux_nat)
-                   fprintf (stderr,
-                            "Process %ld exited while stopping LWPs\n",
-                            ptid_get_lwp (lp->ptid));
-
-                 /* 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.  */
-
-                 /* Prevent trying to stop this thread again.  We'll
-                    never try to resume it because it has a pending
-                    status.  */
-                 lp->stopped = 1;
-
-                 /* Dead LWP's aren't expected to reported a pending
-                    sigstop.  */
-                 lp->signalled = 0;
-
-                 /* Store the pending event in the waitstatus as
-                    well, because W_EXITCODE(0,0) == 0.  */
-                 store_waitstatus (&lp->waitstatus, lp->status);
-               }
-
-             /* Keep looking.  */
-             lp = NULL;
-           }
+        - 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 reapped.
 
-         if (new_pending)
-           {
-             /* Some LWP now has a pending event.  Go all the way
-                back to check it.  */
-             goto retry;
-           }
+        - 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.  */
+
+      errno = 0;
+      lwpid = my_waitpid (-1, &status,  __WCLONE | WNOHANG);
+      if (lwpid == 0 || (lwpid == -1 && errno == ECHILD))
+       lwpid = my_waitpid (-1, &status, WNOHANG);
 
-         if (lp)
+      if (debug_linux_nat)
+       fprintf_unfiltered (gdb_stdlog,
+                           "LNW: waitpid(-1, ...) returned %d, %s\n",
+                           lwpid, errno ? safe_strerror (errno) : "ERRNO-OK");
+
+      if (lwpid > 0)
+       {
+         if (debug_linux_nat)
            {
-             /* We got an event to report to the core.  */
-             break;
+             fprintf_unfiltered (gdb_stdlog,
+                                 "LLW: waitpid %ld received %s\n",
+                                 (long) lwpid, status_to_str (status));
            }
 
+         linux_nat_filter_event (lwpid, status);
          /* Retry until nothing comes out of waitpid.  A single
             SIGCHLD can indicate more than one child stopped.  */
          continue;
        }
 
+      /* Now that we've pulled all events out of the kernel, resume
+        LWPs that don't have an interesting event to report.  */
+      iterate_over_lwps (minus_one_ptid,
+                        resume_stopped_resumed_lwps, &minus_one_ptid);
+
+      /* ... and find an LWP with a status to report to the core, if
+        any.  */
+      lp = iterate_over_lwps (ptid, status_callback, NULL);
+      if (lp != NULL)
+       break;
+
       /* Check for zombie thread group leaders.  Those can't be reaped
         until all other threads in the thread group are.  */
       check_zombie_leaders ();
@@ -3413,7 +3518,7 @@ retry:
 
          ourstatus->kind = TARGET_WAITKIND_NO_RESUMED;
 
-         if (!target_can_async_p ())
+         if (!target_is_async_p ())
            clear_sigint_trap ();
 
          restore_child_signals_mask (&prev_mask);
@@ -3436,10 +3541,12 @@ retry:
       gdb_assert (lp == NULL);
 
       /* Block until we get an event reported with SIGCHLD.  */
+      if (debug_linux_nat)
+       fprintf_unfiltered (gdb_stdlog, "LNW: about to sigsuspend\n");
       sigsuspend (&suspend_mask);
     }
 
-  if (!target_can_async_p ())
+  if (!target_is_async_p ())
     clear_sigint_trap ();
 
   gdb_assert (lp);
@@ -3447,75 +3554,7 @@ retry:
   status = lp->status;
   lp->status = 0;
 
-  /* Don't report signals that GDB isn't interested in, such as
-     signals that are neither printed nor stopped upon.  Stopping all
-     threads can be a bit time-consuming so if we want decent
-     performance with heavily multi-threaded programs, especially when
-     they're using a high frequency timer, we'd better avoid it if we
-     can.  */
-
-  if (WIFSTOPPED (status))
-    {
-      enum gdb_signal signo = gdb_signal_from_host (WSTOPSIG (status));
-
-      /* When using hardware single-step, we need to report every signal.
-        Otherwise, signals in pass_mask may be short-circuited.  */
-      if (!lp->step
-         && WSTOPSIG (status) && sigismember (&pass_mask, WSTOPSIG (status)))
-       {
-         /* FIMXE: kettenis/2001-06-06: Should we resume all threads
-            here?  It is not clear we should.  GDB may not expect
-            other threads to run.  On the other hand, not resuming
-            newly attached threads may cause an unwanted delay in
-            getting them running.  */
-         registers_changed ();
-         if (linux_nat_prepare_to_resume != NULL)
-           linux_nat_prepare_to_resume (lp);
-         linux_ops->to_resume (linux_ops,
-                               pid_to_ptid (ptid_get_lwp (lp->ptid)),
-                               lp->step, signo);
-         if (debug_linux_nat)
-           fprintf_unfiltered (gdb_stdlog,
-                               "LLW: %s %s, %s (preempt 'handle')\n",
-                               lp->step ?
-                               "PTRACE_SINGLESTEP" : "PTRACE_CONT",
-                               target_pid_to_str (lp->ptid),
-                               (signo != GDB_SIGNAL_0
-                                ? strsignal (gdb_signal_to_host (signo))
-                                : "0"));
-         lp->stopped = 0;
-         goto retry;
-       }
-
-      if (!non_stop)
-       {
-         /* Only do the below in all-stop, as we currently use SIGINT
-            to implement target_stop (see linux_nat_stop) in
-            non-stop.  */
-         if (signo == GDB_SIGNAL_INT && signal_pass_state (signo) == 0)
-           {
-             /* If ^C/BREAK is typed at the tty/console, SIGINT gets
-                forwarded to the entire process group, that is, all LWPs
-                will receive it - unless they're using CLONE_THREAD to
-                share signals.  Since we only want to report it once, we
-                mark it as ignored for all LWPs except this one.  */
-             iterate_over_lwps (pid_to_ptid (ptid_get_pid (ptid)),
-                                             set_ignore_sigint, NULL);
-             lp->ignore_sigint = 0;
-           }
-         else
-           maybe_clear_ignore_sigint (lp);
-       }
-    }
-
-  /* This LWP is stopped now.  */
-  lp->stopped = 1;
-
-  if (debug_linux_nat)
-    fprintf_unfiltered (gdb_stdlog, "LLW: Candidate event %s in %s.\n",
-                       status_to_str (status), target_pid_to_str (lp->ptid));
-
-  if (!non_stop)
+  if (!target_is_non_stop_p ())
     {
       /* Now stop all other LWP's ...  */
       iterate_over_lwps (minus_one_ptid, stop_callback, NULL);
@@ -3523,33 +3562,48 @@ retry:
       /* ... and wait until all of them have reported back that
         they're no longer running.  */
       iterate_over_lwps (minus_one_ptid, stop_wait_callback, NULL);
+    }
+
+  /* If we're not waiting for a specific LWP, choose an event LWP from
+     among those that have had events.  Giving equal priority to all
+     LWPs that have had events helps prevent starvation.  */
+  if (ptid_equal (ptid, minus_one_ptid) || ptid_is_pid (ptid))
+    select_event_lwp (ptid, &lp, &status);
+
+  gdb_assert (lp != NULL);
+
+  /* Now that we've selected our final event LWP, un-adjust its PC if
+     it was a software breakpoint, and we can't reliably support the
+     "stopped by software breakpoint" stop reason.  */
+  if (lp->stop_reason == TARGET_STOPPED_BY_SW_BREAKPOINT
+      && !USE_SIGTRAP_SIGINFO)
+    {
+      struct regcache *regcache = get_thread_regcache (lp->ptid);
+      struct gdbarch *gdbarch = get_regcache_arch (regcache);
+      int decr_pc = gdbarch_decr_pc_after_break (gdbarch);
 
-      /* If we're not waiting for a specific LWP, choose an event LWP
-        from among those that have had events.  Giving equal priority
-        to all LWPs that have had events helps prevent
-        starvation.  */
-      if (ptid_equal (ptid, minus_one_ptid) || ptid_is_pid (ptid))
-       select_event_lwp (ptid, &lp, &status);
+      if (decr_pc != 0)
+       {
+         CORE_ADDR pc;
 
-      /* 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.  */
-      iterate_over_lwps (minus_one_ptid, cancel_breakpoints_callback, lp);
+         pc = regcache_read_pc (regcache);
+         regcache_write_pc (regcache, pc + decr_pc);
+       }
+    }
 
-      /* We'll need this to determine whether to report a SIGSTOP as
-        TARGET_WAITKIND_0.  Need to take a copy because
-        resume_clear_callback clears it.  */
-      last_resume_kind = lp->last_resume_kind;
+  /* We'll need this to determine whether to report a SIGSTOP as
+     GDB_SIGNAL_0.  Need to take a copy because resume_clear_callback
+     clears it.  */
+  last_resume_kind = lp->last_resume_kind;
 
+  if (!target_is_non_stop_p ())
+    {
       /* In all-stop, from the core's perspective, all LWPs are now
         stopped until a new resume action is sent over.  */
       iterate_over_lwps (minus_one_ptid, resume_clear_callback, NULL);
     }
   else
     {
-      /* See above.  */
-      last_resume_kind = lp->last_resume_kind;
       resume_clear_callback (lp, NULL);
     }
 
@@ -3601,39 +3655,64 @@ resume_stopped_resumed_lwps (struct lwp_info *lp, void *data)
 {
   ptid_t *wait_ptid_p = data;
 
-  if (lp->stopped
-      && lp->resumed
-      && lp->status == 0
-      && lp->waitstatus.kind == TARGET_WAITKIND_IGNORE)
+  if (!lp->stopped)
+    {
+      if (debug_linux_nat)
+       fprintf_unfiltered (gdb_stdlog,
+                           "RSRL: NOT resuming LWP %s, not stopped\n",
+                           target_pid_to_str (lp->ptid));
+    }
+  else if (!lp->resumed)
+    {
+      if (debug_linux_nat)
+       fprintf_unfiltered (gdb_stdlog,
+                           "RSRL: NOT resuming LWP %s, not resumed\n",
+                           target_pid_to_str (lp->ptid));
+    }
+  else if (lwp_status_pending_p (lp))
+    {
+      if (debug_linux_nat)
+       fprintf_unfiltered (gdb_stdlog,
+                           "RSRL: NOT resuming LWP %s, has pending status\n",
+                           target_pid_to_str (lp->ptid));
+    }
+  else
     {
       struct regcache *regcache = get_thread_regcache (lp->ptid);
       struct gdbarch *gdbarch = get_regcache_arch (regcache);
-      CORE_ADDR pc = regcache_read_pc (regcache);
 
-      gdb_assert (is_executing (lp->ptid));
-
-      /* Don't bother if there's a breakpoint at PC that we'd hit
-        immediately, and we're not waiting for this LWP.  */
-      if (!ptid_match (lp->ptid, *wait_ptid_p))
+      TRY
        {
-         if (breakpoint_inserted_here_p (get_regcache_aspace (regcache), pc))
-           return 0;
-       }
+         CORE_ADDR pc = regcache_read_pc (regcache);
+         int leave_stopped = 0;
 
-      if (debug_linux_nat)
-       fprintf_unfiltered (gdb_stdlog,
-                           "RSRL: resuming stopped-resumed LWP %s at %s: step=%d\n",
-                           target_pid_to_str (lp->ptid),
-                           paddress (gdbarch, pc),
-                           lp->step);
+         /* Don't bother if there's a breakpoint at PC that we'd hit
+            immediately, and we're not waiting for this LWP.  */
+         if (!ptid_match (lp->ptid, *wait_ptid_p))
+           {
+             if (breakpoint_inserted_here_p (get_regcache_aspace (regcache), pc))
+               leave_stopped = 1;
+           }
 
-      registers_changed ();
-      if (linux_nat_prepare_to_resume != NULL)
-       linux_nat_prepare_to_resume (lp);
-      linux_ops->to_resume (linux_ops, pid_to_ptid (ptid_get_lwp (lp->ptid)),
-                           lp->step, GDB_SIGNAL_0);
-      lp->stopped = 0;
-      lp->stopped_by_watchpoint = 0;
+         if (!leave_stopped)
+           {
+             if (debug_linux_nat)
+               fprintf_unfiltered (gdb_stdlog,
+                                   "RSRL: resuming stopped-resumed LWP %s at "
+                                   "%s: step=%d\n",
+                                   target_pid_to_str (lp->ptid),
+                                   paddress (gdbarch, pc),
+                                   lp->step);
+
+             linux_resume_one_lwp_throw (lp, lp->step, GDB_SIGNAL_0);
+           }
+       }
+      CATCH (ex, RETURN_MASK_ERROR)
+       {
+         if (!check_ptrace_stopped_lwp_gone (lp))
+           throw_exception (ex);
+       }
+      END_CATCH
     }
 
   return 0;
@@ -3659,7 +3738,7 @@ linux_nat_wait (struct target_ops *ops,
     }
 
   /* Flush the async file first.  */
-  if (target_can_async_p ())
+  if (target_is_async_p ())
     async_file_flush ();
 
   /* Resume LWPs that are currently stopped without any pending status
@@ -3669,7 +3748,7 @@ linux_nat_wait (struct target_ops *ops,
      specific_process, for example, see linux_nat_wait_1), and
      meanwhile the event became uninteresting.  Don't bother resuming
      LWPs we're not going to wait for if they'd stop immediately.  */
-  if (non_stop)
+  if (target_is_non_stop_p ())
     iterate_over_lwps (minus_one_ptid, resume_stopped_resumed_lwps, &ptid);
 
   event_ptid = linux_nat_wait_1 (ops, ptid, ourstatus, target_options);
@@ -3677,16 +3756,12 @@ linux_nat_wait (struct target_ops *ops,
   /* If we requested any event, and something came out, assume there
      may be more.  If we requested a specific lwp or process, also
      assume there may be more.  */
-  if (target_can_async_p ()
+  if (target_is_async_p ()
       && ((ourstatus->kind != TARGET_WAITKIND_IGNORE
           && ourstatus->kind != TARGET_WAITKIND_NO_RESUMED)
          || !ptid_equal (ptid, minus_one_ptid)))
     async_file_mark ();
 
-  /* Get ready for the next event.  */
-  if (target_can_async_p ())
-    target_async (inferior_event_handler, 0);
-
   return event_ptid;
 }
 
@@ -3696,22 +3771,30 @@ kill_callback (struct lwp_info *lp, void *data)
   /* PTRACE_KILL may resume the inferior.  Send SIGKILL first.  */
 
   errno = 0;
-  kill (ptid_get_lwp (lp->ptid), SIGKILL);
+  kill_lwp (ptid_get_lwp (lp->ptid), SIGKILL);
   if (debug_linux_nat)
-    fprintf_unfiltered (gdb_stdlog,
-                       "KC:  kill (SIGKILL) %s, 0, 0 (%s)\n",
-                       target_pid_to_str (lp->ptid),
-                       errno ? safe_strerror (errno) : "OK");
+    {
+      int save_errno = errno;
+
+      fprintf_unfiltered (gdb_stdlog,
+                         "KC:  kill (SIGKILL) %s, 0, 0 (%s)\n",
+                         target_pid_to_str (lp->ptid),
+                         save_errno ? safe_strerror (save_errno) : "OK");
+    }
 
   /* Some kernels ignore even SIGKILL for processes under ptrace.  */
 
   errno = 0;
   ptrace (PTRACE_KILL, ptid_get_lwp (lp->ptid), 0, 0);
   if (debug_linux_nat)
-    fprintf_unfiltered (gdb_stdlog,
-                       "KC:  PTRACE_KILL %s, 0, 0 (%s)\n",
-                       target_pid_to_str (lp->ptid),
-                       errno ? safe_strerror (errno) : "OK");
+    {
+      int save_errno = errno;
+
+      fprintf_unfiltered (gdb_stdlog,
+                         "KC:  PTRACE_KILL %s, 0, 0 (%s)\n",
+                         target_pid_to_str (lp->ptid),
+                         save_errno ? safe_strerror (save_errno) : "OK");
+    }
 
   return 0;
 }
@@ -3976,6 +4059,23 @@ linux_nat_thread_alive (struct target_ops *ops, ptid_t ptid)
   return linux_thread_alive (ptid);
 }
 
+/* Implement the to_update_thread_list target method for this
+   target.  */
+
+static void
+linux_nat_update_thread_list (struct target_ops *ops)
+{
+  if (linux_supports_traceclone ())
+    {
+      /* With support for clone events, we add/delete threads from the
+        list as clone/exit events are processed, so just try deleting
+        exited threads still in the thread list.  */
+      delete_exited_threads ();
+    }
+  else
+    prune_threads ();
+}
+
 static char *
 linux_nat_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
@@ -4035,75 +4135,7 @@ linux_nat_thread_name (struct target_ops *self, struct thread_info *thr)
 static char *
 linux_child_pid_to_exec_file (struct target_ops *self, int pid)
 {
-  char *name1, *name2;
-
-  name1 = xmalloc (PATH_MAX);
-  name2 = xmalloc (PATH_MAX);
-  make_cleanup (xfree, name1);
-  make_cleanup (xfree, name2);
-  memset (name2, 0, PATH_MAX);
-
-  xsnprintf (name1, PATH_MAX, "/proc/%d/exe", pid);
-  if (readlink (name1, name2, PATH_MAX - 1) > 0)
-    return name2;
-  else
-    return name1;
-}
-
-/* Records the thread's register state for the corefile note
-   section.  */
-
-static char *
-linux_nat_collect_thread_registers (const struct regcache *regcache,
-                                   ptid_t ptid, bfd *obfd,
-                                   char *note_data, int *note_size,
-                                   enum gdb_signal stop_signal)
-{
-  struct gdbarch *gdbarch = get_regcache_arch (regcache);
-  const struct regset *regset;
-  int core_regset_p;
-  gdb_gregset_t gregs;
-  gdb_fpregset_t fpregs;
-
-  core_regset_p = gdbarch_regset_from_core_section_p (gdbarch);
-
-  if (core_regset_p
-      && (regset = gdbarch_regset_from_core_section (gdbarch, ".reg",
-                                                    sizeof (gregs)))
-        != NULL && regset->collect_regset != NULL)
-    regset->collect_regset (regset, regcache, -1, &gregs, sizeof (gregs));
-  else
-    fill_gregset (regcache, &gregs, -1);
-
-  note_data = (char *) elfcore_write_prstatus
-                        (obfd, note_data, note_size, ptid_get_lwp (ptid),
-                         gdb_signal_to_host (stop_signal), &gregs);
-
-  if (core_regset_p
-      && (regset = gdbarch_regset_from_core_section (gdbarch, ".reg2",
-                                                    sizeof (fpregs)))
-         != NULL && regset->collect_regset != NULL)
-    regset->collect_regset (regset, regcache, -1, &fpregs, sizeof (fpregs));
-  else
-    fill_fpregset (regcache, &fpregs, -1);
-
-  note_data = (char *) elfcore_write_prfpreg (obfd, note_data, note_size,
-                                             &fpregs, sizeof (fpregs));
-
-  return note_data;
-}
-
-/* Fills the "to_make_corefile_note" target vector.  Builds the note
-   section for a corefile, and returns it in a malloc buffer.  */
-
-static char *
-linux_nat_make_corefile_notes (struct target_ops *self,
-                              bfd *obfd, int *note_size)
-{
-  /* FIXME: uweigand/2011-10-06: Once all GNU/Linux architectures have been
-     converted to gdbarch_core_regset_sections, this function can go away.  */
-  return linux_make_corefile_notes (target_gdbarch (), obfd, note_size,
-                                   linux_nat_collect_thread_registers);
+  return linux_proc_pid_to_exec_file (pid);
 }
 
 /* Implement the to_xfer_partial interface for memory reads using the /proc
@@ -4122,7 +4154,7 @@ linux_proc_xfer_partial (struct target_ops *ops, enum target_object object,
   char filename[64];
 
   if (object != TARGET_OBJECT_MEMORY || !readbuf)
-    return 0;
+    return TARGET_XFER_EOF;
 
   /* Don't bother for one word.  */
   if (len < 3 * sizeof (long))
@@ -4346,13 +4378,13 @@ linux_proc_pending_signals (int pid, sigset_t *pending,
         Unfortunately some Red Hat kernels include the shared pending
         queue but not the ShdPnd status field.  */
 
-      if (strncmp (buffer, "SigPnd:\t", 8) == 0)
+      if (startswith (buffer, "SigPnd:\t"))
        add_line_to_sigset (buffer + 8, pending);
-      else if (strncmp (buffer, "ShdPnd:\t", 8) == 0)
+      else if (startswith (buffer, "ShdPnd:\t"))
        add_line_to_sigset (buffer + 8, pending);
-      else if (strncmp (buffer, "SigBlk:\t", 8) == 0)
+      else if (startswith (buffer, "SigBlk:\t"))
        add_line_to_sigset (buffer + 8, blocked);
-      else if (strncmp (buffer, "SigIgn:\t", 8) == 0)
+      else if (startswith (buffer, "SigIgn:\t"))
        add_line_to_sigset (buffer + 8, ignored);
     }
 
@@ -4429,7 +4461,8 @@ cleanup_target_stop (void *arg)
 }
 
 static VEC(static_tracepoint_marker_p) *
-linux_child_static_tracepoint_markers_by_strid (const char *strid)
+linux_child_static_tracepoint_markers_by_strid (struct target_ops *self,
+                                               const char *strid)
 {
   char s[IPA_CMD_BUF_SIZE];
   struct cleanup *old_chain;
@@ -4501,7 +4534,6 @@ linux_target_install_ops (struct target_ops *t)
   t->to_post_startup_inferior = linux_child_post_startup_inferior;
   t->to_post_attach = linux_child_post_attach;
   t->to_follow_fork = linux_child_follow_fork;
-  t->to_make_corefile_notes = linux_nat_make_corefile_notes;
 
   super_xfer_partial = t->to_xfer_partial;
   t->to_xfer_partial = linux_xfer_partial;
@@ -4537,10 +4569,7 @@ linux_trad_target (CORE_ADDR (*register_u_offset)(struct gdbarch *, int, int))
 static int
 linux_nat_is_async_p (struct target_ops *ops)
 {
-  /* NOTE: palves 2008-03-21: We're only async when the user requests
-     it explicitly with the "set target-async" command.
-     Someday, linux will always be async.  */
-  return target_async_permitted;
+  return linux_is_async_p ();
 }
 
 /* target_can_async_p implementation.  */
@@ -4560,19 +4589,29 @@ linux_nat_supports_non_stop (struct target_ops *self)
   return 1;
 }
 
+/* to_always_non_stop_p implementation.  */
+
+static int
+linux_nat_always_non_stop_p (struct target_ops *self)
+{
+  if (linux_ops->to_always_non_stop_p != NULL)
+    return linux_ops->to_always_non_stop_p (linux_ops);
+  return 1;
+}
+
 /* True if we want to support multi-process.  To be removed when GDB
    supports multi-exec.  */
 
 int linux_multi_process = 1;
 
 static int
-linux_nat_supports_multi_process (void)
+linux_nat_supports_multi_process (struct target_ops *self)
 {
   return linux_multi_process;
 }
 
 static int
-linux_nat_supports_disable_randomization (void)
+linux_nat_supports_disable_randomization (struct target_ops *self)
 {
 #ifdef HAVE_PERSONALITY
   return 1;
@@ -4583,19 +4622,25 @@ linux_nat_supports_disable_randomization (void)
 
 static int async_terminal_is_ours = 1;
 
-/* target_terminal_inferior implementation.  */
+/* target_terminal_inferior implementation.
+
+   This is a wrapper around child_terminal_inferior to add async support.  */
 
 static void
 linux_nat_terminal_inferior (struct target_ops *self)
 {
-  if (!target_is_async_p ())
+  /* Like target_terminal_inferior, use target_can_async_p, not
+     target_is_async_p, since at this point the target is not async
+     yet.  If it can async, then we know it will become async prior to
+     resume.  */
+  if (!target_can_async_p ())
     {
       /* Async mode is disabled.  */
-      terminal_inferior (self);
+      child_terminal_inferior (self);
       return;
     }
 
-  terminal_inferior (self);
+  child_terminal_inferior (self);
 
   /* Calls to target_terminal_*() are meant to be idempotent.  */
   if (!async_terminal_is_ours)
@@ -4606,22 +4651,22 @@ linux_nat_terminal_inferior (struct target_ops *self)
   set_sigint_trap ();
 }
 
-/* target_terminal_ours implementation.  */
+/* target_terminal_ours implementation.
+
+   This is a wrapper around child_terminal_ours to add async support (and
+   implement the target_terminal_ours vs target_terminal_ours_for_output
+   distinction).  child_terminal_ours is currently no different than
+   child_terminal_ours_for_output.
+   We leave target_terminal_ours_for_output alone, leaving it to
+   child_terminal_ours_for_output.  */
 
 static void
 linux_nat_terminal_ours (struct target_ops *self)
 {
-  if (!target_is_async_p ())
-    {
-      /* Async mode is disabled.  */
-      terminal_ours (self);
-      return;
-    }
-
   /* GDB should never give the terminal to the inferior if the
      inferior is running in the background (run&, continue&, etc.),
      but claiming it sure should.  */
-  terminal_ours (self);
+  child_terminal_ours (self);
 
   if (async_terminal_is_ours)
     return;
@@ -4631,10 +4676,6 @@ linux_nat_terminal_ours (struct target_ops *self)
   async_terminal_is_ours = 1;
 }
 
-static void (*async_client_callback) (enum inferior_event_type event_type,
-                                     void *context);
-static void *async_client_context;
-
 /* SIGCHLD handler that serves two purposes: In non-stop/async mode,
    so we notice when any child changes state, and notify the
    event-loop; it allows us to use sigsuspend in linux_nat_wait_1
@@ -4662,7 +4703,7 @@ sigchld_handler (int signo)
 static void
 handle_target_event (int error, gdb_client_data client_data)
 {
-  (*async_client_callback) (INF_REG_EVENT, async_client_context);
+  inferior_event_handler (INF_REG_EVENT, NULL);
 }
 
 /* Create/destroy the target events pipe.  Returns previous state.  */
@@ -4670,7 +4711,7 @@ handle_target_event (int error, gdb_client_data client_data)
 static int
 linux_async_pipe (int enable)
 {
-  int previous = (linux_nat_event_pipe[0] != -1);
+  int previous = linux_is_async_p ();
 
   if (previous != enable)
     {
@@ -4706,15 +4747,10 @@ linux_async_pipe (int enable)
 /* target_async implementation.  */
 
 static void
-linux_nat_async (struct target_ops *ops,
-                void (*callback) (enum inferior_event_type event_type,
-                                  void *context),
-                void *context)
+linux_nat_async (struct target_ops *ops, int enable)
 {
-  if (callback != NULL)
+  if (enable)
     {
-      async_client_callback = callback;
-      async_client_context = context;
       if (!linux_async_pipe (1))
        {
          add_file_handler (linux_nat_event_pipe[0],
@@ -4726,8 +4762,6 @@ linux_nat_async (struct target_ops *ops,
     }
   else
     {
-      async_client_callback = callback;
-      async_client_context = context;
       delete_file_handler (linux_nat_event_pipe[0]);
       linux_async_pipe (0);
     }
@@ -4783,22 +4817,30 @@ linux_nat_stop_lwp (struct lwp_info *lwp, void *data)
 
 static void
 linux_nat_stop (struct target_ops *self, ptid_t ptid)
+{
+  iterate_over_lwps (ptid, linux_nat_stop_lwp, NULL);
+}
+
+static void
+linux_nat_interrupt (struct target_ops *self, ptid_t ptid)
 {
   if (non_stop)
     iterate_over_lwps (ptid, linux_nat_stop_lwp, NULL);
   else
-    linux_ops->to_stop (linux_ops, ptid);
+    linux_ops->to_interrupt (linux_ops, ptid);
 }
 
 static void
 linux_nat_close (struct target_ops *self)
 {
   /* Unregister from the event loop.  */
-  if (linux_nat_is_async_p (NULL))
-    linux_nat_async (NULL, NULL, 0);
+  if (linux_nat_is_async_p (self))
+    linux_nat_async (self, 0);
 
   if (linux_ops->to_close)
     linux_ops->to_close (linux_ops);
+
+  super_close (self);
 }
 
 /* When requests are passed down from the linux-nat layer to the
@@ -4815,7 +4857,6 @@ linux_nat_thread_address_space (struct target_ops *t, ptid_t ptid)
   struct inferior *inf;
   int pid;
 
-  pid = ptid_get_lwp (ptid);
   if (ptid_get_lwp (ptid) == 0)
     {
       /* An (lwpid,0,0) ptid.  Look up the lwp object to get at the
@@ -4846,6 +4887,105 @@ linux_nat_core_of_thread (struct target_ops *ops, ptid_t ptid)
   return -1;
 }
 
+/* Implementation of to_filesystem_is_local.  */
+
+static int
+linux_nat_filesystem_is_local (struct target_ops *ops)
+{
+  struct inferior *inf = current_inferior ();
+
+  if (inf->fake_pid_p || inf->pid == 0)
+    return 1;
+
+  return linux_ns_same (inf->pid, LINUX_NS_MNT);
+}
+
+/* Convert the INF argument passed to a to_fileio_* method
+   to a process ID suitable for passing to its corresponding
+   linux_mntns_* function.  If INF is non-NULL then the
+   caller is requesting the filesystem seen by INF.  If INF
+   is NULL then the caller is requesting the filesystem seen
+   by the GDB.  We fall back to GDB's filesystem in the case
+   that INF is non-NULL but its PID is unknown.  */
+
+static pid_t
+linux_nat_fileio_pid_of (struct inferior *inf)
+{
+  if (inf == NULL || inf->fake_pid_p || inf->pid == 0)
+    return getpid ();
+  else
+    return inf->pid;
+}
+
+/* Implementation of to_fileio_open.  */
+
+static int
+linux_nat_fileio_open (struct target_ops *self,
+                      struct inferior *inf, const char *filename,
+                      int flags, int mode, int warn_if_slow,
+                      int *target_errno)
+{
+  int nat_flags;
+  mode_t nat_mode;
+  int fd;
+
+  if (fileio_to_host_openflags (flags, &nat_flags) == -1
+      || fileio_to_host_mode (mode, &nat_mode) == -1)
+    {
+      *target_errno = FILEIO_EINVAL;
+      return -1;
+    }
+
+  fd = linux_mntns_open_cloexec (linux_nat_fileio_pid_of (inf),
+                                filename, nat_flags, nat_mode);
+  if (fd == -1)
+    *target_errno = host_to_fileio_error (errno);
+
+  return fd;
+}
+
+/* Implementation of to_fileio_readlink.  */
+
+static char *
+linux_nat_fileio_readlink (struct target_ops *self,
+                          struct inferior *inf, const char *filename,
+                          int *target_errno)
+{
+  char buf[PATH_MAX];
+  int len;
+  char *ret;
+
+  len = linux_mntns_readlink (linux_nat_fileio_pid_of (inf),
+                             filename, buf, sizeof (buf));
+  if (len < 0)
+    {
+      *target_errno = host_to_fileio_error (errno);
+      return NULL;
+    }
+
+  ret = xmalloc (len + 1);
+  memcpy (ret, buf, len);
+  ret[len] = '\0';
+  return ret;
+}
+
+/* Implementation of to_fileio_unlink.  */
+
+static int
+linux_nat_fileio_unlink (struct target_ops *self,
+                        struct inferior *inf, const char *filename,
+                        int *target_errno)
+{
+  int ret;
+
+  ret = linux_mntns_unlink (linux_nat_fileio_pid_of (inf),
+                           filename);
+  if (ret == -1)
+    *target_errno = host_to_fileio_error (errno);
+
+  return ret;
+}
+
 void
 linux_nat_add_target (struct target_ops *t)
 {
@@ -4867,23 +5007,31 @@ linux_nat_add_target (struct target_ops *t)
   t->to_kill = linux_nat_kill;
   t->to_mourn_inferior = linux_nat_mourn_inferior;
   t->to_thread_alive = linux_nat_thread_alive;
+  t->to_update_thread_list = linux_nat_update_thread_list;
   t->to_pid_to_str = linux_nat_pid_to_str;
   t->to_thread_name = linux_nat_thread_name;
   t->to_has_thread_control = tc_schedlock;
   t->to_thread_address_space = linux_nat_thread_address_space;
   t->to_stopped_by_watchpoint = linux_nat_stopped_by_watchpoint;
   t->to_stopped_data_address = linux_nat_stopped_data_address;
+  t->to_stopped_by_sw_breakpoint = linux_nat_stopped_by_sw_breakpoint;
+  t->to_supports_stopped_by_sw_breakpoint = linux_nat_supports_stopped_by_sw_breakpoint;
+  t->to_stopped_by_hw_breakpoint = linux_nat_stopped_by_hw_breakpoint;
+  t->to_supports_stopped_by_hw_breakpoint = linux_nat_supports_stopped_by_hw_breakpoint;
 
   t->to_can_async_p = linux_nat_can_async_p;
   t->to_is_async_p = linux_nat_is_async_p;
   t->to_supports_non_stop = linux_nat_supports_non_stop;
+  t->to_always_non_stop_p = linux_nat_always_non_stop_p;
   t->to_async = linux_nat_async;
   t->to_terminal_inferior = linux_nat_terminal_inferior;
   t->to_terminal_ours = linux_nat_terminal_ours;
+
+  super_close = t->to_close;
   t->to_close = linux_nat_close;
 
-  /* Methods for non-stop support.  */
   t->to_stop = linux_nat_stop;
+  t->to_interrupt = linux_nat_interrupt;
 
   t->to_supports_multi_process = linux_nat_supports_multi_process;
 
@@ -4892,6 +5040,11 @@ linux_nat_add_target (struct target_ops *t)
 
   t->to_core_of_thread = linux_nat_core_of_thread;
 
+  t->to_filesystem_is_local = linux_nat_filesystem_is_local;
+  t->to_fileio_open = linux_nat_fileio_open;
+  t->to_fileio_readlink = linux_nat_fileio_readlink;
+  t->to_fileio_unlink = linux_nat_fileio_unlink;
+
   /* We don't change the stratum; this target will sit at
      process_stratum and thread_db will set at thread_stratum.  This
      is a little strange, since this is a multi-threaded-capable
@@ -4985,6 +5138,15 @@ linux_nat_get_siginfo (ptid_t ptid, siginfo_t *siginfo)
   return 1;
 }
 
+/* See nat/linux-nat.h.  */
+
+ptid_t
+current_lwp_ptid (void)
+{
+  gdb_assert (ptid_lwp_p (inferior_ptid));
+  return inferior_ptid;
+}
+
 /* Provide a prototype to silence -Wmissing-prototypes.  */
 extern initialize_file_ftype _initialize_linux_nat;
 
@@ -5000,6 +5162,15 @@ Enables printf debugging output."),
                             show_debug_linux_nat,
                             &setdebuglist, &showdebuglist);
 
+  add_setshow_boolean_cmd ("linux-namespaces", class_maintenance,
+                          &debug_linux_namespaces, _("\
+Set debugging of GNU/Linux namespaces module."), _("\
+Show debugging of GNU/Linux namespaces module."), _("\
+Enables printf debugging output."),
+                          NULL,
+                          NULL,
+                          &setdebuglist, &showdebuglist);
+
   /* Save this mask as the default.  */
   sigprocmask (SIG_SETMASK, NULL, &normal_mask);
 
@@ -5030,14 +5201,14 @@ Enables printf debugging output."),
 static int
 get_signo (const char *name)
 {
-  struct minimal_symbol *ms;
+  struct bound_minimal_symbol ms;
   int signo;
 
   ms = lookup_minimal_symbol (name, NULL, NULL);
-  if (ms == NULL)
+  if (ms.minsym == NULL)
     return 0;
 
-  if (target_read_memory (SYMBOL_VALUE_ADDRESS (ms), (gdb_byte *) &signo,
+  if (target_read_memory (BMSYMBOL_VALUE_ADDRESS (ms), (gdb_byte *) &signo,
                          sizeof (signo)) != 0)
     return 0;