o * ppc.h (ppc_cpu_t): Typedef to uint64_t.
[deliverable/binutils-gdb.git] / gdb / remote.c
index 9dacd1777e610bc883e92b2be8dffab659147d4a..f730a49f21370982dba35d7c682e70e5012137a3 100644 (file)
@@ -1,7 +1,7 @@
 /* Remote target communications for serial-line targets in custom GDB protocol
 
    Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
-   1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+   1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -79,6 +79,8 @@ enum { REMOTE_ALIGN_WRITES = 16 };
 static void cleanup_sigint_signal_handler (void *dummy);
 static void initialize_sigint_signal_handler (void);
 static int getpkt_sane (char **buf, long *sizeof_buf, int forever);
+static int getpkt_or_notif_sane (char **buf, long *sizeof_buf,
+                                int forever);
 
 static void handle_remote_sigint (int);
 static void handle_remote_sigint_twice (int);
@@ -89,10 +91,6 @@ static void remote_files_info (struct target_ops *ignore);
 
 static void remote_prepare_to_store (struct regcache *regcache);
 
-static void remote_fetch_registers (struct regcache *regcache, int regno);
-
-static void remote_resume (ptid_t ptid, int step,
-                           enum target_signal siggnal);
 static void remote_open (char *name, int from_tty);
 
 static void extended_remote_open (char *name, int from_tty);
@@ -101,13 +99,11 @@ static void remote_open_1 (char *, int, struct target_ops *, int extended_p);
 
 static void remote_close (int quitting);
 
-static void remote_store_registers (struct regcache *regcache, int regno);
-
-static void remote_mourn (void);
+static void remote_mourn (struct target_ops *ops);
 
 static void extended_remote_restart (void);
 
-static void extended_remote_mourn (void);
+static void extended_remote_mourn (struct target_ops *);
 
 static void remote_mourn_1 (struct target_ops *);
 
@@ -115,10 +111,7 @@ static void remote_send (char **buf, long *sizeof_buf_p);
 
 static int readchar (int timeout);
 
-static ptid_t remote_wait (ptid_t ptid,
-                          struct target_waitstatus *status);
-
-static void remote_kill (void);
+static void remote_kill (struct target_ops *ops);
 
 static int tohex (int nib);
 
@@ -131,7 +124,7 @@ static void remote_async (void (*callback) (enum inferior_event_type event_type,
 
 static int remote_async_mask (int new_mask);
 
-static void remote_detach (char *args, int from_tty);
+static void remote_detach (struct target_ops *ops, char *args, int from_tty);
 
 static void remote_interrupt (int signo);
 
@@ -142,8 +135,6 @@ static void interrupt_query (void);
 static void set_general_thread (struct ptid ptid);
 static void set_continue_thread (struct ptid ptid);
 
-static int remote_thread_alive (ptid_t);
-
 static void get_offsets (void);
 
 static void skip_frame (void);
@@ -211,8 +202,34 @@ static void show_remote_protocol_packet_cmd (struct ui_file *file,
 static char *write_ptid (char *buf, const char *endbuf, ptid_t ptid);
 static ptid_t read_ptid (char *buf, char **obuf);
 
+static void remote_query_supported (void);
+
+static void remote_check_symbols (struct objfile *objfile);
+
 void _initialize_remote (void);
 
+struct stop_reply;
+static struct stop_reply *stop_reply_xmalloc (void);
+static void stop_reply_xfree (struct stop_reply *);
+static void do_stop_reply_xfree (void *arg);
+static void remote_parse_stop_reply (char *buf, struct stop_reply *);
+static void push_stop_reply (struct stop_reply *);
+static void remote_get_pending_stop_replies (void);
+static void discard_pending_stop_replies (int pid);
+static int peek_stop_reply (ptid_t ptid);
+
+static void remote_async_inferior_event_handler (gdb_client_data);
+static void remote_async_get_pending_events_handler (gdb_client_data);
+
+static void remote_terminal_ours (void);
+
+static int remote_read_description_p (struct target_ops *target);
+
+/* The non-stop remote protocol provisions for one pending stop reply.
+   This is where we keep it until it is acknowledged.  */
+
+static struct stop_reply *pending_stop_reply = NULL;
+
 /* For "remote".  */
 
 static struct cmd_list_element *remote_cmdlist;
@@ -263,6 +280,23 @@ struct remote_state
   /* True if the stub reported support for multi-process
      extensions.  */
   int multi_process_aware;
+
+  /* True if we resumed the target and we're waiting for the target to
+     stop.  In the mean time, we can't start another command/query.
+     The remote server wouldn't be ready to process it, so we'd
+     timeout waiting for a reply that would never come and eventually
+     we'd close the connection.  This can happen in asynchronous mode
+     because we allow GDB commands while the target is running.  */
+  int waiting_for_stop_reply;
+
+  /* True if the stub reports support for non-stop mode.  */
+  int non_stop_aware;
+
+  /* True if the stub reports support for vCont;t.  */
+  int support_vCont_t;
+
+  /* True if the stub reports support for conditional tracepoints.  */
+  int cond_tracepoints;
 };
 
 /* Returns true if the multi-process extensions are in effect.  */
@@ -831,6 +865,9 @@ add_packet_config_cmd (struct packet_config *config, const char *name,
                                set_remote_protocol_packet_cmd,
                                show_remote_protocol_packet_cmd,
                                &remote_set_cmdlist, &remote_show_cmdlist);
+  /* The command code copies the documentation strings.  */
+  xfree (set_doc);
+  xfree (show_doc);
   /* set/show remote NAME-packet {auto,on,off} -- legacy.  */
   if (legacy)
     {
@@ -950,6 +987,7 @@ enum {
   PACKET_qXfer_memory_map,
   PACKET_qXfer_spu_read,
   PACKET_qXfer_spu_write,
+  PACKET_qXfer_osdata,
   PACKET_qGetTLSAddr,
   PACKET_qSupported,
   PACKET_QPassSignals,
@@ -958,6 +996,12 @@ enum {
   PACKET_vRun,
   PACKET_QStartNoAckMode,
   PACKET_vKill,
+  PACKET_qXfer_siginfo_read,
+  PACKET_qXfer_siginfo_write,
+  PACKET_qAttached,
+  PACKET_ConditionalTracepoints,
+  PACKET_bc,
+  PACKET_bs,
   PACKET_MAX
 };
 
@@ -1060,6 +1104,18 @@ static int use_threadextra_query;
 static struct async_signal_handler *sigint_remote_twice_token;
 static struct async_signal_handler *sigint_remote_token;
 
+\f
+/* Asynchronous signal handle registered as event loop source for
+   when we have pending events ready to be passed to the core.  */
+
+static struct async_event_handler *remote_async_inferior_event_token;
+
+/* Asynchronous signal handle registered as event loop source for when
+   the remote sent us a %Stop notification.  The registered callback
+   will do a vStopped sequence to pull the rest of the events out of
+   the remote side into our event queue.  */
+
+static struct async_event_handler *remote_async_get_pending_events_token;
 \f
 
 static ptid_t magic_null_ptid;
@@ -1072,18 +1128,89 @@ static ptid_t any_thread_ptid;
 static ptid_t general_thread;
 static ptid_t continue_thread;
 
+/* Find out if the stub attached to PID (and hence GDB should offer to
+   detach instead of killing it when bailing out).  */
 
-/* Call this function as a result of
-   1) A halt indication (T packet) containing a thread id
-   2) A direct query of currthread
-   3) Successful execution of set thread
- */
+static int
+remote_query_attached (int pid)
+{
+  struct remote_state *rs = get_remote_state ();
+
+  if (remote_protocol_packets[PACKET_qAttached].support == PACKET_DISABLE)
+    return 0;
+
+  if (remote_multi_process_p (rs))
+    sprintf (rs->buf, "qAttached:%x", pid);
+  else
+    sprintf (rs->buf, "qAttached");
+
+  putpkt (rs->buf);
+  getpkt (&rs->buf, &rs->buf_size, 0);
+
+  switch (packet_ok (rs->buf,
+                    &remote_protocol_packets[PACKET_qAttached]))
+    {
+    case PACKET_OK:
+      if (strcmp (rs->buf, "1") == 0)
+       return 1;
+      break;
+    case PACKET_ERROR:
+      warning (_("Remote failure reply: %s"), rs->buf);
+      break;
+    case PACKET_UNKNOWN:
+      break;
+    }
+
+  return 0;
+}
+
+/* Add PID to GDB's inferior table.  Since we can be connected to a
+   remote system before before knowing about any inferior, mark the
+   target with execution when we find the first inferior.  If ATTACHED
+   is 1, then we had just attached to this inferior.  If it is 0, then
+   we just created this inferior.  If it is -1, then try querying the
+   remote stub to find out if it had attached to the inferior or
+   not.  */
+
+static struct inferior *
+remote_add_inferior (int pid, int attached)
+{
+  struct inferior *inf;
+
+  /* Check whether this process we're learning about is to be
+     considered attached, or if is to be considered to have been
+     spawned by the stub.  */
+  if (attached == -1)
+    attached = remote_query_attached (pid);
+
+  inf = add_inferior (pid);
+
+  inf->attach_flag = attached;
+
+  return inf;
+}
+
+/* Add thread PTID to GDB's thread list.  Tag it as executing/running
+   according to RUNNING.  */
 
 static void
-record_currthread (ptid_t currthread)
+remote_add_thread (ptid_t ptid, int running)
 {
-  general_thread = currthread;
+  add_thread (ptid);
+
+  set_executing (ptid, running);
+  set_running (ptid, running);
+}
 
+/* Come here when we learn about a thread id from the remote target.
+   It may be the first time we hear about such thread, so take the
+   opportunity to add it to GDB's thread list.  In case this is the
+   first time we're noticing its corresponding inferior, add it to
+   GDB's inferior list as well.  */
+
+static void
+remote_notice_new_inferior (ptid_t currthread, int running)
+{
   /* If this is a new thread, add it to GDB's thread list.
      If we leave it up to WFI to do this, bad things will happen.  */
 
@@ -1091,20 +1218,30 @@ record_currthread (ptid_t currthread)
     {
       /* We're seeing an event on a thread id we knew had exited.
         This has to be a new thread reusing the old id.  Add it.  */
-      add_thread (currthread);
+      remote_add_thread (currthread, running);
       return;
     }
 
   if (!in_thread_list (currthread))
     {
-      if (ptid_equal (pid_to_ptid (ptid_get_pid (currthread)), inferior_ptid))
+      struct inferior *inf = NULL;
+      int pid = ptid_get_pid (currthread);
+
+      if (ptid_is_pid (inferior_ptid)
+         && pid == ptid_get_pid (inferior_ptid))
        {
          /* inferior_ptid has no thread member yet.  This can happen
             with the vAttach -> remote_wait,"TAAthread:" path if the
             stub doesn't support qC.  This is the first stop reported
             after an attach, so this is the main thread.  Update the
             ptid in the thread list.  */
-         thread_change_ptid (inferior_ptid, currthread);
+         if (in_thread_list (pid_to_ptid (pid)))
+           thread_change_ptid (inferior_ptid, currthread);
+         else
+           {
+             remote_add_thread (currthread, running);
+             inferior_ptid = currthread;
+           }
          return;
        }
 
@@ -1119,15 +1256,40 @@ record_currthread (ptid_t currthread)
          return;
        }
 
+      /* When connecting to a target remote, or to a target
+        extended-remote which already was debugging an inferior, we
+        may not know about it yet.  Add it before adding its child
+        thread, so notifications are emitted in a sensible order.  */
+      if (!in_inferior_list (ptid_get_pid (currthread)))
+       inf = remote_add_inferior (ptid_get_pid (currthread), -1);
+
       /* This is really a new thread.  Add it.  */
-      add_thread (currthread);
+      remote_add_thread (currthread, running);
+
+      /* If we found a new inferior, let the common code do whatever
+        it needs to with it (e.g., read shared libraries, insert
+        breakpoints).  */
+      if (inf != NULL)
+       notice_new_inferior (currthread, running, 0);
     }
+}
+
+/* Call this function as a result of
+   1) A halt indication (T packet) containing a thread id
+   2) A direct query of currthread
+   3) Successful execution of set thread
+ */
+
+static void
+record_currthread (ptid_t currthread)
+{
+  general_thread = currthread;
+
+  if (ptid_equal (currthread, minus_one_ptid))
+    /* We're just invalidating the local thread mirror.  */
+    return;
 
-  if (!in_inferior_list (ptid_get_pid (currthread)))
-    /* When connecting to a target remote, or to a target
-       extended-remote which already was debugging an inferior, we may
-       not know about it yet --- add it.  */
-    add_inferior (ptid_get_pid (currthread));
+  remote_notice_new_inferior (currthread, 0);
 }
 
 static char *last_pass_packet;
@@ -1234,15 +1396,38 @@ set_continue_thread (struct ptid ptid)
   set_thread (ptid, 0);
 }
 
+/* Change the remote current process.  Which thread within the process
+   ends up selected isn't important, as long as it is the same process
+   as what INFERIOR_PTID points to.
+
+   This comes from that fact that there is no explicit notion of
+   "selected process" in the protocol.  The selected process for
+   general operations is the process the selected general thread
+   belongs to.  */
+
+static void
+set_general_process (void)
+{
+  struct remote_state *rs = get_remote_state ();
+
+  /* If the remote can't handle multiple processes, don't bother.  */
+  if (!remote_multi_process_p (rs))
+    return;
+
+  /* We only need to change the remote current thread if it's pointing
+     at some other process.  */
+  if (ptid_get_pid (general_thread) != ptid_get_pid (inferior_ptid))
+    set_general_thread (inferior_ptid);
+}
+
 \f
 /*  Return nonzero if the thread PTID is still alive on the remote
     system.  */
 
 static int
-remote_thread_alive (ptid_t ptid)
+remote_thread_alive (struct target_ops *ops, ptid_t ptid)
 {
   struct remote_state *rs = get_remote_state ();
-  int tid = ptid_get_tid (ptid);
   char *p, *endp;
 
   if (ptid_equal (ptid, magic_null_ptid))
@@ -1418,7 +1603,6 @@ read_ptid (char *buf, char **obuf)
   char *p = buf;
   char *pp;
   ULONGEST pid = 0, tid = 0;
-  ptid_t ptid;
 
   if (*p == 'p')
     {
@@ -1438,8 +1622,13 @@ read_ptid (char *buf, char **obuf)
   pp = unpack_varlen_hex (p, &tid);
 
   /* Since the stub is not sending a process id, then default to
-     what's in inferior_ptid.  */
-  pid = ptid_get_pid (inferior_ptid);
+     what's in inferior_ptid, unless it's null at this point.  If so,
+     then since there's no way to know the pid of the reported
+     threads, use the magic number.  */
+  if (ptid_equal (inferior_ptid, null_ptid))
+    pid = ptid_get_pid (magic_null_ptid);
+  else
+    pid = ptid_get_pid (inferior_ptid);
 
   if (obuf)
     *obuf = pp;
@@ -1831,6 +2020,10 @@ remote_get_threadinfo (threadref *threadid, int fieldset,        /* TAG mask */
   pack_threadinfo_request (rs->buf, fieldset, threadid);
   putpkt (rs->buf);
   getpkt (&rs->buf, &rs->buf_size, 0);
+
+  if (rs->buf[0] == '\0')
+    return 0;
+
   result = remote_unpack_thread_info_response (rs->buf + 2,
                                               threadid, info);
   return result;
@@ -2005,9 +2198,6 @@ static ptid_t
 remote_current_thread (ptid_t oldpid)
 {
   struct remote_state *rs = get_remote_state ();
-  char *p = rs->buf;
-  int tid;
-  int pid;
 
   putpkt ("qC");
   getpkt (&rs->buf, &rs->buf_size, 0);
@@ -2036,7 +2226,7 @@ remote_find_new_threads (void)
  */
 
 static void
-remote_threads_info (void)
+remote_threads_info (struct target_ops *ops)
 {
   struct remote_state *rs = get_remote_state ();
   char *bufp;
@@ -2057,17 +2247,15 @@ remote_threads_info (void)
              do
                {
                  new_thread = read_ptid (bufp, &bufp);
-                 if (!ptid_equal (new_thread, null_ptid)
-                     && !in_thread_list (new_thread))
+                 if (!ptid_equal (new_thread, null_ptid))
                    {
-                     if (!in_inferior_list (ptid_get_pid (new_thread)))
-                       /* When connected to a multi-process aware
-                          stub, "info threads" may show up threads of
-                          inferiors we didn't know about yet.  Add
-                          them.  */
-                       add_inferior (ptid_get_pid (new_thread));
-
-                     add_thread (new_thread);
+                     /* In non-stop mode, we assume new found threads
+                        are running until proven otherwise with a
+                        stop reply.  In all-stop, we can only get
+                        here if all threads are stopped.  */
+                     int running = non_stop ? 1 : 0;
+
+                     remote_notice_new_inferior (new_thread, running);
                    }
                }
              while (*bufp++ == ',');   /* comma-separated list */
@@ -2079,6 +2267,10 @@ remote_threads_info (void)
        }
     }
 
+  /* Only qfThreadInfo is supported in non-stop mode.  */
+  if (non_stop)
+    return;
+
   /* Else fall back to old method based on jmetzler protocol.  */
   use_threadinfo_query = 0;
   remote_find_new_threads ();
@@ -2185,9 +2377,27 @@ extended_remote_restart (void)
 static void
 remote_close (int quitting)
 {
-  if (remote_desc)
-    serial_close (remote_desc);
+  if (remote_desc == NULL)
+    return; /* already closed */
+
+  /* Make sure we leave stdin registered in the event loop, and we
+     don't leave the async SIGINT signal handler installed.  */
+  remote_terminal_ours ();
+
+  serial_close (remote_desc);
   remote_desc = NULL;
+
+  /* We don't have a connection to the remote stub anymore.  Get rid
+     of all the inferiors and their threads we were controlling.  */
+  discard_all_inferiors ();
+
+  /* We're no longer interested in any of these events.  */
+  discard_pending_stop_replies (-1);
+
+  if (remote_async_inferior_event_token)
+    delete_async_event_handler (&remote_async_inferior_event_token);
+  if (remote_async_get_pending_events_token)
+    delete_async_event_handler (&remote_async_get_pending_events_token);
 }
 
 /* Query the remote side for the text, data and bss offsets.  */
@@ -2347,6 +2557,21 @@ get_offsets (void)
   objfile_relocate (symfile_objfile, offs);
 }
 
+/* Callback for iterate_over_threads.  Set the STOP_REQUESTED flags in
+   threads we know are stopped already.  This is used during the
+   initial remote connection in non-stop mode --- threads that are
+   reported as already being stopped are left stopped.  */
+
+static int
+set_stop_requested_callback (struct thread_info *thread, void *data)
+{
+  /* If we have a stop reply for this thread, it must be stopped.  */
+  if (peek_stop_reply (thread->ptid))
+    set_stop_requested (thread->ptid, 1);
+
+  return 0;
+}
+
 /* Stub for catch_exception.  */
 
 struct start_remote_args
@@ -2363,70 +2588,229 @@ struct start_remote_args
 static void
 remote_start_remote (struct ui_out *uiout, void *opaque)
 {
-  struct remote_state *rs = get_remote_state ();
   struct start_remote_args *args = opaque;
+  struct remote_state *rs = get_remote_state ();
+  struct packet_config *noack_config;
   char *wait_status = NULL;
 
   immediate_quit++;            /* Allow user to interrupt it.  */
 
+  /* Ack any packet which the remote side has already sent.  */
+  serial_write (remote_desc, "+", 1);
+
+  /* The first packet we send to the target is the optional "supported
+     packets" request.  If the target can answer this, it will tell us
+     which later probes to skip.  */
+  remote_query_supported ();
+
+  /* Next, we possibly activate noack mode.
+
+     If the QStartNoAckMode packet configuration is set to AUTO,
+     enable noack mode if the stub reported a wish for it with
+     qSupported.
+
+     If set to TRUE, then enable noack mode even if the stub didn't
+     report it in qSupported.  If the stub doesn't reply OK, the
+     session ends with an error.
+
+     If FALSE, then don't activate noack mode, regardless of what the
+     stub claimed should be the default with qSupported.  */
+
+  noack_config = &remote_protocol_packets[PACKET_QStartNoAckMode];
+
+  if (noack_config->detect == AUTO_BOOLEAN_TRUE
+      || (noack_config->detect == AUTO_BOOLEAN_AUTO
+         && noack_config->support == PACKET_ENABLE))
+    {
+      putpkt ("QStartNoAckMode");
+      getpkt (&rs->buf, &rs->buf_size, 0);
+      if (packet_ok (rs->buf, noack_config) == PACKET_OK)
+       rs->noack_mode = 1;
+    }
+
+  if (args->extended_p)
+    {
+      /* Tell the remote that we are using the extended protocol.  */
+      putpkt ("!");
+      getpkt (&rs->buf, &rs->buf_size, 0);
+    }
+
+  /* Next, if the target can specify a description, read it.  We do
+     this before anything involving memory or registers.  */
+  target_find_description ();
+
+  /* On OSs where the list of libraries is global to all
+     processes, we fetch them early.  */
+  if (gdbarch_has_global_solist (target_gdbarch))
+    solib_add (NULL, args->from_tty, args->target, auto_solib_add);
+
+  if (non_stop)
+    {
+      if (!rs->non_stop_aware)
+       error (_("Non-stop mode requested, but remote does not support non-stop"));
+
+      putpkt ("QNonStop:1");
+      getpkt (&rs->buf, &rs->buf_size, 0);
+
+      if (strcmp (rs->buf, "OK") != 0)
+       error ("Remote refused setting non-stop mode with: %s", rs->buf);
+
+      /* Find about threads and processes the stub is already
+        controlling.  We default to adding them in the running state.
+        The '?' query below will then tell us about which threads are
+        stopped.  */
+      remote_threads_info (args->target);
+    }
+  else if (rs->non_stop_aware)
+    {
+      /* Don't assume that the stub can operate in all-stop mode.
+        Request it explicitely.  */
+      putpkt ("QNonStop:0");
+      getpkt (&rs->buf, &rs->buf_size, 0);
+
+      if (strcmp (rs->buf, "OK") != 0)
+       error ("Remote refused setting all-stop mode with: %s", rs->buf);
+    }
+
   /* Check whether the target is running now.  */
   putpkt ("?");
   getpkt (&rs->buf, &rs->buf_size, 0);
 
-  if (rs->buf[0] == 'W' || rs->buf[0] == 'X')
+  if (!non_stop)
     {
-      if (args->extended_p)
+      if (rs->buf[0] == 'W' || rs->buf[0] == 'X')
        {
+         if (!args->extended_p)
+           error (_("The target is not running (try extended-remote?)"));
+
          /* We're connected, but not running.  Drop out before we
             call start_remote.  */
-         target_mark_exited (args->target);
          return;
        }
       else
-       error (_("The target is not running (try extended-remote?)"));
+       {
+         /* Save the reply for later.  */
+         wait_status = alloca (strlen (rs->buf) + 1);
+         strcpy (wait_status, rs->buf);
+       }
+
+      /* Let the stub know that we want it to return the thread.  */
+      set_continue_thread (minus_one_ptid);
+
+      /* Without this, some commands which require an active target
+        (such as kill) won't work.  This variable serves (at least)
+        double duty as both the pid of the target process (if it has
+        such), and as a flag indicating that a target is active.
+        These functions should be split out into seperate variables,
+        especially since GDB will someday have a notion of debugging
+        several processes.  */
+      inferior_ptid = magic_null_ptid;
+
+      /* Now, if we have thread information, update inferior_ptid.  */
+      inferior_ptid = remote_current_thread (inferior_ptid);
+
+      remote_add_inferior (ptid_get_pid (inferior_ptid), -1);
+
+      /* Always add the main thread.  */
+      add_thread_silent (inferior_ptid);
+
+      get_offsets ();          /* Get text, data & bss offsets.  */
+
+      /* If we could not find a description using qXfer, and we know
+        how to do it some other way, try again.  This is not
+        supported for non-stop; it could be, but it is tricky if
+        there are no stopped threads when we connect.  */
+      if (remote_read_description_p (args->target)
+         && gdbarch_target_desc (target_gdbarch) == NULL)
+       {
+         target_clear_description ();
+         target_find_description ();
+       }
+
+      /* Use the previously fetched status.  */
+      gdb_assert (wait_status != NULL);
+      strcpy (rs->buf, wait_status);
+      rs->cached_wait_status = 1;
+
+      immediate_quit--;
+      start_remote (args->from_tty); /* Initialize gdb process mechanisms.  */
     }
   else
     {
-      if (args->extended_p)
-       target_mark_running (args->target);
+      /* Clear WFI global state.  Do this before finding about new
+        threads and inferiors, and setting the current inferior.
+        Otherwise we would clear the proceed status of the current
+        inferior when we want its stop_soon state to be preserved
+        (see notice_new_inferior).  */
+      init_wait_for_inferior ();
+
+      /* In non-stop, we will either get an "OK", meaning that there
+        are no stopped threads at this time; or, a regular stop
+        reply.  In the latter case, there may be more than one thread
+        stopped --- we pull them all out using the vStopped
+        mechanism.  */
+      if (strcmp (rs->buf, "OK") != 0)
+       {
+         struct stop_reply *stop_reply;
+         struct cleanup *old_chain;
 
-      /* Save the reply for later.  */
-      wait_status = alloca (strlen (rs->buf) + 1);
-      strcpy (wait_status, rs->buf);
-    }
+         stop_reply = stop_reply_xmalloc ();
+         old_chain = make_cleanup (do_stop_reply_xfree, stop_reply);
 
-  /* Start afresh.  */
-  init_thread_list ();
+         remote_parse_stop_reply (rs->buf, stop_reply);
+         discard_cleanups (old_chain);
 
-  /* Let the stub know that we want it to return the thread.  */
-  set_continue_thread (minus_one_ptid);
+         /* get_pending_stop_replies acks this one, and gets the rest
+            out.  */
+         pending_stop_reply = stop_reply;
+         remote_get_pending_stop_replies ();
 
-  /* Without this, some commands which require an active target
-     (such as kill) won't work.  This variable serves (at least)
-     double duty as both the pid of the target process (if it has
-     such), and as a flag indicating that a target is active.
-     These functions should be split out into seperate variables,
-     especially since GDB will someday have a notion of debugging
-     several processes.  */
-  inferior_ptid = magic_null_ptid;
+         /* Make sure that threads that were stopped remain
+            stopped.  */
+         iterate_over_threads (set_stop_requested_callback, NULL);
+       }
 
-  /* Now, if we have thread information, update inferior_ptid.  */
-  inferior_ptid = remote_current_thread (inferior_ptid);
+      if (target_can_async_p ())
+       target_async (inferior_event_handler, 0);
 
-  add_inferior (ptid_get_pid (inferior_ptid));
+      if (thread_count () == 0)
+       {
+         if (!args->extended_p)
+           error (_("The target is not running (try extended-remote?)"));
 
-  /* Always add the main thread.  */
-  add_thread_silent (inferior_ptid);
+         /* We're connected, but not running.  Drop out before we
+            call start_remote.  */
+         return;
+       }
+
+      /* Let the stub know that we want it to return the thread.  */
 
-  get_offsets ();              /* Get text, data & bss offsets.  */
+      /* Force the stub to choose a thread.  */
+      set_general_thread (null_ptid);
 
-  /* Use the previously fetched status.  */
-  gdb_assert (wait_status != NULL);
-  strcpy (rs->buf, wait_status);
-  rs->cached_wait_status = 1;
+      /* Query it.  */
+      inferior_ptid = remote_current_thread (minus_one_ptid);
+      if (ptid_equal (inferior_ptid, minus_one_ptid))
+       error (_("remote didn't report the current thread in non-stop mode"));
 
-  immediate_quit--;
-  start_remote (args->from_tty); /* Initialize gdb process mechanisms.  */
+      get_offsets ();          /* Get text, data & bss offsets.  */
+
+      /* In non-stop mode, any cached wait status will be stored in
+        the stop reply queue.  */
+      gdb_assert (wait_status == NULL);
+    }
+
+  /* If we connected to a live target, do some additional setup.  */
+  if (target_has_execution)
+    {
+      if (exec_bfd)    /* No use without an exec file.  */
+       remote_check_symbols (symfile_objfile);
+    }
+
+  /* If breakpoints are global, insert them now.  */
+  if (gdbarch_has_global_breakpoints (target_gdbarch)
+      && breakpoints_always_inserted_mode ())
+    insert_breakpoints ();
 }
 
 /* Open a connection to a remote debugger.
@@ -2470,6 +2854,9 @@ remote_check_symbols (struct objfile *objfile)
   if (remote_protocol_packets[PACKET_qSymbol].support == PACKET_DISABLE)
     return;
 
+  /* Make sure the remote is pointing at the right process.  */
+  set_general_process ();
+
   /* Allocate a message buffer.  We can't reuse the input buffer in RS,
      because we need both at the same time.  */
   msg = alloca (get_remote_packet_size ());
@@ -2491,6 +2878,7 @@ remote_check_symbols (struct objfile *objfile)
        xsnprintf (msg, get_remote_packet_size (), "qSymbol::%s", &reply[8]);
       else
        {
+         int addr_size = gdbarch_addr_bit (target_gdbarch) / 8;
          CORE_ADDR sym_addr = SYMBOL_VALUE_ADDRESS (sym);
 
          /* If this is a function address, return the start of code
@@ -2500,7 +2888,7 @@ remote_check_symbols (struct objfile *objfile)
                                                         &current_target);
 
          xsnprintf (msg, get_remote_packet_size (), "qSymbol:%s:%s",
-                    paddr_nz (sym_addr), &reply[8]);
+                    phex_nz (sym_addr, addr_size), &reply[8]);
        }
   
       putpkt (msg);
@@ -2620,6 +3008,23 @@ remote_multi_process_feature (const struct protocol_feature *feature,
   rs->multi_process_aware = (support == PACKET_ENABLE);
 }
 
+static void
+remote_non_stop_feature (const struct protocol_feature *feature,
+                             enum packet_support support, const char *value)
+{
+  struct remote_state *rs = get_remote_state ();
+  rs->non_stop_aware = (support == PACKET_ENABLE);
+}
+
+static void
+remote_cond_tracepoint_feature (const struct protocol_feature *feature,
+                                      enum packet_support support,
+                                      const char *value)
+{
+  struct remote_state *rs = get_remote_state ();
+  rs->cond_tracepoints = (support == PACKET_ENABLE);
+}
+
 static struct protocol_feature remote_protocol_features[] = {
   { "PacketSize", PACKET_DISABLE, remote_packet_size, -1 },
   { "qXfer:auxv:read", PACKET_DISABLE, remote_supported_packet,
@@ -2634,11 +3039,24 @@ static struct protocol_feature remote_protocol_features[] = {
     PACKET_qXfer_spu_read },
   { "qXfer:spu:write", PACKET_DISABLE, remote_supported_packet,
     PACKET_qXfer_spu_write },
+  { "qXfer:osdata:read", PACKET_DISABLE, remote_supported_packet,
+    PACKET_qXfer_osdata },
   { "QPassSignals", PACKET_DISABLE, remote_supported_packet,
     PACKET_QPassSignals },
   { "QStartNoAckMode", PACKET_DISABLE, remote_supported_packet,
     PACKET_QStartNoAckMode },
   { "multiprocess", PACKET_DISABLE, remote_multi_process_feature, -1 },
+  { "QNonStop", PACKET_DISABLE, remote_non_stop_feature, -1 },
+  { "qXfer:siginfo:read", PACKET_DISABLE, remote_supported_packet,
+    PACKET_qXfer_siginfo_read },
+  { "qXfer:siginfo:write", PACKET_DISABLE, remote_supported_packet,
+    PACKET_qXfer_siginfo_write },
+  { "ConditionalTracepoints", PACKET_DISABLE, remote_cond_tracepoint_feature,
+    PACKET_ConditionalTracepoints },
+  { "ReverseContinue", PACKET_DISABLE, remote_supported_packet,
+    PACKET_bc },
+  { "ReverseStep", PACKET_DISABLE, remote_supported_packet,
+    PACKET_bs },
 };
 
 static void
@@ -2776,7 +3194,6 @@ static void
 remote_open_1 (char *name, int from_tty, struct target_ops *target, int extended_p)
 {
   struct remote_state *rs = get_remote_state ();
-  struct packet_config *noack_config;
 
   if (name == 0)
     error (_("To open a remote debug connection, you need to specify what\n"
@@ -2791,7 +3208,7 @@ remote_open_1 (char *name, int from_tty, struct target_ops *target, int extended
      But if we're connected to a target system with no running process,
      then we will still be connected when it returns.  Ask this question
      first, before target_preopen has a chance to kill anything.  */
-  if (remote_desc != NULL && !target_has_execution)
+  if (remote_desc != NULL && !have_inferiors ())
     {
       if (!from_tty
          || query (_("Already connected to a remote target.  Disconnect? ")))
@@ -2809,7 +3226,7 @@ remote_open_1 (char *name, int from_tty, struct target_ops *target, int extended
      process, we may still be connected.  If we are starting "target
      remote" now, the extended-remote target will not have been
      removed by unpush_target.  */
-  if (remote_desc != NULL && !target_has_execution)
+  if (remote_desc != NULL && !have_inferiors ())
     pop_target ();
 
   /* Make sure we send the passed signals list the next time we resume.  */
@@ -2852,16 +3269,24 @@ remote_open_1 (char *name, int from_tty, struct target_ops *target, int extended
     }
   push_target (target);                /* Switch to using remote target now.  */
 
-  /* Assume that the target is running, unless we learn otherwise.  */
-  target_mark_running (target);
+  /* Register extra event sources in the event loop.  */
+  remote_async_inferior_event_token
+    = create_async_event_handler (remote_async_inferior_event_handler,
+                                 NULL);
+  remote_async_get_pending_events_token
+    = create_async_event_handler (remote_async_get_pending_events_handler,
+                                 NULL);
 
   /* Reset the target state; these things will be queried either by
      remote_query_supported or as they are needed.  */
   init_all_packet_configs ();
+  rs->cached_wait_status = 0;
   rs->explicit_packet_size = 0;
   rs->noack_mode = 0;
   rs->multi_process_aware = 0;
   rs->extended = extended_p;
+  rs->non_stop_aware = 0;
+  rs->waiting_for_stop_reply = 0;
 
   general_thread = not_sent_ptid;
   continue_thread = not_sent_ptid;
@@ -2870,60 +3295,26 @@ remote_open_1 (char *name, int from_tty, struct target_ops *target, int extended
   use_threadinfo_query = 1;
   use_threadextra_query = 1;
 
-  /* Ack any packet which the remote side has already sent.  */
-  serial_write (remote_desc, "+", 1);
+  if (target_async_permitted)
+    {
+      /* With this target we start out by owning the terminal.  */
+      remote_async_terminal_ours_p = 1;
 
-  /* The first packet we send to the target is the optional "supported
-     packets" request.  If the target can answer this, it will tell us
-     which later probes to skip.  */
-  remote_query_supported ();
+      /* FIXME: cagney/1999-09-23: During the initial connection it is
+        assumed that the target is already ready and able to respond to
+        requests. Unfortunately remote_start_remote() eventually calls
+        wait_for_inferior() with no timeout.  wait_forever_enabled_p gets
+        around this. Eventually a mechanism that allows
+        wait_for_inferior() to expect/get timeouts will be
+        implemented.  */
+      wait_forever_enabled_p = 0;
+    }
 
-  /* Next, we possibly activate noack mode.
+  /* First delete any symbols previously loaded from shared libraries.  */
+  no_shared_libraries (NULL, 0);
 
-     If the QStartNoAckMode packet configuration is set to AUTO,
-     enable noack mode if the stub reported a wish for it with
-     qSupported.
-
-     If set to TRUE, then enable noack mode even if the stub didn't
-     report it in qSupported.  If the stub doesn't reply OK, the
-     session ends with an error.
-
-     If FALSE, then don't activate noack mode, regardless of what the
-     stub claimed should be the default with qSupported.  */
-
-  noack_config = &remote_protocol_packets[PACKET_QStartNoAckMode];
-
-  if (noack_config->detect == AUTO_BOOLEAN_TRUE
-      || (noack_config->detect == AUTO_BOOLEAN_AUTO
-         && noack_config->support == PACKET_ENABLE))
-    {
-      putpkt ("QStartNoAckMode");
-      getpkt (&rs->buf, &rs->buf_size, 0);
-      if (packet_ok (rs->buf, noack_config) == PACKET_OK)
-       rs->noack_mode = 1;
-    }
-
-  /* Next, if the target can specify a description, read it.  We do
-     this before anything involving memory or registers.  */
-  target_find_description ();
-
-  if (target_async_permitted)
-    {
-      /* With this target we start out by owning the terminal.  */
-      remote_async_terminal_ours_p = 1;
-
-      /* FIXME: cagney/1999-09-23: During the initial connection it is
-        assumed that the target is already ready and able to respond to
-        requests. Unfortunately remote_start_remote() eventually calls
-        wait_for_inferior() with no timeout.  wait_forever_enabled_p gets
-        around this. Eventually a mechanism that allows
-        wait_for_inferior() to expect/get timeouts will be
-        implemented.  */
-      wait_forever_enabled_p = 0;
-    }
-
-  /* First delete any symbols previously loaded from shared libraries.  */
-  no_shared_libraries (NULL, 0);
+  /* Start afresh.  */
+  init_thread_list ();
 
   /* Start the remote connection.  If error() or QUIT, discard this
      target (we'd otherwise be in an inconsistent state) and then
@@ -2951,7 +3342,10 @@ remote_open_1 (char *name, int from_tty, struct target_ops *target, int extended
     ex = catch_exception (uiout, remote_start_remote, &args, RETURN_MASK_ALL);
     if (ex.reason < 0)
       {
-       pop_target ();
+       /* Pop the partially set up target - unless something else did
+          already before throwing the exception.  */
+       if (remote_desc != NULL)
+         pop_target ();
        if (target_async_permitted)
          wait_forever_enabled_p = 1;
        throw_exception (ex);
@@ -2960,20 +3354,6 @@ remote_open_1 (char *name, int from_tty, struct target_ops *target, int extended
 
   if (target_async_permitted)
     wait_forever_enabled_p = 1;
-
-  if (extended_p)
-    {
-      /* Tell the remote that we are using the extended protocol.  */
-      putpkt ("!");
-      getpkt (&rs->buf, &rs->buf_size, 0);
-    }
-
-  /* If we connected to a live target, do some additional setup.  */
-  if (target_has_execution)
-    {
-      if (exec_bfd)    /* No use without an exec file.  */
-       remote_check_symbols (symfile_objfile);
-    }
 }
 
 /* This takes a program previously attached to and detaches it.  After
@@ -3009,10 +3389,6 @@ remote_detach_1 (char *args, int from_tty, int extended)
   else
     error (_("Can't detach process."));
 
-  /* Unregister the file descriptor from the event loop.  */
-  if (target_is_async_p ())
-    serial_async (remote_desc, NULL, 0);
-
   if (from_tty)
     {
       if (remote_multi_process_p (rs))
@@ -3027,18 +3403,18 @@ remote_detach_1 (char *args, int from_tty, int extended)
        }
     }
 
-  detach_inferior (pid);
+  discard_pending_stop_replies (pid);
   target_mourn_inferior ();
 }
 
 static void
-remote_detach (char *args, int from_tty)
+remote_detach (struct target_ops *ops, char *args, int from_tty)
 {
   remote_detach_1 (args, from_tty, 0);
 }
 
 static void
-extended_remote_detach (char *args, int from_tty)
+extended_remote_detach (struct target_ops *ops, char *args, int from_tty)
 {
   remote_detach_1 (args, from_tty, 1);
 }
@@ -3051,10 +3427,6 @@ remote_disconnect (struct target_ops *target, char *args, int from_tty)
   if (args)
     error (_("Argument given to \"disconnect\" when remotely debugging."));
 
-  /* Unregister the file descriptor from the event loop.  */
-  if (target_is_async_p ())
-    serial_async (remote_desc, NULL, 0);
-
   /* Make sure we unpush even the extended remote targets; mourn
      won't do it.  So call remote_mourn_1 directly instead of
      target_mourn_inferior.  */
@@ -3074,7 +3446,6 @@ extended_remote_attach_1 (struct target_ops *target, char *args, int from_tty)
   int pid;
   char *dummy;
   char *wait_status = NULL;
-  struct inferior *inf;
 
   if (!args)
     error_no_arg (_("process-id to attach"));
@@ -3098,9 +3469,16 @@ extended_remote_attach_1 (struct target_ops *target, char *args, int from_tty)
        printf_unfiltered (_("Attached to %s\n"),
                           target_pid_to_str (pid_to_ptid (pid)));
 
-      /* Save the reply for later.  */
-      wait_status = alloca (strlen (rs->buf) + 1);
-      strcpy (wait_status, rs->buf);
+      if (!non_stop)
+       {
+         /* Save the reply for later.  */
+         wait_status = alloca (strlen (rs->buf) + 1);
+         strcpy (wait_status, rs->buf);
+       }
+      else if (strcmp (rs->buf, "OK") != 0)
+       error (_("Attaching to %s failed with: %s"),
+              target_pid_to_str (pid_to_ptid (pid)),
+              rs->buf);
     }
   else if (remote_protocol_packets[PACKET_vAttach].support == PACKET_DISABLE)
     error (_("This target does not support attaching to a process"));
@@ -3108,32 +3486,72 @@ extended_remote_attach_1 (struct target_ops *target, char *args, int from_tty)
     error (_("Attaching to %s failed"),
           target_pid_to_str (pid_to_ptid (pid)));
 
-  target_mark_running (target);
+  remote_add_inferior (pid, 1);
+
   inferior_ptid = pid_to_ptid (pid);
 
-  /* Now, if we have thread information, update inferior_ptid.  */
-  inferior_ptid = remote_current_thread (inferior_ptid);
+  if (non_stop)
+    {
+      struct thread_info *thread;
 
-  inf = add_inferior (pid);
-  inf->attach_flag = 1;
+      /* Get list of threads.  */
+      remote_threads_info (target);
 
-  /* Now, add the main thread to the thread list.  */
-  add_thread_silent (inferior_ptid);
+      thread = first_thread_of_process (pid);
+      if (thread)
+       inferior_ptid = thread->ptid;
+      else
+       inferior_ptid = pid_to_ptid (pid);
+
+      /* Invalidate our notion of the remote current thread.  */
+      record_currthread (minus_one_ptid);
+    }
+  else
+    {
+      /* Now, if we have thread information, update inferior_ptid.  */
+      inferior_ptid = remote_current_thread (inferior_ptid);
+
+      /* Add the main thread to the thread list.  */
+      add_thread_silent (inferior_ptid);
+    }
 
   /* Next, if the target can specify a description, read it.  We do
      this before anything involving memory or registers.  */
   target_find_description ();
 
-  /* Use the previously fetched status.  */
-  gdb_assert (wait_status != NULL);
-  strcpy (rs->buf, wait_status);
-  rs->cached_wait_status = 1;
+  if (!non_stop)
+    {
+      /* Use the previously fetched status.  */
+      gdb_assert (wait_status != NULL);
+
+      if (target_can_async_p ())
+       {
+         struct stop_reply *stop_reply;
+         struct cleanup *old_chain;
+
+         stop_reply = stop_reply_xmalloc ();
+         old_chain = make_cleanup (do_stop_reply_xfree, stop_reply);
+         remote_parse_stop_reply (wait_status, stop_reply);
+         discard_cleanups (old_chain);
+         push_stop_reply (stop_reply);
+
+         target_async (inferior_event_handler, 0);
+       }
+      else
+       {
+         gdb_assert (wait_status != NULL);
+         strcpy (rs->buf, wait_status);
+         rs->cached_wait_status = 1;
+       }
+    }
+  else
+    gdb_assert (wait_status == NULL);
 }
 
 static void
-extended_remote_attach (char *args, int from_tty)
+extended_remote_attach (struct target_ops *ops, char *args, int from_tty)
 {
-  extended_remote_attach_1 (&extended_remote_ops, args, from_tty);
+  extended_remote_attach_1 (ops, args, from_tty);
 }
 
 /* Convert hex digit A to a number.  */
@@ -3221,6 +3639,7 @@ remote_vcont_probe (struct remote_state *rs)
       support_S = 0;
       support_c = 0;
       support_C = 0;
+      rs->support_vCont_t = 0;
       while (p && *p == ';')
        {
          p++;
@@ -3232,6 +3651,8 @@ remote_vcont_probe (struct remote_state *rs)
            support_c = 1;
          else if (*p == 'C' && (*(p + 1) == ';' || *(p + 1) == 0))
            support_C = 1;
+         else if (*p == 't' && (*(p + 1) == ';' || *(p + 1) == 0))
+           rs->support_vCont_t = 1;
 
          p = strchr (p, ';');
        }
@@ -3245,6 +3666,50 @@ remote_vcont_probe (struct remote_state *rs)
   packet_ok (buf, &remote_protocol_packets[PACKET_vCont]);
 }
 
+/* Helper function for building "vCont" resumptions.  Write a
+   resumption to P.  ENDP points to one-passed-the-end of the buffer
+   we're allowed to write to.  Returns BUF+CHARACTERS_WRITTEN.  The
+   thread to be resumed is PTID; STEP and SIGGNAL indicate whether the
+   resumed thread should be single-stepped and/or signalled.  If PTID
+   equals minus_one_ptid, then all threads are resumed; if PTID
+   represents a process, then all threads of the process are resumed;
+   the thread to be stepped and/or signalled is given in the global
+   INFERIOR_PTID.  */
+
+static char *
+append_resumption (char *p, char *endp,
+                  ptid_t ptid, int step, enum target_signal siggnal)
+{
+  struct remote_state *rs = get_remote_state ();
+
+  if (step && siggnal != TARGET_SIGNAL_0)
+    p += xsnprintf (p, endp - p, ";S%02x", siggnal);
+  else if (step)
+    p += xsnprintf (p, endp - p, ";s");
+  else if (siggnal != TARGET_SIGNAL_0)
+    p += xsnprintf (p, endp - p, ";C%02x", siggnal);
+  else
+    p += xsnprintf (p, endp - p, ";c");
+
+  if (remote_multi_process_p (rs) && ptid_is_pid (ptid))
+    {
+      ptid_t nptid;
+
+      /* All (-1) threads of process.  */
+      nptid = ptid_build (ptid_get_pid (ptid), 0, -1);
+
+      p += xsnprintf (p, endp - p, ":");
+      p = write_ptid (p, endp, nptid);
+    }
+  else if (!ptid_equal (ptid, minus_one_ptid))
+    {
+      p += xsnprintf (p, endp - p, ":");
+      p = write_ptid (p, endp, ptid);
+    }
+
+  return p;
+}
+
 /* Resume the remote inferior by using a "vCont" packet.  The thread
    to be resumed is PTID; STEP and SIGGNAL indicate whether the
    resumed thread should be single-stepped and/or signalled.  If PTID
@@ -3275,83 +3740,50 @@ remote_vcont_resume (ptid_t ptid, int step, enum target_signal siggnal)
      about overflowing BUF.  Should there be a generic
      "multi-part-packet" packet?  */
 
+  p += xsnprintf (p, endp - p, "vCont");
+
   if (ptid_equal (ptid, magic_null_ptid))
     {
       /* MAGIC_NULL_PTID means that we don't have any active threads,
         so we don't have any TID numbers the inferior will
         understand.  Make sure to only send forms that do not specify
         a TID.  */
-      if (step && siggnal != TARGET_SIGNAL_0)
-       xsnprintf (p, endp - p, "vCont;S%02x", siggnal);
-      else if (step)
-       xsnprintf (p, endp - p, "vCont;s");
-      else if (siggnal != TARGET_SIGNAL_0)
-       xsnprintf (p, endp - p, "vCont;C%02x", siggnal);
-      else
-       xsnprintf (p, endp - p, "vCont;c");
+      p = append_resumption (p, endp, minus_one_ptid, step, siggnal);
     }
-  else if (ptid_equal (ptid, minus_one_ptid))
+  else if (ptid_equal (ptid, minus_one_ptid) || ptid_is_pid (ptid))
     {
-      /* Resume all threads, with preference for INFERIOR_PTID.  */
-      if (step && siggnal != TARGET_SIGNAL_0)
+      /* Resume all threads (of all processes, or of a single
+        process), with preference for INFERIOR_PTID.  This assumes
+        inferior_ptid belongs to the set of all threads we are about
+        to resume.  */
+      if (step || siggnal != TARGET_SIGNAL_0)
        {
-         /* Step inferior_ptid with signal.  */
-         p += xsnprintf (p, endp - p, "vCont;S%02x:", siggnal);
-         p = write_ptid (p, endp, inferior_ptid);
-         /* And continue others.  */
-         p += xsnprintf (p, endp - p, ";c");
+         /* Step inferior_ptid, with or without signal.  */
+         p = append_resumption (p, endp, inferior_ptid, step, siggnal);
        }
-      else if (step)
-       {
-         /* Step inferior_ptid.  */
-         p += xsnprintf (p, endp - p, "vCont;s:");
-         p = write_ptid (p, endp, inferior_ptid);
-         /* And continue others.  */
-         p += xsnprintf (p, endp - p, ";c");
-       }
-      else if (siggnal != TARGET_SIGNAL_0)
-       {
-         /* Continue inferior_ptid with signal.  */
-         p += xsnprintf (p, endp - p, "vCont;C%02x:", siggnal);
-         p = write_ptid (p, endp, inferior_ptid);
-         /* And continue others.  */
-         p += xsnprintf (p, endp - p, ";c");
-       }
-      else
-       xsnprintf (p, endp - p, "vCont;c");
+
+      /* And continue others without a signal.  */
+      p = append_resumption (p, endp, ptid, /*step=*/ 0, TARGET_SIGNAL_0);
     }
   else
     {
       /* Scheduler locking; resume only PTID.  */
-      if (step && siggnal != TARGET_SIGNAL_0)
-       {
-         /* Step ptid with signal.  */
-         p += xsnprintf (p, endp - p, "vCont;S%02x:", siggnal);
-         p = write_ptid (p, endp, ptid);
-       }
-      else if (step)
-       {
-         /* Step ptid.  */
-         p += xsnprintf (p, endp - p, "vCont;s:");
-         p = write_ptid (p, endp, ptid);
-       }
-      else if (siggnal != TARGET_SIGNAL_0)
-       {
-         /* Continue ptid with signal.  */
-         p += xsnprintf (p, endp - p, "vCont;C%02x:", siggnal);
-         p = write_ptid (p, endp, ptid);
-       }
-      else
-       {
-         /* Continue ptid.  */
-         p += xsnprintf (p, endp - p, "vCont;c:");
-         p = write_ptid (p, endp, ptid);
-       }
+      p = append_resumption (p, endp, ptid, step, siggnal);
     }
 
   gdb_assert (strlen (rs->buf) < get_remote_packet_size ());
   putpkt (rs->buf);
 
