Add missing support for -o option.
[deliverable/binutils-gdb.git] / gdb / remote.c
index 54d3b2c5cf17ef4eeb3e3b5ad842f4e6d4f1e791..86ba3c1eb14d47e793dcaff50d63f33f2adeef4c 100644 (file)
@@ -1,5 +1,6 @@
 /* Remote target communications for serial-line targets in custom GDB protocol
-   Copyright 1988, 1991-2000 Free Software Foundation, Inc.
+   Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
+   1998, 1999, 2000, 2001 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #include "gdb_string.h"
 #include <ctype.h>
 #include <fcntl.h>
-#include "frame.h"
 #include "inferior.h"
 #include "bfd.h"
 #include "symfile.h"
 #include "target.h"
-#include "gdb_wait.h"
 /*#include "terminal.h" */
 #include "gdbcmd.h"
 #include "objfiles.h"
 #include "gdb-stabs.h"
 #include "gdbthread.h"
 #include "remote.h"
-
-#include "dcache.h"
+#include "regcache.h"
 
 #include <ctype.h>
 #include <sys/time.h>
 #include <signal.h>
 #include "serial.h"
 
+#include "gdbcore.h" /* for exec_bfd */
+
 /* Prototypes for local functions */
 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 void handle_remote_sigint PARAMS ((int));
-static void handle_remote_sigint_twice PARAMS ((int));
-static void async_remote_interrupt PARAMS ((gdb_client_data));
-void async_remote_interrupt_twice PARAMS ((gdb_client_data));
+static void handle_remote_sigint (int);
+static void handle_remote_sigint_twice (int);
+static void async_remote_interrupt (gdb_client_data);
+void async_remote_interrupt_twice (gdb_client_data);
 
-static void build_remote_gdbarch_data PARAMS ((void));
+static void build_remote_gdbarch_data (void);
 
 static int remote_write_bytes (CORE_ADDR memaddr, char *myaddr, int len);
 
-static int remote_read_bytes PARAMS ((CORE_ADDR memaddr,
-                                     char *myaddr, int len));
+static int remote_read_bytes (CORE_ADDR memaddr, char *myaddr, int len);
 
-static void remote_files_info PARAMS ((struct target_ops * ignore));
+static void remote_files_info (struct target_ops *ignore);
 
-static int remote_xfer_memory PARAMS ((CORE_ADDR memaddr, char *myaddr,
-                                      int len, int should_write,
-                                      struct target_ops * target));
+static int remote_xfer_memory (CORE_ADDR memaddr, char *myaddr,
+                              int len, int should_write,
+                              struct mem_attrib *attrib,
+                              struct target_ops *target);
 
-static void remote_prepare_to_store PARAMS ((void));
+static void remote_prepare_to_store (void);
 
-static void remote_fetch_registers PARAMS ((int regno));
+static void remote_fetch_registers (int regno);
 
-static void remote_resume PARAMS ((int pid, int step,
-                                  enum target_signal siggnal));
-static void remote_async_resume PARAMS ((int pid, int step,
-                                        enum target_signal siggnal));
-static int remote_start_remote PARAMS ((PTR));
+static void remote_resume (ptid_t ptid, int step,
+                           enum target_signal siggnal);
+static void remote_async_resume (ptid_t ptid, int step,
+                                enum target_signal siggnal);
+static int remote_start_remote (PTR);
 
-static void remote_open PARAMS ((char *name, int from_tty));
-static void remote_async_open PARAMS ((char *name, int from_tty));
+static void remote_open (char *name, int from_tty);
+static void remote_async_open (char *name, int from_tty);
 
-static void extended_remote_open PARAMS ((char *name, int from_tty));
-static void extended_remote_async_open PARAMS ((char *name, int from_tty));
+static void extended_remote_open (char *name, int from_tty);
+static void extended_remote_async_open (char *name, int from_tty);
 
-static void remote_open_1 PARAMS ((char *, int, struct target_ops *,
-                                  int extended_p));
-static void remote_async_open_1 PARAMS ((char *, int, struct target_ops *,
-                                        int extended_p));
+static void remote_open_1 (char *, int, struct target_ops *, int extended_p);
+static void remote_async_open_1 (char *, int, struct target_ops *,
+                                int extended_p);
 
-static void remote_close PARAMS ((int quitting));
+static void remote_close (int quitting);
 
-static void remote_store_registers PARAMS ((int regno));
+static void remote_store_registers (int regno);
 
-static void remote_mourn PARAMS ((void));
-static void remote_async_mourn PARAMS ((void));
+static void remote_mourn (void);
+static void remote_async_mourn (void);
 
-static void extended_remote_restart PARAMS ((void));
+static void extended_remote_restart (void);
 
-static void extended_remote_mourn PARAMS ((void));
+static void extended_remote_mourn (void);
 
-static void extended_remote_create_inferior PARAMS ((char *, char *, char **));
-static void extended_remote_async_create_inferior PARAMS ((char *, char *, char **));
+static void extended_remote_create_inferior (char *, char *, char **);
+static void extended_remote_async_create_inferior (char *, char *, char **);
 
-static void remote_mourn_1 PARAMS ((struct target_ops *));
+static void remote_mourn_1 (struct target_ops *);
 
 static void remote_send (char *buf, long sizeof_buf);
 
-static int readchar PARAMS ((int timeout));
+static int readchar (int timeout);
 
-static int remote_wait PARAMS ((int pid, struct target_waitstatus * status));
-static int remote_async_wait PARAMS ((int pid, struct target_waitstatus * status));
+static ptid_t remote_wait (ptid_t ptid,
+                                 struct target_waitstatus *status);
+static ptid_t remote_async_wait (ptid_t ptid,
+                                       struct target_waitstatus *status);
 
-static void remote_kill PARAMS ((void));
-static void remote_async_kill PARAMS ((void));
+static void remote_kill (void);
+static void remote_async_kill (void);
 
-static int tohex PARAMS ((int nib));
+static int tohex (int nib);
 
-static void remote_detach PARAMS ((char *args, int from_tty));
-static void remote_async_detach PARAMS ((char *args, int from_tty));
+static void remote_detach (char *args, int from_tty);
+static void remote_async_detach (char *args, int from_tty);
 
-static void remote_interrupt PARAMS ((int signo));
+static void remote_interrupt (int signo);
 
-static void remote_interrupt_twice PARAMS ((int signo));
+static void remote_interrupt_twice (int signo);
 
-static void interrupt_query PARAMS ((void));
+static void interrupt_query (void);
 
-static void set_thread PARAMS ((int, int));
+static void set_thread (int, int);
 
-static int remote_thread_alive PARAMS ((int));
+static int remote_thread_alive (ptid_t);
 
-static void get_offsets PARAMS ((void));
+static void get_offsets (void);
 
 static long read_frame (char *buf, long sizeof_buf);
 
-static int remote_insert_breakpoint PARAMS ((CORE_ADDR, char *));
+static int remote_insert_breakpoint (CORE_ADDR, char *);
 
-static int remote_remove_breakpoint PARAMS ((CORE_ADDR, char *));
+static int remote_remove_breakpoint (CORE_ADDR, char *);
 
-static int hexnumlen PARAMS ((ULONGEST num));
+static int hexnumlen (ULONGEST num);
 
-static void init_remote_ops PARAMS ((void));
+static void init_remote_ops (void);
 
-static void init_extended_remote_ops PARAMS ((void));
+static void init_extended_remote_ops (void);
 
-static void init_remote_cisco_ops PARAMS ((void));
+static void init_remote_cisco_ops (void);
 
 static struct target_ops remote_cisco_ops;
 
-static void remote_stop PARAMS ((void));
-
-static int ishex PARAMS ((int ch, int *val));
-
-static int stubhex PARAMS ((int ch));
-
-static int remote_query PARAMS ((int /*char */ , char *, char *, int *));
-
-static int hexnumstr PARAMS ((char *, ULONGEST));
+static void remote_stop (void);
 
-static int hexnumnstr PARAMS ((char *, ULONGEST, int));
+static int ishex (int ch, int *val);
 
-static CORE_ADDR remote_address_masked PARAMS ((CORE_ADDR));
+static int stubhex (int ch);
 
-static void print_packet PARAMS ((char *));
+static int remote_query (int /*char */ , char *, char *, int *);
 
-static unsigned long crc32 PARAMS ((unsigned char *, int, unsigned int));
+static int hexnumstr (char *, ULONGEST);
 
-static void compare_sections_command PARAMS ((char *, int));
+static int hexnumnstr (char *, ULONGEST, int);
 
-static void packet_command PARAMS ((char *, int));
+static CORE_ADDR remote_address_masked (CORE_ADDR);
 
-static int stub_unpack_int PARAMS ((char *buff, int fieldlength));
+static void print_packet (char *);
 
-static int remote_current_thread PARAMS ((int oldpid));
+static unsigned long crc32 (unsigned char *, int, unsigned int);
 
-static void remote_find_new_threads PARAMS ((void));
+static void compare_sections_command (char *, int);
 
-static void record_currthread PARAMS ((int currthread));
+static void packet_command (char *, int);
 
-/* exported functions */
+static int stub_unpack_int (char *buff, int fieldlength);
 
-extern int fromhex PARAMS ((int a));
+static ptid_t remote_current_thread (ptid_t oldptid);
 
-static int putpkt_binary PARAMS ((char *buf, int cnt));
+static void remote_find_new_threads (void);
 
-static void check_binary_download PARAMS ((CORE_ADDR addr));
+static void record_currthread (int currthread);
 
-struct packet_config;
-
-static void show_packet_config_cmd PARAMS ((struct packet_config * config));
-
-static void set_packet_config_cmd PARAMS ((struct packet_config * config,
-                                             struct cmd_list_element * c));
+static int fromhex (int a);
 
-static void add_packet_config_cmd PARAMS ((struct packet_config * config,
-                                          char *name,
-                                          char *title,
-   void (*set_func) (char *args, int from_tty, struct cmd_list_element * c),
-                              void (*show_func) (char *name, int from_tty),
-                                          struct cmd_list_element **setlist,
-                                          struct cmd_list_element **showlist));
+static int hex2bin (const char *hex, char *bin, int count);
 
-static void init_packet_config PARAMS ((struct packet_config * config));
+static int bin2hex (const char *bin, char *hex, int count);
 
-static void set_remote_protocol_P_packet_cmd PARAMS ((char *args,
-                                                     int from_tty,
-                                             struct cmd_list_element * c));
+static int putpkt_binary (char *buf, int cnt);
 
-static void show_remote_protocol_P_packet_cmd PARAMS ((char *args,
-                                                      int from_tty));
-
-static void set_remote_protocol_Z_packet_cmd PARAMS ((char *args,
-                                                     int from_tty,
-                                             struct cmd_list_element * c));
-
-static void show_remote_protocol_Z_packet_cmd PARAMS ((char *args,
-                                                      int from_tty));
+static void check_binary_download (CORE_ADDR addr);
 
+struct packet_config;
 
+static void show_packet_config_cmd (struct packet_config *config);
 
+static void update_packet_config (struct packet_config *config);
 
 /* Define the target subroutine names */
 
-void open_remote_target PARAMS ((char *, int, struct target_ops *, int));
+void open_remote_target (char *, int, struct target_ops *, int);
 
-void _initialize_remote PARAMS ((void));
+void _initialize_remote (void);
 
 /* */
 
@@ -520,59 +495,43 @@ enum packet_support
     PACKET_DISABLE
   };
 
-enum packet_detect
-  {
-    PACKET_AUTO_DETECT = 0,
-    PACKET_MANUAL_DETECT
-  };
-
 struct packet_config
   {
-    char *state;
     char *name;
     char *title;
-    enum packet_detect detect;
+    enum cmd_auto_boolean detect;
     enum packet_support support;
   };
 
-static char packet_support_auto[] = "auto";
-static char packet_enable[] = "enable";
-static char packet_disable[] = "disable";
-static char *packet_support_enums[] =
+/* Analyze a packet's return value and update the packet config
+   accordingly. */
+
+enum packet_result
 {
-  packet_support_auto,
-  packet_enable,
-  packet_disable,
-  0,
+  PACKET_ERROR,
+  PACKET_OK,
+  PACKET_UNKNOWN
 };
 
 static void
-set_packet_config_cmd (config, c)
-     struct packet_config *config;
-     struct cmd_list_element *c;
+update_packet_config (struct packet_config *config)
 {
-  if (config->state == packet_enable)
+  switch (config->detect)
     {
-      config->detect = PACKET_MANUAL_DETECT;
+    case CMD_AUTO_BOOLEAN_TRUE:
       config->support = PACKET_ENABLE;
-    }
-  else if (config->state == packet_disable)
-    {
-      config->detect = PACKET_MANUAL_DETECT;
+      break;
+    case CMD_AUTO_BOOLEAN_FALSE:
       config->support = PACKET_DISABLE;
-    }
-  else if (config->state == packet_support_auto)
-    {
-      config->detect = PACKET_AUTO_DETECT;
+      break;
+    case CMD_AUTO_BOOLEAN_AUTO:
       config->support = PACKET_SUPPORT_UNKNOWN;
+      break;
     }
-  else
-    internal_error ("Bad enum value");
 }
 
 static void
-show_packet_config_cmd (config)
-     struct packet_config *config;
+show_packet_config_cmd (struct packet_config *config)
 {
   char *support = "internal-error";
   switch (config->support)
@@ -589,102 +548,302 @@ show_packet_config_cmd (config)
     }
   switch (config->detect)
     {
-    case PACKET_AUTO_DETECT:
+    case CMD_AUTO_BOOLEAN_AUTO:
       printf_filtered ("Support for remote protocol `%s' (%s) packet is auto-detected, currently %s.\n",
                       config->name, config->title, support);
       break;
-    case PACKET_MANUAL_DETECT:
-      printf_filtered ("Support for remote protocol `%s' (%s) is currently %s.\n",
+    case CMD_AUTO_BOOLEAN_TRUE:
+    case CMD_AUTO_BOOLEAN_FALSE:
+      printf_filtered ("Support for remote protocol `%s' (%s) packet is currently %s.\n",
                       config->name, config->title, support);
+      break;
     }
 }
 
 static void
