* Makefile.in (diststuff): Make all-doc; diststuff target does not
[deliverable/binutils-gdb.git] / gdb / sh3-rom.c
... / ...
CommitLineData
1/* Remote target glue for the Hitachi SH-3 ROM monitor.
2 Copyright 1995, 1996 Free Software Foundation, Inc.
3
4This file is part of GDB.
5
6This program is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2 of the License, or
9(at your option) any later version.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with this program; if not, write to the Free Software
18Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
19
20#include "defs.h"
21#include "gdbcore.h"
22#include "target.h"
23#include "monitor.h"
24#include "serial.h"
25#include "srec.h"
26
27static serial_t parallel;
28static int parallel_in_use;
29
30static void sh3_open PARAMS ((char *args, int from_tty));
31
32static void
33sh3_supply_register (regname, regnamelen, val, vallen)
34 char *regname;
35 int regnamelen;
36 char *val;
37 int vallen;
38{
39 int numregs;
40 int regno;
41
42 numregs = 1;
43 regno = -1;
44
45 if (regnamelen == 2)
46 switch (regname[0])
47 {
48 case 'S':
49 if (regname[1] == 'R')
50 regno = SR_REGNUM;
51 break;
52 case 'P':
53 if (regname[1] == 'C')
54 regno = PC_REGNUM;
55 else if (regname[1] == 'R')
56 regno = PR_REGNUM;
57 break;
58 }
59 else if (regnamelen == 3)
60 switch (regname[0])
61 {
62 case 'G':
63 case 'V':
64 if (regname[1] == 'B' && regname[2] == 'R')
65 if (regname[0] == 'G')
66 regno = VBR_REGNUM;
67 else
68 regno = GBR_REGNUM;
69 break;
70#if 0
71 case 'S':
72 if (regname[1] == 'S' && regname[2] == 'R')
73 regno = SSR_REGNUM;
74 else if (regname[1] == 'P' && regname[2] == 'C')
75 regno = SPC_REGNUM;
76 break;
77#endif
78 }
79 else if (regnamelen == 4)
80 switch (regname[0])
81 {
82 case 'M':
83 if (regname[1] == 'A' && regname[2] == 'C')
84 if (regname[3] == 'H')
85 regno = MACH_REGNUM;
86 else if (regname[3] == 'L')
87 regno = MACL_REGNUM;
88 break;
89 case 'R':
90 if (regname[1] == '0' && regname[2] == '-' && regname[3] == '7')
91 {
92 regno = R0_REGNUM;
93 numregs = 8;
94 }
95 }
96 else if (regnamelen == 5)
97 if (regname[1] == '8' && regname[2] == '-' && regname[3] == '1'
98 && regname[4] =='5')
99 {
100 regno = R0_REGNUM + 8;
101 numregs = 8;
102 }
103
104 if (regno >= 0)
105 while (numregs-- > 0)
106 val = monitor_supply_register (regno++, val);
107}
108
109static void
110sh3_load (desc, file, hashmark)
111 serial_t desc;
112 char *file;
113 int hashmark;
114{
115 if (parallel_in_use)
116 {
117 monitor_printf("pl;s\r");
118 load_srec (parallel, file, 80, SREC_ALL, hashmark);
119 monitor_expect_prompt (NULL, 0);
120 }
121 else
122 {
123 monitor_printf ("il;s:x\r");
124 monitor_expect ("\005", NULL, 0); /* Look for ENQ */
125 SERIAL_WRITE (desc, "\006", 1); /* Send ACK */
126 monitor_expect ("LO x\r", NULL, 0); /* Look for filename */
127
128 load_srec (desc, file, 80, SREC_ALL, hashmark);
129
130 monitor_expect ("\005", NULL, 0); /* Look for ENQ */
131 SERIAL_WRITE (desc, "\006", 1); /* Send ACK */
132 monitor_expect_prompt (NULL, 0);
133 }
134}
135
136/* This array of registers need to match the indexes used by GDB.
137 This exists because the various ROM monitors use different strings
138 than does GDB, and don't necessarily support all the registers
139 either. So, typing "info reg sp" becomes a "r30". */
140
141static char *sh3_regnames[NUM_REGS] = {
142 "R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7",
143 "R8", "R9", "R10","R11","R12","R13","R14","R15",
144 "PC", "PR", "GBR","VBR","MACH","MACL","SR",NULL,
145 NULL, NULL, NULL, NULL};
146
147/* Define the monitor command strings. Since these are passed directly
148 through to a printf style function, we may include formatting
149 strings. We also need a CR or LF on the end. */
150
151static struct target_ops sh3_ops;
152
153static char *sh3_inits[] = {"\003", NULL}; /* Exits sub-command mode & download cmds */
154
155static struct monitor_ops sh3_cmds =
156{
157 MO_CLR_BREAK_USES_ADDR
158 | MO_GETMEM_READ_SINGLE, /* flags */
159 sh3_inits, /* monitor init string */
160 "g\r", /* continue command */
161 "s\r", /* single step */
162 "\003", /* Interrupt program */
163 "b %x\r", /* set a breakpoint */
164 "b -%x\r", /* clear a breakpoint */
165 "b -\r", /* clear all breakpoints */
166 "f %x @%x %x\r", /* fill (start len val) */
167 {
168 "m %x %x\r", /* setmem.cmdb (addr, value) */
169 "m %x %x;w\r", /* setmem.cmdw (addr, value) */
170 "m %x %x;l\r", /* setmem.cmdl (addr, value) */
171 NULL, /* setmem.cmdll (addr, value) */
172 NULL, /* setreg.resp_delim */
173 NULL, /* setreg.term */
174 NULL, /* setreg.term_cmd */
175 },
176 {
177 "m %x\r", /* getmem.cmdb (addr, len) */
178 "m %x;w\r", /* getmem.cmdw (addr, len) */
179 "m %x;l\r", /* getmem.cmdl (addr, len) */
180 NULL, /* getmem.cmdll (addr, len) */
181 "^ [0-9A-F]+ ", /* getmem.resp_delim */
182 "? ", /* getmem.term */
183 ".\r", /* getmem.term_cmd */
184 },
185 {
186 ".%s %x\r", /* setreg.cmd (name, value) */
187 NULL, /* setreg.resp_delim */
188 NULL, /* setreg.term */
189 NULL /* setreg.term_cmd */
190 },
191 {
192 ".%s\r", /* getreg.cmd (name) */
193 "=", /* getreg.resp_delim */
194 "? ", /* getreg.term */
195 ".\r" /* getreg.term_cmd */
196 },
197 "r\r", /* dump_registers */
198 /* register_pattern */
199 "\\(\\w+\\)=\\([0-9a-fA-F]+\\( +[0-9a-fA-F]+\\b\\)*\\)",
200 sh3_supply_register, /* supply_register */
201 sh3_load, /* load_routine */
202 NULL, /* download command */
203 NULL, /* Load response */
204 "\n:", /* monitor command prompt */
205 "\r", /* end-of-line terminator */
206 ".\r", /* optional command terminator */
207 &sh3_ops, /* target operations */
208 SERIAL_1_STOPBITS, /* number of stop bits */
209 sh3_regnames, /* registers names */
210 MONITOR_OPS_MAGIC /* magic */
211};
212
213static void
214sh3_open (args, from_tty)
215 char *args;
216 int from_tty;
217{
218 char *serial_port_name = args;
219 char *parallel_port_name = 0;
220 if (args)
221 {
222 char *cursor = serial_port_name = strsave (args);
223
224 while (*cursor && *cursor != ' ')
225 cursor++;
226
227 if (*cursor)
228 *cursor++ = 0;
229
230 while (*cursor == ' ')
231 cursor++;
232
233 if (*cursor)
234 parallel_port_name = cursor;
235 }
236
237 monitor_open (serial_port_name, &sh3_cmds, from_tty);
238
239 if (parallel_port_name)
240 {
241 parallel = SERIAL_OPEN (parallel_port_name);
242 if (!parallel)
243 {
244 perror_with_name ("Unable to open parallel port.");
245 }
246 parallel_in_use = 1;
247 }
248}
249
250
251static void
252sh3_close (quitting)
253 int quitting;
254{
255 monitor_close (quitting);
256 if (parallel_in_use) {
257 SERIAL_CLOSE (parallel);
258 parallel_in_use = 0;
259 }
260}
261
262void
263_initialize_sh3 ()
264{
265 init_monitor_ops (&sh3_ops);
266
267 sh3_ops.to_shortname = "sh3";
268 sh3_ops.to_longname = "Hitachi SH-3 rom monitor";
269
270 sh3_ops.to_doc =
271#ifdef _WINDOWS
272 /* On windows we can talk through the parallel port too. */
273 "Debug on a Hitachi eval board running the SH-3 rom monitor.\n"
274 "Specify the serial device it is connected to (e.g. com2).\n"
275 "If you want to use the parallel port to download to it, specify that\n"
276 "as the second argument. (e.g. lpt1)";
277#else
278 "Debug on a Hitachi eval board running the SH-3 rom monitor.\n\
279Specify the serial device it is connected to (e.g. /dev/ttya).";
280#endif
281
282 sh3_ops.to_open = sh3_open;
283 sh3_ops.to_close = sh3_close;
284
285 add_target (&sh3_ops);
286}
This page took 0.025831 seconds and 4 git commands to generate.