+  if (non_stop)
+    {
+      /* In non-stop, the stub replies to vCont with "OK".  The stop
+        reply will be reported asynchronously by means of a `%Stop'
+        notification.  */
+      getpkt (&rs->buf, &rs->buf_size, 0);
+      if (strcmp (rs->buf, "OK") != 0)
+       error (_("Unexpected vCont reply in non-stop mode: %s"), rs->buf);
+    }
+
   return 1;
 }
 
@@ -3362,7 +3794,8 @@ static enum target_signal last_sent_signal = TARGET_SIGNAL_0;
 static int last_sent_step;
 
 static void
-remote_resume (ptid_t ptid, int step, enum target_signal siggnal)
+remote_resume (struct target_ops *ops,
+              ptid_t ptid, int step, enum target_signal siggnal)
 {
   struct remote_state *rs = get_remote_state ();
   char *buf;
@@ -3374,8 +3807,10 @@ remote_resume (ptid_t ptid, int step, enum target_signal siggnal)
   remote_pass_signals ();
 
   /* The vCont packet doesn't need to specify threads via Hc.  */
-  if (remote_vcont_resume (ptid, step, siggnal))
-    goto done;
+  /* No reverse support (yet) for vCont.  */
+  if (execution_direction != EXEC_REVERSE)
+    if (remote_vcont_resume (ptid, step, siggnal))
+      goto done;
 
   /* All other supported resume packets do use Hc, so set the continue
      thread.  */
@@ -3385,7 +3820,23 @@ remote_resume (ptid_t ptid, int step, enum target_signal siggnal)
     set_continue_thread (ptid);
 
   buf = rs->buf;
-  if (siggnal != TARGET_SIGNAL_0)
+  if (execution_direction == EXEC_REVERSE)
+    {
+      /* We don't pass signals to the target in reverse exec mode.  */
+      if (info_verbose && siggnal != TARGET_SIGNAL_0)
+       warning (" - Can't pass signal %d to target in reverse: ignored.\n",
+                siggnal);
+
+      if (step 
+         && remote_protocol_packets[PACKET_bs].support == PACKET_DISABLE)
+       error (_("Remote reverse-step not supported."));
+      if (!step
+         && remote_protocol_packets[PACKET_bc].support == PACKET_DISABLE)
+       error (_("Remote reverse-continue not supported."));
+
+      strcpy (buf, step ? "bs" : "bc");
+    }
+  else if (siggnal != TARGET_SIGNAL_0)
     {
       buf[0] = step ? 'S' : 'C';
       buf[1] = tohex (((int) siggnal >> 4) & 0xf);
@@ -3407,6 +3858,16 @@ remote_resume (ptid_t ptid, int step, enum target_signal siggnal)
      NOT asynchronously.  */
   if (target_can_async_p ())
     target_async (inferior_event_handler, 0);
+
+  /* We've just told the target to resume.  The remote server will
+     wait for the inferior to stop, and then send a stop reply.  In
+     the mean time, we can't start another command/query ourselves
+     because the stub wouldn't be ready to process it.  This applies
+     only to the base all-stop protocol, however.  In non-stop (which
+     only supports vCont), the stub replies with an "OK", and is
+     immediate able to process further serial input.  */
+  if (!non_stop)
+    rs->waiting_for_stop_reply = 1;
 }
 \f
 
@@ -3494,20 +3955,94 @@ remote_interrupt_twice (int signo)
   signal (signo, remote_interrupt);
 }
 
+/* Non-stop version of target_stop.  Uses `vCont;t' to stop a remote
+   thread, all threads of a remote process, or all threads of all
+   processes.  */
+
+static void
+remote_stop_ns (ptid_t ptid)
+{
+  struct remote_state *rs = get_remote_state ();
+  char *p = rs->buf;
+  char *endp = rs->buf + get_remote_packet_size ();
+
+  if (remote_protocol_packets[PACKET_vCont].support == PACKET_SUPPORT_UNKNOWN)
+    remote_vcont_probe (rs);
+
+  if (!rs->support_vCont_t)
+    error (_("Remote server does not support stopping threads"));
+
+  if (ptid_equal (ptid, minus_one_ptid)
+      || (!remote_multi_process_p (rs) && ptid_is_pid (ptid)))
+    p += xsnprintf (p, endp - p, "vCont;t");
+  else
+    {
+      ptid_t nptid;
+
+      p += xsnprintf (p, endp - p, "vCont;t:");
+
+      if (ptid_is_pid (ptid))
+         /* All (-1) threads of process.  */
+       nptid = ptid_build (ptid_get_pid (ptid), 0, -1);
+      else
+       {
+         /* Small optimization: if we already have a stop reply for
+            this thread, no use in telling the stub we want this
+            stopped.  */
+         if (peek_stop_reply (ptid))
+           return;
+
+         nptid = ptid;
+       }
+
+      p = write_ptid (p, endp, nptid);
+    }
+
+  /* In non-stop, we get an immediate OK reply.  The stop reply will
+     come in asynchronously by notification.  */
+  putpkt (rs->buf);
+  getpkt (&rs->buf, &rs->buf_size, 0);
+  if (strcmp (rs->buf, "OK") != 0)
+    error (_("Stopping %s failed: %s"), target_pid_to_str (ptid), rs->buf);
+}
+
+/* All-stop version of target_stop.  Sends a break or a ^C to stop the
+   remote target.  It is undefined which thread of which process
+   reports the stop.  */
+
+static void
+remote_stop_as (ptid_t ptid)
+{
+  struct remote_state *rs = get_remote_state ();
+
+  /* If the inferior is stopped already, but the core didn't know
+     about it yet, just ignore the request.  The cached wait status
+     will be collected in remote_wait.  */
+  if (rs->cached_wait_status)
+    return;
+
+  /* Send a break or a ^C, depending on user preference.  */
+
+  if (remote_break)
+    serial_send_break (remote_desc);
+  else
+    serial_write (remote_desc, "\003", 1);
+}
+
 /* This is the generic stop called via the target vector. When a target
    interrupt is requested, either by the command line or the GUI, we
    will eventually end up here.  */
+
 static void
 remote_stop (ptid_t ptid)
 {
-  /* Send a break or a ^C, depending on user preference.  */
   if (remote_debug)
     fprintf_unfiltered (gdb_stdlog, "remote_stop called\n");
 
-  if (remote_break)
-    serial_send_break (remote_desc);
+  if (non_stop)
+    remote_stop_ns (ptid);
   else
-    serial_write (remote_desc, "\003", 1);
+    remote_stop_as (ptid);
 }
 
 /* Ask the user what to do when an interrupt is received.  */
@@ -3517,13 +4052,20 @@ interrupt_query (void)
 {
   target_terminal_ours ();
 
-  if (query ("Interrupted while waiting for the program.\n\
-Give up (and stop debugging it)? "))
+  if (target_can_async_p ())
     {
-      target_mourn_inferior ();
       signal (SIGINT, handle_sigint);
       deprecated_throw_reason (RETURN_QUIT);
     }
+  else
+    {
+      if (query (_("Interrupted while waiting for the program.\n\
+Give up (and stop debugging it)? ")))
+       {
+         pop_target ();
+         deprecated_throw_reason (RETURN_QUIT);
+       }
+    }
 
   target_terminal_inferior ();
 }
@@ -3540,19 +4082,12 @@ remote_terminal_inferior (void)
     /* Nothing to do.  */
     return;
 
-  /* FIXME: cagney/1999-09-27: Shouldn't need to test for
-     sync_execution here.  This function should only be called when
-     GDB is resuming the inferior in the forground.  A background
-     resume (``run&'') should leave GDB in control of the terminal and
-     consequently should not call this code.  */
-  if (!sync_execution)
-    return;
-  /* FIXME: cagney/1999-09-27: Closely related to the above.  Make
-     calls target_terminal_*() idenpotent. The event-loop GDB talking
-     to an asynchronous target with a synchronous command calls this
-     function from both event-top.c and infrun.c/infcmd.c.  Once GDB
-     stops trying to transfer the terminal to the target when it
-     shouldn't this guard can go away.  */
+  /* FIXME: cagney/1999-09-27: Make calls to target_terminal_*()
+     idempotent.  The event-loop GDB talking to an asynchronous target
+     with a synchronous command calls this function from both
+     event-top.c and infrun.c/infcmd.c.  Once GDB stops trying to
+     transfer the terminal to the target when it shouldn't this guard
+     can go away.  */
   if (!remote_async_terminal_ours_p)
     return;
   delete_file_handler (input_fd);
@@ -3571,9 +4106,6 @@ remote_terminal_ours (void)
     return;
 
   /* See FIXME in remote_terminal_inferior.  */
-  if (!sync_execution)
-    return;
-  /* See FIXME in remote_terminal_inferior.  */
   if (remote_async_terminal_ours_p)
     return;
   cleanup_sigint_signal_handler (NULL);
@@ -3594,281 +4126,729 @@ remote_console_output (char *msg)
       tb[1] = 0;
       fputs_unfiltered (tb, gdb_stdtarg);
     }
-  gdb_flush (gdb_stdtarg);
+    gdb_flush (gdb_stdtarg);
+  }
+
+typedef struct cached_reg
+{
+  int num;
+  gdb_byte data[MAX_REGISTER_SIZE];
+} cached_reg_t;
+
+DEF_VEC_O(cached_reg_t);
+
+struct stop_reply
+{
+  struct stop_reply *next;
+
+  ptid_t ptid;
+
+  struct target_waitstatus ws;
+
+  VEC(cached_reg_t) *regcache;
+
+  int stopped_by_watchpoint_p;
+  CORE_ADDR watch_data_address;
+
+  int solibs_changed;
+  int replay_event;
+};
+
+/* The list of already fetched and acknowledged stop events.  */
+static struct stop_reply *stop_reply_queue;
+
+static struct stop_reply *
+stop_reply_xmalloc (void)
+{
+  struct stop_reply *r = XMALLOC (struct stop_reply);
+  r->next = NULL;
+  return r;
 }
 
-/* Wait until the remote machine stops, then return,
-   storing status in STATUS just as `wait' would.  */
+static void
+stop_reply_xfree (struct stop_reply *r)
+{
+  if (r != NULL)
+    {
+      VEC_free (cached_reg_t, r->regcache);
+      xfree (r);
+    }
+}
 
-static ptid_t
-remote_wait (ptid_t ptid, struct target_waitstatus *status)
+/* Discard all pending stop replies of inferior PID.  If PID is -1,
+   discard everything.  */
+
+static void
+discard_pending_stop_replies (int pid)
 {
-  struct remote_state *rs = get_remote_state ();
-  struct remote_arch_state *rsa = get_remote_arch_state ();
-  ptid_t event_ptid = null_ptid;
-  ULONGEST addr;
-  int solibs_changed = 0;
+  struct stop_reply *prev = NULL, *reply, *next;
 
-  status->kind = TARGET_WAITKIND_EXITED;
-  status->value.integer = 0;
+  /* Discard the in-flight notification.  */
+  if (pending_stop_reply != NULL
+      && (pid == -1
+         || ptid_get_pid (pending_stop_reply->ptid) == pid))
+    {
+      stop_reply_xfree (pending_stop_reply);
+      pending_stop_reply = NULL;
+    }
 
-  while (1)
+  /* Discard the stop replies we have already pulled with
+     vStopped.  */
+  for (reply = stop_reply_queue; reply; reply = next)
     {
-      char *buf, *p;
+      next = reply->next;
+      if (pid == -1
+         || ptid_get_pid (reply->ptid) == pid)
+       {
+         if (reply == stop_reply_queue)
+           stop_reply_queue = reply->next;
+         else
+           prev->next = reply->next;
 
-      if (rs->cached_wait_status)
-       /* Use the cached wait status, but only once.  */
-       rs->cached_wait_status = 0;
+         stop_reply_xfree (reply);
+       }
       else
+       prev = reply;
+    }
+}
+
+/* Cleanup wrapper.  */
+
+static void
+do_stop_reply_xfree (void *arg)
+{
+  struct stop_reply *r = arg;
+  stop_reply_xfree (r);
+}
+
+/* Look for a queued stop reply belonging to PTID.  If one is found,
+   remove it from the queue, and return it.  Returns NULL if none is
+   found.  If there are still queued events left to process, tell the
+   event loop to get back to target_wait soon.  */
+
+static struct stop_reply *
+queued_stop_reply (ptid_t ptid)
+{
+  struct stop_reply *it, *prev;
+  struct stop_reply head;
+
+  head.next = stop_reply_queue;
+  prev = &head;
+
+  it = head.next;
+
+  if (!ptid_equal (ptid, minus_one_ptid))
+    for (; it; prev = it, it = it->next)
+      if (ptid_equal (ptid, it->ptid))
+       break;
+
+  if (it)
+    {
+      prev->next = it->next;
+      it->next = NULL;
+    }
+
+  stop_reply_queue = head.next;
+
+  if (stop_reply_queue)
+    /* There's still at least an event left.  */
+    mark_async_event_handler (remote_async_inferior_event_token);
+
+  return it;
+}
+
+/* Push a fully parsed stop reply in the stop reply queue.  Since we
+   know that we now have at least one queued event left to pass to the
+   core side, tell the event loop to get back to target_wait soon.  */
+
+static void
+push_stop_reply (struct stop_reply *new_event)
+{
+  struct stop_reply *event;
+
+  if (stop_reply_queue)
+    {
+      for (event = stop_reply_queue;
+          event && event->next;
+          event = event->next)
+       ;
+
+      event->next = new_event;
+    }
+  else
+    stop_reply_queue = new_event;
+
+  mark_async_event_handler (remote_async_inferior_event_token);
+}
+
+/* Returns true if we have a stop reply for PTID.  */
+
+static int
+peek_stop_reply (ptid_t ptid)
+{
+  struct stop_reply *it;
+
+  for (it = stop_reply_queue; it; it = it->next)
+    if (ptid_equal (ptid, it->ptid))
+      {
+       if (it->ws.kind == TARGET_WAITKIND_STOPPED)
+         return 1;
+      }
+
+  return 0;
+}
+
+/* Parse the stop reply in BUF.  Either the function succeeds, and the
+   result is stored in EVENT, or throws an error.  */
+
+static void
+remote_parse_stop_reply (char *buf, struct stop_reply *event)
+{
+  struct remote_arch_state *rsa = get_remote_arch_state ();
+  ULONGEST addr;
+  char *p;
+
+  event->ptid = null_ptid;
+  event->ws.kind = TARGET_WAITKIND_IGNORE;
+  event->ws.value.integer = 0;
+  event->solibs_changed = 0;
+  event->replay_event = 0;
+  event->stopped_by_watchpoint_p = 0;
+  event->regcache = NULL;
+
+  switch (buf[0])
+    {
+    case 'T':          /* Status with PC, SP, FP, ...  */
+      /* Expedited reply, containing Signal, {regno, reg} repeat.  */
+      /*  format is:  'Tssn...:r...;n...:r...;n...:r...;#cc', where
+           ss = signal number
+           n... = register number
+           r... = register contents
+      */
+
+      p = &buf[3];     /* after Txx */
+      while (*p)
        {
-         if (!target_is_async_p ())
+         char *p1;
+         char *p_temp;
+         int fieldsize;
+         LONGEST pnum = 0;
+
+         /* If the packet contains a register number, save it in
+            pnum and set p1 to point to the character following it.
+            Otherwise p1 points to p.  */
+
+         /* If this packet is an awatch packet, don't parse the 'a'
+            as a register number.  */
+
+         if (strncmp (p, "awatch", strlen("awatch")) != 0)
+           {
+             /* Read the ``P'' register number.  */
+             pnum = strtol (p, &p_temp, 16);
+             p1 = p_temp;
+           }
+         else
+           p1 = p;
+
+         if (p1 == p)  /* No register number present here.  */
            {
-             ofunc = signal (SIGINT, remote_interrupt);
-             /* If the user hit C-c before this packet, or between packets,
-                pretend that it was hit right here.  */
-             if (quit_flag)
+             p1 = strchr (p, ':');
+             if (p1 == NULL)
+               error (_("Malformed packet(a) (missing colon): %s\n\
+Packet: '%s'\n"),
+                      p, buf);
+             if (strncmp (p, "thread", p1 - p) == 0)
+               event->ptid = read_ptid (++p1, &p);
+             else if ((strncmp (p, "watch", p1 - p) == 0)
+                      || (strncmp (p, "rwatch", p1 - p) == 0)
+                      || (strncmp (p, "awatch", p1 - p) == 0))
+               {
+                 event->stopped_by_watchpoint_p = 1;
+                 p = unpack_varlen_hex (++p1, &addr);
+                 event->watch_data_address = (CORE_ADDR) addr;
+               }
+             else if (strncmp (p, "library", p1 - p) == 0)
+               {
+                 p1++;
+                 p_temp = p1;
+                 while (*p_temp && *p_temp != ';')
+                   p_temp++;
+
+                 event->solibs_changed = 1;
+                 p = p_temp;
+               }
+             else if (strncmp (p, "replaylog", p1 - p) == 0)
                {
-                 quit_flag = 0;
-                 remote_interrupt (SIGINT);
+                 /* NO_HISTORY event.
+                    p1 will indicate "begin" or "end", but
+                    it makes no difference for now, so ignore it.  */
+                 event->replay_event = 1;
+                 p_temp = strchr (p1 + 1, ';');
+                 if (p_temp)
+                   p = p_temp;
+               }
+             else
+               {
+                 /* Silently skip unknown optional info.  */
+                 p_temp = strchr (p1 + 1, ';');
+                 if (p_temp)
+                   p = p_temp;
                }
            }
-         /* FIXME: cagney/1999-09-27: If we're in async mode we should
-            _never_ wait for ever -> test on target_is_async_p().
-            However, before we do that we need to ensure that the caller
-            knows how to take the target into/out of async mode.  */
-         getpkt (&rs->buf, &rs->buf_size, wait_forever_enabled_p);
-         if (!target_is_async_p ())
-           signal (SIGINT, ofunc);
-       }
+         else
+           {
+             struct packet_reg *reg = packet_reg_from_pnum (rsa, pnum);
+             cached_reg_t cached_reg;
 
-      buf = rs->buf;
+             p = p1;
+
+             if (*p != ':')
+               error (_("Malformed packet(b) (missing colon): %s\n\
+Packet: '%s'\n"),
+                      p, buf);
+             ++p;
+
+             if (reg == NULL)
+               error (_("Remote sent bad register number %s: %s\n\
+Packet: '%s'\n"),
+                      phex_nz (pnum, 0), p, buf);
+
+             cached_reg.num = reg->regnum;
 
-      remote_stopped_by_watchpoint_p = 0;
+             fieldsize = hex2bin (p, cached_reg.data,
+                                  register_size (target_gdbarch,
+                                                 reg->regnum));
+             p += 2 * fieldsize;
+             if (fieldsize < register_size (target_gdbarch,
+                                            reg->regnum))
+               warning (_("Remote reply is too short: %s"), buf);
 
-      switch (buf[0])
+             VEC_safe_push (cached_reg_t, event->regcache, &cached_reg);
+           }
+
+         if (*p != ';')
+           error (_("Remote register badly formatted: %s\nhere: %s"),
+                  buf, p);
+         ++p;
+       }
+      /* fall through */
+    case 'S':          /* Old style status, just signal only.  */
+      if (event->solibs_changed)
+       event->ws.kind = TARGET_WAITKIND_LOADED;
+      else if (event->replay_event)
+       event->ws.kind = TARGET_WAITKIND_NO_HISTORY;
+      else
        {
-       case 'E':               /* Error of some sort.  */
-         /* We're out of sync with the target now.  Did it continue or not?
-            Not is more likely, so report a stop.  */
-         warning (_("Remote failure reply: %s"), buf);
-         status->kind = TARGET_WAITKIND_STOPPED;
-         status->value.sig = TARGET_SIGNAL_0;
-         goto got_status;
-       case 'F':               /* File-I/O request.  */
-         remote_fileio_request (buf);
-         continue;
-       case 'T':               /* Status with PC, SP, FP, ...  */
+         event->ws.kind = TARGET_WAITKIND_STOPPED;
+         event->ws.value.sig = (enum target_signal)
+           (((fromhex (buf[1])) << 4) + (fromhex (buf[2])));
+       }
+      break;
+    case 'W':          /* Target exited.  */
+    case 'X':
+      {
+       char *p;
+       int pid;
+       ULONGEST value;
+
+       /* GDB used to accept only 2 hex chars here.  Stubs should
+          only send more if they detect GDB supports multi-process
+          support.  */
+       p = unpack_varlen_hex (&buf[1], &value);
+
+       if (buf[0] == 'W')
+         {
+           /* The remote process exited.  */
+           event->ws.kind = TARGET_WAITKIND_EXITED;
+           event->ws.value.integer = value;
+         }
+       else
          {
-           gdb_byte regs[MAX_REGISTER_SIZE];
+           /* The remote process exited with a signal.  */
+           event->ws.kind = TARGET_WAITKIND_SIGNALLED;
+           event->ws.value.sig = (enum target_signal) value;
+         }
 
-           /* Expedited reply, containing Signal, {regno, reg} repeat.  */
-           /*  format is:  'Tssn...:r...;n...:r...;n...:r...;#cc', where
-              ss = signal number
-              n... = register number
-              r... = register contents
-            */
-           p = &buf[3];        /* after Txx */
+       /* If no process is specified, assume inferior_ptid.  */
+       pid = ptid_get_pid (inferior_ptid);
+       if (*p == '\0')
+         ;
+       else if (*p == ';')
+         {
+           p++;
 
-           while (*p)
+           if (p == '\0')
+             ;
+           else if (strncmp (p,
+                             "process:", sizeof ("process:") - 1) == 0)
              {
-               char *p1;
-               char *p_temp;
-               int fieldsize;
-               LONGEST pnum = 0;
+               ULONGEST upid;
+               p += sizeof ("process:") - 1;
+               unpack_varlen_hex (p, &upid);
+               pid = upid;
+             }
+           else
+             error (_("unknown stop reply packet: %s"), buf);
+         }
+       else
+         error (_("unknown stop reply packet: %s"), buf);
+       event->ptid = pid_to_ptid (pid);
+      }
+      break;
+    }
 
