Wed Apr 26 19:01:08 1995 Steve Chamberlain <sac@slash.cygnus.com>
* remote-hms.c: Rewrite to use new monitor conventions.
This commit is contained in:
parent
f302a4d978
commit
5d747d616f
2 changed files with 168 additions and 9 deletions
|
@ -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)
|
Tue Apr 25 11:27:14 1995 Jim Kingdon (kingdon@lioth.cygnus.com)
|
||||||
|
|
||||||
* dbxread.c: Add comment explaining lowest_text_address.
|
* 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
|
* config/pa/tm-hppa.h: Define lots register offsets needed by
|
||||||
w89k-rom.c.
|
w89k-rom.c.
|
||||||
|
|
||||||
|
|
||||||
Thu Apr 6 17:00:46 1995 Michael Meissner <meissner@tiktok.cygnus.com>
|
Thu Apr 6 17:00:46 1995 Michael Meissner <meissner@tiktok.cygnus.com>
|
||||||
|
|
||||||
* Makefile.in (X11_INCLUDES): Define as empty.
|
* Makefile.in (X11_INCLUDES): Define as empty.
|
||||||
|
|
172
gdb/remote-hms.c
172
gdb/remote-hms.c
|
@ -1,5 +1,5 @@
|
||||||
/* Remote debugging interface for Hitachi HMS Monitor Version 1.0
|
/* 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
|
Contributed by Cygnus Support. Written by Steve Chamberlain
|
||||||
(sac@cygnus.com).
|
(sac@cygnus.com).
|
||||||
|
|
||||||
|
@ -20,6 +20,156 @@
|
||||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
#include "defs.h"
|
#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 "inferior.h"
|
||||||
#include "wait.h"
|
#include "wait.h"
|
||||||
#include "value.h"
|
#include "value.h"
|
||||||
|
@ -53,7 +203,8 @@ static void remove_commands ();
|
||||||
|
|
||||||
static int quiet = 1; /* FIXME - can be removed after Dec '94 */
|
static int quiet = 1; /* FIXME - can be removed after Dec '94 */
|
||||||
|
|
||||||
static DCACHE *remote_dcache;
|
DCACHE *dcache_ptr;
|
||||||
|
int remote_dcache;
|
||||||
serial_t desc;
|
serial_t desc;
|
||||||
|
|
||||||
|
|
||||||
|
@ -112,7 +263,7 @@ readchar ()
|
||||||
return buf & 0x7f;
|
return buf & 0x7f;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
flush ()
|
flush ()
|
||||||
{
|
{
|
||||||
while (1)
|
while (1)
|
||||||
|
@ -382,6 +533,7 @@ hms_close (quitting)
|
||||||
SERIAL_CLOSE (desc);
|
SERIAL_CLOSE (desc);
|
||||||
}
|
}
|
||||||
is_open = 0;
|
is_open = 0;
|
||||||
|
remote_dcache = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Terminate the open connection to the remote debugger. Use this
|
/* Terminate the open connection to the remote debugger. Use this
|
||||||
|
@ -410,7 +562,7 @@ hms_resume (pid, step, sig)
|
||||||
enum target_signal
|
enum target_signal
|
||||||
sig;
|
sig;
|
||||||
{
|
{
|
||||||
dcache_flush (remote_dcache);
|
dcache_flush (dcache_ptr);
|
||||||
|
|
||||||
if (step)
|
if (step)
|
||||||
{
|
{
|
||||||
|
@ -890,7 +1042,7 @@ int
|
||||||
hms_fetch_word (addr)
|
hms_fetch_word (addr)
|
||||||
CORE_ADDR addr;
|
CORE_ADDR addr;
|
||||||
{
|
{
|
||||||
return dcache_fetch (remote_dcache, addr);
|
return dcache_fetch (dcache_ptr, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Write a word WORD into remote address ADDR.
|
/* Write a word WORD into remote address ADDR.
|
||||||
|
@ -901,7 +1053,7 @@ hms_store_word (addr, word)
|
||||||
CORE_ADDR addr;
|
CORE_ADDR addr;
|
||||||
int word;
|
int word;
|
||||||
{
|
{
|
||||||
dcache_poke (remote_dcache, addr, word);
|
dcache_poke (dcache_ptr, addr, word);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -1252,9 +1404,9 @@ hms_open (name, from_tty)
|
||||||
SERIAL_RAW (desc);
|
SERIAL_RAW (desc);
|
||||||
is_open = 1;
|
is_open = 1;
|
||||||
push_target (&hms_ops);
|
push_target (&hms_ops);
|
||||||
dcache_init (hms_read_inferior_memory,
|
dcache_ptr = dcache_init (hms_read_inferior_memory,
|
||||||
hms_write_inferior_memory);
|
hms_write_inferior_memory);
|
||||||
|
remote_dcache = 1;
|
||||||
/* Hello? Are you there? */
|
/* Hello? Are you there? */
|
||||||
SERIAL_WRITE (desc, "\r\n", 2);
|
SERIAL_WRITE (desc, "\r\n", 2);
|
||||||
expect_prompt ();
|
expect_prompt ();
|
||||||
|
@ -1400,3 +1552,5 @@ _initialize_remote_hms ()
|
||||||
|
|
||||||
dev_name = NULL;
|
dev_name = NULL;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue