Re-implement ``set/show remote Z-packet ...'' commands so that each Z
authorAndrew Cagney <cagney@redhat.com>
Fri, 4 Aug 2000 09:32:19 +0000 (09:32 +0000)
committerAndrew Cagney <cagney@redhat.com>
Fri, 4 Aug 2000 09:32:19 +0000 (09:32 +0000)
packet sub-type can be explicitly controled.

gdb/ChangeLog
gdb/TODO
gdb/remote.c

index 093750203a8e267bd129f3db5f06a780af33ce32..82f34a48912bbd98c5da8eea6559db577f48ae10 100644 (file)
@@ -1,3 +1,41 @@
+Fri Aug  4 18:00:41 2000  Andrew Cagney  <cagney@b1.cygnus.com>
+
+       * remote.c (enum Z_packet_type): Define.
+       (remote_protocol_Z): Change to an array of size NR_Z_PACKET_TYPES.
+       (remote_insert_watchpoint): Check watchpoint type.
+       (watchpoint_to_Z_packet): New function.
+       (enum packet_result): Define.
+       (packet_ok): New function. Return enum packet_result.
+       (init_all_packet_configs): New function.
+       (remote_open_1, remote_async_open_1, remote_cisco_open): Use
+       init_all_packet_configs instead of initializing remote_protocol_P,
+       remote_protocol_Z, remote_protocol_binary_download separatly.
+       (remote_remove_hw_breakpoint, remote_insert_hw_breakpoint,
+       remote_remove_watchpoint, remote_insert_watchpoint): Use
+       watchpoint_to_Z_packet and packet_ok.  Remove #ifdef
+       TARGET_HAS_HARDWARE_WATCHPOINTS.
+       (set_remote_protocol_Z_software_bp_packet_cmd,
+       show_remote_protocol_Z_software_bp_packet_cmd,
+       set_remote_protocol_Z_hardware_bp_packet_cmd,
+       show_remote_protocol_Z_hardware_bp_packet_cmd,
+       set_remote_protocol_Z_write_wp_packet_cmd,
+       show_remote_protocol_Z_write_wp_packet_cmd,
+       set_remote_protocol_Z_read_wp_packet_cmd,
+       show_remote_protocol_Z_read_wp_packet_cmd,
+       set_remote_protocol_Z_access_wp_packet_cmd,
+       show_remote_protocol_Z_access_wp_packet_cmd): New functions.
+       (remote_Z_packet_packet_detect): New variable.
+       (show_remote_protocol_Z_packet_cmd,
+       set_remote_protocol_Z_packet_cmd): Iterate over all ``Z'' packet
+       variants.
+       (add_packet_config_cmd): Add argument legacy.  Change syntax to
+       ``set/show remote FULL_NAME-packet ...'' command.  Add ``set/show
+       remote XXX-packet ...'' command using add_alias_cmd when legacy.
+       (set_packet_config_cmd): Delete.
+       (show_remote_cmd): New function.
+       
+       * TODO: Update.
+
 Fri Aug  4 14:05:57 2000  Andrew Cagney  <cagney@b1.cygnus.com>
 
        * Makefile.in (infodir, SER_HARDWIRE): Fix merge problems from
index 17b645100d4edb07871e36ed56fcd2ac7843ea02..633ac79bdb0fe5b0f96b5214654528863e27aa85 100644 (file)
--- a/gdb/TODO
+++ b/gdb/TODO
@@ -496,6 +496,11 @@ A brief summary of what happended is that sim/common/sim-break.c was
 created as a good idea.  It turned out a better idea was to use
 SIM_SIGBREAK and have GDB pass back sim_resume (..., SIGBREAK).
 
+--
+
+Move remote_remove_hw_breakpoint, remote_insert_hw_breakpoint,
+remote_remove_watchpoint, remote_insert_watchpoint into target vector.
+
 --
 
                        New Features and Fixes
@@ -751,7 +756,7 @@ ignored and a timeout is required before GDB retries.  A pre-cursor to
 fixing this this is making GDB's remote protocol packet more robust.
 
 While downloading to a remote protocol target, gdb ignores packet
-errors in so far as it will continue to edownload with chunk N+1 even
+errors in so far as it will continue to download with chunk N+1 even
 if chunk N was not correctly sent.  This causes gdb.base/remote.exp to
 take a painfully long time to run.  As a PS that test needs to be
 fixed so that it builds on 16 bit machines.
@@ -776,11 +781,6 @@ target endianess changes gdb doesn't know.
 
 --
 
-Use the recently added add_set_auto_boolean_cmd() function to
-implement the X-packet commands.
-
---
-
 Rename read_register{,_pid}() to read_unsigned_register{,_pid}().
 
 --
index 317954f548d0baee19ed16134b225a4d889031fd..8c3d694565ce6e53b7dc97b4ce8396a3f5f9c49f 100644 (file)
@@ -194,36 +194,7 @@ struct packet_config;
 
 static void show_packet_config_cmd (struct packet_config *config);
 
-static void set_packet_config_cmd (struct packet_config *config,
-                                  struct cmd_list_element *c);
-
-static void 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 **setlist,
-                                  struct cmd_list_element **showlist);
-
-static void init_packet_config (struct packet_config *config);
-
-static void set_remote_protocol_P_packet_cmd (char *args,
-                                             int from_tty,
-                                             struct cmd_list_element *c);
-
-static void show_remote_protocol_P_packet_cmd (char *args, int from_tty);
-
-static void set_remote_protocol_Z_packet_cmd (char *args,
-                                             int from_tty,
-                                             struct cmd_list_element *c);
-
-static void show_remote_protocol_Z_packet_cmd (char *args, int from_tty);
-
-
-
+static void update_packet_config (struct packet_config *config);
 
 /* Define the target subroutine names */
 
@@ -526,10 +497,31 @@ struct packet_config
     enum packet_support support;
   };
 
+/* Analyze a packet's return value and update the packet config
+   accordingly. */
+
+enum packet_result
+{
+  PACKET_ERROR,
+  PACKET_OK,
+  PACKET_UNKNOWN
+};
+
 static void
-set_packet_config_cmd (struct packet_config *config, struct cmd_list_element *c)
+update_packet_config (struct packet_config *config)
 {
-  init_packet_config (config);
+  switch (config->detect)
+    {
+    case CMD_AUTO_BOOLEAN_TRUE:
+      config->support = PACKET_ENABLE;
+      break;
+    case CMD_AUTO_BOOLEAN_FALSE:
+      config->support = PACKET_DISABLE;
+      break;
+    case CMD_AUTO_BOOLEAN_AUTO:
+      config->support = PACKET_SUPPORT_UNKNOWN;
+      break;
+    }
 }
 
 static void
@@ -563,20 +555,23 @@ show_packet_config_cmd (struct packet_config *config)
 }
 
 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) (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;
-{
-  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;
   config->detect = CMD_AUTO_BOOLEAN_AUTO;
@@ -585,27 +580,86 @@ add_packet_config_cmd (config, name, title, set_func, show_func,
            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_auto_boolean_cmd (full_name, class_obscure,
-                               &config->detect, set_doc, setlist);
-  c->function.sfunc = set_func;
-  add_cmd (full_name, class_obscure, show_func, show_doc, showlist);
+  /* set/show TITLE-packet {auto,on,off} */
+  asprintf (&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;
+      asprintf (&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 (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 CMD_AUTO_BOOLEAN_TRUE:
-      config->support = PACKET_ENABLE;
-      break;
-    case CMD_AUTO_BOOLEAN_FALSE:
-      config->support = PACKET_DISABLE;
-      break;
-    case CMD_AUTO_BOOLEAN_AUTO:
-      config->support = PACKET_SUPPORT_UNKNOWN;
-      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 ("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;
     }
 }
 
@@ -617,7 +671,7 @@ static void
 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
@@ -626,21 +680,113 @@ 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;
+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 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
+show_remote_protocol_Z_hardware_bp_packet_cmd (char *args, int from_tty)
+{
+  show_packet_config_cmd (&remote_protocol_Z[Z_PACKET_HARDWARE_BP]);
+}
+
+static void
+set_remote_protocol_Z_write_wp_packet_cmd (char *args, int from_tty,
+                                             struct cmd_list_element *c)
+{
+  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)
 {
-  set_packet_config_cmd (&remote_protocol_Z, 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)
 {
-  show_packet_config_cmd (&remote_protocol_Z);
+  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?
@@ -671,7 +817,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
@@ -1883,6 +2029,18 @@ extended_remote_async_open (char *name, int from_tty)
 
 static DCACHE *remote_dcache;
 
+static void
+init_all_packet_configs (void)
+{
+  int i;
+  update_packet_config (&remote_protocol_P);
+  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);
+}
+
 static void
 remote_open_1 (char *name, int from_tty, struct target_ops *target,
               int extended_p)
@@ -1928,16 +2086,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;
@@ -2014,16 +2167,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;
@@ -4084,13 +4232,12 @@ remote_insert_breakpoint (CORE_ADDR addr, char *contents_cache)
 #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;
@@ -4106,24 +4253,14 @@ remote_insert_breakpoint (CORE_ADDR addr, char *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;
        }
     }
 
@@ -4151,8 +4288,7 @@ 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;
@@ -4179,17 +4315,41 @@ remote_remove_breakpoint (CORE_ADDR addr, char *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 ("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 (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);
@@ -4198,19 +4358,33 @@ remote_insert_watchpoint (CORE_ADDR addr, int len, int 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 ("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 (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);
@@ -4218,21 +4392,31 @@ remote_remove_watchpoint (CORE_ADDR addr, int len, int 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 ("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 (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++) = ',';
@@ -4244,18 +4428,31 @@ remote_insert_hw_breakpoint (CORE_ADDR addr, int 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 ("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 (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++) = ',';
@@ -4267,12 +4464,16 @@ remote_remove_hw_breakpoint (CORE_ADDR addr, int 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 ("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
@@ -4869,16 +5070,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;
@@ -5289,6 +5485,13 @@ 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_P_packet_cmd (args, from_tty);
+  show_remote_protocol_binary_download_cmd (args, from_tty);
+}
 
 static void
 build_remote_gdbarch_data (void)
@@ -5334,13 +5537,15 @@ _initialize_remote (void)
   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",
@@ -5413,7 +5618,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. */
@@ -5427,13 +5633,55 @@ 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_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);
 }