This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: new gdb remote packet type


Andrew Cagney wrote:


To get this in, there's some additional leg work:


- copyright assignment?

- documentation (see gdb/doc/gdb.texinfo near the end)

- a corresponding gdbserver patch

- not to forget, ChangeLogs :-)

Andrew


Hi Andrew,

FSF has a copyright assignment on file for me. The other items you mentioned are contained in the patch below with the exception of gdbserver patch. There wasn't any feedback on 'P' packet support not being in gdbserver. So I'm assuming that not adding 'p' packet support is o.k.

thanks,

Bob

diff -ruN gdb-6.1.1-orig/gdb/ChangeLog gdb-6.1.1/gdb/ChangeLog
--- gdb-6.1.1-orig/gdb/ChangeLog	2004-06-14 18:39:49.000000000 -0400
+++ gdb-6.1.1/gdb/ChangeLog	2004-08-02 10:33:03.993382712 -0400
@@ -1,3 +1,9 @@
+2004-06-28  Robert Picco <Robert.Picco@hp.com>
+	* Add new 'p' packet to gdb/remote.c.  The 'p' is for fetching
+	the value of a single register.  It complements the 'P' which
+	writes a single register.  Should the remote gdbserver support
+	the 'p', then 'g' packets aren't used.
+
2004-06-14  GDB Administrator  <gdbadmin@sourceware.org>

	GDB 6.1.1 released.
diff -ruN gdb-6.1.1-orig/gdb/doc/gdb.texinfo gdb-6.1.1/gdb/doc/gdb.texinfo
--- gdb-6.1.1-orig/gdb/doc/gdb.texinfo	2004-06-14 18:25:29.000000000 -0400
+++ gdb-6.1.1/gdb/doc/gdb.texinfo	2004-08-02 10:33:28.011731368 -0400
@@ -19896,19 +19896,18 @@

@item @code{O} --- reserved

-Reserved for future use.
-
-@item @code{p}@var{n@dots{}} --- read reg @strong{(reserved)}
+@item @code{p}@var{hex value of register} --- read register packet
@cindex @code{p} packet

-@xref{write register packet}.
-
Reply:
@table @samp
@item @var{r@dots{}.}
-The hex encoded value of the register in target byte order.
+Two hex values for each byte of register content in target byte order.
+@item E@var{NN}
+for an error
@end table

+
@item @code{P}@var{n@dots{}}@code{=}@var{r@dots{}} --- write register
@anchor{write register packet}
@cindex @code{P} packet
diff -ruN gdb-6.1.1-orig/gdb/remote.c gdb-6.1.1/gdb/remote.c
--- gdb-6.1.1-orig/gdb/remote.c	2004-02-25 15:41:00.000000000 -0500
+++ gdb-6.1.1/gdb/remote.c	2004-08-02 10:32:48.960668032 -0400
@@ -809,6 +809,23 @@
  show_packet_config_cmd (&remote_protocol_E);
}

+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);
+}
+
+

/* Should we try the 'P' (set register) request? */

@@ -2080,6 +2097,7 @@
  update_packet_config (&remote_protocol_e);
  update_packet_config (&remote_protocol_E);
  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++)
@@ -3240,6 +3258,36 @@
/* 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)
{
@@ -3260,6 +3308,31 @@
			"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));
@@ -5419,6 +5492,7 @@
  show_remote_protocol_e_packet_cmd (args, from_tty, NULL);
  show_remote_protocol_E_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);
@@ -5631,6 +5705,13 @@
			 &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,



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]