diff options
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/remote-hms.c | 172 |
2 files changed, 168 insertions, 9 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index cde5d72595..126648ca49 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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. diff --git a/gdb/remote-hms.c b/gdb/remote-hms.c index 371fb389b2..216e35eb7f 100644 --- a/gdb/remote-hms.c +++ b/gdb/remote-hms.c @@ -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). @@ -20,6 +20,156 @@ 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 + |