aboutsummaryrefslogtreecommitdiff
path: root/gdb/mon960-rom.c
diff options
context:
space:
mode:
authorMark Alexander <marka@cygnus>1996-07-08 15:53:36 +0000
committerMark Alexander <marka@cygnus>1996-07-08 15:53:36 +0000
commitee7b308fe474ecfe5909961c7e894f1b6c2eb520 (patch)
tree79782aae83724804999f1d433ceda6c3110afa1a /gdb/mon960-rom.c
parentace4b8d75a3bd81cdaf61a0fec307d631388470d (diff)
downloadgdb-ee7b308fe474ecfe5909961c7e894f1b6c2eb520.zip
gdb-ee7b308fe474ecfe5909961c7e894f1b6c2eb520.tar.gz
gdb-ee7b308fe474ecfe5909961c7e894f1b6c2eb520.tar.bz2
* mon960-rom.c (mon960_open): Add floating point detection to
prevent hang on non-FPU processors (PR 9775). (mon960_cmds): Swap setmem.cmdw and setmem.cmdl to fix problem setting breakpoints and improve loading speed.
Diffstat (limited to 'gdb/mon960-rom.c')
-rw-r--r--gdb/mon960-rom.c39
1 files changed, 34 insertions, 5 deletions
diff --git a/gdb/mon960-rom.c b/gdb/mon960-rom.c
index 566ed17..fcec6a2 100644
--- a/gdb/mon960-rom.c
+++ b/gdb/mon960-rom.c
@@ -133,7 +133,7 @@ mon960_load (desc, file, hashmark)
/* g0-g14, fp, pfp, sp, rip,r3-15, pc, ac, tc, fp0-3 */
/* NOTE: "ip" is documented as "ir" in the Mon960 UG. */
/* NOTE: "ir" can't be accessed... but there's an ip and rip. */
-static char *mon960_regnames[NUM_REGS] = {
+static char *full_regnames[NUM_REGS] = {
/* 0 */ "pfp", "sp", "rip", "r3", "r4", "r5", "r6", "r7",
/* 8 */ "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
/* 16 */ "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
@@ -141,13 +141,24 @@ static char *mon960_regnames[NUM_REGS] = {
/* 32 */ "pc", "ac", "tc", "ip", "fp0", "fp1", "fp2", "fp3",
};
+static char *mon960_regnames[NUM_REGS];
+
/* Define the monitor command strings. Since these are passed directly
through to a printf style function, we may include formatting
strings. We also need a CR or LF on the end. */
/* need to pause the monitor for timing reasons, so slow it down */
+#if 1
+/* FIXME: this extremely long init string causes MON960 to return two NAKS
+ instead of performing the autobaud recognition, at least when gdb
+ is running on Linux. The short string below works on Linux, and on
+ SunOS using a tcp serial connection. Must retest on SunOS using a
+ direct serial connection; if that works, get rid of the long string. */
static char *mon960_inits[] = {"\n\r\r\r\r\r\r\r\r\r\r\r\r\r\r\n\r\n\r\n", NULL};
+#else
+static char *mon960_inits[] = { "\r", NULL};
+#endif
static struct monitor_ops mon960_cmds =
{
@@ -158,7 +169,7 @@ static struct monitor_ops mon960_cmds =
mon960_inits, /* Init strings */
"go\n\r", /* continue command */
"st\n\r", /* single step */
- "\n\r", /* break interrupts the program */
+ NULL, /* break interrupts the program */
NULL, /* set a breakpoint */
/* can't use "br" because only 2 hw bps are supported */
NULL, /* clear a breakpoint - "de" is for hw bps */
@@ -168,8 +179,8 @@ static struct monitor_ops mon960_cmds =
{
/* can't use "mb", "md" or "mo" because they require interaction */
NULL, /* setmem.cmdb (addr, value) */
- "md %x %x\n\r", /* setmem.cmdw (addr, value) */
- NULL, /* setmem.cmdl (addr, value) */
+ NULL, /* setmem.cmdw (addr, value) */
+ "md %x %x\n\r", /* setmem.cmdl (addr, value) */
NULL, /* setmem.cmdll (addr, value) */
NULL, /* setmem.resp_delim */
NULL, /* setmem.term */
@@ -225,12 +236,31 @@ mon960_open (args, from_tty)
char *args;
int from_tty;
{
+ char buf[64];
+
monitor_open (args, &mon960_cmds, from_tty);
+
+ /* Attempt to fetch the value of the first floating point register (fp0).
+ If the monitor returns a string containing the word "Bad" we'll assume
+ this processor has no floating point registers, and nullify the
+ regnames entries that refer to FP registers. */
+
+ monitor_printf (mon960_cmds.getreg.cmd, full_regnames[FP0_REGNUM]); /* di fp0 */
+ if (monitor_expect_prompt (buf, sizeof(buf)) != -1)
+ if (strstr(buf, "Bad") != NULL)
+ {
+ int i;
+
+ for (i = FP0_REGNUM; i < FP0_REGNUM + 4; i++)
+ mon960_regnames[i] = NULL;
+ }
}
void
_initialize_mon960 ()
{
+ memcpy(mon960_regnames, full_regnames, sizeof(full_regnames));
+
init_monitor_ops (&mon960_ops);
mon960_ops.to_shortname = "mon960"; /* for the target command */
@@ -249,4 +279,3 @@ Specify the serial device it is connected to (e.g. /dev/ttya).";
mon960_ops.to_open = mon960_open;
add_target (&mon960_ops);
}
-