Wed Apr 26 19:01:08 1995 Steve Chamberlain <sac@slash.cygnus.com>
authorSteve Chamberlain <sac@cygnus>
Thu, 27 Apr 1995 02:07:44 +0000 (02:07 +0000)
committerSteve Chamberlain <sac@cygnus>
Thu, 27 Apr 1995 02:07:44 +0000 (02:07 +0000)
   * remote-hms.c: Rewrite to use new monitor conventions.

gdb/ChangeLog
gdb/remote-hms.c

index cde5d72595ff02f44dd37ad9f36415757b775aea..126648ca4974202fa81781536172825207c75941 100644 (file)
@@ -1,3 +1,7 @@
+Wed Apr 26 19:01:08 1995  Steve Chamberlain  <sac@slash.cygnus.com>
+       * remote-hms.c: Rewrite to use new monitor conventions.
+
 Tue Apr 25 11:27:14 1995  Jim Kingdon  (kingdon@lioth.cygnus.com)
 
        * dbxread.c: Add comment explaining lowest_text_address.
@@ -461,6 +465,7 @@ Fri Apr  7 17:43:01 1995  Stu Grossman  (grossman@andros.cygnus.com)
        * config/pa/tm-hppa.h:  Define lots register offsets needed by
        w89k-rom.c.
 
+
 Thu Apr  6 17:00:46 1995  Michael Meissner  <meissner@tiktok.cygnus.com>
 
        * Makefile.in (X11_INCLUDES): Define as empty.
index 371fb389b25ae803c86192ff59460807eb537191..216e35eb7f7429c4b1b1a37da9b55f6532c7f1b6 100644 (file)
@@ -1,5 +1,5 @@
 /* Remote debugging interface for Hitachi HMS Monitor Version 1.0
-   Copyright 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+   Copyright 1995 Free Software Foundation, Inc.
    Contributed by Cygnus Support.  Written by Steve Chamberlain
    (sac@cygnus.com).
 
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #include "defs.h"
+#include "gdbcore.h"
+#include "target.h"
+#include "monitor.h"
+#include "serial.h"
+
+static void hms_open PARAMS ((char *args, int from_tty));
+
+static void
+hms_supply_register (regname, regnamelen, val, vallen)
+     char *regname;
+     int regnamelen;
+     char *val;
+     int vallen;
+{
+  int regno;
+
+  if (regnamelen != 2)
+    return;
+  if (regname[0] != 'P')
+    return;
+  /* We scan off all the registers in one go */
+
+  val = monitor_supply_register (PC_REGNUM, val);
+  /* Skip the ccr string */
+  while (*val != '=' && *val)
+    val++;
+
+  val = monitor_supply_register (CCR_REGNUM, val + 1);
+
+  /* Skip up to rest of regs */
+  while (*val != '=' && *val)
+    val++;
+
+  for (regno = 0; regno < 7; regno++)
+    {
+      val = monitor_supply_register (regno, val + 1);
+    }
+}
+
+/*
+ * This array of registers needs to match the indexes used by GDB. The
+ * whole reason this exists is because the various ROM monitors use
+ * different names than GDB does, and don't support all the
+ * registers either. So, typing "info reg sp" becomes a "r30".
+ */
+
+static char *hms_regnames[NUM_REGS] =
+{
+  "R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7", "CCR", "PC"
+};
+
+/*
+ * Define the monitor command strings. Since these are passed directly
+ * through to a printf style function, we need can include formatting
+ * strings. We also need a CR or LF on the end.
+ */
+
+static struct target_ops hms_ops;
+
+static char *hms_inits[] =
+{"\003",                       /* Resets the prompt, and clears repeated cmds */
+ NULL};
+
+static struct monitor_ops hms_cmds =
+{
+  MO_CLR_BREAK_USES_ADDR | MO_FILL_USES_ADDR | MO_GETMEM_NEEDS_RANGE,
+  hms_inits,                   /* Init strings */
+  "g\r",                       /* continue command */
+  "s\r",                       /* single step */
+  "\003",                      /* ^C interrupts the program */
+  "b %x\r",                    /* set a breakpoint */
+  "b - %x\r",                  /* clear a breakpoint */
+  "b -\r",                     /* clear all breakpoints */
+  "f %x %x %x\r",              /* fill (start end val) */
+  {
+    "m.b %x=%x\r",             /* setmem.cmdb (addr, value) */
+    "m.w %x=%x\r",             /* setmem.cmdw (addr, value) */
+    NULL,                      /* setmem.cmdl (addr, value) */
+    NULL,                      /* setmem.cmdll (addr, value) */
+    NULL,                      /* setreg.resp_delim */
+    NULL,                      /* setreg.term */
+    NULL,                      /* setreg.term_cmd */
+  },
+  {
+    "m.b %x %x\r",             /* getmem.cmdb (addr, addr) */
+    "m.w %x %x\r",             /* getmem.cmdw (addr, addr) */
+    NULL,                      /* getmem.cmdl (addr, addr) */
+    NULL,                      /* getmem.cmdll (addr, addr) */
+    ": ",                      /* getmem.resp_delim */
+    ">",                       /* getmem.term */
+    "\003",                    /* getmem.term_cmd */
+  },
+  {
+    "\003r %s=%x\r",           /* setreg.cmd (name, value) */
+    NULL,                      /* setreg.resp_delim */
+    NULL,                      /* setreg.term */
+    NULL                       /* setreg.term_cmd */
+  },
+  {
+    "r %s\r",                  /* getreg.cmd (name) */
+    " (",                      /* getreg.resp_delim */
+    "):",                      /* getreg.term */
+    "\003",                    /* getreg.term_cmd */
+  },
+  "r\r",                       /* dump_registers */
+  "\\(\\w+\\)=\\([0-9a-fA-F]+\\)",     /* register_pattern */
+  hms_supply_register,         /* supply_register */
+  NULL,                                /* load_routine (defaults to SRECs) */
+  "tl\r",                      /* download command */
+  NULL,                                /* load response */
+  ">",                         /* monitor command prompt */
+  NULL,                                /* end-of-command delimitor */
+  NULL,                                /* optional command terminator */
+  &hms_ops,                    /* target operations */
+  SERIAL_1_STOPBITS,           /* number of stop bits */
+  hms_regnames,                        /* registers names */
+  MONITOR_OPS_MAGIC            /* magic */
+};
+
+void
+hms_open (args, from_tty)
+     char *args;
+     int from_tty;
+{
+  monitor_open (args, &hms_cmds, from_tty);
+}
+
+
+int write_dos_tick_delay;
+void
+_initialize_remote_hms ()
+{
+  init_monitor_ops (&hms_ops);
+
+  hms_ops.to_shortname = "hms";
+  hms_ops.to_longname = "Hitachi Microsystems H8/300 debug monitor";
+  hms_ops.to_doc = "Debug via the HMS monitor.\n\
+Specify the serial device it is connected to (e.g. /dev/ttya).";
+  hms_ops.to_open = hms_open;
+  /* By trial and error I've found that this delay doesn't break things */
+  write_dos_tick_delay = 1;
+  add_target (&hms_ops);
+}
+
+
+
+#if 0
+/* This is kept here because we used to support the H8/500 in this module,
+   and I haven't done the H8/500 yet */
+#include "defs.h"
 #include "inferior.h"
 #include "wait.h"
 #include "value.h"
