2004-09-24 Robert Picco <Robert.Picco@hp.com>
authorAndrew Cagney <cagney@redhat.com>
Fri, 24 Sep 2004 19:51:18 +0000 (19:51 +0000)
committerAndrew Cagney <cagney@redhat.com>
Fri, 24 Sep 2004 19:51:18 +0000 (19:51 +0000)
Committed by Andrew Cagney.
* remote.c (set_remote_protocol_p_packet_cmd, remote_protocol_p)
(show_remote_protocol_p_packet_cmd): New.  Implement 'p' packet.
configuration.
(fetch_register_using_p): Implement 'p' packet.  Based on code by
Fernando Nasser.
(remote_fetch_registers): Call fetch_register_using_p.
(init_all_packet_configs, show_remote_cmd)
(_initialize_remote): Add p-packet.

gdb/ChangeLog
gdb/remote.c

index 74a0283f1b4a5cc7ad5bf8ab0cd241a0cfe0f1b3..d27a0cd2f0f0e8008ab0f723ce7609e71305f463 100644 (file)
@@ -1,3 +1,15 @@
+2004-09-24  Robert Picco <Robert.Picco@hp.com>
+
+       Committed by Andrew Cagney.
+       * remote.c (set_remote_protocol_p_packet_cmd, remote_protocol_p)
+       (show_remote_protocol_p_packet_cmd): New.  Implement 'p' packet.
+       configuration.
+       (fetch_register_using_p): Implement 'p' packet.  Based on code by
+       Fernando Nasser.
+       (remote_fetch_registers): Call fetch_register_using_p.
+       (init_all_packet_configs, show_remote_cmd)
+       (_initialize_remote): Add p-packet.
+
 2004-09-24  Mark Kettenis  <kettenis@gnu.org>
 
        * inf-ptrace.c (inf_ptrace_kill_inferior): Call ptrace directly
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,