* cgen-asm.in (insert_normal): Handle empty fields and 64 bit hosts.
[deliverable/binutils-gdb.git] / gdb / mon960-rom.c
index 7fc50808bb60dda919951616e84227a2295e988c..f5adbc7d9af9ffd21b1912547539f915d9ac3a7c 100644 (file)
@@ -28,25 +28,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #include "symtab.h"
 #include "symfile.h" /* for generic_load */
 
-#if !defined (HAVE_TERMIOS) && !defined (HAVE_TERMIO) && !defined (HAVE_SGTTY)
-#define HAVE_SGTTY
-#endif
-
-#ifdef HAVE_SGTTY
-#include <sys/ioctl.h>
-#endif
-
-#include <sys/types.h> /* Needed by file.h on Sys V */
-#include <sys/file.h>
-#include <signal.h>
-#include <sys/stat.h>
 
 #define USE_GENERIC_LOAD
 
 static struct target_ops mon960_ops;
 
-static struct monitor_ops mon960_cmds;
-
 static void mon960_open PARAMS ((char *args, int from_tty));
 
 #ifdef USE_GENERIC_LOAD
@@ -98,9 +84,9 @@ mon960_load (desc, file, hashmark)
        printf_filtered ("%s\t: 0x%4x .. 0x%4x  ", s->name, s->vma,
                         s->vma + s->_raw_size);
        gdb_flush (gdb_stdout);
-       monitor_printf (mon960_cmds.load, s->vma);
-       if (mon960_cmds.loadresp)
-         monitor_expect (mon960_cmds.loadresp, NULL, 0);
+       monitor_printf (current_monitor->load, s->vma);
+       if (current_monitor->loadresp)
+         monitor_expect (current_monitor->loadresp, NULL, 0);
        xmodem_init_xfer (desc);
        section_size = bfd_section_size (abfd, s);
        for (i = 0; i < section_size; i += XMODEM_DATASIZE)
