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