@@ -53,7 +203,8 @@ static void remove_commands ();
 
 static int quiet = 1;          /* FIXME - can be removed after Dec '94 */
 
-static DCACHE *remote_dcache;
+DCACHE *dcache_ptr;
+int remote_dcache;
 serial_t desc;
 
 
@@ -112,7 +263,7 @@ readchar ()
   return buf & 0x7f;
 }
 
-static void 
+static void
 flush ()
 {
   while (1)
@@ -382,6 +533,7 @@ hms_close (quitting)
       SERIAL_CLOSE (desc);
     }
   is_open = 0;
+  remote_dcache = 0;
 }
 
 /* Terminate the open connection to the remote debugger.  Use this
@@ -410,7 +562,7 @@ hms_resume (pid, step, sig)
      enum target_signal
        sig;
 {
-  dcache_flush (remote_dcache);
+  dcache_flush (dcache_ptr);
 
   if (step)
     {
@@ -890,7 +1042,7 @@ int
 hms_fetch_word (addr)
      CORE_ADDR addr;
 {
-  return dcache_fetch (remote_dcache, addr);
+  return dcache_fetch (dcache_ptr, addr);
 }
 
 /* Write a word WORD into remote address ADDR.
@@ -901,7 +1053,7 @@ hms_store_word (addr, word)
      CORE_ADDR addr;
      int word;
 {
-  dcache_poke (remote_dcache, addr, word);
+  dcache_poke (dcache_ptr, addr, word);
 }
 
 int
@@ -1252,9 +1404,9 @@ hms_open (name, from_tty)
   SERIAL_RAW (desc);
   is_open = 1;
   push_target (&hms_ops);
-  dcache_init (hms_read_inferior_memory,
-              hms_write_inferior_memory);
-
+  dcache_ptr = dcache_init (hms_read_inferior_memory,
+                           hms_write_inferior_memory);
+  remote_dcache = 1;
   /* Hello?  Are you there?  */
   SERIAL_WRITE (desc, "\r\n", 2);
   expect_prompt ();
@@ -1400,3 +1552,5 @@ _initialize_remote_hms ()
 
   dev_name = NULL;
 }
+#endif
+