@@ -135,91 +121,93 @@ 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] = {
-  /*  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", \
-  /* 24 */ "g8",  "g9",  "g10", "g11", "g12", "g13", "g14", "fp", \
-  /* 32 */ "pc",  "ac",  "tc",  "ip",  "fp0", "fp1", "fp2", "fp3",\
+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",
+  /* 24 */ "g8",  "g9",  "g10", "g11", "g12", "g13", "g14", "fp",
+  /* 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 0
+/* 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 GNU/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 =
+static struct monitor_ops mon960_cmds ;
+static void init_mon960_cmds(void)
 {
-  MO_CLR_BREAK_USES_ADDR
-    | MO_NO_ECHO_ON_OPEN
-    | MO_SEND_BREAK_ON_STOP
-    | MO_GETMEM_READ_SINGLE,    /* flags */
-  mon960_inits,                        /* Init strings */
-  "go\n\r",                    /* continue command */
-  "st\n\r",                    /* single step */
-  "\n\r",                      /* 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 */
+  mon960_cmds.flags =   MO_CLR_BREAK_USES_ADDR
+    | MO_NO_ECHO_ON_OPEN   | MO_SEND_BREAK_ON_STOP   | MO_GETMEM_READ_SINGLE ;    /* flags */
+  mon960_cmds.init =   mon960_inits;   /* Init strings */
+  mon960_cmds.cont =   "go\n\r";       /* continue command */
+  mon960_cmds.step =   "st\n\r";               /* single step */
+  mon960_cmds.stop =   NULL;                   /* break interrupts the program */
+  mon960_cmds.set_break =   NULL;              /* set a breakpoint */
+  mon960_cmds.clr_break =                      /* can't use "br" because only 2 hw bps are supported */
+    mon960_cmds.clr_all_break =   NULL;                /* clear a breakpoint - "de" is for hw bps */
   NULL,                                /* clear all breakpoints */
-  NULL,                                /* fill (start end val) */
-                               /* can't use "fi" because it takes words, not bytes */
-  {
-    /* 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.cmdll (addr, value) */
-    NULL,                      /* setmem.resp_delim */
-    NULL,                      /* setmem.term */
-    NULL,                      /* setmem.term_cmd */
-  },
-  {
-    /* since the parsing of multiple bytes is difficult due to
-       interspersed addresses, we'll only read 1 value at a time, 
-       even tho these can handle a count */
-    "db %x\n\r",               /* getmem.cmdb (addr, #bytes) */
-    "ds %x\n\r",               /* getmem.cmdw (addr, #swords) */
-    "di %x\n\r",               /* getmem.cmdl (addr, #words) */
-    "dd %x\n\r",               /* getmem.cmdll (addr, #dwords) */
-    " : ",                     /* getmem.resp_delim */
-    NULL,                      /* getmem.term */
-    NULL,                      /* getmem.term_cmd */
-  },
-  {
-    "md %s %x\n\r",            /* setreg.cmd (name, value) */
-    NULL,                      /* setreg.resp_delim */
-    NULL,                      /* setreg.term */
-    NULL                       /* setreg.term_cmd */
-  },
-  {
-    "di %s\n\r",               /* getreg.cmd (name) */
-    " : ",                     /* getreg.resp_delim */
-    NULL,                      /* getreg.term */
-    NULL,                      /* getreg.term_cmd */
-  },
-  "re\n\r",                    /* dump_registers */
-  "\\(\\w+\\)=\\([0-9a-fA-F]+\\)",     /* register_pattern */
-  NULL,                                /* supply_register */
+    mon960_cmds.fill =   NULL;                 /* fill (start end val) */
+  /* can't use "fi" because it takes words, not bytes */
+  /* can't use "mb", "md" or "mo" because they require interaction */
+  mon960_cmds.setmem.cmdb =     NULL;          /* setmem.cmdb (addr, value) */
+  mon960_cmds.setmem.cmdw =     NULL;          /* setmem.cmdw (addr, value) */
+  mon960_cmds.setmem.cmdl =     "md %x %x\n\r";        /* setmem.cmdl (addr, value) */
+  mon960_cmds.setmem.cmdll =     NULL;         /* setmem.cmdll (addr, value) */
+  mon960_cmds.setmem.resp_delim =     NULL;    /* setmem.resp_delim */
+  mon960_cmds.setmem.term =     NULL;          /* setmem.term */
+  mon960_cmds.setmem.term_cmd =     NULL;                      /* setmem.term_cmd */
+  /* since the parsing of multiple bytes is difficult due to
+     interspersed addresses, we'll only read 1 value at a time,
+     even tho these can handle a count */
+  mon960_cmds.getmem.cmdb =     "db %x\n\r";   /* getmem.cmdb (addr, #bytes) */
+  mon960_cmds.getmem.cmdw =     "ds %x\n\r";   /* getmem.cmdw (addr, #swords) */
+  mon960_cmds.getmem.cmdl =     "di %x\n\r";   /* getmem.cmdl (addr, #words) */
+  mon960_cmds.getmem.cmdll =     "dd %x\n\r";  /* getmem.cmdll (addr, #dwords) */
+  mon960_cmds.getmem.resp_delim =     " : ";   /* getmem.resp_delim */
+  mon960_cmds.getmem.term =     NULL;          /* getmem.term */
+  mon960_cmds.getmem.term_cmd =     NULL;      /* getmem.term_cmd */
+  mon960_cmds.setreg.cmd =     "md %s %x\n\r"; /* setreg.cmd (name, value) */
+  mon960_cmds.setreg.resp_delim =     NULL;    /* setreg.resp_delim */
+  mon960_cmds.setreg.term =     NULL;          /* setreg.term */
+  mon960_cmds.setreg.term_cmd =     NULL,      /* setreg.term_cmd */
+    mon960_cmds.getreg.cmd =     "di %s\n\r";  /* getreg.cmd (name) */
+  mon960_cmds.getreg.resp_delim =     " : ";   /* getreg.resp_delim */
+  mon960_cmds.getreg.term =     NULL;          /* getreg.term */
+  mon960_cmds.getreg.term_cmd =     NULL;      /* getreg.term_cmd */
+  mon960_cmds.dump_registers =   "re\n\r";     /* dump_registers */
+  mon960_cmds.register_pattern =   "\\(\\w+\\)=\\([0-9a-fA-F]+\\)";    /* register_pattern */
+  mon960_cmds.supply_register =   NULL;                /* supply_register */
 #ifdef USE_GENERIC_LOAD
-  NULL,                                /* load_routine (defaults to SRECs) */
-  NULL,                                /* download command */
-  NULL,                                /* load response */
+  mon960_cmds.load_routine =   NULL;           /* load_routine (defaults to SRECs) */
+  mon960_cmds.load = NULL;                     /* download command */
+  mon960_cmds.loadresp  = NULL;                        /* load response */
 #else
-  mon960_load,                 /* load_routine (defaults to SRECs) */
-  "do\n\r",                    /* download command */
-  "Downloading\n\r",           /* load response */
+  mon960_cmds.load_routine =   mon960_load ;   /* load_routine (defaults to SRECs) */
+  mon960_cmds.load =  "do\n\r";                /* download command */
+  mon960_cmds.loadresp =  "Downloading\n\r" ;/* load response */
 #endif
-  "=>",                                /* monitor command prompt */
-  "\n\r",                      /* end-of-command delimitor */
-  NULL,                                /* optional command terminator */
-  &mon960_ops,                 /* target operations */
-  SERIAL_1_STOPBITS,           /* number of stop bits */
-  mon960_regnames,             /* registers names */
-  MONITOR_OPS_MAGIC            /* magic */
+  mon960_cmds.prompt =   "=>";         /* monitor command prompt */
+  mon960_cmds.line_term =  "\n\r";             /* end-of-command delimitor */  
+  mon960_cmds.cmd_end = NULL;          /* optional command terminator */
+  mon960_cmds.target =   &mon960_ops;          /* target operations */
+  mon960_cmds.stopbits =     SERIAL_1_STOPBITS;        /* number of stop bits */
+  mon960_cmds.regnames =  mon960_regnames;     /* registers names */
+  mon960_cmds.magic = MONITOR_OPS_MAGIC;       /* magic */
 };
 
 static void
@@ -227,12 +215,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 */
@@ -245,10 +252,9 @@ _initialize_mon960 ()
   mon960_ops.to_remove_breakpoint = memory_remove_breakpoint; 
 
   mon960_ops.to_doc = 
-    "Use an Intel 960 board running the MON960 debug monitor.\n"
-    "Specify the serial device it is connected to (e.g. /dev/ttya).";
+    "Use an Intel 960 board running the MON960 debug monitor.\n\
+Specify the serial device it is connected to (e.g. /dev/ttya).";
 
   mon960_ops.to_open = mon960_open;
   add_target (&mon960_ops);
 }
-
This page took 0.032132 seconds and 4 git commands to generate.