* remote-bug.c: rename quiet to bug88k_snoop.
(double_scan, multi_scan): generalize double_scan into a scan for multiple patterns. Rename to multi_scan. (bug_wait, bug_write_inferior_memory): adapt to use the new multi_scan in order to catch and represent target bus errors. (bug_scan): currently unused, so comment out. (bug_quiet): removed. Replaced with a standard user settable boolean.
This commit is contained in:
parent
e0508fdcf3
commit
16f6ab6b2c
2 changed files with 146 additions and 93 deletions
|
@ -1,5 +1,13 @@
|
||||||
Mon Aug 23 17:16:23 1993 K. Richard Pixley (rich@sendai.cygnus.com)
|
Mon Aug 23 17:16:23 1993 K. Richard Pixley (rich@sendai.cygnus.com)
|
||||||
|
|
||||||
|
* remote-bug.c: rename quiet to bug88k_snoop.
|
||||||
|
(double_scan, multi_scan): generalize double_scan into a scan
|
||||||
|
for multiple patterns. Rename to multi_scan.
|
||||||
|
(bug_wait, bug_write_inferior_memory): adapt to use the new
|
||||||
|
multi_scan in order to catch and represent target bus errors.
|
||||||
|
(bug_scan): currently unused, so comment out.
|
||||||
|
(bug_quiet): removed. Replaced with a standard user settable boolean.
|
||||||
|
|
||||||
* m88k-tdep.c: remove include of sys/dir.h. Appears unnecessary
|
* m88k-tdep.c: remove include of sys/dir.h. Appears unnecessary
|
||||||
and isn't available on solaris.
|
and isn't available on solaris.
|
||||||
|
|
||||||
|
|
231
gdb/remote-bug.c
231
gdb/remote-bug.c
|
@ -68,7 +68,7 @@ static int bug_write_inferior_memory ();
|
||||||
/* To be silent, or to loudly echo all input and output to and from
|
/* To be silent, or to loudly echo all input and output to and from
|
||||||
the target. */
|
the target. */
|
||||||
|
|
||||||
static int quiet = 1;
|
static int bug88k_snoop = 0;
|
||||||
|
|
||||||
/* This is the serial descriptor to our target. */
|
/* This is the serial descriptor to our target. */
|
||||||
|
|
||||||
|
@ -326,7 +326,7 @@ readchar ()
|
||||||
if (buf == SERIAL_TIMEOUT)
|
if (buf == SERIAL_TIMEOUT)
|
||||||
error ("Timeout reading from remote system.");
|
error ("Timeout reading from remote system.");
|
||||||
|
|
||||||
if (!quiet)
|
if (bug88k_snoop)
|
||||||
printf ("%c", buf);
|
printf ("%c", buf);
|
||||||
|
|
||||||
return buf & 0x7f;
|
return buf & 0x7f;
|
||||||
|
@ -340,7 +340,7 @@ readchar_nofail ()
|
||||||
buf = SERIAL_READCHAR (desc, timeout);
|
buf = SERIAL_READCHAR (desc, timeout);
|
||||||
if (buf == SERIAL_TIMEOUT)
|
if (buf == SERIAL_TIMEOUT)
|
||||||
buf = 0;
|
buf = 0;
|
||||||
if (!quiet)
|
if (bug88k_snoop)
|
||||||
if (buf)
|
if (buf)
|
||||||
printf ("%c", buf);
|
printf ("%c", buf);
|
||||||
else
|
else
|
||||||
|
@ -358,7 +358,7 @@ pollchar()
|
||||||
buf = SERIAL_READCHAR (desc, 0);
|
buf = SERIAL_READCHAR (desc, 0);
|
||||||
if (buf == SERIAL_TIMEOUT)
|
if (buf == SERIAL_TIMEOUT)
|
||||||
buf = 0;
|
buf = 0;
|
||||||
if (!quiet)
|
if (bug88k_snoop)
|
||||||
if (buf)
|
if (buf)
|
||||||
printf ("%c", buf);
|
printf ("%c", buf);
|
||||||
else
|
else
|
||||||
|
@ -688,84 +688,107 @@ bug_resume (pid, step, sig)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Given a null terminated list of strings LIST, read the input until we find one of
|
||||||
|
them. Return the index of the string found or -1 on error. '?' means match
|
||||||
|
any single character. Note that with the algorithm we use, the initial
|
||||||
|
character of the string cannot recur in the string, or we will not find some
|
||||||
|
cases of the string in the input. If PASSTHROUGH is non-zero, then
|
||||||
|
pass non-matching data on. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
double_scan (a, b)
|
multi_scan (list, passthrough)
|
||||||
char *a, *b;
|
char *list[];
|
||||||
|
int passthrough;
|
||||||
{
|
{
|
||||||
/* Strings to look for. '?' means match any single character.
|
char *swallowed = NULL; /* holding area */
|
||||||
Note that with the algorithm we use, the initial character
|
char *swallowed_p = swallowed; /* Current position in swallowed. */
|
||||||
of the string cannot recur in the string, or we will not
|
int ch;
|
||||||
find some cases of the string in the input. */
|
|
||||||
|
|
||||||
char *pa = a;
|
|
||||||
char *pb = b;
|
|
||||||
|
|
||||||
/* Large enough for either sizeof (bpt) or sizeof (exitmsg) chars. */
|
|
||||||
char swallowed[50];
|
|
||||||
|
|
||||||
/* Current position in swallowed. */
|
|
||||||
char *swallowed_p = swallowed;
|
|
||||||
|
|
||||||
int ch = readchar();
|
|
||||||
int ch_handled;
|
int ch_handled;
|
||||||
int swallowed_cr = 0;
|
int i;
|
||||||
|
int string_count;
|
||||||
|
int max_length;
|
||||||
|
char **plist;
|
||||||
|
|
||||||
for (;;)
|
/* Look through the strings. Count them. Find the largest one so we can
|
||||||
|
allocate a holding area. */
|
||||||
|
|
||||||
|
for (max_length = string_count = i = 0;
|
||||||
|
list[i] != NULL;
|
||||||
|
++i, ++string_count)
|
||||||
|
{
|
||||||
|
int length = strlen(list[i]);
|
||||||
|
|
||||||
|
if (length > max_length)
|
||||||
|
max_length = length;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if we have no strings, then something is wrong. */
|
||||||
|
if (string_count == 0)
|
||||||
|
return(-1);
|
||||||
|
|
||||||
|
/* otherwise, we will need a holding area big enough to hold almost two
|
||||||
|
copies of our largest string. */
|
||||||
|
swallowed_p = swallowed = alloca(max_length << 1);
|
||||||
|
|
||||||
|
/* and a list of pointers to current scan points. */
|
||||||
|
plist = alloca(string_count * sizeof(*plist));
|
||||||
|
|
||||||
|
/* and initialize */
|
||||||
|
for (i = 0; i < string_count; ++i)
|
||||||
|
plist[i] = list[i];
|
||||||
|
|
||||||
|
for (ch = readchar(); /* loop forever */ ; ch = readchar())
|
||||||
{
|
{
|
||||||
QUIT; /* Let user quit and leave process running */
|
QUIT; /* Let user quit and leave process running */
|
||||||
ch_handled = 0;
|
ch_handled = 0;
|
||||||
if (ch == *pa)
|
|
||||||
|
for (i = 0; i < string_count; ++i)
|
||||||
{
|
{
|
||||||
pa++;
|
if (ch == *plist[i] || *plist[i] == '?')
|
||||||
if (*pa == '\0')
|
{
|
||||||
break;
|
++plist[i];
|
||||||
ch_handled = 1;
|
if (*plist[i] == '\0')
|
||||||
|
return(i);
|
||||||
|
|
||||||
*swallowed_p++ = ch;
|
if (!ch_handled)
|
||||||
|
*swallowed_p++ = ch;
|
||||||
|
|
||||||
|
ch_handled = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
plist[i] = list[i];
|
||||||
}
|
}
|
||||||
else
|
|
||||||
pa = a;
|
|
||||||
|
|
||||||
if (ch == *pb || *pb == '?')
|
|
||||||
{
|
|
||||||
pb++;
|
|
||||||
if (*pb == '\0')
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (!ch_handled)
|
|
||||||
*swallowed_p++ = ch;
|
|
||||||
ch_handled = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
pb = b;
|
|
||||||
|
|
||||||
if (!ch_handled)
|
if (!ch_handled)
|
||||||
{
|
{
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
/* Print out any characters which have been swallowed. */
|
/* Print out any characters which have been swallowed. */
|
||||||
for (p = swallowed; p < swallowed_p; ++p)
|
if (passthrough)
|
||||||
putc (*p, stdout);
|
|
||||||
swallowed_p = swallowed;
|
|
||||||
|
|
||||||
if ((ch != '\r' && ch != '\n') || swallowed_cr > 10)
|
|
||||||
{
|
{
|
||||||
|
for (p = swallowed; p < swallowed_p; ++p)
|
||||||
|
putc (*p, stdout);
|
||||||
|
|
||||||
putc (ch, stdout);
|
putc (ch, stdout);
|
||||||
swallowed_cr = 10;
|
|
||||||
}
|
}
|
||||||
swallowed_cr++;
|
|
||||||
|
|
||||||
|
swallowed_p = swallowed;
|
||||||
}
|
}
|
||||||
|
|
||||||
ch = readchar ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return(*pa == '\0');
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Wait until the remote machine stops, then return,
|
/* Wait until the remote machine stops, then return,
|
||||||
storing status in STATUS just as `wait' would. */
|
storing status in STATUS just as `wait' would. */
|
||||||
|
|
||||||
|
static char *wait_strings[] = {
|
||||||
|
"At Breakpoint",
|
||||||
|
"Exception: Data Access Fault (Local Bus Timeout)",
|
||||||
|
"\r8???-Bug>",
|
||||||
|
NULL,
|
||||||
|
};
|
||||||
|
|
||||||
int
|
int
|
||||||
bug_wait (status)
|
bug_wait (status)
|
||||||
WAITTYPE *status;
|
WAITTYPE *status;
|
||||||
|
@ -775,32 +798,53 @@ bug_wait (status)
|
||||||
|
|
||||||
WSETEXIT ((*status), 0);
|
WSETEXIT ((*status), 0);
|
||||||
|
|
||||||
if (need_artificial_trap != 0)
|
/* read off leftovers from resume so that the rest can be passed
|
||||||
|
back out as stdout. */
|
||||||
|
if (need_artificial_trap == 0)
|
||||||
{
|
{
|
||||||
WSETSTOP ((*status), SIGTRAP);
|
expect("Effective address: ");
|
||||||
need_artificial_trap--;
|
(void) get_hex_word();
|
||||||
/* user output from the target can be discarded here. (?) */
|
expect ("\r\n");
|
||||||
expect_prompt();
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* read off leftovers from resume */
|
|
||||||
expect("Effective address: ");
|
|
||||||
(void) get_hex_word();
|
|
||||||
expect ("\r\n");
|
|
||||||
|
|
||||||
timeout = -1; /* Don't time out -- user program is running. */
|
timeout = -1; /* Don't time out -- user program is running. */
|
||||||
immediate_quit = 1; /* Helps ability to QUIT */
|
immediate_quit = 1; /* Helps ability to QUIT */
|
||||||
|
|
||||||
if (double_scan("At Breakpoint", "8???-Bug>"))
|
switch (multi_scan(wait_strings, need_artificial_trap == 0))
|
||||||
{
|
{
|
||||||
/* breakpoint case */
|
case 0: /* breakpoint case */
|
||||||
WSETSTOP ((*status), SIGTRAP);
|
WSETSTOP ((*status), SIGTRAP);
|
||||||
expect_prompt ();
|
/* user output from the target can be discarded here. (?) */
|
||||||
}
|
expect_prompt();
|
||||||
else /* exit case */
|
break;
|
||||||
WSETEXIT ((*status), 0);
|
|
||||||
|
|
||||||
|
case 1: /* bus error */
|
||||||
|
WSETSTOP ((*status), SIGBUS);
|
||||||
|
/* user output from the target can be discarded here. (?) */
|
||||||
|
expect_prompt();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2: /* normal case */
|
||||||
|
if (need_artificial_trap != 0)
|
||||||
|
{
|
||||||
|
/* stepping */
|
||||||
|
WSETSTOP ((*status), SIGTRAP);
|
||||||
|
need_artificial_trap--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* exit case */
|
||||||
|
WSETEXIT ((*status), 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case -1: /* trouble */
|
||||||
|
default:
|
||||||
|
fprintf_filtered (stderr,
|
||||||
|
"Trouble reading target during wait\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
timeout = old_timeout;
|
timeout = old_timeout;
|
||||||
immediate_quit = old_immediate_quit;
|
immediate_quit = old_immediate_quit;
|
||||||
|
@ -844,7 +888,7 @@ bug_write (a, l)
|
||||||
|
|
||||||
SERIAL_WRITE (desc, a, l);
|
SERIAL_WRITE (desc, a, l);
|
||||||
|
|
||||||
if (!quiet)
|
if (bug88k_snoop)
|
||||||
for (i = 0; i < l; i++)
|
for (i = 0; i < l; i++)
|
||||||
{
|
{
|
||||||
printf ("%c", a[i]);
|
printf ("%c", a[i]);
|
||||||
|
@ -862,6 +906,7 @@ bug_write_cr (s)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0 /* not currently used */
|
||||||
/* Read from remote while the input matches STRING. Return zero on
|
/* Read from remote while the input matches STRING. Return zero on
|
||||||
success, -1 on failure. */
|
success, -1 on failure. */
|
||||||
|
|
||||||
|
@ -884,6 +929,7 @@ bug_scan (s)
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
#endif /* never */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
bug_srec_write_cr (s)
|
bug_srec_write_cr (s)
|
||||||
|
@ -894,7 +940,7 @@ bug_srec_write_cr (s)
|
||||||
if (srec_echo_pace)
|
if (srec_echo_pace)
|
||||||
for (p = s; *p; ++p)
|
for (p = s; *p; ++p)
|
||||||
{
|
{
|
||||||
if (!quiet)
|
if (bug88k_snoop)
|
||||||
printf ("%c", *p);
|
printf ("%c", *p);
|
||||||
|
|
||||||
do
|
do
|
||||||
|
@ -1119,6 +1165,12 @@ start_load()
|
||||||
data records each containing srec_bytes, and an S7 termination
|
data records each containing srec_bytes, and an S7 termination
|
||||||
record. */
|
record. */
|
||||||
|
|
||||||
|
static char *srecord_strings[] = {
|
||||||
|
"S-RECORD",
|
||||||
|
"8???-Bug>",
|
||||||
|
NULL,
|
||||||
|
};
|
||||||
|
|
||||||
static int
|
static int
|
||||||
bug_write_inferior_memory (memaddr, myaddr, len)
|
bug_write_inferior_memory (memaddr, myaddr, len)
|
||||||
CORE_ADDR memaddr;
|
CORE_ADDR memaddr;
|
||||||
|
@ -1142,7 +1194,7 @@ bug_write_inferior_memory (memaddr, myaddr, len)
|
||||||
|
|
||||||
if (retries > 0)
|
if (retries > 0)
|
||||||
{
|
{
|
||||||
if (!quiet)
|
if (bug88k_snoop)
|
||||||
printf("\n<retrying...>\n");
|
printf("\n<retrying...>\n");
|
||||||
|
|
||||||
/* This expect_prompt call is extremely important. Without
|
/* This expect_prompt call is extremely important. Without
|
||||||
|
@ -1203,7 +1255,7 @@ bug_write_inferior_memory (memaddr, myaddr, len)
|
||||||
if (srec_sleep != 0)
|
if (srec_sleep != 0)
|
||||||
sleep(srec_sleep);
|
sleep(srec_sleep);
|
||||||
|
|
||||||
/* This pollchar is probably redundant to the double_scan
|
/* This pollchar is probably redundant to the multi_scan
|
||||||
below. Trouble is, we can't be sure when or where an
|
below. Trouble is, we can't be sure when or where an
|
||||||
error message will appear. Apparently, when running at
|
error message will appear. Apparently, when running at
|
||||||
full speed from a typical sun4, error messages tend to
|
full speed from a typical sun4, error messages tend to
|
||||||
|
@ -1211,7 +1263,7 @@ bug_write_inferior_memory (memaddr, myaddr, len)
|
||||||
|
|
||||||
if ((x = pollchar()) != 0)
|
if ((x = pollchar()) != 0)
|
||||||
{
|
{
|
||||||
if (!quiet)
|
if (bug88k_snoop)
|
||||||
printf("\n<retrying...>\n");
|
printf("\n<retrying...>\n");
|
||||||
|
|
||||||
++retries;
|
++retries;
|
||||||
|
@ -1233,7 +1285,7 @@ bug_write_inferior_memory (memaddr, myaddr, len)
|
||||||
|
|
||||||
/* Having finished the load, we need to figure out whether we
|
/* Having finished the load, we need to figure out whether we
|
||||||
had any errors. */
|
had any errors. */
|
||||||
} while (double_scan("S-RECORD", "8???-Bug>"));;
|
} while (multi_scan(srecord_strings, 0) == 0);;
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
@ -1451,20 +1503,6 @@ bug_com (args, fromtty)
|
||||||
expect_prompt ();
|
expect_prompt ();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
bug_quiet (args, fromtty)
|
|
||||||
char *args;
|
|
||||||
int fromtty;
|
|
||||||
{
|
|
||||||
quiet = !quiet;
|
|
||||||
if (quiet)
|
|
||||||
printf_filtered ("Snoop disabled\n");
|
|
||||||
else
|
|
||||||
printf_filtered ("Snoop enabled\n");
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
bug_device (args, fromtty)
|
bug_device (args, fromtty)
|
||||||
char *args;
|
char *args;
|
||||||
|
@ -1537,8 +1575,6 @@ _initialize_remote_bug ()
|
||||||
|
|
||||||
add_com ("bug <command>", class_obscure, bug_com,
|
add_com ("bug <command>", class_obscure, bug_com,
|
||||||
"Send a command to the BUG monitor.");
|
"Send a command to the BUG monitor.");
|
||||||
add_com ("snoop", class_obscure, bug_quiet,
|
|
||||||
"Show what commands are going to the monitor");
|
|
||||||
|
|
||||||
add_com ("device", class_obscure, bug_device,
|
add_com ("device", class_obscure, bug_device,
|
||||||
"Set the terminal line for BUG communications");
|
"Set the terminal line for BUG communications");
|
||||||
|
@ -1604,5 +1640,14 @@ much slower, but generally more reliable.",
|
||||||
&setlist),
|
&setlist),
|
||||||
&showlist);
|
&showlist);
|
||||||
|
|
||||||
|
add_show_from_set
|
||||||
|
(add_set_cmd ("bug88k-snoop", class_support, var_boolean,
|
||||||
|
(char *) &bug88k_snoop,
|
||||||
|
"\
|
||||||
|
Set echoing of what's going to and from the monitor.\n\
|
||||||
|
When on, echo data going out on and coming back from the serial line.",
|
||||||
|
&setlist),
|
||||||
|
&showlist);
|
||||||
|
|
||||||
dev_name = NULL;
|
dev_name = NULL;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue