1226031Sstas/* Remote debugging interface for EST-300 ICE, for GDB
2226031Sstas   Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001
3226031Sstas   Free Software Foundation, Inc.
4226031Sstas   Contributed by Cygnus Support.
5226031Sstas
6226031Sstas   Written by Steve Chamberlain for Cygnus Support.
7226031Sstas   Re-written by Stu Grossman of Cygnus Support
8226031Sstas
9226031Sstas   This file is part of GDB.
10226031Sstas
11226031Sstas   This program is free software; you can redistribute it and/or modify
12226031Sstas   it under the terms of the GNU General Public License as published by
13226031Sstas   the Free Software Foundation; either version 2 of the License, or
14226031Sstas   (at your option) any later version.
15226031Sstas
16226031Sstas   This program is distributed in the hope that it will be useful,
17226031Sstas   but WITHOUT ANY WARRANTY; without even the implied warranty of
18226031Sstas   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19226031Sstas   GNU General Public License for more details.
20226031Sstas
21226031Sstas   You should have received a copy of the GNU General Public License
22226031Sstas   along with this program; if not, write to the Free Software
23226031Sstas   Foundation, Inc., 59 Temple Place - Suite 330,
24226031Sstas   Boston, MA 02111-1307, USA.  */
25226031Sstas
26226031Sstas#include "defs.h"
27226031Sstas#include "gdbcore.h"
28226031Sstas#include "target.h"
29226031Sstas#include "monitor.h"
30226031Sstas#include "serial.h"
31226031Sstas#include "regcache.h"
32226031Sstas
33226031Sstas#include "m68k-tdep.h"
34226031Sstas
35226031Sstasstatic void est_open (char *args, int from_tty);
36226031Sstas
37226031Sstasstatic void
38226031Sstasest_supply_register (char *regname, int regnamelen, char *val, int vallen)
39226031Sstas{
40226031Sstas  int regno;
41226031Sstas
42226031Sstas  if (regnamelen != 2)
43226031Sstas    return;
44226031Sstas
45226031Sstas  switch (regname[0])
46226031Sstas    {
47226031Sstas    case 'S':
48226031Sstas      if (regname[1] != 'R')
49226031Sstas	return;
50226031Sstas      regno = PS_REGNUM;
51226031Sstas      break;
52226031Sstas    case 'P':
53      if (regname[1] != 'C')
54	return;
55      regno = PC_REGNUM;
56      break;
57    case 'D':
58      if (regname[1] < '0' || regname[1] > '7')
59	return;
60      regno = regname[1] - '0' + M68K_D0_REGNUM;
61      break;
62    case 'A':
63      if (regname[1] < '0' || regname[1] > '7')
64	return;
65      regno = regname[1] - '0' + M68K_A0_REGNUM;
66      break;
67    default:
68      return;
69    }
70
71  monitor_supply_register (regno, val);
72}
73
74/*
75 * This array of registers needs to match the indexes used by GDB. The
76 * whole reason this exists is because the various ROM monitors use
77 * different names than GDB does, and don't support all the
78 * registers either. So, typing "info reg sp" becomes a "r30".
79 */
80
81static const char *
82est_regname (int index)
83{
84
85  static char *regnames[] =
86  {
87    "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
88    "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7",
89    "SR", "PC",
90  };
91
92
93  if ((index >= (sizeof (regnames) /  sizeof (regnames[0])))
94       || (index < 0) || (index >= NUM_REGS))
95    return NULL;
96  else
97    return regnames[index];
98}
99
100/*
101 * Define the monitor command strings. Since these are passed directly
102 * through to a printf style function, we need can include formatting
103 * strings. We also need a CR or LF on the end.
104 */
105
106static struct target_ops est_ops;
107
108static char *est_inits[] =
109{"he\r",			/* Resets the prompt, and clears repeated cmds */
110 NULL};
111
112static struct monitor_ops est_cmds;
113
114static void
115init_est_cmds (void)
116{
117  est_cmds.flags = MO_CLR_BREAK_USES_ADDR | MO_FILL_USES_ADDR | MO_NEED_REGDUMP_AFTER_CONT |
118    MO_SREC_ACK | MO_SREC_ACK_PLUS;
119  est_cmds.init = est_inits;	/* Init strings */
120  est_cmds.cont = "go\r";	/* continue command */
121  est_cmds.step = "sidr\r";	/* single step */
122  est_cmds.stop = "\003";	/* ^C interrupts the program */
123  est_cmds.set_break = "sb %x\r";	/* set a breakpoint */
124  est_cmds.clr_break = "rb %x\r";	/* clear a breakpoint */
125  est_cmds.clr_all_break = "rb\r";	/* clear all breakpoints */
126  est_cmds.fill = "bfb %x %x %x\r";	/* fill (start end val) */
127  est_cmds.setmem.cmdb = "smb %x %x\r";		/* setmem.cmdb (addr, value) */
128  est_cmds.setmem.cmdw = "smw %x %x\r";		/* setmem.cmdw (addr, value) */
129  est_cmds.setmem.cmdl = "sml %x %x\r";		/* setmem.cmdl (addr, value) */
130  est_cmds.setmem.cmdll = NULL;	/* setmem.cmdll (addr, value) */
131  est_cmds.setmem.resp_delim = NULL;	/* setreg.resp_delim */
132  est_cmds.setmem.term = NULL;	/* setreg.term */
133  est_cmds.setmem.term_cmd = NULL;	/* setreg.term_cmd */
134  est_cmds.getmem.cmdb = "dmb %x %x\r";		/* getmem.cmdb (addr, len) */
135  est_cmds.getmem.cmdw = "dmw %x %x\r";		/* getmem.cmdw (addr, len) */
136  est_cmds.getmem.cmdl = "dml %x %x\r";		/* getmem.cmdl (addr, len) */
137  est_cmds.getmem.cmdll = NULL;	/* getmem.cmdll (addr, len) */
138  est_cmds.getmem.resp_delim = ": ";	/* getmem.resp_delim */
139  est_cmds.getmem.term = NULL;	/* getmem.term */
140  est_cmds.getmem.term_cmd = NULL;	/* getmem.term_cmd */
141  est_cmds.setreg.cmd = "sr %s %x\r";	/* setreg.cmd (name, value) */
142  est_cmds.setreg.resp_delim = NULL;	/* setreg.resp_delim */
143  est_cmds.setreg.term = NULL;	/* setreg.term */
144  est_cmds.setreg.term_cmd = NULL;	/* setreg.term_cmd */
145  est_cmds.getreg.cmd = "dr %s\r";	/* getreg.cmd (name) */
146  est_cmds.getreg.resp_delim = " = ";	/* getreg.resp_delim */
147  est_cmds.getreg.term = NULL;	/* getreg.term */
148  est_cmds.getreg.term_cmd = NULL;	/* getreg.term_cmd */
149  est_cmds.dump_registers = "dr\r";	/* dump_registers */
150  est_cmds.register_pattern = "\\(\\w+\\) = \\([0-9a-fA-F]+\\)";	/* register_pattern */
151  est_cmds.supply_register = est_supply_register;	/* supply_register */
152  est_cmds.load_routine = NULL;	/* load_routine (defaults to SRECs) */
153  est_cmds.load = "dl\r";	/* download command */
154  est_cmds.loadresp = "+";	/* load response */
155  est_cmds.prompt = ">BKM>";	/* monitor command prompt */
156  est_cmds.line_term = "\r";	/* end-of-line terminator */
157  est_cmds.cmd_end = NULL;	/* optional command terminator */
158  est_cmds.target = &est_ops;	/* target operations */
159  est_cmds.stopbits = SERIAL_1_STOPBITS;	/* number of stop bits */
160  est_cmds.regnames = NULL;
161  est_cmds.regname = est_regname; /*register names*/
162  est_cmds.magic = MONITOR_OPS_MAGIC;	/* magic */
163}				/* init_est_cmds */
164
165static void
166est_open (char *args, int from_tty)
167{
168  monitor_open (args, &est_cmds, from_tty);
169}
170
171extern initialize_file_ftype _initialize_est; /* -Wmissing-prototypes */
172
173void
174_initialize_est (void)
175{
176  init_est_cmds ();
177  init_monitor_ops (&est_ops);
178
179  est_ops.to_shortname = "est";
180  est_ops.to_longname = "EST background debug monitor";
181  est_ops.to_doc = "Debug via the EST BDM.\n\
182Specify the serial device it is connected to (e.g. /dev/ttya).";
183  est_ops.to_open = est_open;
184
185  add_target (&est_ops);
186}
187