-               /* If the packet contains a register number, save it
-                  in pnum and set p1 to point to the character
-                  following it.  Otherwise p1 points to p.  */
+  if (non_stop && ptid_equal (event->ptid, null_ptid))
+    error (_("No process or thread specified in stop reply: %s"), buf);
+}
 
-               /* If this packet is an awatch packet, don't parse the
-                  'a' as a register number.  */
+/* When the stub wants to tell GDB about a new stop reply, it sends a
+   stop notification (%Stop).  Those can come it at any time, hence,
+   we have to make sure that any pending putpkt/getpkt sequence we're
+   making is finished, before querying the stub for more events with
+   vStopped.  E.g., if we started a vStopped sequence immediatelly
+   upon receiving the %Stop notification, something like this could
+   happen:
 
-               if (strncmp (p, "awatch", strlen("awatch")) != 0)
-                 {
-                   /* Read the ``P'' register number.  */
-                   pnum = strtol (p, &p_temp, 16);
-                   p1 = p_temp;
-                 }
-               else
-                 p1 = p;
+    1.1) --> Hg 1
+    1.2) <-- OK
+    1.3) --> g
+    1.4) <-- %Stop
+    1.5) --> vStopped
+    1.6) <-- (registers reply to step #1.3)
 
-               if (p1 == p)    /* No register number present here.  */
-                 {
-                   p1 = strchr (p, ':');
-                   if (p1 == NULL)
-                     error (_("Malformed packet(a) (missing colon): %s\n\
-Packet: '%s'\n"),
-                            p, buf);
-                   if (strncmp (p, "thread", p1 - p) == 0)
-                     event_ptid = read_ptid (++p1, &p);
-                   else if ((strncmp (p, "watch", p1 - p) == 0)
-                            || (strncmp (p, "rwatch", p1 - p) == 0)
-                            || (strncmp (p, "awatch", p1 - p) == 0))
-                     {
-                       remote_stopped_by_watchpoint_p = 1;
-                       p = unpack_varlen_hex (++p1, &addr);
-                       remote_watch_data_address = (CORE_ADDR)addr;
-                     }
-                   else if (strncmp (p, "library", p1 - p) == 0)
-                     {
-                       p1++;
-                       p_temp = p1;
-                       while (*p_temp && *p_temp != ';')
-                         p_temp++;
+   Obviously, the reply in step #1.6 would be unexpected to a vStopped
+   query.
 
-                       solibs_changed = 1;
-                       p = p_temp;
-                     }
-                   else
-                     {
-                       /* Silently skip unknown optional info.  */
-                       p_temp = strchr (p1 + 1, ';');
-                       if (p_temp)
-                         p = p_temp;
-                     }
-                 }
-               else
-                 {
-                   struct packet_reg *reg = packet_reg_from_pnum (rsa, pnum);
-                   p = p1;
+   To solve this, whenever we parse a %Stop notification sucessfully,
+   we mark the REMOTE_ASYNC_GET_PENDING_EVENTS_TOKEN, and carry on
+   doing whatever we were doing:
 
-                   if (*p != ':')
-                     error (_("Malformed packet(b) (missing colon): %s\n\
-Packet: '%s'\n"),
-                            p, buf);
-                    ++p;
+    2.1) --> Hg 1
+    2.2) <-- OK
+    2.3) --> g
+    2.4) <-- %Stop
+      <GDB marks the REMOTE_ASYNC_GET_PENDING_EVENTS_TOKEN>
+    2.5) <-- (registers reply to step #2.3)
 
-                   if (reg == NULL)
-                     error (_("Remote sent bad register number %s: %s\n\
-Packet: '%s'\n"),
-                            phex_nz (pnum, 0), p, buf);
-
-                   fieldsize = hex2bin (p, regs,
-                                        register_size (target_gdbarch,
-                                                       reg->regnum));
-                   p += 2 * fieldsize;
-                   if (fieldsize < register_size (target_gdbarch,
-                                                  reg->regnum))
-                     warning (_("Remote reply is too short: %s"), buf);
-                   regcache_raw_supply (get_current_regcache (),
-                                        reg->regnum, regs);
-                 }
+   Eventualy after step #2.5, we return to the event loop, which
+   notices there's an event on the
+   REMOTE_ASYNC_GET_PENDING_EVENTS_TOKEN event and calls the
+   associated callback --- the function below.  At this point, we're
+   always safe to start a vStopped sequence. :
 
-               if (*p != ';')
-                 error (_("Remote register badly formatted: %s\nhere: %s"),
-                        buf, p);
-                ++p;
-             }
-         }
-         /* fall through */
-       case 'S':               /* Old style status, just signal only.  */
-         if (solibs_changed)
-           status->kind = TARGET_WAITKIND_LOADED;
+    2.6) --> vStopped
+    2.7) <-- T05 thread:2
+    2.8) --> vStopped
+    2.9) --> OK
+*/
+
+static void
+remote_get_pending_stop_replies (void)
+{
+  struct remote_state *rs = get_remote_state ();
+
+  if (pending_stop_reply)
+    {
+      /* acknowledge */
+      putpkt ("vStopped");
+
+      /* Now we can rely on it.         */
+      push_stop_reply (pending_stop_reply);
+      pending_stop_reply = NULL;
+
+      while (1)
+       {
+         getpkt (&rs->buf, &rs->buf_size, 0);
+         if (strcmp (rs->buf, "OK") == 0)
+           break;
          else
            {
-             status->kind = TARGET_WAITKIND_STOPPED;
-             status->value.sig = (enum target_signal)
-               (((fromhex (buf[1])) << 4) + (fromhex (buf[2])));
+             struct cleanup *old_chain;
+             struct stop_reply *stop_reply = stop_reply_xmalloc ();
+
+             old_chain = make_cleanup (do_stop_reply_xfree, stop_reply);
+             remote_parse_stop_reply (rs->buf, stop_reply);
+
+             /* acknowledge */
+             putpkt ("vStopped");
+
+             if (stop_reply->ws.kind != TARGET_WAITKIND_IGNORE)
+               {
+                 /* Now we can rely on it.  */
+                 discard_cleanups (old_chain);
+                 push_stop_reply (stop_reply);
+               }
+             else
+               /* We got an unknown stop reply.  */
+               do_cleanups (old_chain);
            }
-         goto got_status;
-       case 'W':               /* Target exited.  */
-       case 'X':
-         {
-           char *p;
-           int pid;
-           ULONGEST value;
+       }
+    }
+}
 
-           /* GDB used to accept only 2 hex chars here.  Stubs should
-              only send more if they detect GDB supports
-              multi-process support.  */
-           p = unpack_varlen_hex (&buf[1], &value);
 
-           if (buf[0] == 'W')
-             {
-               /* The remote process exited.  */
-               status->kind = TARGET_WAITKIND_EXITED;
-               status->value.integer = value;
-             }
-           else
-             {
-               /* The remote process exited with a signal.  */
-               status->kind = TARGET_WAITKIND_SIGNALLED;
-               status->value.sig = (enum target_signal) value;
-             }
+/* Called when it is decided that STOP_REPLY holds the info of the
+   event that is to be returned to the core.  This function always
+   destroys STOP_REPLY.  */
 
-           /* If no process is specified, assume inferior_ptid.  */
-           pid = ptid_get_pid (inferior_ptid);
-           if (*p == '\0')
-             ;
-           else if (*p == ';')
-             {
-               p++;
+static ptid_t
+process_stop_reply (struct stop_reply *stop_reply,
+                   struct target_waitstatus *status)
+{
+  ptid_t ptid;
 
-               if (p == '\0')
-                 ;
-               else if (strncmp (p,
-                                 "process:", sizeof ("process:") - 1) == 0)
-                 {
-                   ULONGEST upid;
-                   p += sizeof ("process:") - 1;
-                   unpack_varlen_hex (p, &upid);
-                   pid = upid;
-                 }
-               else
-                 error (_("unknown stop reply packet: %s"), buf);
-             }
-           else
-             error (_("unknown stop reply packet: %s"), buf);
-           event_ptid = ptid_build (pid, 0, 0);
-           goto got_status;
+  *status = stop_reply->ws;
+  ptid = stop_reply->ptid;
+
+  /* If no thread/process was reported by the stub, assume the current
+     inferior.  */
+  if (ptid_equal (ptid, null_ptid))
+    ptid = inferior_ptid;
+
+  if (status->kind != TARGET_WAITKIND_EXITED
+      && status->kind != TARGET_WAITKIND_SIGNALLED)
+    {
+      /* Expedited registers.  */
+      if (stop_reply->regcache)
+       {
+         struct regcache *regcache
+           = get_thread_arch_regcache (ptid, target_gdbarch);
+         cached_reg_t *reg;
+         int ix;
+
+         for (ix = 0;
+              VEC_iterate(cached_reg_t, stop_reply->regcache, ix, reg);
+              ix++)
+           regcache_raw_supply (regcache, reg->num, reg->data);
+         VEC_free (cached_reg_t, stop_reply->regcache);
+       }
+
+      remote_stopped_by_watchpoint_p = stop_reply->stopped_by_watchpoint_p;
+      remote_watch_data_address = stop_reply->watch_data_address;
+
+      remote_notice_new_inferior (ptid, 0);
+    }
+
+  stop_reply_xfree (stop_reply);
+  return ptid;
+}
+
+/* The non-stop mode version of target_wait.  */
+
+static ptid_t
+remote_wait_ns (ptid_t ptid, struct target_waitstatus *status, int options)
+{
+  struct remote_state *rs = get_remote_state ();
+  struct stop_reply *stop_reply;
+  int ret;
+
+  /* If in non-stop mode, get out of getpkt even if a
+     notification is received. */
+
+  ret = getpkt_or_notif_sane (&rs->buf, &rs->buf_size,
+                             0 /* forever */);
+  while (1)
+    {
+      if (ret != -1)
+       switch (rs->buf[0])
+         {
+         case 'E':             /* Error of some sort.  */
+           /* We're out of sync with the target now.  Did it continue
+              or not?  We can't tell which thread it was in non-stop,
+              so just ignore this.  */
+           warning (_("Remote failure reply: %s"), rs->buf);
+           break;
+         case 'O':             /* Console output.  */
+           remote_console_output (rs->buf + 1);
+           break;
+         default:
+           warning (_("Invalid remote reply: %s"), rs->buf);
+           break;
          }
-       case 'O':               /* Console output.  */
-         remote_console_output (buf + 1);
-         if (target_can_async_p ())
-           {
-             /* Return immediately to the event loop. The event loop
-                will still be waiting on the inferior afterwards.  */
-             status->kind = TARGET_WAITKIND_IGNORE;
-             goto got_status;
-           }
-         else
-           continue;
-       case '\0':
-         if (last_sent_signal != TARGET_SIGNAL_0)
+
+      /* Acknowledge a pending stop reply that may have arrived in the
+        mean time.  */
+      if (pending_stop_reply != NULL)
+       remote_get_pending_stop_replies ();
+
+      /* If indeed we noticed a stop reply, we're done.  */
+      stop_reply = queued_stop_reply (ptid);
+      if (stop_reply != NULL)
+       return process_stop_reply (stop_reply, status);
+
+      /* Still no event.  If we're just polling for an event, then
+        return to the event loop.  */
+      if (options & TARGET_WNOHANG)
+       {
+         status->kind = TARGET_WAITKIND_IGNORE;
+         return minus_one_ptid;
+       }
+
+      /* Otherwise do a blocking wait.  */
+      ret = getpkt_or_notif_sane (&rs->buf, &rs->buf_size,
+                                 1 /* forever */);
+    }
+}
+
+/* Wait until the remote machine stops, then return, storing status in
+   STATUS just as `wait' would.  */
+
+static ptid_t
+remote_wait_as (ptid_t ptid, struct target_waitstatus *status, int options)
+{
+  struct remote_state *rs = get_remote_state ();
+  ptid_t event_ptid = null_ptid;
+  char *buf;
+  struct stop_reply *stop_reply;
+
+ again:
+
+  status->kind = TARGET_WAITKIND_IGNORE;
+  status->value.integer = 0;
+
+  stop_reply = queued_stop_reply (ptid);
+  if (stop_reply != NULL)
+    return process_stop_reply (stop_reply, status);
+
+  if (rs->cached_wait_status)
+    /* Use the cached wait status, but only once.  */
+    rs->cached_wait_status = 0;
+  else
+    {
+      int ret;
+
+      if (!target_is_async_p ())
+       {
+         ofunc = signal (SIGINT, remote_interrupt);
+         /* If the user hit C-c before this packet, or between packets,
+            pretend that it was hit right here.  */
+         if (quit_flag)
            {
-             /* Zero length reply means that we tried 'S' or 'C' and
-                the remote system doesn't support it.  */
-             target_terminal_ours_for_output ();
-             printf_filtered
-               ("Can't send signals to this remote system.  %s not sent.\n",
-                target_signal_to_name (last_sent_signal));
-             last_sent_signal = TARGET_SIGNAL_0;
-             target_terminal_inferior ();
-
-             strcpy ((char *) buf, last_sent_step ? "s" : "c");
-             putpkt ((char *) buf);
-             continue;
+             quit_flag = 0;
+             remote_interrupt (SIGINT);
            }
-         /* else fallthrough */
-       default:
-         warning (_("Invalid remote reply: %s"), buf);
-         continue;
        }
+
+      /* FIXME: cagney/1999-09-27: If we're in async mode we should
+        _never_ wait for ever -> test on target_is_async_p().
+        However, before we do that we need to ensure that the caller
+        knows how to take the target into/out of async mode.  */
+      ret = getpkt_sane (&rs->buf, &rs->buf_size, wait_forever_enabled_p);
+      if (!target_is_async_p ())
+       signal (SIGINT, ofunc);
+    }
+
+  buf = rs->buf;
+
+  remote_stopped_by_watchpoint_p = 0;
+
+  /* We got something.  */
+  rs->waiting_for_stop_reply = 0;
+
+  switch (buf[0])
+    {
+    case 'E':          /* Error of some sort.  */
+      /* We're out of sync with the target now.  Did it continue or
+        not?  Not is more likely, so report a stop.  */
+      warning (_("Remote failure reply: %s"), buf);
+      status->kind = TARGET_WAITKIND_STOPPED;
+      status->value.sig = TARGET_SIGNAL_0;
+      break;
+    case 'F':          /* File-I/O request.  */
+      remote_fileio_request (buf);
+      break;
+    case 'T': case 'S': case 'X': case 'W':
+      {
+       struct stop_reply *stop_reply;
+       struct cleanup *old_chain;
+
+       stop_reply = stop_reply_xmalloc ();
+       old_chain = make_cleanup (do_stop_reply_xfree, stop_reply);
+       remote_parse_stop_reply (buf, stop_reply);
+       discard_cleanups (old_chain);
+       event_ptid = process_stop_reply (stop_reply, status);
+       break;
+      }
+    case 'O':          /* Console output.  */
+      remote_console_output (buf + 1);
+
+      /* The target didn't really stop; keep waiting.  */
+      rs->waiting_for_stop_reply = 1;
+
+      break;
+    case '\0':
+      if (last_sent_signal != TARGET_SIGNAL_0)
+       {
+         /* Zero length reply means that we tried 'S' or 'C' and the
+            remote system doesn't support it.  */
+         target_terminal_ours_for_output ();
+         printf_filtered
+           ("Can't send signals to this remote system.  %s not sent.\n",
+            target_signal_to_name (last_sent_signal));
+         last_sent_signal = TARGET_SIGNAL_0;
+         target_terminal_inferior ();
+
+         strcpy ((char *) buf, last_sent_step ? "s" : "c");
+         putpkt ((char *) buf);
+
+         /* We just told the target to resume, so a stop reply is in
+            order.  */
+         rs->waiting_for_stop_reply = 1;
+         break;
+       }
+      /* else fallthrough */
+    default:
+      warning (_("Invalid remote reply: %s"), buf);
+      /* Keep waiting.  */
+      rs->waiting_for_stop_reply = 1;
+      break;
     }
-got_status:
-  if (status->kind == TARGET_WAITKIND_EXITED
-      || status->kind == TARGET_WAITKIND_SIGNALLED)
+
+  if (status->kind == TARGET_WAITKIND_IGNORE)
     {
-      int pid = ptid_get_pid (event_ptid);
-      delete_inferior (pid);
+      /* Nothing interesting happened.  If we're doing a non-blocking
+        poll, we're done.  Otherwise, go back to waiting.  */
+      if (options & TARGET_WNOHANG)
+       return minus_one_ptid;
+      else
+       goto again;
     }
-  else
+  else if (status->kind != TARGET_WAITKIND_EXITED
+          && status->kind != TARGET_WAITKIND_SIGNALLED)
     {
       if (!ptid_equal (event_ptid, null_ptid))
        record_currthread (event_ptid);
       else
        event_ptid = inferior_ptid;
     }
+  else
+    /* A process exit.  Invalidate our notion of current thread.  */
+    record_currthread (minus_one_ptid);
+
+  return event_ptid;
+}
+
+/* Wait until the remote machine stops, then return, storing status in
+   STATUS just as `wait' would.  */
+
+static ptid_t
+remote_wait (struct target_ops *ops,
+            ptid_t ptid, struct target_waitstatus *status, int options)
+{
+  ptid_t event_ptid;
+
+  if (non_stop)
+    event_ptid = remote_wait_ns (ptid, status, options);
+  else
+    event_ptid = remote_wait_as (ptid, status, options);
+
+  if (target_can_async_p ())
+    {
+      /* If there are are events left in the queue tell the event loop
+        to return here.  */
+      if (stop_reply_queue)
+       mark_async_event_handler (remote_async_inferior_event_token);
+    }
 
   return event_ptid;
 }
@@ -3893,7 +4873,8 @@ fetch_register_using_p (struct regcache *regcache, struct packet_reg *reg)
   *p++ = 'p';
   p += hexnumstr (p, reg->pnum);
   *p++ = '\0';
-  remote_send (&rs->buf, &rs->buf_size);
+  putpkt (rs->buf);
+  getpkt (&rs->buf, &rs->buf_size, 0);
 
   buf = rs->buf;
 
@@ -3904,8 +4885,10 @@ fetch_register_using_p (struct regcache *regcache, struct packet_reg *reg)
     case PACKET_UNKNOWN:
       return 0;
     case PACKET_ERROR:
-      error (_("Could not fetch register \"%s\""),
-            gdbarch_register_name (get_regcache_arch (regcache), reg->regnum));
+      error (_("Could not fetch register \"%s\"; remote failure reply '%s'"),
+            gdbarch_register_name (get_regcache_arch (regcache), 
+                                   reg->regnum), 
+            buf);
     }
 
   /* If this register is unfetchable, tell the regcache.  */
