2004-09-24 Robert Picco <Robert.Picco@hp.com>
[deliverable/binutils-gdb.git] / gdb / remote.c
index 497f97242ccc9e9d96c17ec583ad23a9c0b5c05c..5ea5d12d943c1f03c635e11c7ca5aeec10caadf2 100644 (file)
@@ -961,6 +961,23 @@ show_remote_protocol_qPart_auxv_packet_cmd (char *args, int from_tty,
   show_packet_config_cmd (&remote_protocol_qPart_auxv);
 }
 
+static struct packet_config remote_protocol_p;
+
+static void
+set_remote_protocol_p_packet_cmd (char *args, int from_tty,
+                                 struct cmd_list_element *c)
+{
+  update_packet_config (&remote_protocol_p);
+}
+
+static void
+show_remote_protocol_p_packet_cmd (char *args, int from_tty,
+                                  struct cmd_list_element *c)
+{
+  show_packet_config_cmd (&remote_protocol_p);
+}
+
+
 
 /* Tokens for use by the asynchronous signal handlers for SIGINT */
 static void *sigint_remote_twice_token;
@@ -2041,6 +2058,7 @@ init_all_packet_configs (void)
 {
   int i;
   update_packet_config (&remote_protocol_P);
+  update_packet_config (&remote_protocol_p);
   update_packet_config (&remote_protocol_qSymbol);
   update_packet_config (&remote_protocol_vcont);
   for (i = 0; i < NR_Z_PACKET_TYPES; i++)
@@ -3150,6 +3168,36 @@ static int register_bytes_found;
 /* Read the remote registers into the block REGS.  */
 /* Currently we just read all the registers, so we don't use regnum.  */
 
+static int
+fetch_register_using_p (int regnum)
+{
+  struct remote_state *rs = get_remote_state ();
+  char *buf = alloca (rs->remote_packet_size), *p;
+  char regp[MAX_REGISTER_SIZE];
+  int i;
+
+  buf[0] = 'p';
+  bin2hex((char *) &regnum, &buf[1], sizeof(regnum));
+  buf[9] = 0;
+  remote_send (buf, rs->remote_packet_size);
+  if (buf[0] != 0 && buf[0] != 'E') {
+     p = buf;
+     i = 0;
+     while (p[0] != 0) {
+       if (p[1] == 0) {
+               error("fetch_register_using_p: early buf termination");
+               return 0;
+       }
+       regp[i++] = fromhex (p[0]) * 16 + fromhex (p[1]);
+        p += 2;
+    }
+    regcache_raw_supply (current_regcache, regnum, regp);
+    return 1;
+ }
+
+ return 0;
+}
+
 static void
 remote_fetch_registers (int regnum)
 {
@@ -3170,6 +3218,31 @@ remote_fetch_registers (int regnum)
                        "Attempt to fetch a non G-packet register when this "
                        "remote.c does not support the p-packet.");
     }
+      switch (remote_protocol_p.support)
+       {
+       case PACKET_DISABLE:
+         break;
+       case PACKET_ENABLE:
+         if (fetch_register_using_p (regnum))
+           return;
+         else
+           error ("Protocol error: p packet not recognized by stub");
+       case PACKET_SUPPORT_UNKNOWN:
+         if (fetch_register_using_p (regnum))
+           {
+             /* The stub recognized the 'p' packet.  Remember this.  */
+             remote_protocol_p.support = PACKET_ENABLE;
+             return;
+           }
+         else
+           {
+             /* The stub does not support the 'P' packet.  Use 'G'
+                instead, and don't try using 'P' in the future (it
+                will just waste our time).  */
+             remote_protocol_p.support = PACKET_DISABLE;
+             break;
+           }
+       }
 
   sprintf (buf, "g");
   remote_send (buf, (rs->remote_packet_size));
@@ -5332,6 +5405,7 @@ show_remote_cmd (char *args, int from_tty)
      remote_show_cmdlist for a list of sub commands to show.  */
   show_remote_protocol_Z_packet_cmd (args, from_tty, NULL);
   show_remote_protocol_P_packet_cmd (args, from_tty, NULL);
+  show_remote_protocol_p_packet_cmd (args, from_tty, NULL);
   show_remote_protocol_qSymbol_packet_cmd (args, from_tty, NULL);
   show_remote_protocol_vcont_packet_cmd (args, from_tty, NULL);
   show_remote_protocol_binary_download_cmd (args, from_tty, NULL);
@@ -5528,6 +5602,13 @@ in a memory packet.\n",
                         &remote_set_cmdlist, &remote_show_cmdlist,
                         1);
 
+  add_packet_config_cmd (&remote_protocol_p,
+                        "p", "fetch-register",
+                        set_remote_protocol_p_packet_cmd,
+                        show_remote_protocol_p_packet_cmd,
+                        &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,
This page took 0.026067 seconds and 4 git commands to generate.