-add_packet_config_cmd (config, name, title, set_func, show_func,
-                      setlist, showlist)
-     struct packet_config *config;
-     char *name;
-     char *title;
-     void (*set_func) PARAMS ((char *args, int from_tty,
-                              struct cmd_list_element * c));
-     void (*show_func) PARAMS ((char *name, int from_tty));
-     struct cmd_list_element **setlist;
-     struct cmd_list_element **showlist;
-{
-  struct cmd_list_element *c;
+add_packet_config_cmd (struct packet_config *config,
+                      char *name,
+                      char *title,
+                      void (*set_func) (char *args, int from_tty,
+                                        struct cmd_list_element *
+                                        c),
+                      void (*show_func) (char *name,
+                                         int from_tty),
+                      struct cmd_list_element **set_remote_list,
+                      struct cmd_list_element **show_remote_list,
+                      int legacy)
+{
+  struct cmd_list_element *set_cmd;
+  struct cmd_list_element *show_cmd;
   char *set_doc;
   char *show_doc;
-  char *full_name;
+  char *cmd_name;
   config->name = name;
   config->title = title;
-  asprintf (&set_doc, "Set use of remote protocol `%s' (%s) packet",
-           name, title);
-  asprintf (&show_doc, "Show current use of remote protocol `%s' (%s) packet",
-           name, title);
-  asprintf (&full_name, "%s-packet", name);
-  c = add_set_enum_cmd (full_name,
-                       class_obscure, packet_support_enums,
-                       (char *) &config->state,
-                       set_doc, setlist);
-  c->function.sfunc = set_func;
-  add_cmd (full_name, class_obscure, show_func, show_doc, showlist);
+  config->detect = CMD_AUTO_BOOLEAN_AUTO;
+  config->support = PACKET_SUPPORT_UNKNOWN;
+  xasprintf (&set_doc, "Set use of remote protocol `%s' (%s) packet",
+            name, title);
+  xasprintf (&show_doc, "Show current use of remote protocol `%s' (%s) packet",
+            name, title);
+  /* set/show TITLE-packet {auto,on,off} */
+  xasprintf (&cmd_name, "%s-packet", title);
+  set_cmd = add_set_auto_boolean_cmd (cmd_name, class_obscure,
+                               &config->detect, set_doc,
+                               set_remote_list);
+  set_cmd->function.sfunc = set_func;
+  show_cmd = add_cmd (cmd_name, class_obscure, show_func, show_doc,
+                     show_remote_list);
+  /* set/show remote NAME-packet {auto,on,off} -- legacy */
+  if (legacy)
+    {
+      char *legacy_name;
+      xasprintf (&legacy_name, "%s-packet", name);
+      add_alias_cmd (legacy_name, cmd_name, class_obscure, 0,
+                    set_remote_list);
+      add_alias_cmd (legacy_name, cmd_name, class_obscure, 0,
+                    show_remote_list);
+    }
 }
 
-static void
-init_packet_config (config)
-     struct packet_config *config;
+static enum packet_result
+packet_ok (const char *buf, struct packet_config *config)
 {
-  switch (config->detect)
+  if (buf[0] != '\0')
     {
-    case PACKET_AUTO_DETECT:
-      config->support = PACKET_SUPPORT_UNKNOWN;
-      break;
-    case PACKET_MANUAL_DETECT:
-      /* let the user beware */
-      break;
+      /* The stub recognized the packet request.  Check that the
+        operation succeeded. */
+      switch (config->support)
+       {
+       case PACKET_SUPPORT_UNKNOWN:
+         if (remote_debug)
+           fprintf_unfiltered (gdb_stdlog,
+                                   "Packet %s (%s) is supported\n",
+                                   config->name, config->title);
+         config->support = PACKET_ENABLE;
+         break;
+       case PACKET_DISABLE:
+         internal_error (__FILE__, __LINE__,
+                         "packet_ok: attempt to use a disabled packet");
+         break;
+       case PACKET_ENABLE:
+         break;
+       }
+      if (buf[0] == 'O' && buf[1] == 'K' && buf[2] == '\0')
+       /* "OK" - definitly OK. */
+       return PACKET_OK;
+      if (buf[0] == 'E'
+         && isxdigit (buf[1]) && isxdigit (buf[2])
+         && buf[3] == '\0')
+       /* "Enn"  - definitly an error. */
+       return PACKET_ERROR;
+      /* The packet may or may not be OK.  Just assume it is */
+      return PACKET_OK;
+    }
+  else
+    {
+      /* The stub does not support the packet. */
+      switch (config->support)
+       {
+       case PACKET_ENABLE:
+         if (config->detect == CMD_AUTO_BOOLEAN_AUTO)
+           /* If the stub previously indicated that the packet was
+              supported then there is a protocol error.. */
+           error ("Protocol error: %s (%s) conflicting enabled responses.",
+                  config->name, config->title);
+         else
+           /* The user set it wrong. */
+           error ("Enabled packet %s (%s) not recognized by stub",
+                  config->name, config->title);
+         break;
+       case PACKET_SUPPORT_UNKNOWN:
+         if (remote_debug)
+           fprintf_unfiltered (gdb_stdlog,
+                               "Packet %s (%s) is NOT supported\n",
+                               config->name, config->title);
+         config->support = PACKET_DISABLE;
+         break;
+       case PACKET_DISABLE:
+         break;
+       }
+      return PACKET_UNKNOWN;
     }
 }
 
+/* Should we try the 'qSymbol' (target symbol lookup service) request? */
+static struct packet_config remote_protocol_qSymbol;
+
+static void
+set_remote_protocol_qSymbol_packet_cmd (char *args, int from_tty,
+                                 struct cmd_list_element *c)
+{
+  update_packet_config (&remote_protocol_qSymbol);
+}
+
+static void
+show_remote_protocol_qSymbol_packet_cmd (char *args, int from_tty)
+{
+  show_packet_config_cmd (&remote_protocol_qSymbol);
+}
+
+/* Should we try the 'e' (step over range) request? */
+static struct packet_config remote_protocol_e;
+
+static void
+set_remote_protocol_e_packet_cmd (char *args, int from_tty,
+                                 struct cmd_list_element *c)
+{
+  update_packet_config (&remote_protocol_e);
+}
+
+static void
+show_remote_protocol_e_packet_cmd (char *args, int from_tty)
+{
+  show_packet_config_cmd (&remote_protocol_e);
+}
+  
+
+/* Should we try the 'E' (step over range / w signal #) request? */
+static struct packet_config remote_protocol_E;
+
+static void
+set_remote_protocol_E_packet_cmd (char *args, int from_tty,
+                                 struct cmd_list_element *c)
+{
+  update_packet_config (&remote_protocol_E);
+}
+
+static void
+show_remote_protocol_E_packet_cmd (char *args, int from_tty)
+{
+  show_packet_config_cmd (&remote_protocol_E);
+}
+  
+
 /* Should we try the 'P' (set register) request?  */
 
 static struct packet_config remote_protocol_P;
 
 static void
-set_remote_protocol_P_packet_cmd (args, from_tty, c)
-     char *args;
-     int from_tty;
-     struct cmd_list_element *c;
+set_remote_protocol_P_packet_cmd (char *args, int from_tty,
+                                 struct cmd_list_element *c)
 {
-  set_packet_config_cmd (&remote_protocol_P, c);
+  update_packet_config (&remote_protocol_P);
 }
 
 static void
-show_remote_protocol_P_packet_cmd (args, from_tty)
-     char *args;
-     int from_tty;
+show_remote_protocol_P_packet_cmd (char *args, int from_tty)
 {
   show_packet_config_cmd (&remote_protocol_P);
 }
 
-/* Should we try the 'Z' (set breakpoint) request?  */
+/* Should we try one of the 'Z' requests?  */
+
+enum Z_packet_type
+{
+  Z_PACKET_SOFTWARE_BP,
+  Z_PACKET_HARDWARE_BP,
+  Z_PACKET_WRITE_WP,
+  Z_PACKET_READ_WP,
+  Z_PACKET_ACCESS_WP,
+  NR_Z_PACKET_TYPES
+};
+
+static struct packet_config remote_protocol_Z[NR_Z_PACKET_TYPES];
+
+/* FIXME: Instead of having all these boiler plate functions, the
+   command callback should include a context argument. */
+
+static void
+set_remote_protocol_Z_software_bp_packet_cmd (char *args, int from_tty,
+                                             struct cmd_list_element *c)
+{
+  update_packet_config (&remote_protocol_Z[Z_PACKET_SOFTWARE_BP]);
+}
+
+static void
+show_remote_protocol_Z_software_bp_packet_cmd (char *args, int from_tty)
+{
+  show_packet_config_cmd (&remote_protocol_Z[Z_PACKET_SOFTWARE_BP]);
+}
 
-static struct packet_config remote_protocol_Z;
+static void
+set_remote_protocol_Z_hardware_bp_packet_cmd (char *args, int from_tty,
+                                             struct cmd_list_element *c)
+{
+  update_packet_config (&remote_protocol_Z[Z_PACKET_HARDWARE_BP]);
+}
 
 static void
-set_remote_protocol_Z_packet_cmd (args, from_tty, c)
-     char *args;
-     int from_tty;
-     struct cmd_list_element *c;
+show_remote_protocol_Z_hardware_bp_packet_cmd (char *args, int from_tty)
 {
-  set_packet_config_cmd (&remote_protocol_Z, c);
+  show_packet_config_cmd (&remote_protocol_Z[Z_PACKET_HARDWARE_BP]);
 }
 
 static void
-show_remote_protocol_Z_packet_cmd (args, from_tty)
-     char *args;
-     int from_tty;
+set_remote_protocol_Z_write_wp_packet_cmd (char *args, int from_tty,
+                                             struct cmd_list_element *c)
 {
-  show_packet_config_cmd (&remote_protocol_Z);
+  update_packet_config (&remote_protocol_Z[Z_PACKET_WRITE_WP]);
+}
+
+static void
+show_remote_protocol_Z_write_wp_packet_cmd (char *args, int from_tty)
+{
+  show_packet_config_cmd (&remote_protocol_Z[Z_PACKET_WRITE_WP]);
+}
+
+static void
+set_remote_protocol_Z_read_wp_packet_cmd (char *args, int from_tty,
+                                             struct cmd_list_element *c)
+{
+  update_packet_config (&remote_protocol_Z[Z_PACKET_READ_WP]);
+}
+
+static void
+show_remote_protocol_Z_read_wp_packet_cmd (char *args, int from_tty)
+{
+  show_packet_config_cmd (&remote_protocol_Z[Z_PACKET_READ_WP]);
+}
+
+static void
+set_remote_protocol_Z_access_wp_packet_cmd (char *args, int from_tty,
+                                             struct cmd_list_element *c)
+{
+  update_packet_config (&remote_protocol_Z[Z_PACKET_ACCESS_WP]);
+}
+
+static void
+show_remote_protocol_Z_access_wp_packet_cmd (char *args, int from_tty)
+{
+  show_packet_config_cmd (&remote_protocol_Z[Z_PACKET_ACCESS_WP]);
+}
+
+/* For compatibility with older distributions.  Provide a ``set remote
+   Z-packet ...'' command that updates all the Z packet types. */
+
+static enum cmd_auto_boolean remote_Z_packet_detect;
+
+static void
+set_remote_protocol_Z_packet_cmd (char *args, int from_tty,
+                                 struct cmd_list_element *c)
+{
+  int i;
+  for (i = 0; i < NR_Z_PACKET_TYPES; i++)
+    {
+      remote_protocol_Z[i].detect = remote_Z_packet_detect;
+      update_packet_config (&remote_protocol_Z[i]);
+    }
+}
+
+static void
+show_remote_protocol_Z_packet_cmd (char *args, int from_tty)
+{
+  int i;
+  for (i = 0; i < NR_Z_PACKET_TYPES; i++)
+    {
+      show_packet_config_cmd (&remote_protocol_Z[i]);
+    }
 }
 
 /* Should we try the 'X' (remote binary download) packet?
@@ -715,7 +874,7 @@ set_remote_protocol_binary_download_cmd (char *args,
                                         int from_tty,
                                         struct cmd_list_element *c)
 {
-  set_packet_config_cmd (&remote_protocol_binary_download, c);
+  update_packet_config (&remote_protocol_binary_download);
 }
 
 static void
@@ -733,8 +892,8 @@ PTR sigint_remote_token;
 /* These are pointers to hook functions that may be set in order to
    modify resume/wait behavior for a particular architecture.  */
 
-void (*target_resume_hook) PARAMS ((void));
-void (*target_wait_loop_hook) PARAMS ((void));
+void (*target_resume_hook) (void);
+void (*target_wait_loop_hook) (void);
 \f
 
 
@@ -750,22 +909,22 @@ static int continue_thread;
  */
 
 static void
-record_currthread (currthread)
-     int currthread;
+record_currthread (int currthread)
 {
   general_thread = currthread;
 
   /* 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.  */
-  if (!in_thread_list (currthread))
+  if (!in_thread_list (pid_to_ptid (currthread)))
     {
-      add_thread (currthread);
+      add_thread (pid_to_ptid (currthread));
 #ifdef UI_OUT
       ui_out_text (uiout, "[New ");
-      ui_out_text (uiout, target_pid_to_str (currthread));
+      ui_out_text (uiout, target_pid_to_str (pid_to_ptid (currthread)));
       ui_out_text (uiout, "]\n");
 #else
-      printf_filtered ("[New %s]\n", target_pid_to_str (currthread));
+      printf_filtered ("[New %s]\n",
+                       target_pid_to_str (pid_to_ptid (currthread)));
 #endif
     }
 }
@@ -773,9 +932,7 @@ record_currthread (currthread)
 #define MAGIC_NULL_PID 42000
 
 static void
-set_thread (th, gen)
-     int th;
-     int gen;
+set_thread (int th, int gen)
 {
   char *buf = alloca (PBUFSIZ);
   int state = gen ? general_thread : continue_thread;
@@ -805,9 +962,9 @@ set_thread (th, gen)
 /*  Return nonzero if the thread TH is still alive on the remote system.  */
 
 static int
-remote_thread_alive (tid)
-     int tid;
+remote_thread_alive (ptid_t ptid)
 {
+  int tid = PIDGET (ptid);
   char buf[16];
 
   if (tid < 0)
@@ -865,82 +1022,77 @@ struct gdb_ext_thread_info
 
 #define BUF_THREAD_ID_SIZE (OPAQUETHREADBYTES*2)
 
-char *unpack_varlen_hex PARAMS ((char *buff, int *result));
+char *unpack_varlen_hex (char *buff, int *result);
 
-static char *unpack_nibble PARAMS ((char *buf, int *val));
+static char *unpack_nibble (char *buf, int *val);
 
-static char *pack_nibble PARAMS ((char *buf, int nibble));
+static char *pack_nibble (char *buf, int nibble);
 
-static char *pack_hex_byte PARAMS ((char *pkt, int /*unsigned char */ byte));
+static char *pack_hex_byte (char *pkt, int /*unsigned char */ byte);
 
-static char *unpack_byte PARAMS ((char *buf, int *value));
+static char *unpack_byte (char *buf, int *value);
 
-static char *pack_int PARAMS ((char *buf, int value));
+static char *pack_int (char *buf, int value);
 
-static char *unpack_int PARAMS ((char *buf, int *value));
+static char *unpack_int (char *buf, int *value);
 
-static char *unpack_string PARAMS ((char *src, char *dest, int length));
+static char *unpack_string (char *src, char *dest, int length);
 
-static char *pack_threadid PARAMS ((char *pkt, threadref * id));
+static char *pack_threadid (char *pkt, threadref * id);
 
-static char *unpack_threadid PARAMS ((char *inbuf, threadref * id));
+static char *unpack_threadid (char *inbuf, threadref * id);
 
-void int_to_threadref PARAMS ((threadref * id, int value));
+void int_to_threadref (threadref * id, int value);
 
-static int threadref_to_int PARAMS ((threadref * ref));
+static int threadref_to_int (threadref * ref);
 
-static void copy_threadref PARAMS ((threadref * dest, threadref * src));
+static void copy_threadref (threadref * dest, threadref * src);
 
-static int threadmatch PARAMS ((threadref * dest, threadref * src));
+static int threadmatch (threadref * dest, threadref * src);
 
-static char *pack_threadinfo_request PARAMS ((char *pkt, int mode,
-                                             threadref * id));
+static char *pack_threadinfo_request (char *pkt, int mode, threadref * id);
 
-static int remote_unpack_thread_info_response PARAMS ((char *pkt,
-                                                   threadref * expectedref,
-                                       struct gdb_ext_thread_info * info));
+static int remote_unpack_thread_info_response (char *pkt,
+                                              threadref * expectedref,
+                                              struct gdb_ext_thread_info
+                                              *info);
 
 
-static int remote_get_threadinfo PARAMS ((threadref * threadid,
-                                         int fieldset,         /*TAG mask */
-                                       struct gdb_ext_thread_info * info));
+static int remote_get_threadinfo (threadref * threadid, int fieldset,  /*TAG mask */
+                                 struct gdb_ext_thread_info *info);
 
-static int adapt_remote_get_threadinfo PARAMS ((gdb_threadref * ref,
-                                               int selection,
-                                       struct gdb_ext_thread_info * info));
+static int adapt_remote_get_threadinfo (gdb_threadref * ref,
+                                       int selection,
+                                       struct gdb_ext_thread_info *info);
 
-static char *pack_threadlist_request PARAMS ((char *pkt, int startflag,
-                                             int threadcount,
-                                             threadref * nextthread));
+static char *pack_threadlist_request (char *pkt, int startflag,
+                                     int threadcount,
+                                     threadref * nextthread);
 
-static int parse_threadlist_response PARAMS ((char *pkt,
-                                             int result_limit,
-                                             threadref * original_echo,
-                                             threadref * resultlist,
-                                             int *doneflag));
+static int parse_threadlist_response (char *pkt,
+                                     int result_limit,
+                                     threadref * original_echo,
+                                     threadref * resultlist, int *doneflag);
 
-static int remote_get_threadlist PARAMS ((int startflag,
-                                         threadref * nextthread,
-                                         int result_limit,
-                                         int *done,
-                                         int *result_count,
-                                         threadref * threadlist));
+static int remote_get_threadlist (int startflag,
+                                 threadref * nextthread,
+                                 int result_limit,
+                                 int *done,
+                                 int *result_count, threadref * threadlist);
 
 typedef int (*rmt_thread_action) (threadref * ref, void *context);
 
-static int remote_threadlist_iterator PARAMS ((rmt_thread_action stepfunction,
-                                            void *context, int looplimit));
+static int remote_threadlist_iterator (rmt_thread_action stepfunction,
+                                      void *context, int looplimit);
 
-static int remote_newthread_step PARAMS ((threadref * ref, void *context));
+static int remote_newthread_step (threadref * ref, void *context);
 
 /* encode 64 bits in 16 chars of hex */
 
 static const char hexchars[] = "0123456789abcdef";
 
 static int
-ishex (ch, val)
-     int ch;
-     int *val;
+ishex (int ch, int *val)
 {
   if ((ch >= 'a') && (ch <= 'f'))
     {
@@ -961,8 +1113,7 @@ ishex (ch, val)
 }
 
 static int
-stubhex (ch)
-     int ch;
+stubhex (int ch)
 {
   if (ch >= 'a' && ch <= 'f')
     return ch - 'a' + 10;
@@ -974,9 +1125,7 @@ stubhex (ch)
 }
 
 static int
-stub_unpack_int (buff, fieldlength)
-     char *buff;
-     int fieldlength;
+stub_unpack_int (char *buff, int fieldlength)
 {
   int nibble;
   int retval = 0;
@@ -993,9 +1142,8 @@ stub_unpack_int (buff, fieldlength)
 }
 
 char *
-unpack_varlen_hex (buff, result)
-     char *buff;               /* packet to parse */
-     int *result;
+unpack_varlen_hex (char *buff, /* packet to parse */
+                  int *result)
 {
   int nibble;
   int retval = 0;
@@ -1011,27 +1159,21 @@ unpack_varlen_hex (buff, result)
 }
 
 static char *
-unpack_nibble (buf, val)
-     char *buf;
-     int *val;
+unpack_nibble (char *buf, int *val)
 {
   ishex (*buf++, val);
   return buf;
 }
 
 static char *
-pack_nibble (buf, nibble)
-     char *buf;
-     int nibble;
+pack_nibble (char *buf, int nibble)
 {
   *buf++ = hexchars[(nibble & 0x0f)];
   return buf;
 }
 
 static char *
-pack_hex_byte (pkt, byte)
-     char *pkt;
-     int byte;
+pack_hex_byte (char *pkt, int byte)
 {
   *pkt++ = hexchars[(byte >> 4) & 0xf];
   *pkt++ = hexchars[(byte & 0xf)];
@@ -1039,18 +1181,14 @@ pack_hex_byte (pkt, byte)
 }
 
 static char *
-unpack_byte (buf, value)
-     char *buf;
-     int *value;
+unpack_byte (char *buf, int *value)
 {
   *value = stub_unpack_int (buf, 2);
   return buf + 2;
 }
 
 static char *
-pack_int (buf, value)
-     char *buf;
-     int value;
+pack_int (char *buf, int value)
 {
   buf = pack_hex_byte (buf, (value >> 24) & 0xff);
   buf = pack_hex_byte (buf, (value >> 16) & 0xff);
@@ -1060,21 +1198,17 @@ pack_int (buf, value)
 }
 
 static char *
-unpack_int (buf, value)
-     char *buf;
-     int *value;
+unpack_int (char *buf, int *value)
 {
   *value = stub_unpack_int (buf, 8);
   return buf + 8;
 }
 
 #if 0                          /* currently unused, uncomment when needed */
-static char *pack_string PARAMS ((char *pkt, char *string));
+static char *pack_string (char *pkt, char *string);
 
 static char *
-pack_string (pkt, string)
-     char *pkt;
-     char *string;
+pack_string (char *pkt, char *string)
 {
   char ch;
   int len;
@@ -1095,10 +1229,7 @@ pack_string (pkt, string)
 #endif /* 0 (unused) */
 
 static char *
-unpack_string (src, dest, length)
-     char *src;
-     char *dest;
-     int length;
+unpack_string (char *src, char *dest, int length)
 {
   while (length--)
     *dest++ = *src++;
@@ -1107,9 +1238,7 @@ unpack_string (src, dest, length)
 }
 
 static char *
-pack_threadid (pkt, id)
-     char *pkt;
-     threadref *id;
+pack_threadid (char *pkt, threadref *id)
 {
   char *limit;
   unsigned char *altid;
@@ -1123,9 +1252,7 @@ pack_threadid (pkt, id)
 
 
 static char *
-unpack_threadid (inbuf, id)
-     char *inbuf;
-     threadref *id;
+unpack_threadid (char *inbuf, threadref *id)
 {
   char *altref;
   char *limit = inbuf + BUF_THREAD_ID_SIZE;
@@ -1148,9 +1275,7 @@ unpack_threadid (inbuf, id)
    function.  */
 
 void
-int_to_threadref (id, value)
-     threadref *id;
-     int value;
+int_to_threadref (threadref *id, int value)
 {
   unsigned char *scan;
 
@@ -1167,8 +1292,7 @@ int_to_threadref (id, value)
 }
 
 static int
-threadref_to_int (ref)
-     threadref *ref;
+threadref_to_int (threadref *ref)
 {
   int i, value = 0;
   unsigned char *scan;
@@ -1182,9 +1306,7 @@ threadref_to_int (ref)
 }
 
 static void
-copy_threadref (dest, src)
-     threadref *dest;
-     threadref *src;
+copy_threadref (threadref *dest, threadref *src)
 {
   int i;
   unsigned char *csrc, *cdest;
@@ -1197,9 +1319,7 @@ copy_threadref (dest, src)
 }
 
 static int
-threadmatch (dest, src)
-     threadref *dest;
-     threadref *src;
+threadmatch (threadref *dest, threadref *src)
 {
   /* things are broken right now, so just assume we got a match */
 #if 0
@@ -1227,10 +1347,7 @@ threadmatch (dest, src)
 /* Encoding:  'Q':8,'P':8,mask:32,threadid:64 */
 
 static char *
-pack_threadinfo_request (pkt, mode, id)
-     char *pkt;
-     int mode;
-     threadref *id;
+pack_threadinfo_request (char *pkt, int mode, threadref *id)
 {
   *pkt++ = 'q';                        /* Info Query */
   *pkt++ = 'P';                        /* process or thread info */
@@ -1253,10 +1370,8 @@ pack_threadinfo_request (pkt, mode, id)
                                   the process */
 
 static int
-remote_unpack_thread_info_response (pkt, expectedref, info)
-     char *pkt;
-     threadref *expectedref;
-     struct gdb_ext_thread_info *info;
+remote_unpack_thread_info_response (char *pkt, threadref *expectedref,
+                                   struct gdb_ext_thread_info *info)
 {
   int mask, length;
   unsigned int tag;
@@ -1345,10 +1460,8 @@ remote_unpack_thread_info_response (pkt, expectedref, info)
 }
 
 static int
-remote_get_threadinfo (threadid, fieldset, info)
-     threadref *threadid;
-     int fieldset;             /* TAG mask */
-     struct gdb_ext_thread_info *info;
+remote_get_threadinfo (threadref *threadid, int fieldset,      /* TAG mask */
+                      struct gdb_ext_thread_info *info)
 {
   int result;
   char *threadinfo_pkt = alloca (PBUFSIZ);
@@ -1365,10 +1478,8 @@ remote_get_threadinfo (threadid, fieldset, info)
    representation of a threadid.  */
 
 static int
-adapt_remote_get_threadinfo (ref, selection, info)
-     gdb_threadref *ref;
-     int selection;
-     struct gdb_ext_thread_info *info;
+adapt_remote_get_threadinfo (gdb_threadref *ref, int selection,
+                            struct gdb_ext_thread_info *info)
 {
   threadref lclref;
 
@@ -1379,11 +1490,8 @@ adapt_remote_get_threadinfo (ref, selection, info)
 /*    Format: i'Q':8,i"L":8,initflag:8,batchsize:16,lastthreadid:32   */
 
 static char *
-pack_threadlist_request (pkt, startflag, threadcount, nextthread)
-     char *pkt;
-     int startflag;
-     int threadcount;
-     threadref *nextthread;
+pack_threadlist_request (char *pkt, int startflag, int threadcount,
+                        threadref *nextthread)
 {
   *pkt++ = 'q';                        /* info query packet */
   *pkt++ = 'L';                        /* Process LIST or threadLIST request */
@@ -1397,13 +1505,9 @@ pack_threadlist_request (pkt, startflag, threadcount, nextthread)
 /* Encoding:   'q':8,'M':8,count:16,done:8,argthreadid:64,(threadid:64)* */
 
 static int
-parse_threadlist_response (pkt, result_limit, original_echo, resultlist,
-                          doneflag)
-     char *pkt;
-     int result_limit;
-     threadref *original_echo;
-     threadref *resultlist;
-     int *doneflag;
+parse_threadlist_response (char *pkt, int result_limit,
+                          threadref *original_echo, threadref *resultlist,
+                          int *doneflag)
 {
   char *limit;
   int count, resultcount, done;
@@ -1427,15 +1531,8 @@ parse_threadlist_response (pkt, result_limit, original_echo, resultlist,
 }
 
 static int
-remote_get_threadlist (startflag, nextthread, result_limit,
-                      done, result_count, threadlist)
-     int startflag;
-     threadref *nextthread;
-     int result_limit;
-     int *done;
-     int *result_count;
-     threadref *threadlist;
-
+remote_get_threadlist (int startflag, threadref *nextthread, int result_limit,
+                      int *done, int *result_count, threadref *threadlist)
 {
   static threadref echo_nextthread;
   char *threadlist_packet = alloca (PBUFSIZ);
@@ -1500,10 +1597,8 @@ remote_get_threadlist (startflag, nextthread, result_limit,
 #define MAXTHREADLISTRESULTS 32
 
 static int
-remote_threadlist_iterator (stepfunction, context, looplimit)
-     rmt_thread_action stepfunction;
-     void *context;
-     int looplimit;
+remote_threadlist_iterator (rmt_thread_action stepfunction, void *context,
+                           int looplimit)
 {
   int done, i, result_count;
   int startflag = 1;
@@ -1541,30 +1636,28 @@ remote_threadlist_iterator (stepfunction, context, looplimit)
 }
 
 static int
-remote_newthread_step (ref, context)
-     threadref *ref;
-     void *context;
+remote_newthread_step (threadref *ref, void *context)
 {
-  int pid;
+  ptid_t ptid;
+
+  ptid = pid_to_ptid (threadref_to_int (ref));
 
-  pid = threadref_to_int (ref);
-  if (!in_thread_list (pid))
-    add_thread (pid);
+  if (!in_thread_list (ptid))
+    add_thread (ptid);
   return 1;                    /* continue iterator */
 }
 
 #define CRAZY_MAX_THREADS 1000
 
-static int
-remote_current_thread (oldpid)
-     int oldpid;
+static ptid_t
+remote_current_thread (ptid_t oldpid)
 {
   char *buf = alloca (PBUFSIZ);
 
   putpkt ("qC");
   getpkt (buf, PBUFSIZ, 0);
   if (buf[0] == 'Q' && buf[1] == 'C')
-    return strtol (&buf[2], NULL, 16);
+    return pid_to_ptid (strtol (&buf[2], NULL, 16));
   else
     return oldpid;
 }
@@ -1574,12 +1667,12 @@ remote_current_thread (oldpid)
  */
 
 static void
-remote_find_new_threads ()
+remote_find_new_threads (void)
 {
   remote_threadlist_iterator (remote_newthread_step, 0,
                              CRAZY_MAX_THREADS);
-  if (inferior_pid == MAGIC_NULL_PID)  /* ack ack ack */
-    inferior_pid = remote_current_thread (inferior_pid);
+  if (PIDGET (inferior_ptid) == MAGIC_NULL_PID)        /* ack ack ack */
+    inferior_ptid = remote_current_thread (inferior_ptid);
 }
 
 /*
@@ -1611,8 +1704,8 @@ remote_threads_info (void)
              do
                {
                  tid = strtol (bufp, &bufp, 16);
-                 if (tid != 0 && !in_thread_list (tid))
-                   add_thread (tid);
+                 if (tid != 0 && !in_thread_list (pid_to_ptid (tid)))
+                   add_thread (pid_to_ptid (tid));
                }
              while (*bufp++ == ',');   /* comma-separated list */
              putpkt ("qsThreadInfo");
@@ -1650,26 +1743,19 @@ remote_threads_extra_info (struct thread_info *tp)
   int n = 0;                    /* position in display_buf */
 
   if (remote_desc == 0)                /* paranoia */
-    internal_error ("remote_threads_extra_info");
+    internal_error (__FILE__, __LINE__,
+                   "remote_threads_extra_info");
 
   if (use_threadextra_query)
     {
-      sprintf (bufp, "qThreadExtraInfo,%x", tp->pid);
+      sprintf (bufp, "qThreadExtraInfo,%x", PIDGET (tp->ptid));
       putpkt (bufp);
       getpkt (bufp, PBUFSIZ, 0);
       if (bufp[0] != 0)
        {
-         char *p;
-
-         for (p = display_buf; 
-              p < display_buf + sizeof(display_buf) - 1 &&
-                bufp[0] != 0 &&
-                bufp[1] != 0;
-              p++, bufp+=2)
-           {
-             *p = fromhex (bufp[0]) * 16 + fromhex (bufp[1]);
-           }
-         *p = 0;
+         n = min (strlen (bufp) / 2, sizeof (display_buf));
+         result = hex2bin (bufp, display_buf, n);
+         display_buf [result] = '\0';
          return display_buf;
        }
     }
@@ -1678,7 +1764,7 @@ remote_threads_extra_info (struct thread_info *tp)
   use_threadextra_query = 0;
   set = TAG_THREADID | TAG_EXISTS | TAG_THREADNAME
     | TAG_MOREDISPLAY | TAG_DISPLAY;
-  int_to_threadref (&id, tp->pid);
+  int_to_threadref (&id, PIDGET (tp->ptid));
   if (remote_get_threadinfo (&id, set, &threadinfo))
     if (threadinfo.active)
       {
@@ -1706,7 +1792,7 @@ remote_threads_extra_info (struct thread_info *tp)
 /*  Restart the remote side; this is an extended protocol operation.  */
 
 static void
-extended_remote_restart ()
+extended_remote_restart (void)
 {
   char *buf = alloca (PBUFSIZ);
 
@@ -1726,8 +1812,7 @@ extended_remote_restart ()
 
 /* ARGSUSED */
 static void
-remote_close (quitting)
-     int quitting;
+remote_close (int quitting)
 {
   if (remote_desc)
     SERIAL_CLOSE (remote_desc);
@@ -1737,7 +1822,7 @@ remote_close (quitting)
 /* Query the remote side for the text, data and bss offsets. */
 
 static void
-get_offsets ()
+get_offsets (void)
 {
   char *buf = alloca (PBUFSIZ);
   char *ptr;
@@ -1803,14 +1888,14 @@ get_offsets ()
   offs = (struct section_offsets *) alloca (SIZEOF_SECTION_OFFSETS);
   memcpy (offs, symfile_objfile->section_offsets, SIZEOF_SECTION_OFFSETS);
 
-  ANOFFSET (offs, SECT_OFF_TEXT) = text_addr;
+  offs->offsets[SECT_OFF_TEXT (symfile_objfile)] = text_addr;
 
   /* This is a temporary kludge to force data and bss to use the same offsets
      because that's what nlmconv does now.  The real solution requires changes
      to the stub and remote.c that I don't have time to do right now.  */
 
-  ANOFFSET (offs, SECT_OFF_DATA) = data_addr;
-  ANOFFSET (offs, SECT_OFF_BSS) = data_addr;
+  offs->offsets[SECT_OFF_DATA (symfile_objfile)] = data_addr;
+  offs->offsets[SECT_OFF_BSS (symfile_objfile)] = data_addr;
 
   objfile_relocate (symfile_objfile, offs);
 }
@@ -1843,7 +1928,6 @@ remote_cisco_section_offsets (bfd_vma text_addr,
   asection *sect;
   bfd *abfd;
   int len;
-  char *p;
 
   if (symfile_objfile == NULL)
     return -1;                 /* no can do nothin' */
@@ -1860,7 +1944,7 @@ remote_cisco_section_offsets (bfd_vma text_addr,
        sect != 0;
        sect = sect->next)
     {
-      p = (unsigned char *) bfd_get_section_name (abfd, sect);
+      const char *p = bfd_get_section_name (abfd, sect);
       len = strlen (p);
       if (strcmp (p + len - 4, "data") == 0)   /* ends in "data" */
        if (data_base == 0 ||
@@ -1902,10 +1986,8 @@ remote_cisco_section_offsets (bfd_vma text_addr,
  */
 
 void
-remote_cisco_objfile_relocate (text_off, data_off, bss_off)
-     bfd_signed_vma text_off;
-     bfd_signed_vma data_off;
-     bfd_signed_vma bss_off;
+remote_cisco_objfile_relocate (bfd_signed_vma text_off, bfd_signed_vma data_off,
+                              bfd_signed_vma bss_off)
 {
   struct section_offsets *offs;
 
@@ -1918,9 +2000,9 @@ remote_cisco_objfile_relocate (text_off, data_off, bss_off)
       offs = (struct section_offsets *) alloca (SIZEOF_SECTION_OFFSETS);
       memcpy (offs, symfile_objfile->section_offsets, SIZEOF_SECTION_OFFSETS);
 
-      ANOFFSET (offs, SECT_OFF_TEXT) = text_off;
-      ANOFFSET (offs, SECT_OFF_DATA) = data_off;
-      ANOFFSET (offs, SECT_OFF_BSS) = bss_off;
+      offs->offsets[SECT_OFF_TEXT (symfile_objfile)] = text_off;
+      offs->offsets[SECT_OFF_DATA (symfile_objfile)] = data_off;
+      offs->offsets[SECT_OFF_BSS (symfile_objfile)] = bss_off;
 
       /* First call the standard objfile_relocate.  */
       objfile_relocate (symfile_objfile, offs);
@@ -1943,10 +2025,9 @@ remote_start_remote_dummy (void *dummy)
 }
 
 static int
-remote_start_remote (dummy)
-     PTR dummy;
+remote_start_remote (PTR dummy)
 {
-  immediate_quit = 1;          /* Allow user to interrupt it */
+  immediate_quit++;            /* Allow user to interrupt it */
 
   /* Ack any packet which the remote side has already sent.  */
   SERIAL_WRITE (remote_desc, "+", 1);
@@ -1954,12 +2035,12 @@ remote_start_remote (dummy)
   /* Let the stub know that we want it to return the thread.  */
   set_thread (-1, 0);
 
-  inferior_pid = remote_current_thread (inferior_pid);
+  inferior_ptid = remote_current_thread (inferior_ptid);
 
   get_offsets ();              /* Get text, data & bss offsets */
 
   putpkt ("?");                        /* initiate a query from remote machine */
-  immediate_quit = 0;
+  immediate_quit--;
 
   return remote_start_remote_dummy (dummy);
 }
@@ -1968,18 +2049,14 @@ remote_start_remote (dummy)
    NAME is the filename used for communication.  */
 
 static void
-remote_open (name, from_tty)
-     char *name;
-     int from_tty;
+remote_open (char *name, int from_tty)
 {
   remote_open_1 (name, from_tty, &remote_ops, 0);
 }
 
 /* Just like remote_open, but with asynchronous support. */
 static void
-remote_async_open (name, from_tty)
-     char *name;
-     int from_tty;
+remote_async_open (char *name, int from_tty)
 {
   remote_async_open_1 (name, from_tty, &remote_async_ops, 0);
 }
@@ -1988,32 +2065,76 @@ remote_async_open (name, from_tty)
    remote gdb protocol.  NAME is the filename used for communication.  */
 
 static void
-extended_remote_open (name, from_tty)
-     char *name;
-     int from_tty;
+extended_remote_open (char *name, int from_tty)
 {
   remote_open_1 (name, from_tty, &extended_remote_ops, 1 /*extended_p */ );
 }
 
 /* Just like extended_remote_open, but with asynchronous support. */
 static void
-extended_remote_async_open (name, from_tty)
-     char *name;
-     int from_tty;
+extended_remote_async_open (char *name, int from_tty)
 {
   remote_async_open_1 (name, from_tty, &extended_async_remote_ops, 1 /*extended_p */ );
 }
 
 /* Generic code for opening a connection to a remote target.  */
 
-static DCACHE *remote_dcache;
+static void
+init_all_packet_configs (void)
+{
+  int i;
+  update_packet_config (&remote_protocol_e);
+  update_packet_config (&remote_protocol_E);
+  update_packet_config (&remote_protocol_P);
+  update_packet_config (&remote_protocol_qSymbol);
+  for (i = 0; i < NR_Z_PACKET_TYPES; i++)
+    update_packet_config (&remote_protocol_Z[i]);
+  /* Force remote_write_bytes to check whether target supports binary
+     downloading. */
+  update_packet_config (&remote_protocol_binary_download);
+}
+
+/* Symbol look-up. */
 
 static void
-remote_open_1 (name, from_tty, target, extended_p)
-     char *name;
-     int from_tty;
-     struct target_ops *target;
-     int extended_p;
+remote_check_symbols (struct objfile *objfile)
+{
+  char *msg, *reply, *tmp;
+  struct minimal_symbol *sym;
+  int end;
+
+  if (remote_protocol_qSymbol.support == PACKET_DISABLE)
+    return;
+
+  msg   = alloca (PBUFSIZ);
+  reply = alloca (PBUFSIZ);
+
+  /* Invite target to request symbol lookups. */
+
+  putpkt ("qSymbol::");
+  getpkt (reply, PBUFSIZ, 0);
+  packet_ok (reply, &remote_protocol_qSymbol);
+
+  while (strncmp (reply, "qSymbol:", 8) == 0)
+    {
+      tmp = &reply[8];
+      end = hex2bin (tmp, msg, strlen (tmp) / 2);
+      msg[end] = '\0';
+      sym = lookup_minimal_symbol (msg, NULL, NULL);
+      if (sym == NULL)
+       sprintf (msg, "qSymbol::%s", &reply[8]);
+      else
+       sprintf (msg, "qSymbol:%s:%s", 
+                paddr_nz (SYMBOL_VALUE_ADDRESS (sym)),
+                &reply[8]);
+      putpkt (msg);
+      getpkt (reply, PBUFSIZ, 0);
+    }
+}
+
+static void
+remote_open_1 (char *name, int from_tty, struct target_ops *target,
+              int extended_p)
 {
   if (name == 0)
     error ("To open a remote debug connection, you need to specify what\n\
@@ -2027,8 +2148,6 @@ serial device is attached to the remote system\n\
 
   unpush_target (target);
 
-  remote_dcache = dcache_init (remote_read_bytes, remote_write_bytes);
-
   remote_desc = SERIAL_OPEN (name);
   if (!remote_desc)
     perror_with_name (name);
@@ -2056,16 +2175,11 @@ serial device is attached to the remote system\n\
     }
   push_target (target);                /* Switch to using remote target now */
 
-  init_packet_config (&remote_protocol_P);
-  init_packet_config (&remote_protocol_Z);
+  init_all_packet_configs ();
   
   general_thread = -2;
   continue_thread = -2;
 
-  /* Force remote_write_bytes to check whether target supports
-     binary downloading. */
-  init_packet_config (&remote_protocol_binary_download);
-
   /* Probe for ability to use "ThreadInfo" query, as required.  */
   use_threadinfo_query = 1;
   use_threadextra_query = 1;
@@ -2077,7 +2191,12 @@ serial device is attached to the remote system\n\
      be split out into seperate variables, especially since GDB will
      someday have a notion of debugging several processes.  */
 
-  inferior_pid = MAGIC_NULL_PID;
+  inferior_ptid = pid_to_ptid (MAGIC_NULL_PID);
+#ifdef SOLIB_CREATE_INFERIOR_HOOK
+  /* First delete any symbols previously loaded from shared libraries. */
+  no_shared_libraries (NULL, 0);
+#endif
+
   /* Start the remote connection; if error (0), discard this target.
      In particular, if the user quits, be sure to discard it
      (we'd be in an inconsistent state otherwise).  */
@@ -2091,20 +2210,31 @@ serial device is attached to the remote system\n\
 
   if (extended_p)
     {
-      /* tell the remote that we're using the extended protocol.  */
+      /* Tell the remote that we are using the extended protocol.  */
       char *buf = alloca (PBUFSIZ);
       putpkt ("!");
       getpkt (buf, PBUFSIZ, 0);
     }
+#ifdef SOLIB_CREATE_INFERIOR_HOOK
+  /* FIXME: need a master target_open vector from which all 
+     remote_opens can be called, so that stuff like this can 
+     go there.  Failing that, the following code must be copied
+     to the open function for any remote target that wants to 
+     support svr4 shared libraries.  */
+
+  /* Set up to detect and load shared libraries. */
+  if (exec_bfd)        /* No use without an exec file. */
+    {
+      SOLIB_CREATE_INFERIOR_HOOK (PIDGET (inferior_ptid));
+      remote_check_symbols (symfile_objfile);
+    }
+#endif
 }
 
 /* Just like remote_open but with asynchronous support. */
 static void
-remote_async_open_1 (name, from_tty, target, extended_p)
-     char *name;
-     int from_tty;
-     struct target_ops *target;
-     int extended_p;
+remote_async_open_1 (char *name, int from_tty, struct target_ops *target,
+                    int extended_p)
 {
   if (name == 0)
     error ("To open a remote debug connection, you need to specify what\n\
@@ -2115,8 +2245,6 @@ serial device is attached to the remote system\n\
 
   unpush_target (target);
 
-  remote_dcache = dcache_init (remote_read_bytes, remote_write_bytes);
-
   remote_desc = SERIAL_OPEN (name);
   if (!remote_desc)
     perror_with_name (name);
@@ -2145,16 +2273,11 @@ serial device is attached to the remote system\n\
 
   push_target (target);                /* Switch to using remote target now */
 
-  init_packet_config (&remote_protocol_P);
-  init_packet_config (&remote_protocol_Z);
+  init_all_packet_configs ();
 
   general_thread = -2;
   continue_thread = -2;
 
-  /* Force remote_write_bytes to check whether target supports
-     binary downloading. */
-  init_packet_config (&remote_protocol_binary_download);
-
   /* Probe for ability to use "ThreadInfo" query, as required.  */
   use_threadinfo_query = 1;
   use_threadextra_query = 1;
@@ -2165,20 +2288,25 @@ serial device is attached to the remote system\n\
      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_pid = MAGIC_NULL_PID;
+  inferior_ptid = pid_to_ptid (MAGIC_NULL_PID);
 
   /* 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. Unfortunatly remote_start_remote() eventually calls
+     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;
 
+#ifdef SOLIB_CREATE_INFERIOR_HOOK
+  /* First delete any symbols previously loaded from shared libraries. */
+  no_shared_libraries (NULL, 0);
+#endif
+
   /* Start the remote connection; if error (0), discard this target.
      In particular, if the user quits, be sure to discard it
      (we'd be in an inconsistent state otherwise).  */
@@ -2195,11 +2323,25 @@ serial device is attached to the remote system\n\
 
   if (extended_p)
     {
-      /* tell the remote that we're using the extended protocol.  */
+      /* Tell the remote that we are using the extended protocol.  */
       char *buf = alloca (PBUFSIZ);
       putpkt ("!");
       getpkt (buf, PBUFSIZ, 0);
     }
+#ifdef SOLIB_CREATE_INFERIOR_HOOK
+  /* FIXME: need a master target_open vector from which all 
+     remote_opens can be called, so that stuff like this can 
+     go there.  Failing that, the following code must be copied
+     to the open function for any remote target that wants to 
+     support svr4 shared libraries.  */
+
+  /* Set up to detect and load shared libraries. */
+  if (exec_bfd)        /* No use without an exec file. */
+    {
+      SOLIB_CREATE_INFERIOR_HOOK (PIDGET (inferior_ptid));
+      remote_check_symbols (symfile_objfile);
+    }
+#endif
 }
 
 /* This takes a program previously attached to and detaches it.  After
@@ -2208,9 +2350,7 @@ serial device is attached to the remote system\n\
    die when it hits one.  */
 
 static void
-remote_detach (args, from_tty)
-     char *args;
-     int from_tty;
+remote_detach (char *args, int from_tty)
 {
   char *buf = alloca (PBUFSIZ);
 
@@ -2229,9 +2369,7 @@ remote_detach (args, from_tty)
 
 /* Same as remote_detach, but with async support. */
 static void
-remote_async_detach (args, from_tty)
-     char *args;
-     int from_tty;
+remote_async_detach (char *args, int from_tty)
 {
   char *buf = alloca (PBUFSIZ);
 
@@ -2253,9 +2391,8 @@ remote_async_detach (args, from_tty)
 
 /* Convert hex digit A to a number.  */
 
-int
-fromhex (a)
-     int a;
+static int
+fromhex (int a)
 {
   if (a >= '0' && a <= '9')
     return a - '0';
@@ -2267,17 +2404,52 @@ fromhex (a)
     error ("Reply contains invalid hex digit %d", a);
 }
 
+static int
+hex2bin (const char *hex, char *bin, int count)
+{
+  int i;
+
+  for (i = 0; i < count; i++)
+    {
+      if (hex[0] == 0 || hex[1] == 0)
+       {
+         /* Hex string is short, or of uneven length.
+            Return the count that has been converted so far. */
+         return i;
+       }
+      *bin++ = fromhex (hex[0]) * 16 + fromhex (hex[1]);
+      hex += 2;
+    }
+  return i;
+}
+
 /* Convert number NIB to a hex digit.  */
 
 static int
-tohex (nib)
-     int nib;
+tohex (int nib)
 {
   if (nib < 10)
     return '0' + nib;
   else
     return 'a' + nib - 10;
 }
+
+static int
+bin2hex (const char *bin, char *hex, int count)
+{
+  int i;
+  /* May use a length, or a nul-terminated string as input. */
+  if (count == 0)
+    count = strlen (bin);
+
+  for (i = 0; i < count; i++)
+    {
+      *hex++ = tohex ((*bin >> 4) & 0xf);
+      *hex++ = tohex (*bin++ & 0xf);
+    }
+  *hex = 0;
+  return i;
+}
 \f
 /* Tell the remote machine to resume.  */
 
@@ -2286,19 +2458,17 @@ static enum target_signal last_sent_signal = TARGET_SIGNAL_0;
 static int last_sent_step;
 
 static void
-remote_resume (pid, step, siggnal)
-     int pid, step;
-     enum target_signal siggnal;
+remote_resume (ptid_t ptid, int step, enum target_signal siggnal)
 {
   char *buf = alloca (PBUFSIZ);
+  int pid = PIDGET (ptid);
+  char *p;
 
   if (pid == -1)
     set_thread (0, 0);         /* run any thread */
   else
     set_thread (pid, 0);       /* run this thread */
 
-  dcache_flush (remote_dcache);
-
   last_sent_signal = siggnal;
   last_sent_step = step;
 
@@ -2307,11 +2477,66 @@ remote_resume (pid, step, siggnal)
   if (target_resume_hook)
     (*target_resume_hook) ();
 
+
+  /* The s/S/c/C packets do not return status.  So if the target does
+     not support the S or C packets, the debug agent returns an empty
+     string which is detected in remote_wait().  This protocol defect
+     is fixed in the e/E packets. */
+
+  if (step && step_range_end)
+    {
+      /* If the target does not support the 'E' packet, we try the 'S'
+        packet.  Ideally we would fall back to the 'e' packet if that
+        too is not supported.  But that would require another copy of
+        the code to issue the 'e' packet (and fall back to 's' if not
+        supported) in remote_wait().  */
+      
+      if (siggnal != TARGET_SIGNAL_0)
+       {
+         if (remote_protocol_E.support != PACKET_DISABLE)
+           {
+             p = buf;
+             *p++ = 'E';
+             *p++ = tohex (((int) siggnal >> 4) & 0xf);
+             *p++ = tohex (((int) siggnal) & 0xf);
+             *p++ = ',';
+             p += hexnumstr (p, (ULONGEST) step_range_start);
+             *p++ = ',';
+             p += hexnumstr (p, (ULONGEST) step_range_end);
+             *p++ = 0;
+
+             putpkt (buf);
+             getpkt (buf, PBUFSIZ, 0);
+
+             if (packet_ok (buf, &remote_protocol_E) == PACKET_OK)
+               return;
+           }
+       }
+      else
+       {
+         if (remote_protocol_e.support != PACKET_DISABLE)
+           {
+             p = buf;
+             *p++ = 'e';
+             p += hexnumstr (p, (ULONGEST) step_range_start);
+             *p++ = ',';
+             p += hexnumstr (p, (ULONGEST) step_range_end);
+             *p++ = 0;
+
+             putpkt (buf);
+             getpkt (buf, PBUFSIZ, 0);
+
+             if (packet_ok (buf, &remote_protocol_e) == PACKET_OK)
+               return;
+           }
+       }
+    }
+
   if (siggnal != TARGET_SIGNAL_0)
     {
       buf[0] = step ? 'S' : 'C';
       buf[1] = tohex (((int) siggnal >> 4) & 0xf);
-      buf[2] = tohex ((int) siggnal & 0xf);
+      buf[2] = tohex (((int) siggnal) & 0xf);
       buf[3] = '\0';
     }
   else
@@ -2322,19 +2547,17 @@ remote_resume (pid, step, siggnal)
 
 /* Same as remote_resume, but with async support. */
 static void
-remote_async_resume (pid, step, siggnal)
-     int pid, step;
-     enum target_signal siggnal;
+remote_async_resume (ptid_t ptid, int step, enum target_signal siggnal)
 {
   char *buf = alloca (PBUFSIZ);
+  int pid = PIDGET (ptid);
+  char *p;
 
   if (pid == -1)
     set_thread (0, 0);         /* run any thread */
   else
     set_thread (pid, 0);       /* run this thread */
 
-  dcache_flush (remote_dcache);
-
   last_sent_signal = siggnal;
   last_sent_step = step;
 
@@ -2343,6 +2566,60 @@ remote_async_resume (pid, step, siggnal)
   if (target_resume_hook)
     (*target_resume_hook) ();
 
+  /* The s/S/c/C packets do not return status.  So if the target does
+     not support the S or C packets, the debug agent returns an empty
+     string which is detected in remote_wait().  This protocol defect
+     is fixed in the e/E packets. */
+
+  if (step && step_range_end)
+    {
+      /* If the target does not support the 'E' packet, we try the 'S'
+        packet.  Ideally we would fall back to the 'e' packet if that
+        too is not supported.  But that would require another copy of
+        the code to issue the 'e' packet (and fall back to 's' if not
+        supported) in remote_wait().  */
+      
+      if (siggnal != TARGET_SIGNAL_0)
+       {
+         if (remote_protocol_E.support != PACKET_DISABLE)
+           {
+             p = buf;
+             *p++ = 'E';
+             *p++ = tohex (((int) siggnal >> 4) & 0xf);
+             *p++ = tohex (((int) siggnal) & 0xf);
+             *p++ = ',';
+             p += hexnumstr (p, (ULONGEST) step_range_start);
+             *p++ = ',';
+             p += hexnumstr (p, (ULONGEST) step_range_end);
+             *p++ = 0;
+
+             putpkt (buf);
+             getpkt (buf, PBUFSIZ, 0);
+
+             if (packet_ok (buf, &remote_protocol_E) == PACKET_OK)
+               goto register_event_loop;
+           }
+       }
+      else
+       {
+         if (remote_protocol_e.support != PACKET_DISABLE)
+           {
+             p = buf;
+             *p++ = 'e';
+             p += hexnumstr (p, (ULONGEST) step_range_start);
+             *p++ = ',';
+             p += hexnumstr (p, (ULONGEST) step_range_end);
+             *p++ = 0;
+
+             putpkt (buf);
+             getpkt (buf, PBUFSIZ, 0);
+
+             if (packet_ok (buf, &remote_protocol_e) == PACKET_OK)
+               goto register_event_loop;
+           }
+       }
+    }
+
   if (siggnal != TARGET_SIGNAL_0)
     {
       buf[0] = step ? 'S' : 'C';
@@ -2352,7 +2629,10 @@ remote_async_resume (pid, step, siggnal)
     }
   else
     strcpy (buf, step ? "s" : "c");
+  
+  putpkt (buf);
 
+register_event_loop:
   /* We are about to start executing the inferior, let's register it
      with the event loop. NOTE: this is the one place where all the
      execution commands end up. We could alternatively do this in each
@@ -2369,14 +2649,13 @@ remote_async_resume (pid, step, siggnal)
      this information already found in the continuation block?  */
   if (target_is_async_p ())
     target_executing = 1;
-  putpkt (buf);
 }
 \f
 
 /* Set up the signal handler for SIGINT, while the target is
    executing, ovewriting the 'regular' SIGINT signal handler. */
 static void
-initialize_sigint_signal_handler ()
+initialize_sigint_signal_handler (void)
 {
   sigint_remote_token =
     create_async_signal_handler (async_remote_interrupt, NULL);
@@ -2385,8 +2664,7 @@ initialize_sigint_signal_handler ()
 
 /* Signal handler for SIGINT, while the target is executing. */
 static void
-handle_remote_sigint (sig)
-     int sig;
+handle_remote_sigint (int sig)
 {
   signal (sig, handle_remote_sigint_twice);
   sigint_remote_twice_token =
@@ -2398,8 +2676,7 @@ handle_remote_sigint (sig)
    sent once.  It will take effect the second time that the user sends
    a ^C. */
 static void
-handle_remote_sigint_twice (sig)
-     int sig;
+handle_remote_sigint_twice (int sig)
 {
   signal (sig, handle_sigint);
   sigint_remote_twice_token =
@@ -2410,8 +2687,7 @@ handle_remote_sigint_twice (sig)
 /* Perform the real interruption of the target execution, in response
    to a ^C. */
 static void
-async_remote_interrupt (arg)
-     gdb_client_data arg;
+async_remote_interrupt (gdb_client_data arg)
 {
   if (remote_debug)
     fprintf_unfiltered (gdb_stdlog, "remote_interrupt called\n");
@@ -2422,8 +2698,7 @@ async_remote_interrupt (arg)
 /* Perform interrupt, if the first attempt did not succeed. Just give
    up on the target alltogether. */
 void
-async_remote_interrupt_twice (arg)
-     gdb_client_data arg;
+async_remote_interrupt_twice (gdb_client_data arg)
 {
   if (remote_debug)
     fprintf_unfiltered (gdb_stdlog, "remote_interrupt_twice called\n");
@@ -2450,7 +2725,7 @@ cleanup_sigint_signal_handler (void *dummy)
 
 /* Send ^C to target to halt it.  Target will respond, and send us a
    packet.  */
-static void (*ofunc) PARAMS ((int));
+static void (*ofunc) (int);
 
 /* The command line interface's stop routine. This function is installed
    as a signal handler for SIGINT. The first time a user requests a
@@ -2458,8 +2733,7 @@ static void (*ofunc) PARAMS ((int));
    response from the target (it didn't stop when the user requested it),
    we ask the user if he'd like to detach from the target. */
 static void
-remote_interrupt (signo)
-     int signo;
+remote_interrupt (int signo)
 {
   /* If this doesn't work, try more severe steps. */
   signal (signo, remote_interrupt_twice);
@@ -2473,8 +2747,7 @@ remote_interrupt (signo)
 /* The user typed ^C twice.  */
 
 static void
-remote_interrupt_twice (signo)
-     int signo;
+remote_interrupt_twice (int signo)
 {
   signal (signo, ofunc);
   interrupt_query ();
@@ -2485,7 +2758,7 @@ remote_interrupt_twice (signo)
    interrupt is requested, either by the command line or the GUI, we
    will eventually end up here. */
 static void
-remote_stop ()
+remote_stop (void)
 {
   /* Send a break or a ^C, depending on user preference.  */
   if (remote_debug)
@@ -2500,7 +2773,7 @@ remote_stop ()
 /* Ask the user what to do when an interrupt is received.  */
 
 static void
-interrupt_query ()
+interrupt_query (void)
 {
   target_terminal_ours ();
 
@@ -2584,10 +2857,8 @@ remote_console_output (char *msg)
    Returns "pid", which in the case of a multi-threaded 
    remote OS, is the thread-id.  */
 
-static int
-remote_wait (pid, status)
-     int pid;
-     struct target_waitstatus *status;
+static ptid_t
+remote_wait (ptid_t ptid, struct target_waitstatus *status)
 {
   unsigned char *buf = alloca (PBUFSIZ);
   int thread_num = -1;
@@ -2617,7 +2888,7 @@ remote_wait (pid, status)
          {
            int i;
            long regno;
-           char regs[MAX_REGISTER_RAW_SIZE];
+           char* regs = (char*) alloca (MAX_REGISTER_RAW_SIZE);
 
            /* Expedited reply, containing Signal, {regno, reg} repeat */
            /*  format is:  'Tssn...:r...;n...:r...;n...:r...;#cc', where
@@ -2631,6 +2902,7 @@ remote_wait (pid, status)
              {
                unsigned char *p1;
                char *p_temp;
+               int fieldsize;
 
                /* Read the register number */
                regno = strtol ((const char *) p, &p_temp, 16);
@@ -2664,13 +2936,10 @@ Packet: '%s'\n",
 Packet: '%s'\n",
                               regno, p, buf);
 
-                   for (i = 0; i < REGISTER_RAW_SIZE (regno); i++)
-                     {
-                       if (p[0] == 0 || p[1] == 0)
-                         warning ("Remote reply is too short: %s", buf);
-                       regs[i] = fromhex (p[0]) * 16 + fromhex (p[1]);
-                       p += 2;
-                     }
+                   fieldsize = hex2bin (p, regs, REGISTER_RAW_SIZE (regno));
+                   p += 2 * fieldsize;
+                   if (fieldsize < REGISTER_RAW_SIZE (regno))
+                     warning ("Remote reply is too short: %s", buf);
                    supply_register (regno, regs);
                  }
 
@@ -2795,16 +3064,14 @@ Packet Dropped");
 got_status:
   if (thread_num != -1)
     {
-      return thread_num;
+      return pid_to_ptid (thread_num);
     }
-  return inferior_pid;
+  return inferior_ptid;
 }
 
 /* Async version of remote_wait. */
-static int
-remote_async_wait (pid, status)
-     int pid;
-     struct target_waitstatus *status;
+static ptid_t
+remote_async_wait (ptid_t ptid, struct target_waitstatus *status)
 {
   unsigned char *buf = alloca (PBUFSIZ);
   int thread_num = -1;
@@ -2840,7 +3107,7 @@ remote_async_wait (pid, status)
          {
            int i;
            long regno;
-           char regs[MAX_REGISTER_RAW_SIZE];
+           char* regs = (char*) alloca (MAX_REGISTER_RAW_SIZE);
 
            /* Expedited reply, containing Signal, {regno, reg} repeat */
            /*  format is:  'Tssn...:r...;n...:r...;n...:r...;#cc', where
@@ -2854,6 +3121,7 @@ remote_async_wait (pid, status)
              {
                unsigned char *p1;
                char *p_temp;
+               int fieldsize;
 
                /* Read the register number */
                regno = strtol ((const char *) p, &p_temp, 16);
@@ -2887,13 +3155,10 @@ Packet: '%s'\n",
 Packet: '%s'\n",
                               regno, p, buf);
 
-                   for (i = 0; i < REGISTER_RAW_SIZE (regno); i++)
-                     {
-                       if (p[0] == 0 || p[1] == 0)
-                         warning ("Remote reply is too short: %s", buf);
-                       regs[i] = fromhex (p[0]) * 16 + fromhex (p[1]);
-                       p += 2;
-                     }
+                   fieldsize = hex2bin (p, regs, REGISTER_RAW_SIZE (regno));
+                   p += 2 * fieldsize;
+                   if (fieldsize < REGISTER_RAW_SIZE (regno))
+                     warning ("Remote reply is too short: %s", buf);
                    supply_register (regno, regs);
                  }
 
@@ -3021,9 +3286,9 @@ Packet Dropped");
 got_status:
   if (thread_num != -1)
     {
-      return thread_num;
+      return pid_to_ptid (thread_num);
     }
-  return inferior_pid;
+  return inferior_ptid;
 }
 
 /* Number of bytes of registers this stub implements.  */
@@ -3035,15 +3300,14 @@ static int register_bytes_found;
 
 /* ARGSUSED */
 static void
-remote_fetch_registers (regno)
-     int regno;
+remote_fetch_registers (int regno)
 {
   char *buf = alloca (PBUFSIZ);
   int i;
   char *p;
-  char regs[REGISTER_BYTES];
+  char *regs = alloca (REGISTER_BYTES);
 
-  set_thread (inferior_pid, 1);
+  set_thread (PIDGET (inferior_ptid), 1);
 
   sprintf (buf, "g");
   remote_send (buf, PBUFSIZ);
@@ -3096,10 +3360,9 @@ remote_fetch_registers (regno)
   if (i != register_bytes_found)
     {
       register_bytes_found = i;
-#ifdef REGISTER_BYTES_OK
-      if (!REGISTER_BYTES_OK (i))
+      if (REGISTER_BYTES_OK_P ()
+         && !REGISTER_BYTES_OK (i))
        warning ("Remote reply is too short: %s", buf);
-#endif
     }
 
 supply_them:
@@ -3107,7 +3370,7 @@ supply_them:
     {
       supply_register (i, &regs[REGISTER_BYTE (i)]);
       if (buf[REGISTER_BYTE (i) * 2] == 'x')
-       register_valid[i] = -1; /* register value not available */
+       set_register_cached (i, -1);
     }
 }
 
@@ -3116,7 +3379,7 @@ supply_them:
    first.  */
 
 static void
-remote_prepare_to_store ()
+remote_prepare_to_store (void)
 {
   /* Make sure the entire registers array is valid.  */
   switch (remote_protocol_P.support)
@@ -3144,13 +3407,8 @@ store_register_using_P (int regno)
 
   sprintf (buf, "P%x=", regno);
   p = buf + strlen (buf);
-  regp = &registers[REGISTER_BYTE (regno)];
-  for (i = 0; i < REGISTER_RAW_SIZE (regno); ++i)
-    {
-      *p++ = tohex ((regp[i] >> 4) & 0xf);
-      *p++ = tohex (regp[i] & 0xf);
-    }
-  *p = '\0';
+  regp = register_buffer (regno);
+  bin2hex (regp, p, REGISTER_RAW_SIZE (regno));
   remote_send (buf, PBUFSIZ);
 
   return buf[0] != '\0';
@@ -3158,17 +3416,17 @@ store_register_using_P (int regno)
 
 
 /* Store register REGNO, or all registers if REGNO == -1, from the contents
-   of REGISTERS.  FIXME: ignores errors.  */
+   of the register cache buffer.  FIXME: ignores errors.  */
 
 static void
-remote_store_registers (regno)
-     int regno;
+remote_store_registers (int regno)
 {
   char *buf = alloca (PBUFSIZ);
   int i;
   char *p;
+  char *regs;
 
-  set_thread (inferior_pid, 1);
+  set_thread (PIDGET (inferior_ptid), 1);
 
   if (regno >= 0)
     {
@@ -3204,59 +3462,18 @@ remote_store_registers (regno)
   /* Command describes registers byte by byte,
      each byte encoded as two hex characters.  */
 
+  regs = register_buffer (-1);
   p = buf + 1;
   /* remote_prepare_to_store insures that register_bytes_found gets set.  */
-  for (i = 0; i < register_bytes_found; i++)
-    {
-      *p++ = tohex ((registers[i] >> 4) & 0xf);
-      *p++ = tohex (registers[i] & 0xf);
-    }
-  *p = '\0';
-
+  bin2hex (regs, p, register_bytes_found);
   remote_send (buf, PBUFSIZ);
 }
-
-/* Use of the data cache *used* to be disabled because it loses for looking
-   at and changing hardware I/O ports and the like.  Accepting `volatile'
-   would perhaps be one way to fix it.  Another idea would be to use the
-   executable file for the text segment (for all SEC_CODE sections?
-   For all SEC_READONLY sections?).  This has problems if you want to
-   actually see what the memory contains (e.g. self-modifying code,
-   clobbered memory, user downloaded the wrong thing).  
-
-   Because it speeds so much up, it's now enabled, if you're playing
-   with registers you turn it of (set remotecache 0).  */
-
-/* Read a word from remote address ADDR and return it.
-   This goes through the data cache.  */
-
-#if 0                          /* unused? */
-static int
-remote_fetch_word (addr)
-     CORE_ADDR addr;
-{
-  return dcache_fetch (remote_dcache, addr);
-}
-
-/* Write a word WORD into remote address ADDR.
-   This goes through the data cache.  */
-
-static void
-remote_store_word (addr, word)
-     CORE_ADDR addr;
-     int word;
-{
-  dcache_poke (remote_dcache, addr, word);
-}
-#endif /* 0 (unused?) */
 \f
 
-
 /* Return the number of hex digits in num.  */
 
 static int
-hexnumlen (num)
-     ULONGEST num;
+hexnumlen (ULONGEST num)
 {
   int i;
 
@@ -3269,9 +3486,7 @@ hexnumlen (num)
 /* Set BUF to the minimum number of hex digits representing NUM.  */
 
 static int
-hexnumstr (buf, num)
-     char *buf;
-     ULONGEST num;
+hexnumstr (char *buf, ULONGEST num)
 {
   int len = hexnumlen (num);
   return hexnumnstr (buf, num, len);
@@ -3281,10 +3496,7 @@ hexnumstr (buf, num)
 /* Set BUF to the hex digits representing NUM, padded to WIDTH characters.  */
 
 static int
-hexnumnstr (buf, num, width)
-     char *buf;
-     ULONGEST num;
-     int width;
+hexnumnstr (char *buf, ULONGEST num, int width)
 {
   int i;
 
@@ -3302,8 +3514,7 @@ hexnumnstr (buf, num, width)
 /* Mask all but the least significant REMOTE_ADDRESS_SIZE bits. */
 
 static CORE_ADDR
-remote_address_masked (addr)
-     CORE_ADDR addr;
+remote_address_masked (CORE_ADDR addr)
 {
   if (remote_address_size > 0
       && remote_address_size < (sizeof (ULONGEST) * 8))
@@ -3328,8 +3539,7 @@ remote_address_masked (addr)
    X-packet". */
 
 static void
-check_binary_download (addr)
-     CORE_ADDR addr;
+check_binary_download (CORE_ADDR addr)
 {
   switch (remote_protocol_binary_download.support)
     {
@@ -3423,7 +3633,10 @@ remote_write_bytes (CORE_ADDR memaddr, char *myaddr, int len)
       todo = min (len, max_buf_size / 2);
       break;
     case PACKET_SUPPORT_UNKNOWN:
-      internal_error ("remote_write_bytes: bad switch");
+      internal_error (__FILE__, __LINE__,
+                     "remote_write_bytes: bad internal state");
+    default:
+      internal_error (__FILE__, __LINE__, "bad switch");
     }
   
   /* Append <memaddr> */
@@ -3479,15 +3692,14 @@ remote_write_bytes (CORE_ADDR memaddr, char *myaddr, int len)
       /* Normal mode: Send target system values byte by byte, in
         increasing byte addresses.  Each byte is encoded as a two hex
         value.  */
-      for (nr_bytes = 0; nr_bytes < todo; nr_bytes++)
-       {
-         *p++ = tohex ((myaddr[nr_bytes] >> 4) & 0xf);
-         *p++ = tohex (myaddr[nr_bytes] & 0xf);
-       }
-      *p = '\0';
+      nr_bytes = bin2hex (myaddr, p, todo);
+      p += 2 * nr_bytes;
       break;
     case PACKET_SUPPORT_UNKNOWN:
-      internal_error ("remote_write_bytes: bad switch");
+      internal_error (__FILE__, __LINE__,
+                     "remote_write_bytes: bad internal state");
+    default:
+      internal_error (__FILE__, __LINE__, "bad switch");
     }
   
   putpkt_binary (buf, (int) (p - buf));
@@ -3524,10 +3736,7 @@ remote_write_bytes (CORE_ADDR memaddr, char *myaddr, int len)
    handling partial reads. */
 
 static int
-remote_read_bytes (memaddr, myaddr, len)
-     CORE_ADDR memaddr;
-     char *myaddr;
-     int len;
+remote_read_bytes (CORE_ADDR memaddr, char *myaddr, int len)
 {
   char *buf;
   int max_buf_size;            /* Max size of packet output buffer */
@@ -3575,14 +3784,11 @@ remote_read_bytes (memaddr, myaddr, len)
          each byte encoded as two hex characters.  */
 
       p = buf;
-      for (i = 0; i < todo; i++)
+      if ((i = hex2bin (p, myaddr, todo)) < todo)
        {
-         if (p[0] == 0 || p[1] == 0)
-           /* Reply is short.  This means that we were able to read
-              only part of what we wanted to.  */
-           return i + (origlen - len);
-         myaddr[i] = fromhex (p[0]) * 16 + fromhex (p[1]);
-         p += 2;
+         /* Reply is short.  This means that we were able to read
+            only part of what we wanted to. */
+         return i + (origlen - len);
        }
       myaddr += todo;
       memaddr += todo;
@@ -3594,30 +3800,29 @@ remote_read_bytes (memaddr, myaddr, len)
 /* Read or write LEN bytes from inferior memory at MEMADDR,
    transferring to or from debugger address BUFFER.  Write to inferior if
    SHOULD_WRITE is nonzero.  Returns length of data written or read; 0
-   for error.  */
-
-#ifndef REMOTE_TRANSLATE_XFER_ADDRESS
-#define REMOTE_TRANSLATE_XFER_ADDRESS(MEM_ADDR, MEM_LEN, TARG_ADDR, TARG_LEN) \
-   (*(TARG_ADDR) = (MEM_ADDR), *(TARG_LEN) = (MEM_LEN))
-#endif
+   for error.  TARGET is unused.  */
 
 /* ARGSUSED */
 static int
-remote_xfer_memory (mem_addr, buffer, mem_len, should_write, target)
-     CORE_ADDR mem_addr;
-     char *buffer;
-     int mem_len;
-     int should_write;
-     struct target_ops *target;        /* ignored */
+remote_xfer_memory (CORE_ADDR mem_addr, char *buffer, int mem_len,
+                   int should_write,
+                   struct mem_attrib *attrib ATTRIBUTE_UNUSED,
+                   struct target_ops *target)
 {
   CORE_ADDR targ_addr;
   int targ_len;
+  int res;
+
   REMOTE_TRANSLATE_XFER_ADDRESS (mem_addr, mem_len, &targ_addr, &targ_len);
   if (targ_len <= 0)
     return 0;
 
-  return dcache_xfer_memory (remote_dcache, targ_addr, buffer,
-                            targ_len, should_write);
+  if (should_write)
+    res = remote_write_bytes (targ_addr, buffer, targ_len);
+  else
+    res = remote_read_bytes (targ_addr, buffer, targ_len);
+
+  return res;
 }
 
 
@@ -3625,17 +3830,9 @@ remote_xfer_memory (mem_addr, buffer, mem_len, should_write, target)
 /* Enable after 4.12.  */
 
 void
-remote_search (len, data, mask, startaddr, increment, lorange, hirange
-              addr_found, data_found)
-     int len;
-     char *data;
-     char *mask;
-     CORE_ADDR startaddr;
-     int increment;
-     CORE_ADDR lorange;
-     CORE_ADDR hirange;
-     CORE_ADDR *addr_found;
-     char *data_found;
+remote_search (int len, char *data, char *mask, CORE_ADDR startaddr,
+              int increment, CORE_ADDR lorange, CORE_ADDR hirange,
+              CORE_ADDR *addr_found, char *data_found)
 {
   if (increment == -4 && len == 4)
     {
@@ -3696,8 +3893,7 @@ remote_search (len, data, mask, startaddr, increment, lorange, hirange
 #endif /* 0 */
 \f
 static void
-remote_files_info (ignore)
-     struct target_ops *ignore;
+remote_files_info (struct target_ops *ignore)
 {
   puts_filtered ("Debugging a target over a serial line.\n");
 }
@@ -3708,8 +3904,7 @@ remote_files_info (ignore)
 /* Read a single character from the remote end, masking it down to 7 bits. */
 
 static int
-readchar (timeout)
-     int timeout;
+readchar (int timeout)
 {
   int ch;
 
@@ -3751,8 +3946,7 @@ remote_send (char *buf,
    string notation.  */
 
 static void
-print_packet (buf)
-     char *buf;
+print_packet (char *buf)
 {
   puts_filtered ("\"");
   fputstr_filtered (buf, '"', gdb_stdout);
@@ -3760,8 +3954,7 @@ print_packet (buf)
 }
 
 int
-putpkt (buf)
-     char *buf;
+putpkt (char *buf)
 {
   return putpkt_binary (buf, strlen (buf));
 }
@@ -3772,9 +3965,7 @@ putpkt (buf)
    debugging (remote_debug) and want to print the sent packet as a string */
 
 static int
-putpkt_binary (buf, cnt)
-     char *buf;
-     int cnt;
+putpkt_binary (char *buf, int cnt)
 {
   int i;
   unsigned char csum = 0;
@@ -3855,9 +4046,11 @@ putpkt_binary (buf, cnt)
              break;            /* Retransmit buffer */
            case '$':
              {
+               if (remote_debug)
+                 fprintf_unfiltered (gdb_stdlog, "Packet instead of Ack, ignoring it\n");
                /* It's probably an old response, and we're out of sync.
                   Just gobble up the packet and ignore it.  */
-               getpkt (junkbuf, sizeof_junkbuf, 0);
+               read_frame (junkbuf, sizeof_junkbuf);
                continue;       /* Now, go look for + */
              }
            default:
@@ -3930,12 +4123,29 @@ read_frame (char *buf,
        case '#':
          {
            unsigned char pktcsum;
+           int check_0 = 0;
+           int check_1 = 0;
 
            buf[bc] = '\0';
 
-           pktcsum = fromhex (readchar (remote_timeout)) << 4;
-           pktcsum |= fromhex (readchar (remote_timeout));
+           check_0 = readchar (remote_timeout);
+           if (check_0 >= 0)
+             check_1 = readchar (remote_timeout);
+           
+           if (check_0 == SERIAL_TIMEOUT || check_1 == SERIAL_TIMEOUT)
+             {
+               if (remote_debug)
+                 fputs_filtered ("Timeout in checksum, retrying\n", gdb_stdlog);
+               return -1;
+             }
+           else if (check_0 < 0 || check_1 < 0)
+             {
+               if (remote_debug)
+                 fputs_filtered ("Communication error in checksum\n", gdb_stdlog);
+               return -1;
+             }
 
+           pktcsum = (fromhex (check_0) << 4) | fromhex (check_1);
            if (csum == pktcsum)
               return bc;
 
@@ -4035,7 +4245,7 @@ getpkt (char *buf,
    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. */
-int
+static int
 getpkt_sane (char *buf,
        long sizeof_buf,
        int forever)
@@ -4115,7 +4325,7 @@ getpkt_sane (char *buf,
 }
 \f
 static void
-remote_kill ()
+remote_kill (void)
 {
   /* For some mysterious reason, wait_for_inferior calls kill instead of
      mourn after it gets TARGET_WAITKIND_SIGNALLED.  Work around it.  */
@@ -4137,7 +4347,7 @@ remote_kill ()
 
 /* Async version of remote_kill. */
 static void
-remote_async_kill ()
+remote_async_kill (void)
 {
   /* Unregister the file descriptor from the event loop. */
   if (target_is_async_p ())
@@ -4162,19 +4372,19 @@ remote_async_kill ()
 }
 
 static void
-remote_mourn ()
+remote_mourn (void)
 {
   remote_mourn_1 (&remote_ops);
 }
 
 static void
-remote_async_mourn ()
+remote_async_mourn (void)
 {
   remote_mourn_1 (&remote_async_ops);
 }
 
 static void
-extended_remote_mourn ()
+extended_remote_mourn (void)
 {
   /* We do _not_ want to mourn the target like this; this will
      remove the extended remote target  from the target stack,
@@ -4188,8 +4398,7 @@ extended_remote_mourn ()
 
 /* Worker function for remote_mourn.  */
 static void
-remote_mourn_1 (target)
-     struct target_ops *target;
+remote_mourn_1 (struct target_ops *target)
 {
   unpush_target (target);
   generic_mourn_inferior ();
@@ -4203,10 +4412,7 @@ remote_mourn_1 (target)
    we're debugging, arguments and an environment.  */
 
 static void
-extended_remote_create_inferior (exec_file, args, env)
-     char *exec_file;
-     char *args;
-     char **env;
+extended_remote_create_inferior (char *exec_file, char *args, char **env)
 {
   /* Rip out the breakpoints; we'll reinsert them after restarting
      the remote server.  */
@@ -4228,10 +4434,7 @@ extended_remote_create_inferior (exec_file, args, env)
 
 /* Async version of extended_remote_create_inferior. */
 static void
-extended_remote_async_create_inferior (exec_file, args, env)
-     char *exec_file;
-     char *args;
-     char **env;
+extended_remote_async_create_inferior (char *exec_file, char *args, char **env)
 {
   /* Rip out the breakpoints; we'll reinsert them after restarting
      the remote server.  */
@@ -4294,22 +4497,19 @@ static unsigned char little_break_insn[] = LITTLE_REMOTE_BREAKPOINT;
    is accomplished via BREAKPOINT_MAX).  */
 
 static int
-remote_insert_breakpoint (addr, contents_cache)
-     CORE_ADDR addr;
-     char *contents_cache;
+remote_insert_breakpoint (CORE_ADDR addr, char *contents_cache)
 {
 #ifdef REMOTE_BREAKPOINT
   int val;
 #endif  
   int bp_size;
 
-  /* Try the "Z" packet if it is not already disabled.
-     If it succeeds, then set the support to PACKET_ENABLE.
-     If it fails, and the user has explicitly requested the Z support 
-     then report an error, otherwise, mark it disabled and go on. */
+  /* 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
+     fails, and the user has explicitly requested the Z support then
+     report an error, otherwise, mark it disabled and go on. */
   
-  if ((remote_protocol_Z.support == PACKET_ENABLE)
-      || (remote_protocol_Z.support == PACKET_SUPPORT_UNKNOWN)) 
+  if (remote_protocol_Z[Z_PACKET_SOFTWARE_BP].support != PACKET_DISABLE)
     {
       char *buf = alloca (PBUFSIZ);
       char *p = buf;
@@ -4325,24 +4525,14 @@ remote_insert_breakpoint (addr, contents_cache)
       putpkt (buf);
       getpkt (buf, PBUFSIZ, 0);
 
-      if (buf[0] != '\0')
-       {
-         remote_protocol_Z.support = PACKET_ENABLE;
-         return (buf[0] == 'E');
-       }
-      
-      /* The stub does not support the 'Z' request.  If the user has
-         explicitly requested the Z support, or if the stub previously
-        said it supported the packet, this is an error,
-         otherwise, mark it disabled. */
-      
-      else if (remote_protocol_Z.support == PACKET_ENABLE)
-       {
-         error ("Protocol error: Z packet not recognized by stub");
-       }
-      else
+      switch (packet_ok (buf, &remote_protocol_Z[Z_PACKET_SOFTWARE_BP]))
        {
-         remote_protocol_Z.support = PACKET_DISABLE;
+       case PACKET_ERROR:
+         return -1;
+       case PACKET_OK:
+         return 0;
+       case PACKET_UNKNOWN:
+         break;
        }
     }
 
@@ -4366,14 +4556,11 @@ remote_insert_breakpoint (addr, contents_cache)
 }
 
 static int
-remote_remove_breakpoint (addr, contents_cache)
-     CORE_ADDR addr;
-     char *contents_cache;
+remote_remove_breakpoint (CORE_ADDR addr, char *contents_cache)
 {
   int bp_size;
 
-  if ((remote_protocol_Z.support == PACKET_ENABLE)
-      || (remote_protocol_Z.support == PACKET_SUPPORT_UNKNOWN))
+  if (remote_protocol_Z[Z_PACKET_SOFTWARE_BP].support != PACKET_DISABLE)
     {
       char *buf = alloca (PBUFSIZ);
       char *p = buf;
@@ -4400,20 +4587,42 @@ remote_remove_breakpoint (addr, contents_cache)
 #endif /* REMOTE_BREAKPOINT */
 }
 
-#ifdef TARGET_HAS_HARDWARE_WATCHPOINTS
+static int
+watchpoint_to_Z_packet (int type)
+{
+  switch (type)
+    {
+    case hw_write:
+      return 2;
+      break;
+    case hw_read:
+      return 3;
+      break;
+    case hw_access:
+      return 4;
+      break;
+    default:
+      internal_error (__FILE__, __LINE__,
+                     "hw_bp_to_z: bad watchpoint type %d", type);
+    }
+}
+
+/* FIXME: This function should be static and a member of the remote
+   target vector. */
+
 int
-remote_insert_watchpoint (addr, len, type)
-     CORE_ADDR addr;
-     int len;
-     int type;
+remote_insert_watchpoint (CORE_ADDR addr, int len, int type)
 {
   char *buf = alloca (PBUFSIZ);
   char *p;
+  enum Z_packet_type packet = watchpoint_to_Z_packet (type);
 
-  if (remote_protocol_Z.support == PACKET_DISABLE)
-    error ("Can't set hardware watchpoints without the 'Z' packet\n");
+  if (remote_protocol_Z[packet].support == PACKET_DISABLE)
+    error ("Can't set hardware watchpoints without the '%s' (%s) packet\n",
+          remote_protocol_Z[packet].name,
+          remote_protocol_Z[packet].title);
   
-  sprintf (buf, "Z%x,", type + 2 );
+  sprintf (buf, "Z%x,", packet);
   p = strchr (buf, '\0');
   addr = remote_address_masked (addr);
   p += hexnumstr (p, (ULONGEST) addr);
@@ -4422,22 +4631,34 @@ remote_insert_watchpoint (addr, len, type)
   putpkt (buf);
   getpkt (buf, PBUFSIZ, 0);
 
-  if (buf[0] == '\0' || buf [0] == 'E')
-    return -1;
-
-  return 0;
+  switch (packet_ok (buf, &remote_protocol_Z[packet]))
+    {
+    case PACKET_ERROR:
+    case PACKET_UNKNOWN:
+      return -1;
+    case PACKET_OK:
+      return 0;
+    }
+  internal_error (__FILE__, __LINE__,
+                 "remote_insert_watchpoint: reached end of function");
 }
 
+/* FIXME: This function should be static and a member of the remote
+   target vector. */
+
 int
-remote_remove_watchpoint (addr, len, type)
-     CORE_ADDR addr;
-     int len;
-     int type;
+remote_remove_watchpoint (CORE_ADDR addr, int len, int type)
 {
   char *buf = alloca (PBUFSIZ);
   char *p;
+  enum Z_packet_type packet = watchpoint_to_Z_packet (type);
+
+  if (remote_protocol_Z[packet].support == PACKET_DISABLE)
+    error ("Can't clear hardware watchpoints without the '%s' (%s) packet\n",
+          remote_protocol_Z[packet].name,
+          remote_protocol_Z[packet].title);
   
-  sprintf (buf, "z%x,", type + 2 );
+  sprintf (buf, "z%x,", packet);
   p = strchr (buf, '\0');
   addr = remote_address_masked (addr);
   p += hexnumstr (p, (ULONGEST) addr);
@@ -4445,65 +4666,91 @@ remote_remove_watchpoint (addr, len, type)
   putpkt (buf);
   getpkt (buf, PBUFSIZ, 0);
 
-  if (buf[0] == '\0' || buf [0] == 'E')
-    return -1;
-
-  return 0;
+  switch (packet_ok (buf, &remote_protocol_Z[packet]))
+    {
+    case PACKET_ERROR:
+    case PACKET_UNKNOWN:
+      return -1;
+    case PACKET_OK:
+      return 0;
+    }
+  internal_error (__FILE__, __LINE__,
+                 "remote_remove_watchpoint: reached end of function");
 }
 
+/* FIXME: This function should be static and a member of the remote
+   target vector. */
+
 int
-remote_insert_hw_breakpoint (addr, len)
-     CORE_ADDR addr;
-     int len;
+remote_insert_hw_breakpoint (CORE_ADDR addr, int len)
 {
   char *buf = alloca (PBUFSIZ);
   char *p = buf;
       
-  if (remote_protocol_Z.support == PACKET_DISABLE)
-    error ("Can't set hardware breakpoints without the 'Z' packet\n");
-
+  if (remote_protocol_Z[Z_PACKET_HARDWARE_BP].support == PACKET_DISABLE)
+    error ("Can't set hardware breakpoint without the '%s' (%s) packet\n",
+          remote_protocol_Z[Z_PACKET_HARDWARE_BP].name,
+          remote_protocol_Z[Z_PACKET_HARDWARE_BP].title);
+  
   *(p++) = 'Z';
   *(p++) = '1';
   *(p++) = ',';
   
   addr = remote_address_masked (addr);
   p += hexnumstr (p, (ULONGEST) addr);
-  *p = '\0';
+  sprintf (p, ",%x", len);
 
   putpkt (buf);
   getpkt (buf, PBUFSIZ, 0);
 
-  if (buf[0] == '\0' || buf [0] == 'E')
-    return -1;
-
-  return 0;
+  switch (packet_ok (buf, &remote_protocol_Z[Z_PACKET_HARDWARE_BP]))
+    {
+    case PACKET_ERROR:
+    case PACKET_UNKNOWN:
+      return -1;
+    case PACKET_OK:
+      return 0;
+    }
+  internal_error (__FILE__, __LINE__,
+                 "remote_remove_watchpoint: reached end of function");
 }
 
+/* FIXME: This function should be static and a member of the remote
+   target vector. */
+
 int 
-remote_remove_hw_breakpoint (addr, len)
-     CORE_ADDR addr;
-     int len;
+remote_remove_hw_breakpoint (CORE_ADDR addr, int len)
 {
   char *buf = alloca (PBUFSIZ);
   char *p = buf;
   
+  if (remote_protocol_Z[Z_PACKET_HARDWARE_BP].support == PACKET_DISABLE)
+    error ("Can't clear hardware breakpoint without the '%s' (%s) packet\n",
+          remote_protocol_Z[Z_PACKET_HARDWARE_BP].name,
+          remote_protocol_Z[Z_PACKET_HARDWARE_BP].title);
+  
   *(p++) = 'z';
   *(p++) = '1';
   *(p++) = ',';
   
   addr = remote_address_masked (addr);
   p += hexnumstr (p, (ULONGEST) addr);
-  *p = '\0';
+  sprintf (p, ",%x", len);
 
   putpkt(buf);
   getpkt (buf, PBUFSIZ, 0);
   
-  if (buf[0] == '\0' || buf [0] == 'E')
-    return -1;
-
-  return 0;
+  switch (packet_ok (buf, &remote_protocol_Z[Z_PACKET_HARDWARE_BP]))
+    {
+    case PACKET_ERROR:
+    case PACKET_UNKNOWN:
+      return -1;
+    case PACKET_OK:
+      return 0;
+    }
+  internal_error (__FILE__, __LINE__,
+                 "remote_remove_watchpoint: reached end of function");
 }
-#endif
 
 /* Some targets are only capable of doing downloads, and afterwards
    they switch to the remote serial protocol.  This function provides
@@ -4516,9 +4763,7 @@ remote_remove_hw_breakpoint (addr, len)
    already..." message.  Usually a call to pop_target() suffices.  */
 
 void
-push_remote_target (name, from_tty)
-     char *name;
-     int from_tty;
+push_remote_target (char *name, int from_tty)
 {
   printf_filtered ("Switching to remote protocol\n");
   remote_open (name, from_tty);
@@ -4528,11 +4773,8 @@ push_remote_target (name, from_tty)
    certain remote_ops overridden. */
 
 void
-open_remote_target (name, from_tty, target, extended_p)
-     char *name;
-     int from_tty;
-     struct target_ops *target;
-     int extended_p;
+open_remote_target (char *name, int from_tty, struct target_ops *target,
+                   int extended_p)
 {
   printf_filtered ("Selecting the %sremote protocol\n",
                   (extended_p ? "extended-" : ""));
@@ -4545,10 +4787,7 @@ static unsigned long crc32_table[256] =
 {0, 0};
 
 static unsigned long
-crc32 (buf, len, crc)
-     unsigned char *buf;
-     int len;
-     unsigned int crc;
+crc32 (unsigned char *buf, int len, unsigned int crc)
 {
   if (!crc32_table[1])
     {
@@ -4585,9 +4824,7 @@ crc32 (buf, len, crc)
    generic_load()) to make use of this target functionality. */
 
 static void
-compare_sections_command (args, from_tty)
-     char *args;
-     int from_tty;
+compare_sections_command (char *args, int from_tty)
 {
   asection *s;
   unsigned long host_crc, target_crc;
@@ -4595,7 +4832,7 @@ compare_sections_command (args, from_tty)
   struct cleanup *old_chain;
   char *tmp;
   char *sectdata;
-  char *sectname;
+  const char *sectname;
   char *buf = alloca (PBUFSIZ);
   bfd_size_type size;
   bfd_vma lma;
@@ -4617,7 +4854,7 @@ compare_sections_command (args, from_tty)
       if (size == 0)
        continue;               /* skip zero-length section */
 
-      sectname = (char *) bfd_get_section_name (exec_bfd, s);
+      sectname = bfd_get_section_name (exec_bfd, s);
       if (args && strcmp (args, sectname) != 0)
        continue;               /* not the section selected by user */
 
@@ -4629,7 +4866,7 @@ compare_sections_command (args, from_tty)
 
       /* be clever; compute the host_crc before waiting for target reply */
       sectdata = xmalloc (size);
-      old_chain = make_cleanup (free, sectdata);
+      old_chain = make_cleanup (xfree, sectdata);
       bfd_get_section_contents (exec_bfd, s, sectdata, 0, size);
       host_crc = crc32 ((unsigned char *) sectdata, size, 0xffffffff);
 
@@ -4663,11 +4900,7 @@ the loaded file\n");
 }
 
 static int
-remote_query (query_type, buf, outbuf, bufsiz)
-     int query_type;
-     char *buf;
-     char *outbuf;
-     int *bufsiz;
+remote_query (int query_type, char *buf, char *outbuf, int *bufsiz)
 {
   int i;
   char *buf2 = alloca (PBUFSIZ);
@@ -4755,12 +4988,7 @@ remote_rcmd (char *command,
     error ("\"monitor\" command ``%s'' is too long\n", command);
 
   /* Encode the actual command */
-  for (i = 0; command[i]; i++)
-    {
-      *p++ = tohex ((command[i] >> 4) & 0xf);
-      *p++ = tohex (command[i] & 0xf);
-    }
-  *p = '\0';
+  bin2hex (command, p, 0);
 
   if (putpkt (buf) < 0)
     error ("Communication problem with target\n");
@@ -4795,9 +5023,7 @@ remote_rcmd (char *command,
 }
 
 static void
-packet_command (args, from_tty)
-     char *args;
-     int from_tty;
+packet_command (char *args, int from_tty)
 {
   char *buf = alloca (PBUFSIZ);
 
@@ -4821,30 +5047,28 @@ packet_command (args, from_tty)
 #if 0
 /* --------- UNIT_TEST for THREAD oriented PACKETS ------------------------- */
 
-static void display_thread_info PARAMS ((struct gdb_ext_thread_info * info));
+static void display_thread_info (struct gdb_ext_thread_info *info);
 
-static void threadset_test_cmd PARAMS ((char *cmd, int tty));
+static void threadset_test_cmd (char *cmd, int tty);
 
-static void threadalive_test PARAMS ((char *cmd, int tty));
+static void threadalive_test (char *cmd, int tty);
 
-static void threadlist_test_cmd PARAMS ((char *cmd, int tty));
+static void threadlist_test_cmd (char *cmd, int tty);
 
-int get_and_display_threadinfo PARAMS ((threadref * ref));
+int get_and_display_threadinfo (threadref * ref);
 
-static void threadinfo_test_cmd PARAMS ((char *cmd, int tty));
+static void threadinfo_test_cmd (char *cmd, int tty);
 
-static int thread_display_step PARAMS ((threadref * ref, void *context));
+static int thread_display_step (threadref * ref, void *context);
 
-static void threadlist_update_test_cmd PARAMS ((char *cmd, int tty));
+static void threadlist_update_test_cmd (char *cmd, int tty);
 
-static void init_remote_threadtests PARAMS ((void));
+static void init_remote_threadtests (void);
 
 #define SAMPLE_THREAD  0x05060708      /* Truncated 64 bit threadid */
 
 static void
-threadset_test_cmd (cmd, tty)
-     char *cmd;
-     int tty;
+threadset_test_cmd (char *cmd, int tty)
 {
   int sample_thread = SAMPLE_THREAD;
 
@@ -4854,24 +5078,20 @@ threadset_test_cmd (cmd, tty)
 
 
 static void
-threadalive_test (cmd, tty)
-     char *cmd;
-     int tty;
+threadalive_test (char *cmd, int tty)
 {
   int sample_thread = SAMPLE_THREAD;
 
-  if (remote_thread_alive (sample_thread))
+  if (remote_thread_alive (pid_to_ptid (sample_thread)))
     printf_filtered ("PASS: Thread alive test\n");
   else
     printf_filtered ("FAIL: Thread alive test\n");
 }
 
-void output_threadid PARAMS ((char *title, threadref * ref));
+void output_threadid (char *title, threadref * ref);
 
 void
-output_threadid (title, ref)
-     char *title;
-     threadref *ref;
+output_threadid (char *title, threadref *ref)
 {
   char hexid[20];
 
@@ -4881,9 +5101,7 @@ output_threadid (title, ref)
 }
 
 static void
-threadlist_test_cmd (cmd, tty)
-     char *cmd;
-     int tty;
+threadlist_test_cmd (char *cmd, int tty)
 {
   int startflag = 1;
   threadref nextthread;
@@ -4905,8 +5123,7 @@ threadlist_test_cmd (cmd, tty)
 }
 
 void
-display_thread_info (info)
-     struct gdb_ext_thread_info *info;
+display_thread_info (struct gdb_ext_thread_info *info)
 {
   output_threadid ("Threadid: ", &info->threadid);
   printf_filtered ("Name: %s\n ", info->shortname);
@@ -4915,8 +5132,7 @@ display_thread_info (info)
 }
 
 int
-get_and_display_threadinfo (ref)
-     threadref *ref;
+get_and_display_threadinfo (threadref *ref)
 {
   int result;
   int set;
@@ -4930,9 +5146,7 @@ get_and_display_threadinfo (ref)
 }
 
 static void
-threadinfo_test_cmd (cmd, tty)
-     char *cmd;
-     int tty;
+threadinfo_test_cmd (char *cmd, int tty)
 {
   int athread = SAMPLE_THREAD;
   threadref thread;
@@ -4945,18 +5159,14 @@ threadinfo_test_cmd (cmd, tty)
 }
 
 static int
-thread_display_step (ref, context)
-     threadref *ref;
-     void *context;
+thread_display_step (threadref *ref, void *context)
 {
   /* output_threadid(" threadstep ",ref); *//* simple test */
   return get_and_display_threadinfo (ref);
 }
 
 static void
-threadlist_update_test_cmd (cmd, tty)
-     char *cmd;
-     int tty;
+threadlist_update_test_cmd (char *cmd, int tty)
 {
   printf_filtered ("Remote Threadlist update test\n");
   remote_threadlist_iterator (thread_display_step, 0, CRAZY_MAX_THREADS);
@@ -4979,8 +5189,20 @@ init_remote_threadtests (void)
 
 #endif /* 0 */
 
+/* Convert a thread ID to a string.  Returns the string in a static
+   buffer.  */
+
+static char *
+remote_pid_to_str (ptid_t ptid)
+{
+  static char buf[30];
+
+  sprintf (buf, "Thread %d", PIDGET (ptid));
+  return buf;
+}
+
 static void
-init_remote_ops ()
+init_remote_ops (void)
 {
   remote_ops.to_shortname = "remote";
   remote_ops.to_longname = "Remote serial target in gdb-specific protocol";
@@ -5006,6 +5228,7 @@ Specify the serial device it is connected to\n\
   remote_ops.to_thread_alive = remote_thread_alive;
   remote_ops.to_find_new_threads = remote_threads_info;
   remote_ops.to_extra_thread_info = remote_threads_extra_info;
+  remote_ops.to_pid_to_str = remote_pid_to_str;
   remote_ops.to_stop = remote_stop;
   remote_ops.to_query = remote_query;
   remote_ops.to_rcmd = remote_rcmd;
@@ -5023,7 +5246,7 @@ Specify the serial device it is connected to\n\
    remote vector and adding to it.  */
 
 static void
-init_extended_remote_ops ()
+init_extended_remote_ops (void)
 {
   extended_remote_ops = remote_ops;
 
@@ -5096,8 +5319,6 @@ device is attached to the remote system (e.g. host:port).");
 
   unpush_target (&remote_cisco_ops);
 
-  remote_dcache = dcache_init (remote_read_bytes, remote_write_bytes);
-
   remote_desc = SERIAL_OPEN (name);
   if (!remote_desc)
     perror_with_name (name);
@@ -5132,16 +5353,11 @@ device is attached to the remote system (e.g. host:port).");
 
   push_target (&remote_cisco_ops);     /* Switch to using cisco target now */
 
-  init_packet_config (&remote_protocol_P);
-  init_packet_config (&remote_protocol_Z);
+  init_all_packet_configs ();
 
   general_thread = -2;
   continue_thread = -2;
 
-  /* Force remote_write_bytes to check whether target supports
-     binary downloading. */
-  init_packet_config (&remote_protocol_binary_download);
-
   /* Probe for ability to use "ThreadInfo" query, as required.  */
   use_threadinfo_query = 1;
   use_threadextra_query = 1;
@@ -5152,7 +5368,7 @@ device is attached to the remote system (e.g. host:port).");
      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_pid = MAGIC_NULL_PID;
+  inferior_ptid = pid_to_ptid (MAGIC_NULL_PID);
 
   /* Start the remote connection; if error (0), discard this target. */
 
@@ -5173,8 +5389,7 @@ remote_cisco_close (int quitting)
 }
 
 static void
-  remote_cisco_mourn
-PARAMS ((void))
+remote_cisco_mourn (void)
 {
   remote_mourn_1 (&remote_cisco_ops);
 }
@@ -5385,19 +5600,19 @@ minitelnet (void)
     }
 }
 
-static int
-remote_cisco_wait (int pid, struct target_waitstatus *status)
+static ptid_t
+remote_cisco_wait (ptid_t ptid, struct target_waitstatus *status)
 {
   if (minitelnet () != ENTER_DEBUG)
     {
       error ("Debugging session terminated by protocol error");
     }
   putpkt ("?");
-  return remote_wait (pid, status);
+  return remote_wait (ptid, status);
 }
 
 static void
-init_remote_cisco_ops ()
+init_remote_cisco_ops (void)
 {
   remote_cisco_ops.to_shortname = "cisco";
   remote_cisco_ops.to_longname = "Remote serial target in cisco-specific protocol";
@@ -5465,7 +5680,8 @@ static void
 remote_async (void (*callback) (enum inferior_event_type event_type, void *context), void *context)
 {
   if (current_target.to_async_mask_value == 0)
-    internal_error ("Calling remote_async when async is masked");
+    internal_error (__FILE__, __LINE__,
+                   "Calling remote_async when async is masked");
 
   if (callback != NULL)
     {
@@ -5550,22 +5766,49 @@ Specify the serial device it is connected to (e.g. /dev/ttya).",
 static void
 set_remote_cmd (char *args, int from_tty)
 {
-  
 }
 
+static void
+show_remote_cmd (char *args, int from_tty)
+{
+  
+  show_remote_protocol_Z_packet_cmd (args, from_tty);
+  show_remote_protocol_e_packet_cmd (args, from_tty);
+  show_remote_protocol_E_packet_cmd (args, from_tty);
+  show_remote_protocol_P_packet_cmd (args, from_tty);
+  show_remote_protocol_qSymbol_packet_cmd (args, from_tty);
+  show_remote_protocol_binary_download_cmd (args, from_tty);
+}
 
 static void
-build_remote_gdbarch_data ()
+build_remote_gdbarch_data (void)
 {
   build_remote_packet_sizes ();
 
   /* Cisco stuff */
   tty_input = xmalloc (PBUFSIZ);
-  remote_address_size = TARGET_PTR_BIT;
+  remote_address_size = TARGET_ADDR_BIT;
+}
+
+/* Saved pointer to previous owner of the new_objfile event. */
+static void (*remote_new_objfile_chain) (struct objfile *);
+
+/* Function to be called whenever a new objfile (shlib) is detected. */
+static void
+remote_new_objfile (struct objfile *objfile)
+{
+  if (remote_desc != 0)                /* Have a remote connection */
+    {
+      remote_check_symbols (objfile);
+    }
+  /* Call predecessor on chain, if any. */
+  if (remote_new_objfile_chain != 0 &&
+      remote_desc == 0)
+    remote_new_objfile_chain (objfile);
 }
 
 void
-_initialize_remote ()
+_initialize_remote (void)
 {
   static struct cmd_list_element *remote_set_cmdlist;
   static struct cmd_list_element *remote_show_cmdlist;
@@ -5594,17 +5837,23 @@ _initialize_remote ()
   init_remote_cisco_ops ();
   add_target (&remote_cisco_ops);
 
+  /* Hook into new objfile notification.  */
+  remote_new_objfile_chain = target_new_objfile_hook;
+  target_new_objfile_hook  = remote_new_objfile;
+
 #if 0
   init_remote_threadtests ();
 #endif
 
+  /* set/show remote ... */
+
   add_prefix_cmd ("remote", class_maintenance, set_remote_cmd, "\
 Remote protocol specific variables\n\
 Configure various remote-protocol specific variables such as\n\
 the packets being used",
                  &remote_set_cmdlist, "set remote ",
                  0/*allow-unknown*/, &setlist);
-  add_prefix_cmd ("remote", class_maintenance, set_remote_cmd, "\
+  add_prefix_cmd ("remote", class_maintenance, show_remote_cmd, "\
 Remote protocol specific variables\n\
 Configure various remote-protocol specific variables such as\n\
 the packets being used",
@@ -5637,7 +5886,7 @@ terminating `#' character and checksum.",
   add_cmd ("remotewritesize", no_class, set_memory_write_packet_size,
           "Set the maximum number of bytes per memory write packet (deprecated).\n",
           &setlist);
-  add_cmd ("remotewritesize", no_class, set_memory_write_packet_size,
+  add_cmd ("remotewritesize", no_class, show_memory_write_packet_size,
           "Show the maximum number of bytes per memory write packet (deprecated).\n",
           &showlist);
   add_cmd ("memory-write-packet-size", no_class,
@@ -5677,7 +5926,8 @@ in a memory packet.\n",
                         "X", "binary-download",
                         set_remote_protocol_binary_download_cmd,
                         show_remote_protocol_binary_download_cmd,
-                        &remote_set_cmdlist, &remote_show_cmdlist);
+                        &remote_set_cmdlist, &remote_show_cmdlist,
+                        1);
 #if 0
   /* XXXX - should ``set remotebinarydownload'' be retained for
      compatibility. */
@@ -5691,13 +5941,76 @@ in a memory packet.\n",
   add_info ("remote-process", remote_info_process,
            "Query the remote system for process info.");
 
-  add_packet_config_cmd (&remote_protocol_P, "P", "set-register",
+  add_packet_config_cmd (&remote_protocol_qSymbol,
+                        "qSymbol", "symbol-lookup",
+                        set_remote_protocol_qSymbol_packet_cmd,
+                        show_remote_protocol_qSymbol_packet_cmd,
+                        &remote_set_cmdlist, &remote_show_cmdlist,
+                        0);
+
+  add_packet_config_cmd (&remote_protocol_e,
+                        "e", "step-over-range",
+                        set_remote_protocol_e_packet_cmd,
+                        show_remote_protocol_e_packet_cmd,
+                        &remote_set_cmdlist, &remote_show_cmdlist,
+                        0);
+
+  add_packet_config_cmd (&remote_protocol_E,
+                        "E", "step-over-range-w-signal",
+                        set_remote_protocol_E_packet_cmd,
+                        show_remote_protocol_E_packet_cmd,
+                        &remote_set_cmdlist, &remote_show_cmdlist,
+                        0);
+
+  add_packet_config_cmd (&remote_protocol_P,
+                        "P", "set-register",
                         set_remote_protocol_P_packet_cmd,
                         show_remote_protocol_P_packet_cmd,
-                        &remote_set_cmdlist, &remote_show_cmdlist);
-
-  add_packet_config_cmd (&remote_protocol_Z, "Z", "breakpoint",
-                        set_remote_protocol_Z_packet_cmd,
-                        show_remote_protocol_Z_packet_cmd,
-                        &remote_set_cmdlist, &remote_show_cmdlist);
+                        &remote_set_cmdlist, &remote_show_cmdlist,
+                        1);
+
+  add_packet_config_cmd (&remote_protocol_Z[Z_PACKET_SOFTWARE_BP],
+                        "Z0", "software-breakpoint",
+                        set_remote_protocol_Z_software_bp_packet_cmd,
+                        show_remote_protocol_Z_software_bp_packet_cmd,
+                        &remote_set_cmdlist, &remote_show_cmdlist,
+                        0);
+
+  add_packet_config_cmd (&remote_protocol_Z[Z_PACKET_HARDWARE_BP],
+                        "Z1", "hardware-breakpoint",
+                        set_remote_protocol_Z_hardware_bp_packet_cmd,
+                        show_remote_protocol_Z_hardware_bp_packet_cmd,
+                        &remote_set_cmdlist, &remote_show_cmdlist,
+                        0);
+
+  add_packet_config_cmd (&remote_protocol_Z[Z_PACKET_WRITE_WP],
+                        "Z2", "write-watchpoint",
+                        set_remote_protocol_Z_write_wp_packet_cmd,
+                        show_remote_protocol_Z_write_wp_packet_cmd,
+                        &remote_set_cmdlist, &remote_show_cmdlist,
+                        0);
+
+  add_packet_config_cmd (&remote_protocol_Z[Z_PACKET_READ_WP],
+                        "Z3", "read-watchpoint",
+                        set_remote_protocol_Z_read_wp_packet_cmd,
+                        show_remote_protocol_Z_read_wp_packet_cmd,
+                        &remote_set_cmdlist, &remote_show_cmdlist,
+                        0);
+
+  add_packet_config_cmd (&remote_protocol_Z[Z_PACKET_ACCESS_WP],
+                        "Z4", "access-watchpoint",
+                        set_remote_protocol_Z_access_wp_packet_cmd,
+                        show_remote_protocol_Z_access_wp_packet_cmd,
+                        &remote_set_cmdlist, &remote_show_cmdlist,
+                        0);
+
+  /* Keep the old ``set remote Z-packet ...'' working. */
+  tmpcmd = add_set_auto_boolean_cmd ("Z-packet", class_obscure,
+                                    &remote_Z_packet_detect,
+                                    "\
+Set use of remote protocol `Z' packets", &remote_set_cmdlist);
+  tmpcmd->function.sfunc = set_remote_protocol_Z_packet_cmd;
+  add_cmd ("Z-packet", class_obscure, show_remote_protocol_Z_packet_cmd,
+          "Show use of remote protocol `Z' packets ",
+          &remote_show_cmdlist);
 }
This page took 0.0702 seconds and 4 git commands to generate.