This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
[PATCH]: remote protocol step over range extended
- To: gdb-patches at sourceware dot cygnus dot com
- Subject: [PATCH]: remote protocol step over range extended
- From: jtc at redback dot com (J.T. Conklin)
- Date: 02 Apr 2001 18:41:09 -0700
- Reply-To: jtc at redback dot com
I will be checking in the enclosed patch shortly.
It implements the "step over range" extension to the remote serial
protocol as was discussed over in the gdb list a few weeks ago. This
extension eliminates much of the latency of stepping when used with a
debug agent that supports this extension.
--jtc
Index: ChangeLog
===================================================================
RCS file: /cvs/src/src/gdb/ChangeLog,v
retrieving revision 1.1146
diff -c -r1.1146 ChangeLog
*** ChangeLog 2001/04/02 20:57:26 1.1146
--- ChangeLog 2001/04/03 01:32:49
***************
*** 1,3 ****
--- 1,19 ----
+ 2001-04-02 J.T. Conklin <jtc@redback.com>
+
+ * remote.c (remote_protocol_e, remote_protocol_E): Define.
+ (set_remote_protocol_e_packet_cmd)
+ (set_remote_protocol_E_packet_cmd)
+ (show_remote_protocol_e_packet_command)
+ (show_remote_protocol_E_packet_command): New functions.
+ (init_all_packet_configs): Initialize remote_protocol_e and
+ remote_protocol_E.
+ (remote_resume, remote_async_resume): Support e/E command
+ packets.
+ (show_remote_cmd): Show state of remote_protocol_e and
+ remote_protocol_E.
+ (_initialize_remote): Add "set remote step-over-range-packet"
+ and "set remote step-over-range-w-signal-packet" to CLI.
+
2001-04-01 Andrew Cagney <ac131313@redhat.com>
Obsolete ns32k-*-mach3*, ns32k-umax-*, ns32k-utek-sysv* and
Index: remote.c
===================================================================
RCS file: /cvs/src/src/gdb/remote.c,v
retrieving revision 1.43
diff -c -r1.43 remote.c
*** remote.c 2001/03/27 20:36:24 1.43
--- remote.c 2001/04/03 01:32:56
***************
*** 663,668 ****
--- 663,702 ----
}
}
+ /* 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;
***************
*** 2031,2036 ****
--- 2065,2072 ----
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);
for (i = 0; i < NR_Z_PACKET_TYPES; i++)
update_packet_config (&remote_protocol_Z[i]);
***************
*** 2294,2299 ****
--- 2330,2336 ----
remote_resume (int pid, int step, enum target_signal siggnal)
{
char *buf = alloca (PBUFSIZ);
+ char *p;
if (pid == -1)
set_thread (0, 0); /* run any thread */
***************
*** 2308,2318 ****
if (target_resume_hook)
(*target_resume_hook) ();
if (siggnal != TARGET_SIGNAL_0)
{
buf[0] = step ? 'S' : 'C';
buf[1] = tohex (((int) siggnal >> 4) & 0xf);
! buf[2] = tohex ((int) siggnal & 0xf);
buf[3] = '\0';
}
else
--- 2345,2410 ----
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[3] = '\0';
}
else
***************
*** 2326,2331 ****
--- 2418,2424 ----
remote_async_resume (int pid, int step, enum target_signal siggnal)
{
char *buf = alloca (PBUFSIZ);
+ char *p;
if (pid == -1)
set_thread (0, 0); /* run any thread */
***************
*** 2340,2345 ****
--- 2433,2492 ----
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';
***************
*** 2349,2355 ****
--- 2496,2505 ----
}
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
***************
*** 2366,2372 ****
this information already found in the continuation block? */
if (target_is_async_p ())
target_executing = 1;
- putpkt (buf);
}
--- 2516,2521 ----
***************
*** 5504,5510 ****
--- 5653,5662 ----
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_binary_download_cmd (args, from_tty);
}
***************
*** 5648,5653 ****
--- 5800,5819 ----
add_info ("remote-process", remote_info_process,
"Query the remote system for process info.");
+
+ 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",
--
J.T. Conklin
RedBack Networks