@@ -3936,9 +4919,7 @@ static int
 send_g_packet (void)
 {
   struct remote_state *rs = get_remote_state ();
-  int i, buf_len;
-  char *p;
-  char *regs;
+  int buf_len;
 
   sprintf (rs->buf, "g");
   remote_send (&rs->buf, &rs->buf_size);
@@ -4066,9 +5047,9 @@ fetch_registers_using_g (struct regcache *regcache)
 }
 
 static void
-remote_fetch_registers (struct regcache *regcache, int regnum)
+remote_fetch_registers (struct target_ops *ops,
+                       struct regcache *regcache, int regnum)
 {
-  struct remote_state *rs = get_remote_state ();
   struct remote_arch_state *rsa = get_remote_arch_state ();
   int i;
 
@@ -4140,11 +5121,11 @@ remote_prepare_to_store (struct regcache *regcache)
    packet was not recognized.  */
 
 static int
-store_register_using_P (const struct regcache *regcache, struct packet_reg *reg)
+store_register_using_P (const struct regcache *regcache, 
+                       struct packet_reg *reg)
 {
   struct gdbarch *gdbarch = get_regcache_arch (regcache);
   struct remote_state *rs = get_remote_state ();
-  struct remote_arch_state *rsa = get_remote_arch_state ();
   /* Try storing a single register.  */
   char *buf = rs->buf;
   gdb_byte regp[MAX_REGISTER_SIZE];
@@ -4160,15 +5141,16 @@ store_register_using_P (const struct regcache *regcache, struct packet_reg *reg)
   p = buf + strlen (buf);
   regcache_raw_collect (regcache, reg->regnum, regp);
   bin2hex (regp, p, register_size (gdbarch, reg->regnum));
-  remote_send (&rs->buf, &rs->buf_size);
+  putpkt (rs->buf);
+  getpkt (&rs->buf, &rs->buf_size, 0);
 
   switch (packet_ok (rs->buf, &remote_protocol_packets[PACKET_P]))
     {
     case PACKET_OK:
       return 1;
     case PACKET_ERROR:
-      error (_("Could not write register \"%s\""),
-            gdbarch_register_name (gdbarch, reg->regnum));
+      error (_("Could not write register \"%s\"; remote failure reply '%s'"),
+            gdbarch_register_name (gdbarch, reg->regnum), rs->buf);
     case PACKET_UNKNOWN:
       return 0;
     default:
@@ -4208,16 +5190,20 @@ store_registers_using_G (const struct regcache *regcache)
   /* remote_prepare_to_store insures that rsa->sizeof_g_packet gets
      updated.  */
   bin2hex (regs, p, rsa->sizeof_g_packet);
-  remote_send (&rs->buf, &rs->buf_size);
+  putpkt (rs->buf);
+  getpkt (&rs->buf, &rs->buf_size, 0);
+  if (packet_check_result (rs->buf) == PACKET_ERROR)
+    error (_("Could not write registers; remote failure reply '%s'"), 
+          rs->buf);
 }
 
 /* Store register REGNUM, or all registers if REGNUM == -1, from the contents
    of the register cache buffer.  FIXME: ignores errors.  */
 
 static void
-remote_store_registers (struct regcache *regcache, int regnum)
+remote_store_registers (struct target_ops *ops,
+                       struct regcache *regcache, int regnum)
 {
-  struct remote_state *rs = get_remote_state ();
   struct remote_arch_state *rsa = get_remote_arch_state ();
   int i;
 
@@ -4749,6 +5735,45 @@ remote_read_bytes (CORE_ADDR memaddr, gdb_byte *myaddr, int len)
     }
   return origlen;
 }
+\f
+
+/* Remote notification handler.  */
+
+static void
+handle_notification (char *buf, size_t length)
+{
+  if (strncmp (buf, "Stop:", 5) == 0)
+    {
+      if (pending_stop_reply)
+       /* We've already parsed the in-flight stop-reply, but the stub
+          for some reason thought we didn't, possibly due to timeout
+          on its side.  Just ignore it.  */
+       ;
+      else
+       {
+         struct cleanup *old_chain;
+         struct stop_reply *reply = stop_reply_xmalloc ();
+         old_chain = make_cleanup (do_stop_reply_xfree, reply);
+
+         remote_parse_stop_reply (buf + 5, reply);
+
+         discard_cleanups (old_chain);
+
+         /* Be careful to only set it after parsing, since an error
+            may be thrown then.  */
+         pending_stop_reply = reply;
+
+         /* Notify the event loop there's a stop reply to acknowledge
+            and that there may be more events to fetch.  */
+         mark_async_event_handler (remote_async_get_pending_events_token);
+       }
+    }
+  else
+    /* We ignore notifications we don't recognize, for compatibility
+       with newer stubs.  */
+    ;
+}
+
 \f
 /* Read or write LEN bytes from inferior memory at MEMADDR,
    transferring to or from debugger address BUFFER.  Write to inferior
@@ -4776,7 +5801,7 @@ remote_xfer_memory (CORE_ADDR mem_addr, gdb_byte *buffer, int mem_len,
    FORMAT and the remaining arguments, then gets the reply.  Returns
    whether the packet was a success, a failure, or unknown.  */
 
-enum packet_result
+static enum packet_result
 remote_send_printf (const char *format, ...)
 {
   struct remote_state *rs = get_remote_state ();
@@ -4814,6 +5839,7 @@ static void
 remote_flash_erase (struct target_ops *ops,
                     ULONGEST address, LONGEST length)
 {
+  int addr_size = gdbarch_addr_bit (target_gdbarch) / 8;
   int saved_remote_timeout = remote_timeout;
   enum packet_result ret;
 
@@ -4822,7 +5848,7 @@ remote_flash_erase (struct target_ops *ops,
   remote_timeout = remote_flash_timeout;
 
   ret = remote_send_printf ("vFlashErase:%s,%s",
-                           paddr (address),
+                           phex (address, addr_size),
                            phex (length, 4));
   switch (ret)
     {
@@ -4901,7 +5927,7 @@ readchar (int timeout)
   switch ((enum serial_rc) ch)
     {
     case SERIAL_EOF:
-      target_mourn_inferior ();
+      pop_target ();
       error (_("Remote connection closed"));
       /* no return */
     case SERIAL_ERROR:
@@ -4929,6 +5955,27 @@ remote_send (char **buf,
     error (_("Remote failure reply: %s"), *buf);
 }
 
+/* Return a pointer to an xmalloc'ed string representing an escaped
+   version of BUF, of len N.  E.g. \n is converted to \\n, \t to \\t,
+   etc.  The caller is responsible for releasing the returned
+   memory.  */
+
+static char *
+escape_buffer (const char *buf, int n)
+{
+  struct cleanup *old_chain;
+  struct ui_file *stb;
+  char *str;
+
+  stb = mem_fileopen ();
+  old_chain = make_cleanup_ui_file_delete (stb);
+
+  fputstrn_unfiltered (buf, n, 0, stb);
+  str = ui_file_xstrdup (stb, NULL);
+  do_cleanups (old_chain);
+  return str;
+}
+
 /* Display a null-terminated packet on stdout, for debugging, using C
    string notation.  */
 
@@ -4964,6 +6011,16 @@ putpkt_binary (char *buf, int cnt)
   int tcount = 0;
   char *p;
 
+  /* Catch cases like trying to read memory or listing threads while
+     we're waiting for a stop reply.  The remote server wouldn't be
+     ready to handle this request, so we'd hang and timeout.  We don't
+     have to worry about this in synchronous mode, because in that
+     case it's not possible to issue a command while the target is
+     running.  This is not a problem in non-stop mode, because in that
+     case, the stub is always ready to process serial input.  */
+  if (!non_stop && target_can_async_p () && rs->waiting_for_stop_reply)
+    error (_("Cannot execute this command while the target is running."));
+
   /* We're sending out a new packet.  Make sure we don't look at a
      stale cached response.  */
   rs->cached_wait_status = 0;
@@ -4991,11 +6048,15 @@ putpkt_binary (char *buf, int cnt)
 
       if (remote_debug)
        {
+         struct cleanup *old_chain;
+         char *str;
+
          *p = '\0';
-         fprintf_unfiltered (gdb_stdlog, "Sending packet: ");
-         fputstrn_unfiltered (buf2, p - buf2, 0, gdb_stdlog);
-         fprintf_unfiltered (gdb_stdlog, "...");
+         str = escape_buffer (buf2, p - buf2);
+         old_chain = make_cleanup (xfree, str);
+         fprintf_unfiltered (gdb_stdlog, "Sending packet: %s...", str);
          gdb_flush (gdb_stdlog);
+         do_cleanups (old_chain);
        }
       if (serial_write (remote_desc, buf2, p - buf2))
        perror_with_name (_("putpkt: write failed"));
@@ -5005,7 +6066,8 @@ putpkt_binary (char *buf, int cnt)
       if (rs->noack_mode)
         break;
 
-      /* Read until either a timeout occurs (-2) or '+' is read.  */
+      /* Read until either a timeout occurs (-2) or '+' is read.
+        Handle any notification that arrives in the mean time.  */
       while (1)
        {
          ch = readchar (remote_timeout);
@@ -5018,6 +6080,7 @@ putpkt_binary (char *buf, int cnt)
                case '-':
                case SERIAL_TIMEOUT:
                case '$':
+               case '%':
                  if (started_error_output)
                    {
                      putchar_unfiltered ('\n');
@@ -5053,6 +6116,50 @@ putpkt_binary (char *buf, int cnt)
                serial_write (remote_desc, "+", 1);
                continue;       /* Now, go look for +.  */
              }
+
+           case '%':
+             {
+               int val;
+
+               /* If we got a notification, handle it, and go back to looking
+                  for an ack.  */
+               /* We've found the start of a notification.  Now
+                  collect the data.  */
+               val = read_frame (&rs->buf, &rs->buf_size);
+               if (val >= 0)
+                 {
+                   if (remote_debug)
+                     {
+                       struct cleanup *old_chain;
+                       char *str;
+
+                       str = escape_buffer (rs->buf, val);
+                       old_chain = make_cleanup (xfree, str);
+                       fprintf_unfiltered (gdb_stdlog,
+                                           "  Notification received: %s\n",
+                                           str);
+                       do_cleanups (old_chain);
+                     }
+                   handle_notification (rs->buf, val);
+                   /* We're in sync now, rewait for the ack.  */
+                   tcount = 0;
+                 }
+               else
+                 {
+                   if (remote_debug)
+                     {
+                       if (!started_error_output)
+                         {
+                           started_error_output = 1;
+                           fprintf_unfiltered (gdb_stdlog, "putpkt: Junk: ");
+                         }
+                       fputc_unfiltered (ch & 0177, gdb_stdlog);
+                       fprintf_unfiltered (gdb_stdlog, "%s", rs->buf);
+                     }
+                 }
+               continue;
+             }
+             /* fall-through */
            default:
              if (remote_debug)
                {
@@ -5195,11 +6302,16 @@ read_frame (char **buf_p,
 
            if (remote_debug)
              {
-               fprintf_filtered (gdb_stdlog,
-                             "Bad checksum, sentsum=0x%x, csum=0x%x, buf=",
-                                 pktcsum, csum);
-               fputstrn_filtered (buf, bc, 0, gdb_stdlog);
-               fputs_filtered ("\n", gdb_stdlog);
+               struct cleanup *old_chain;
+               char *str;
+
+               str = escape_buffer (buf, bc);
+               old_chain = make_cleanup (xfree, str);
+               fprintf_unfiltered (gdb_stdlog,
+                                   "\
+Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n",
+                                   pktcsum, csum, str);
+               do_cleanups (old_chain);
              }
            /* Number of characters in buffer ignoring trailing
                NULL.  */
@@ -5277,16 +6389,19 @@ getpkt (char **buf,
    rather than timing out; this is used (in synchronous mode) to wait
    for a target that is is executing user code to stop.  If FOREVER ==
    0, this function is allowed to time out gracefully and return an
-   indication of this to the caller.  Otherwise return the number
-   of bytes read.  */
+   indication of this to the caller.  Otherwise return the number of
+   bytes read.  If EXPECTING_NOTIF, consider receiving a notification
+   enough reason to return to the caller.  */
+
 static int
-getpkt_sane (char **buf, long *sizeof_buf, int forever)
+getpkt_or_notif_sane_1 (char **buf, long *sizeof_buf, int forever,
+                       int expecting_notif)
 {
   struct remote_state *rs = get_remote_state ();
   int c;
   int tries;
   int timeout;
-  int val;
+  int val = -1;
 
   /* We're reading a new response.  Make sure we don't look at a
      previously cached response.  */
@@ -5295,57 +6410,87 @@ getpkt_sane (char **buf, long *sizeof_buf, int forever)
   strcpy (*buf, "timeout");
 
   if (forever)
-    {
-      timeout = watchdog > 0 ? watchdog : -1;
-    }
-
+    timeout = watchdog > 0 ? watchdog : -1;
+  else if (expecting_notif)
+    timeout = 0; /* There should already be a char in the buffer.  If
+                   not, bail out.  */
   else
     timeout = remote_timeout;
 
 #define MAX_TRIES 3
 
-  for (tries = 1; tries <= MAX_TRIES; tries++)
+  /* Process any number of notifications, and then return when
+     we get a packet.  */
+  for (;;)
     {
-      /* This can loop forever if the remote side sends us characters
-         continuously, but if it pauses, we'll get a zero from
-         readchar because of timeout.  Then we'll count that as a
-         retry.  */
-
-      /* Note that we will only wait forever prior to the start of a
-         packet.  After that, we expect characters to arrive at a
-         brisk pace.  They should show up within remote_timeout
-         intervals.  */
-
-      do
+      /* If we get a timeout or bad checksm, retry up to MAX_TRIES
+        times.  */
+      for (tries = 1; tries <= MAX_TRIES; tries++)
        {
-         c = readchar (timeout);
+         /* This can loop forever if the remote side sends us
+            characters continuously, but if it pauses, we'll get
+            SERIAL_TIMEOUT from readchar because of timeout.  Then
+            we'll count that as a retry.
+
+            Note that even when forever is set, we will only wait
+            forever prior to the start of a packet.  After that, we
+            expect characters to arrive at a brisk pace.  They should
+            show up within remote_timeout intervals.  */
+         do
+           c = readchar (timeout);
+         while (c != SERIAL_TIMEOUT && c != '$' && c != '%');
 
          if (c == SERIAL_TIMEOUT)
            {
+             if (expecting_notif)
+               return -1; /* Don't complain, it's normal to not get
+                             anything in this case.  */
+
              if (forever)      /* Watchdog went off?  Kill the target.  */
                {
                  QUIT;
-                 target_mourn_inferior ();
+                 pop_target ();
                  error (_("Watchdog timeout has expired.  Target detached."));
                }
              if (remote_debug)
                fputs_filtered ("Timed out.\n", gdb_stdlog);
-             goto retry;
            }
+         else
+           {
+             /* We've found the start of a packet or notification.
+                Now collect the data.  */
+             val = read_frame (buf, sizeof_buf);
+             if (val >= 0)
+               break;
+           }
+
+         serial_write (remote_desc, "-", 1);
        }
-      while (c != '$');
 
-      /* We've found the start of a packet, now collect the data.  */
+      if (tries > MAX_TRIES)
+       {
+         /* We have tried hard enough, and just can't receive the
+            packet/notification.  Give up.  */
+         printf_unfiltered (_("Ignoring packet error, continuing...\n"));
 
-      val = read_frame (buf, sizeof_buf);
+         /* Skip the ack char if we're in no-ack mode.  */
+         if (!rs->noack_mode)
+           serial_write (remote_desc, "+", 1);
+         return -1;
+       }
 
-      if (val >= 0)
+      /* If we got an ordinary packet, return that to our caller.  */
+      if (c == '$')
        {
          if (remote_debug)
            {
-             fprintf_unfiltered (gdb_stdlog, "Packet received: ");
-             fputstrn_unfiltered (*buf, val, 0, gdb_stdlog);
-             fprintf_unfiltered (gdb_stdlog, "\n");
+            struct cleanup *old_chain;
+            char *str;
+
+            str = escape_buffer (*buf, val);
+            old_chain = make_cleanup (xfree, str);
+            fprintf_unfiltered (gdb_stdlog, "Packet received: %s\n", str);
+            do_cleanups (old_chain);
            }
 
          /* Skip the ack char if we're in no-ack mode.  */
@@ -5354,31 +6499,51 @@ getpkt_sane (char **buf, long *sizeof_buf, int forever)
          return val;
        }
 
-      /* Try the whole thing again.  */
-    retry:
-      /* Skip the nack char if we're in no-ack mode.  */
-      if (!rs->noack_mode)
-       serial_write (remote_desc, "-", 1);
-    }
+       /* If we got a notification, handle it, and go back to looking
+        for a packet.  */
+      else
+       {
+         gdb_assert (c == '%');
 
-  /* We have tried hard enough, and just can't receive the packet.
-     Give up.  */
+         if (remote_debug)
+           {
+             struct cleanup *old_chain;
+             char *str;
+
+             str = escape_buffer (*buf, val);
+             old_chain = make_cleanup (xfree, str);
+             fprintf_unfiltered (gdb_stdlog,
+                                 "  Notification received: %s\n",
+                                 str);
+             do_cleanups (old_chain);
+           }
 
-  printf_unfiltered (_("Ignoring packet error, continuing...\n"));
+         handle_notification (*buf, val);
 
-  /* Skip the ack char if we're in no-ack mode.  */
-  if (!rs->noack_mode)
-    serial_write (remote_desc, "+", 1);
-  return -1;
+         /* Notifications require no acknowledgement.  */
+
+         if (expecting_notif)
+           return -1;
+       }
+    }
+}
+
+static int
+getpkt_sane (char **buf, long *sizeof_buf, int forever)
+{
+  return getpkt_or_notif_sane_1 (buf, sizeof_buf, forever, 0);
+}
+
+static int
+getpkt_or_notif_sane (char **buf, long *sizeof_buf, int forever)
+{
+  return getpkt_or_notif_sane_1 (buf, sizeof_buf, forever, 1);
 }
+
 \f
 static void
-remote_kill (void)
+remote_kill (struct target_ops *ops)
 {
-  /* Unregister the file descriptor from the event loop.  */
-  if (target_is_async_p ())
-    serial_async (remote_desc, NULL, 0);
-
   /* Use catch_errors so the user can quit from gdb even when we
      aren't on speaking terms with the remote system.  */
   catch_errors ((catch_errors_ftype *) putpkt, "k", "", RETURN_MASK_ERROR);
@@ -5409,7 +6574,7 @@ remote_vkill (int pid, struct remote_state *rs)
 }
 
 static void
-extended_remote_kill (void)
+extended_remote_kill (struct target_ops *ops)
 {
   int res;
   int pid = ptid_get_pid (inferior_ptid);
@@ -5436,39 +6601,23 @@ extended_remote_kill (void)
   if (res != 0)
     error (_("Can't kill process"));
 
-  delete_inferior (pid);
   target_mourn_inferior ();
 }
 
 static void
-remote_mourn (void)
+remote_mourn (struct target_ops *ops)
 {
-  remote_mourn_1 (&remote_ops);
+  remote_mourn_1 (ops);
 }
 
 /* Worker function for remote_mourn.  */
 static void
 remote_mourn_1 (struct target_ops *target)
 {
-  /* Get rid of all the inferiors and their threads we were
-     controlling.  */
-  discard_all_inferiors ();
-
   unpush_target (target);
-  generic_mourn_inferior ();
-}
 
-static int
-select_new_thread_callback (struct thread_info *th, void* data)
-{
-  if (!ptid_equal (th->ptid, minus_one_ptid))
-    {
-      switch_to_thread (th->ptid);
-      printf_filtered (_("[Switching to %s]\n"),
-                      target_pid_to_str (inferior_ptid));
-      return 1;
-    }
-  return 0;
+  /* remote_close takes care of doing most of the clean up.  */
+  generic_mourn_inferior ();
 }
 
 static void
@@ -5476,24 +6625,46 @@ extended_remote_mourn_1 (struct target_ops *target)
 {
   struct remote_state *rs = get_remote_state ();
 
+  /* In case we got here due to an error, but we're going to stay
+     connected.  */
+  rs->waiting_for_stop_reply = 0;
+
+  /* We're no longer interested in these events.  */
+  discard_pending_stop_replies (ptid_get_pid (inferior_ptid));
+
+  /* If the current general thread belonged to the process we just
+     detached from or has exited, the remote side current general
+     thread becomes undefined.  Considering a case like this:
+
+     - We just got here due to a detach.
+     - The process that we're detaching from happens to immediately
+       report a global breakpoint being hit in non-stop mode, in the
+       same thread we had selected before.
+     - GDB attaches to this process again.
+     - This event happens to be the next event we handle.
+
+     GDB would consider that the current general thread didn't need to
+     be set on the stub side (with Hg), since for all it knew,
+     GENERAL_THREAD hadn't changed.
+
+     Notice that although in all-stop mode, the remote server always
+     sets the current thread to the thread reporting the stop event,
+     that doesn't happen in non-stop mode; in non-stop, the stub *must
+     not* change the current thread when reporting a breakpoint hit,
+     due to the decoupling of event reporting and event handling.
+
+     To keep things simple, we always invalidate our notion of the
+     current thread.  */
+  record_currthread (minus_one_ptid);
+
   /* Unlike "target remote", we do not want to unpush the target; then
      the next time the user says "run", we won't be connected.  */
 
-  if (have_inferiors ())
-    {
-      extern void nullify_last_target_wait_ptid ();
-      /* Multi-process case.  The current process has exited, but
-        there are other processes to debug.  Switch to the first
-        available.  */
-      iterate_over_threads (select_new_thread_callback, NULL);
-      nullify_last_target_wait_ptid ();
-    }
-  else
-    {
-      struct remote_state *rs = get_remote_state ();
+  /* Call common code to mark the inferior as not running.     */
+  generic_mourn_inferior ();
 
-      /* Call common code to mark the inferior as not running. */
-      generic_mourn_inferior ();
+  if (!have_inferiors ())
+    {
       if (!remote_multi_process_p (rs))
        {
          /* Check whether the target is running now - some remote stubs
@@ -5508,30 +6679,20 @@ extended_remote_mourn_1 (struct target_ops *target)
                 so that the user can say "kill" again.  */
              inferior_ptid = magic_null_ptid;
            }
-         else
-           {
-             /* Mark this (still pushed) target as not executable until we
-                restart it.  */
-             target_mark_exited (target);
-           }
        }
-      else
-       /* Always remove execution if this was the last process.  */
-       target_mark_exited (target);
     }
 }
 
 static void
-extended_remote_mourn (void)
+extended_remote_mourn (struct target_ops *ops)
 {
-  extended_remote_mourn_1 (&extended_remote_ops);
+  extended_remote_mourn_1 (ops);
 }
 
 static int
 extended_remote_run (char *args)
 {
   struct remote_state *rs = get_remote_state ();
-  char *p;
   int len;
 
   /* If the user has disabled vRun support, or we have detected that
@@ -5546,13 +6707,14 @@ extended_remote_run (char *args)
     error (_("Remote file name too long for run packet"));
   len += 2 * bin2hex ((gdb_byte *) remote_exec_file, rs->buf + len, 0);
 
+  gdb_assert (args != NULL);
   if (*args)
     {
       struct cleanup *back_to;
       int i;
       char **argv;
 
-      argv = buildargv (args);
+      argv = gdb_buildargv (args);
       back_to = make_cleanup ((void (*) (void *)) freeargv, argv);
       for (i = 0; argv[i] != NULL; i++)
        {
@@ -5626,17 +6788,19 @@ extended_remote_create_inferior_1 (char *exec_file, char *args,
   /* Now mark the inferior as running before we do anything else.  */
   inferior_ptid = magic_null_ptid;
 
-  add_inferior (ptid_get_pid (inferior_ptid));
-  add_thread_silent (inferior_ptid);
+  /* Now, if we have thread information, update inferior_ptid.  */
+  inferior_ptid = remote_current_thread (inferior_ptid);
 
-  target_mark_running (&extended_remote_ops);
+  remote_add_inferior (ptid_get_pid (inferior_ptid), 0);
+  add_thread_silent (inferior_ptid);
 
   /* Get updated offsets, if the stub uses qOffsets.  */
   get_offsets ();
 }
 
 static void
-extended_remote_create_inferior (char *exec_file, char *args,
+extended_remote_create_inferior (struct target_ops *ops, 
+                                char *exec_file, char *args,
                                 char **env, int from_tty)
 {
   extended_remote_create_inferior_1 (exec_file, args, env, from_tty);
@@ -5648,7 +6812,8 @@ extended_remote_create_inferior (char *exec_file, char *args,
    which don't, we insert a traditional memory breakpoint.  */
 
 static int
-remote_insert_breakpoint (struct bp_target_info *bp_tgt)
+remote_insert_breakpoint (struct gdbarch *gdbarch,
+                         struct bp_target_info *bp_tgt)
 {
   /* Try the "Z" s/w breakpoint packet if it is not already disabled.
      If it succeeds, then set the support to PACKET_ENABLE.  If it
@@ -5662,7 +6827,7 @@ remote_insert_breakpoint (struct bp_target_info *bp_tgt)
       char *p;
       int bpsize;
 
-      gdbarch_breakpoint_from_pc (target_gdbarch, &addr, &bpsize);
+      gdbarch_breakpoint_from_pc (gdbarch, &addr, &bpsize);
 
       rs = get_remote_state ();
       p = rs->buf;
@@ -5690,15 +6855,15 @@ remote_insert_breakpoint (struct bp_target_info *bp_tgt)
        }
     }
 
-  return memory_insert_breakpoint (bp_tgt);
+  return memory_insert_breakpoint (gdbarch, bp_tgt);
 }
 
 static int
-remote_remove_breakpoint (struct bp_target_info *bp_tgt)
+remote_remove_breakpoint (struct gdbarch *gdbarch,
+                         struct bp_target_info *bp_tgt)
 {
   CORE_ADDR addr = bp_tgt->placed_address;
   struct remote_state *rs = get_remote_state ();
-  int bp_size;
 
   if (remote_protocol_packets[PACKET_Z0].support != PACKET_DISABLE)
     {
@@ -5718,7 +6883,7 @@ remote_remove_breakpoint (struct bp_target_info *bp_tgt)
       return (rs->buf[0] == 'E');
     }
 
-  return memory_remove_breakpoint (bp_tgt);
+  return memory_remove_breakpoint (gdbarch, bp_tgt);
 }
 
 static int
@@ -5854,7 +7019,8 @@ remote_stopped_data_address (struct target_ops *target, CORE_ADDR *addr_p)
 
 
 static int
-remote_insert_hw_breakpoint (struct bp_target_info *bp_tgt)
+remote_insert_hw_breakpoint (struct gdbarch *gdbarch,
+                            struct bp_target_info *bp_tgt)
 {
   CORE_ADDR addr;
   struct remote_state *rs;
@@ -5864,7 +7030,7 @@ remote_insert_hw_breakpoint (struct bp_target_info *bp_tgt)
      instruction, even though we aren't inserting one ourselves.  */
 
   gdbarch_breakpoint_from_pc
-    (target_gdbarch, &bp_tgt->placed_address, &bp_tgt->placed_size);
+    (gdbarch, &bp_tgt->placed_address, &bp_tgt->placed_size);
 
   if (remote_protocol_packets[PACKET_Z1].support == PACKET_DISABLE)
     return -1;
@@ -5897,7 +7063,8 @@ remote_insert_hw_breakpoint (struct bp_target_info *bp_tgt)
 
 
 static int
-remote_remove_hw_breakpoint (struct bp_target_info *bp_tgt)
+remote_remove_hw_breakpoint (struct gdbarch *gdbarch,
+                            struct bp_target_info *bp_tgt)
 {
   CORE_ADDR addr;
   struct remote_state *rs = get_remote_state ();
@@ -5929,23 +7096,6 @@ remote_remove_hw_breakpoint (struct bp_target_info *bp_tgt)
                  _("remote_remove_hw_breakpoint: reached end of function"));
 }
 
-/* Some targets are only capable of doing downloads, and afterwards
-   they switch to the remote serial protocol.  This function provides
-   a clean way to get from the download target to the remote target.
-   It's basically just a wrapper so that we don't have to expose any
-   of the internal workings of remote.c.
-
-   Prior to calling this routine, you should shutdown the current
-   target code, else you will get the "A program is being debugged
-   already..." message.  Usually a call to pop_target() suffices.  */
-
-void
-push_remote_target (char *name, int from_tty)
-{
-  printf_filtered (_("Switching to remote protocol\n"));
-  remote_open (name, from_tty);
-}
-
 /* Table used by the crc32 function to calcuate the checksum.  */
 
 static unsigned long crc32_table[256] =
@@ -5994,7 +7144,6 @@ compare_sections_command (char *args, int from_tty)
   struct remote_state *rs = get_remote_state ();
   asection *s;
   unsigned long host_crc, target_crc;
-  extern bfd *exec_bfd;
   struct cleanup *old_chain;
   char *tmp;
   char *sectdata;
@@ -6039,16 +7188,18 @@ compare_sections_command (char *args, int from_tty)
 
       getpkt (&rs->buf, &rs->buf_size, 0);
       if (rs->buf[0] == 'E')
-       error (_("target memory fault, section %s, range 0x%s -- 0x%s"),
-              sectname, paddr (lma), paddr (lma + size));
+       error (_("target memory fault, section %s, range %s -- %s"), sectname,
+              paddress (target_gdbarch, lma),
+              paddress (target_gdbarch, lma + size));
       if (rs->buf[0] != 'C')
        error (_("remote target does not support this operation"));
 
       for (target_crc = 0, tmp = &rs->buf[1]; *tmp; tmp++)
        target_crc = target_crc * 16 + fromhex (*tmp);
 
-      printf_filtered ("Section %s, range 0x%s -- 0x%s: ",
-                      sectname, paddr (lma), paddr (lma + size));
+      printf_filtered ("Section %s, range %s -- %s: ", sectname,
+                      paddress (target_gdbarch, lma),
+                      paddress (target_gdbarch, lma + size));
       if (host_crc == target_crc)
        printf_filtered ("matched.\n");
       else
@@ -6078,7 +7229,6 @@ remote_write_qxfer (struct target_ops *ops, const char *object_name,
 {
   int i, buf_len;
   ULONGEST n;
-  gdb_byte *wbuf;
   struct remote_state *rs = get_remote_state ();
   int max_size = get_memory_write_packet_size (); 
 
@@ -6123,7 +7273,6 @@ remote_read_qxfer (struct target_ops *ops, const char *object_name,
   static ULONGEST finished_offset;
 
   struct remote_state *rs = get_remote_state ();
-  unsigned int total = 0;
   LONGEST i, n, packet_len;
 
   if (packet->support == PACKET_DISABLE)
@@ -6241,6 +7390,19 @@ remote_xfer_partial (struct target_ops *ops, enum target_object object,
                                     [PACKET_qXfer_spu_write]);
     }
 
+  /* Handle extra signal info using qxfer packets.  */
+  if (object == TARGET_OBJECT_SIGNAL_INFO)
+    {
+      if (readbuf)
+       return remote_read_qxfer (ops, "siginfo", annex, readbuf, offset, len,
+                                 &remote_protocol_packets
+                                 [PACKET_qXfer_siginfo_read]);
+      else
+       return remote_write_qxfer (ops, "siginfo", annex, writebuf, offset, len,
+                                  &remote_protocol_packets
+                                  [PACKET_qXfer_siginfo_write]);
+    }
+
   /* Only handle flash writes.  */
   if (writebuf != NULL)
     {
@@ -6291,6 +7453,13 @@ remote_xfer_partial (struct target_ops *ops, enum target_object object,
       return remote_read_qxfer (ops, "memory-map", annex, readbuf, offset, len,
                                &remote_protocol_packets[PACKET_qXfer_memory_map]);
 
+    case TARGET_OBJECT_OSDATA:
+      /* Should only get here if we're connected.  */
+      gdb_assert (remote_desc);
+      return remote_read_qxfer
+       (ops, "osdata", annex, readbuf, offset, len,
+        &remote_protocol_packets[PACKET_qXfer_osdata]);
+
     default:
       return -1;
     }
@@ -6348,6 +7517,7 @@ remote_search_memory (struct target_ops* ops,
                      const gdb_byte *pattern, ULONGEST pattern_len,
                      CORE_ADDR *found_addrp)
 {
+  int addr_size = gdbarch_addr_bit (target_gdbarch) / 8;
   struct remote_state *rs = get_remote_state ();
   int max_size = get_memory_write_packet_size ();
   struct packet_config *packet =
@@ -6386,7 +7556,7 @@ remote_search_memory (struct target_ops* ops,
   /* Insert header.  */
   i = snprintf (rs->buf, max_size, 
                "qSearch:memory:%s;%s;",
-               paddr_nz (start_addr),
+               phex_nz (start_addr, addr_size),
                phex_nz (search_space_len, sizeof (search_space_len)));
   max_size -= (i + 1);
 
@@ -6678,38 +7848,52 @@ Fetch and print the remote list of thread identifiers, one pkt only"));
    buffer.  */
 
 static char *
-remote_pid_to_str (ptid_t ptid)
+remote_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
   static char buf[64];
   struct remote_state *rs = get_remote_state ();
 
-  if (ptid_equal (magic_null_ptid, ptid))
-    {
-      xsnprintf (buf, sizeof buf, "Thread <main>");
-      return buf;
-    }
-  else if (remote_multi_process_p (rs)
-          && ptid_get_tid (ptid) != 0 && ptid_get_pid (ptid) != 0)
+  if (ptid_is_pid (ptid))
     {
-      xsnprintf (buf, sizeof buf, "Thread %d.%ld",
-                ptid_get_pid (ptid), ptid_get_tid (ptid));
-      return buf;
+      /* Printing an inferior target id.  */
+
+      /* When multi-process extensions are off, there's no way in the
+        remote protocol to know the remote process id, if there's any
+        at all.  There's one exception --- when we're connected with
+        target extended-remote, and we manually attached to a process
+        with "attach PID".  We don't record anywhere a flag that
+        allows us to distinguish that case from the case of
+        connecting with extended-remote and the stub already being
+        attached to a process, and reporting yes to qAttached, hence
+        no smart special casing here.  */
+      if (!remote_multi_process_p (rs))
+       {
+         xsnprintf (buf, sizeof buf, "Remote target");
+         return buf;
+       }
+
+      return normal_pid_to_str (ptid);
     }
-  else if (ptid_get_tid (ptid) != 0)
+  else
     {
-      xsnprintf (buf, sizeof buf, "Thread %ld",
-                ptid_get_tid (ptid));
+      if (ptid_equal (magic_null_ptid, ptid))
+       xsnprintf (buf, sizeof buf, "Thread <main>");
+      else if (remote_multi_process_p (rs))
+       xsnprintf (buf, sizeof buf, "Thread %d.%ld",
+                  ptid_get_pid (ptid), ptid_get_tid (ptid));
+      else
+       xsnprintf (buf, sizeof buf, "Thread %ld",
+                  ptid_get_tid (ptid));
       return buf;
     }
-
-  return normal_pid_to_str (ptid);
 }
 
 /* Get the address of the thread local variable in OBJFILE which is
    stored at OFFSET within the thread local storage for thread PTID.  */
 
 static CORE_ADDR
-remote_get_thread_local_address (ptid_t ptid, CORE_ADDR lm, CORE_ADDR offset)
+remote_get_thread_local_address (struct target_ops *ops,
+                                ptid_t ptid, CORE_ADDR lm, CORE_ADDR offset)
 {
   if (remote_protocol_packets[PACKET_qGetTLSAddr].support != PACKET_DISABLE)
     {
@@ -6802,12 +7986,32 @@ register_remote_g_packet_guess (struct gdbarch *gdbarch, int bytes,
   VEC_safe_push (remote_g_packet_guess_s, data->guesses, &new_guess);
 }
 
+/* Return 1 if remote_read_description would do anything on this target
+   and architecture, 0 otherwise.  */
+
+static int
+remote_read_description_p (struct target_ops *target)
+{
+  struct remote_g_packet_data *data
+    = gdbarch_data (target_gdbarch, remote_g_packet_data_handle);
+
+  if (!VEC_empty (remote_g_packet_guess_s, data->guesses))
+    return 1;
+
+  return 0;
+}
+
 static const struct target_desc *
 remote_read_description (struct target_ops *target)
 {
   struct remote_g_packet_data *data
     = gdbarch_data (target_gdbarch, remote_g_packet_data_handle);
 
+  /* Do not try this during initial connection, when we do not know
+     whether there is a running but stopped thread.  */
+  if (!target_has_execution || ptid_equal (inferior_ptid, null_ptid))
+    return NULL;
+
   if (!VEC_empty (remote_g_packet_guess_s, data->guesses))
     {
       struct remote_g_packet_guess *guess;
@@ -7220,12 +8424,6 @@ remote_hostio_error (int errnum)
     error (_("Remote I/O error: %s"), safe_strerror (host_error));
 }
 
-static void
-fclose_cleanup (void *file)
-{
-  fclose (file);
-}
-
 static void
 remote_hostio_close_cleanup (void *opaque)
 {
@@ -7343,7 +8541,7 @@ remote_file_put (const char *local_file, const char *remote_file, int from_tty)
   file = fopen (local_file, "rb");
   if (file == NULL)
     perror_with_name (local_file);
-  back_to = make_cleanup (fclose_cleanup, file);
+  back_to = make_cleanup_fclose (file);
 
   fd = remote_hostio_open (remote_file, (FILEIO_O_WRONLY | FILEIO_O_CREAT
                                         | FILEIO_O_TRUNC),
@@ -7418,7 +8616,7 @@ void
 remote_file_get (const char *remote_file, const char *local_file, int from_tty)
 {
   struct cleanup *back_to, *close_cleanup;
-  int retcode, fd, remote_errno, bytes, io_size;
+  int fd, remote_errno, bytes, io_size;
   FILE *file;
   gdb_byte *buffer;
   ULONGEST offset;
@@ -7433,7 +8631,7 @@ remote_file_get (const char *remote_file, const char *local_file, int from_tty)
   file = fopen (local_file, "wb");
   if (file == NULL)
     perror_with_name (local_file);
-  back_to = make_cleanup (fclose_cleanup, file);
+  back_to = make_cleanup_fclose (file);
 
   /* Send up to this many bytes at once.  They won't all fit in the
      remote packet limit, so we'll transfer slightly fewer.  */
@@ -7491,9 +8689,10 @@ remote_put_command (char *args, int from_tty)
   struct cleanup *back_to;
   char **argv;
 
-  argv = buildargv (args);
-  if (argv == NULL)
-    nomem (0);
+  if (args == NULL)
+    error_no_arg (_("file to put"));
+
+  argv = gdb_buildargv (args);
   back_to = make_cleanup_freeargv (argv);
   if (argv[0] == NULL || argv[1] == NULL || argv[2] != NULL)
     error (_("Invalid parameters to remote put"));
@@ -7509,9 +8708,10 @@ remote_get_command (char *args, int from_tty)
   struct cleanup *back_to;
   char **argv;
 
-  argv = buildargv (args);
-  if (argv == NULL)
-    nomem (0);
+  if (args == NULL)
+    error_no_arg (_("file to get"));
+
+  argv = gdb_buildargv (args);
   back_to = make_cleanup_freeargv (argv);
   if (argv[0] == NULL || argv[1] == NULL || argv[2] != NULL)
     error (_("Invalid parameters to remote get"));
@@ -7527,9 +8727,10 @@ remote_delete_command (char *args, int from_tty)
   struct cleanup *back_to;
   char **argv;
 
-  argv = buildargv (args);
-  if (argv == NULL)
-    nomem (0);
+  if (args == NULL)
+    error_no_arg (_("file to delete"));
+
+  argv = gdb_buildargv (args);
   back_to = make_cleanup_freeargv (argv);
   if (argv[0] == NULL || argv[1] != NULL)
     error (_("Invalid parameters to remote delete"));
@@ -7545,6 +8746,36 @@ remote_command (char *args, int from_tty)
   help_list (remote_cmdlist, "remote ", -1, gdb_stdout);
 }
 
+static int
+remote_can_execute_reverse (void)
+{
+  if (remote_protocol_packets[PACKET_bs].support == PACKET_ENABLE
+      || remote_protocol_packets[PACKET_bc].support == PACKET_ENABLE)
+    return 1;
+  else
+    return 0;
+}
+
+static int
+remote_supports_non_stop (void)
+{
+  return 1;
+}
+
+static int
+remote_supports_multi_process (void)
+{
+  struct remote_state *rs = get_remote_state ();
+  return remote_multi_process_p (rs);
+}
+
+int
+remote_supports_cond_tracepoints (void)
+{
+  struct remote_state *rs = get_remote_state ();
+  return rs->cond_tracepoints;
+}
+
 static void
 init_remote_ops (void)
 {
@@ -7587,12 +8818,13 @@ Specify the serial device it is connected to\n\
   remote_ops.to_log_command = serial_log_command;
   remote_ops.to_get_thread_local_address = remote_get_thread_local_address;
   remote_ops.to_stratum = process_stratum;
-  remote_ops.to_has_all_memory = 1;
-  remote_ops.to_has_memory = 1;
-  remote_ops.to_has_stack = 1;
-  remote_ops.to_has_registers = 1;
-  remote_ops.to_has_execution = 1;
+  remote_ops.to_has_all_memory = default_child_has_all_memory;
+  remote_ops.to_has_memory = default_child_has_memory;
+  remote_ops.to_has_stack = default_child_has_stack;
+  remote_ops.to_has_registers = default_child_has_registers;
+  remote_ops.to_has_execution = default_child_has_execution;
   remote_ops.to_has_thread_control = tc_schedlock;     /* can lock scheduler */
+  remote_ops.to_can_execute_reverse = remote_can_execute_reverse;
   remote_ops.to_magic = OPS_MAGIC;
   remote_ops.to_memory_map = remote_memory_map;
   remote_ops.to_flash_erase = remote_flash_erase;
@@ -7605,6 +8837,8 @@ Specify the serial device it is connected to\n\
   remote_ops.to_async_mask = remote_async_mask;
   remote_ops.to_terminal_inferior = remote_terminal_inferior;
   remote_ops.to_terminal_ours = remote_terminal_ours;
+  remote_ops.to_supports_non_stop = remote_supports_non_stop;
+  remote_ops.to_supports_multi_process = remote_supports_multi_process;
 }
 
 /* Set up the extended remote vector by making a copy of the standard
@@ -7668,6 +8902,18 @@ remote_async_serial_handler (struct serial *scb, void *context)
   async_client_callback (INF_REG_EVENT, async_client_context);
 }
 
+static void
+remote_async_inferior_event_handler (gdb_client_data data)
+{
+  inferior_event_handler (INF_REG_EVENT, NULL);
+}
+
+static void
+remote_async_get_pending_events_handler (gdb_client_data data)
+{
+  remote_get_pending_stop_replies ();
+}
+
 static void
 remote_async (void (*callback) (enum inferior_event_type event_type,
                                void *context), void *context)
@@ -7924,10 +9170,25 @@ Show the maximum size of the address (in bits) in a memory packet."), NULL,
   add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_spu_write],
                          "qXfer:spu:write", "write-spu-object", 0);
 
+  add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_osdata],
+                        "qXfer:osdata:read", "osdata", 0);
+
+  add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_siginfo_read],
+                         "qXfer:siginfo:read", "read-siginfo-object", 0);
+
+  add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_siginfo_write],
+                         "qXfer:siginfo:write", "write-siginfo-object", 0);
+
   add_packet_config_cmd (&remote_protocol_packets[PACKET_qGetTLSAddr],
                         "qGetTLSAddr", "get-thread-local-storage-address",
                         0);
 
+  add_packet_config_cmd (&remote_protocol_packets[PACKET_bc],
+                        "bc", "reverse-continue", 0);
+
+  add_packet_config_cmd (&remote_protocol_packets[PACKET_bs],
+                        "bs", "reverse-step", 0);
+
   add_packet_config_cmd (&remote_protocol_packets[PACKET_qSupported],
                         "qSupported", "supported-packets", 0);
 
@@ -7961,6 +9222,12 @@ Show the maximum size of the address (in bits) in a memory packet."), NULL,
   add_packet_config_cmd (&remote_protocol_packets[PACKET_vKill],
                         "vKill", "kill", 0);
 
+  add_packet_config_cmd (&remote_protocol_packets[PACKET_qAttached],
+                        "qAttached", "query-attached", 0);
+
+  add_packet_config_cmd (&remote_protocol_packets[PACKET_ConditionalTracepoints],
+                        "ConditionalTracepoints", "conditional-tracepoints", 0);
+
   /* Keep the old ``set remote Z-packet ...'' working.  Each individual
      Z sub-packet has its own set and show commands, but users may
      have sets to this variable in their .gdbinit files (or in their
This page took 0.065073 seconds and 4 git commands to generate.