]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/m32r-rom.c
* emulparams/crislinux.sh (COMMONPAGESIZE): Define.
[thirdparty/binutils-gdb.git] / gdb / m32r-rom.c
CommitLineData
d95a8903
AC
1/* Remote debugging interface to m32r and mon2000 ROM monitors for GDB,
2 the GNU debugger.
3b64bf98 3
ecd75fc8 4 Copyright (C) 1996-2014 Free Software Foundation, Inc.
d95a8903
AC
5
6 Adapted by Michael Snyder of Cygnus Support.
7
8 This file is part of GDB.
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
a9762ec7 12 the Free Software Foundation; either version 3 of the License, or
d95a8903
AC
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
a9762ec7 21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
d95a8903 22
025bb325 23/* This module defines communication with the Renesas m32r monitor. */
d95a8903
AC
24
25#include "defs.h"
26#include "gdbcore.h"
27#include "target.h"
60250e8b 28#include "exceptions.h"
d95a8903
AC
29#include "monitor.h"
30#include "serial.h"
31#include "symtab.h"
32#include "command.h"
33#include "gdbcmd.h"
34#include "symfile.h" /* for generic load */
2b71414d 35#include <sys/time.h>
d95a8903 36#include <time.h> /* for time_t */
0e9f083f 37#include <string.h>
025bb325 38#include "objfiles.h" /* for ALL_OBJFILES etc. */
fb14de7b 39#include "inferior.h"
d95a8903
AC
40#include <ctype.h>
41#include "regcache.h"
cbb099e8 42#include "gdb_bfd.h"
529480d0 43#include "cli/cli-utils.h"
d95a8903 44
d95a8903
AC
45/*
46 * All this stuff just to get my host computer's IP address!
47 */
cbba9205 48#ifdef __MINGW32__
b467f580 49#include <winsock2.h>
cbba9205 50#else
d95a8903
AC
51#include <sys/types.h>
52#include <netdb.h> /* for hostent */
53#include <netinet/in.h> /* for struct in_addr */
54#if 1
55#include <arpa/inet.h> /* for inet_ntoa */
56#endif
cbba9205 57#endif
d95a8903
AC
58
59static char *board_addr; /* user-settable IP address for M32R-EVA */
60static char *server_addr; /* user-settable IP address for gdb host */
61static char *download_path; /* user-settable path for SREC files */
62
63
64/* REGNUM */
65#define PSW_REGNUM 16
66#define SPI_REGNUM 18
67#define SPU_REGNUM 19
68#define ACCL_REGNUM 22
69#define ACCH_REGNUM 23
70
71
72/*
73 * Function: m32r_load_1 (helper function)
74 */
75
76static void
77m32r_load_section (bfd *abfd, asection *s, void *obj)
78{
79 unsigned int *data_count = obj;
80 if (s->flags & SEC_LOAD)
81 {
f5656ead 82 int addr_size = gdbarch_addr_bit (target_gdbarch ()) / 8;
d95a8903
AC
83 bfd_size_type section_size = bfd_section_size (abfd, s);
84 bfd_vma section_base = bfd_section_lma (abfd, s);
85 unsigned int buffer, i;
86
87 *data_count += section_size;
88
89 printf_filtered ("Loading section %s, size 0x%lx lma ",
ec20a626
UW
90 bfd_section_name (abfd, s),
91 (unsigned long) section_size);
f5656ead 92 fputs_filtered (paddress (target_gdbarch (), section_base), gdb_stdout);
d95a8903
AC
93 printf_filtered ("\n");
94 gdb_flush (gdb_stdout);
5af949e3 95 monitor_printf ("%s mw\r", phex_nz (section_base, addr_size));
d95a8903
AC
96 for (i = 0; i < section_size; i += 4)
97 {
98 QUIT;
99 monitor_expect (" -> ", NULL, 0);
100 bfd_get_section_contents (abfd, s, (char *) &buffer, i, 4);
101 monitor_printf ("%x\n", buffer);
102 }
103 monitor_expect (" -> ", NULL, 0);
104 monitor_printf ("q\n");
105 monitor_expect_prompt (NULL, 0);
106 }
107}
108
109static int
110m32r_load_1 (void *dummy)
111{
112 int data_count = 0;
113
114 bfd_map_over_sections ((bfd *) dummy, m32r_load_section, &data_count);
115 return data_count;
116}
117
118/*
119 * Function: m32r_load (an alternate way to load)
120 */
121
122static void
123m32r_load (char *filename, int from_tty)
124{
125 bfd *abfd;
22e048c9 126 unsigned int data_count = 0;
2b71414d 127 struct timeval start_time, end_time;
d6ad71ba 128 struct cleanup *cleanup;
d95a8903
AC
129
130 if (filename == NULL || filename[0] == 0)
131 filename = get_exec_file (1);
132
1c00ec6b 133 abfd = gdb_bfd_open (filename, NULL, -1);
d95a8903 134 if (!abfd)
8a3fe4f8 135 error (_("Unable to open file %s."), filename);
f9a062ff 136 cleanup = make_cleanup_bfd_unref (abfd);
d95a8903 137 if (bfd_check_format (abfd, bfd_object) == 0)
8a3fe4f8 138 error (_("File is not an object file."));
2b71414d 139 gettimeofday (&start_time, NULL);
d95a8903
AC
140#if 0
141 for (s = abfd->sections; s; s = s->next)
142 if (s->flags & SEC_LOAD)
143 {
144 bfd_size_type section_size = bfd_section_size (abfd, s);
145 bfd_vma section_base = bfd_section_vma (abfd, s);
146 unsigned int buffer;
147
148 data_count += section_size;
149
150 printf_filtered ("Loading section %s, size 0x%lx vma ",
151 bfd_section_name (abfd, s), section_size);
f5656ead 152 fputs_filtered (paddress (target_gdbarch (), section_base), gdb_stdout);
d95a8903
AC
153 printf_filtered ("\n");
154 gdb_flush (gdb_stdout);
155 monitor_printf ("%x mw\r", section_base);
156 for (i = 0; i < section_size; i += 4)
157 {
158 monitor_expect (" -> ", NULL, 0);
159 bfd_get_section_contents (abfd, s, (char *) &buffer, i, 4);
160 monitor_printf ("%x\n", buffer);
161 }
162 monitor_expect (" -> ", NULL, 0);
163 monitor_printf ("q\n");
164 monitor_expect_prompt (NULL, 0);
165 }
166#else
167 if (!(catch_errors (m32r_load_1, abfd, "Load aborted!\n", RETURN_MASK_ALL)))
168 {
169 monitor_printf ("q\n");
4bbc010a 170 do_cleanups (cleanup);
d95a8903
AC
171 return;
172 }
173#endif
2b71414d 174 gettimeofday (&end_time, NULL);
ec20a626
UW
175 printf_filtered ("Start address 0x%lx\n",
176 (unsigned long) bfd_get_start_address (abfd));
2b71414d
DJ
177 print_transfer_performance (gdb_stdout, data_count, 0, &start_time,
178 &end_time);
d95a8903 179
025bb325 180 /* Finally, make the PC point at the start address. */
d95a8903 181 if (exec_bfd)
fb14de7b
UW
182 regcache_write_pc (get_current_regcache (),
183 bfd_get_start_address (exec_bfd));
d95a8903 184
025bb325 185 inferior_ptid = null_ptid; /* No process now. */
d95a8903
AC
186
187 /* This is necessary because many things were based on the PC at the
188 time that we attached to the monitor, which is no longer valid
189 now that we have loaded new code (and just changed the PC).
190 Another way to do this might be to call normal_stop, except that
191 the stack may not be valid, and things would get horribly
025bb325 192 confused... */
d95a8903 193
c1e56572 194 clear_symtab_users (0);
d6ad71ba 195 do_cleanups (cleanup);
d95a8903
AC
196}
197
198static void
199m32r_load_gen (char *filename, int from_tty)
200{
201 generic_load (filename, from_tty);
202}
203
204static void m32r_open (char *args, int from_tty);
205static void mon2000_open (char *args, int from_tty);
206
025bb325 207/* This array of registers needs to match the indexes used by GDB. The
d95a8903
AC
208 whole reason this exists is because the various ROM monitors use
209 different names than GDB does, and don't support all the registers
025bb325 210 either. So, typing "info reg sp" becomes an "A7". */
d95a8903
AC
211
212static char *m32r_regnames[] =
213 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
214 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
215 "psw", "cbr", "spi", "spu", "bpc", "pc", "accl", "acch",
216};
217
218static void
c410a84c
UW
219m32r_supply_register (struct regcache *regcache, char *regname,
220 int regnamelen, char *val, int vallen)
d95a8903
AC
221{
222 int regno;
223 int num_regs = sizeof (m32r_regnames) / sizeof (m32r_regnames[0]);
40a6adc1 224 struct gdbarch *gdbarch = get_regcache_arch (regcache);
d95a8903
AC
225
226 for (regno = 0; regno < num_regs; regno++)
227 if (strncmp (regname, m32r_regnames[regno], regnamelen) == 0)
228 break;
229
230 if (regno >= num_regs)
231 return; /* no match */
232
233 if (regno == ACCL_REGNUM)
025bb325 234 { /* Special handling for 64-bit acc reg. */
c410a84c 235 monitor_supply_register (regcache, ACCH_REGNUM, val);
025bb325 236 val = strchr (val, ':'); /* Skip past ':' to get 2nd word. */
d95a8903 237 if (val != NULL)
c410a84c 238 monitor_supply_register (regcache, ACCL_REGNUM, val + 1);
d95a8903
AC
239 }
240 else
241 {
c410a84c 242 monitor_supply_register (regcache, regno, val);
d95a8903
AC
243 if (regno == PSW_REGNUM)
244 {
22e048c9
SDJ
245#if (defined SM_REGNUM || defined BSM_REGNUM || defined IE_REGNUM \
246 || defined BIE_REGNUM || defined COND_REGNUM || defined CBR_REGNUM \
247 || defined BPC_REGNUM || defined BCARRY_REGNUM)
d95a8903
AC
248 unsigned long psw = strtoul (val, NULL, 16);
249 char *zero = "00000000", *one = "00000001";
22e048c9 250#endif
d95a8903
AC
251
252#ifdef SM_REGNUM
253 /* Stack mode bit */
025bb325
MS
254 monitor_supply_register (regcache, SM_REGNUM,
255 (psw & 0x80) ? one : zero);
d95a8903
AC
256#endif
257#ifdef BSM_REGNUM
258 /* Backup stack mode bit */
025bb325
MS
259 monitor_supply_register (regcache, BSM_REGNUM,
260 (psw & 0x8000) ? one : zero);
d95a8903
AC
261#endif
262#ifdef IE_REGNUM
263 /* Interrupt enable bit */
025bb325
MS
264 monitor_supply_register (regcache, IE_REGNUM,
265 (psw & 0x40) ? one : zero);
d95a8903
AC
266#endif
267#ifdef BIE_REGNUM
268 /* Backup interrupt enable bit */
025bb325
MS
269 monitor_supply_register (regcache, BIE_REGNUM,
270 (psw & 0x4000) ? one : zero);
d95a8903
AC
271#endif
272#ifdef COND_REGNUM
273 /* Condition bit (carry etc.) */
025bb325
MS
274 monitor_supply_register (regcache, COND_REGNUM,
275 (psw & 0x1) ? one : zero);
d95a8903
AC
276#endif
277#ifdef CBR_REGNUM
025bb325
MS
278 monitor_supply_register (regcache, CBR_REGNUM,
279 (psw & 0x1) ? one : zero);
d95a8903
AC
280#endif
281#ifdef BPC_REGNUM
025bb325
MS
282 monitor_supply_register (regcache, BPC_REGNUM,
283 zero); /* KLUDGE: (???????) */
d95a8903
AC
284#endif
285#ifdef BCARRY_REGNUM
025bb325
MS
286 monitor_supply_register (regcache, BCARRY_REGNUM,
287 zero); /* KLUDGE: (??????) */
d95a8903
AC
288#endif
289 }
290
291 if (regno == SPI_REGNUM || regno == SPU_REGNUM)
025bb325 292 { /* special handling for stack pointer (spu or spi). */
7e3dd49e 293 ULONGEST stackmode, psw;
c410a84c 294 regcache_cooked_read_unsigned (regcache, PSW_REGNUM, &psw);
7e3dd49e 295 stackmode = psw & 0x80;
d95a8903
AC
296
297 if (regno == SPI_REGNUM && !stackmode) /* SP == SPI */
3e8c568d 298 monitor_supply_register (regcache,
40a6adc1 299 gdbarch_sp_regnum (gdbarch), val);
d95a8903 300 else if (regno == SPU_REGNUM && stackmode) /* SP == SPU */
3e8c568d 301 monitor_supply_register (regcache,
40a6adc1 302 gdbarch_sp_regnum (gdbarch), val);
d95a8903
AC
303 }
304 }
305}
306
307/* m32r RevC board monitor */
308
309static struct target_ops m32r_ops;
310
311static char *m32r_inits[] = { "\r", NULL };
312
313static struct monitor_ops m32r_cmds;
314
315static void
316init_m32r_cmds (void)
317{
318 m32r_cmds.flags = MO_CLR_BREAK_USES_ADDR | MO_REGISTER_VALUE_FIRST;
319 m32r_cmds.init = m32r_inits; /* Init strings */
320 m32r_cmds.cont = "go\r"; /* continue command */
321 m32r_cmds.step = "step\r"; /* single step */
322 m32r_cmds.stop = NULL; /* interrupt command */
323 m32r_cmds.set_break = "%x +bp\r"; /* set a breakpoint */
324 m32r_cmds.clr_break = "%x -bp\r"; /* clear a breakpoint */
325 m32r_cmds.clr_all_break = "bpoff\r"; /* clear all breakpoints */
326 m32r_cmds.fill = "%x %x %x fill\r"; /* fill (start length val) */
327 m32r_cmds.setmem.cmdb = "%x 1 %x fill\r"; /* setmem.cmdb (addr, value) */
328 m32r_cmds.setmem.cmdw = "%x 1 %x fillh\r"; /* setmem.cmdw (addr, value) */
329 m32r_cmds.setmem.cmdl = "%x 1 %x fillw\r"; /* setmem.cmdl (addr, value) */
330 m32r_cmds.setmem.cmdll = NULL; /* setmem.cmdll (addr, value) */
331 m32r_cmds.setmem.resp_delim = NULL; /* setmem.resp_delim */
332 m32r_cmds.setmem.term = NULL; /* setmem.term */
333 m32r_cmds.setmem.term_cmd = NULL; /* setmem.term_cmd */
334 m32r_cmds.getmem.cmdb = "%x %x dump\r"; /* getmem.cmdb (addr, len) */
335 m32r_cmds.getmem.cmdw = NULL; /* getmem.cmdw (addr, len) */
336 m32r_cmds.getmem.cmdl = NULL; /* getmem.cmdl (addr, len) */
337 m32r_cmds.getmem.cmdll = NULL; /* getmem.cmdll (addr, len) */
338 m32r_cmds.getmem.resp_delim = ": "; /* getmem.resp_delim */
339 m32r_cmds.getmem.term = NULL; /* getmem.term */
340 m32r_cmds.getmem.term_cmd = NULL; /* getmem.term_cmd */
341 m32r_cmds.setreg.cmd = "%x to %%%s\r"; /* setreg.cmd (name, value) */
342 m32r_cmds.setreg.resp_delim = NULL; /* setreg.resp_delim */
343 m32r_cmds.setreg.term = NULL; /* setreg.term */
344 m32r_cmds.setreg.term_cmd = NULL; /* setreg.term_cmd */
345 m32r_cmds.getreg.cmd = NULL; /* getreg.cmd (name) */
346 m32r_cmds.getreg.resp_delim = NULL; /* getreg.resp_delim */
347 m32r_cmds.getreg.term = NULL; /* getreg.term */
348 m32r_cmds.getreg.term_cmd = NULL; /* getreg.term_cmd */
349 m32r_cmds.dump_registers = ".reg\r"; /* dump_registers */
025bb325
MS
350 /* register_pattern */
351 m32r_cmds.register_pattern = "\\(\\w+\\) += \\([0-9a-fA-F]+\\b\\)";
23a6d369 352 m32r_cmds.supply_register = m32r_supply_register;
d95a8903
AC
353 m32r_cmds.load = NULL; /* download command */
354 m32r_cmds.loadresp = NULL; /* load response */
355 m32r_cmds.prompt = "ok "; /* monitor command prompt */
356 m32r_cmds.line_term = "\r"; /* end-of-line terminator */
357 m32r_cmds.cmd_end = NULL; /* optional command terminator */
358 m32r_cmds.target = &m32r_ops; /* target operations */
359 m32r_cmds.stopbits = SERIAL_1_STOPBITS; /* number of stop bits */
360 m32r_cmds.regnames = m32r_regnames; /* registers names */
361 m32r_cmds.magic = MONITOR_OPS_MAGIC; /* magic */
362} /* init_m32r_cmds */
363
364static void
365m32r_open (char *args, int from_tty)
366{
367 monitor_open (args, &m32r_cmds, from_tty);
368}
369
370/* Mon2000 monitor (MSA2000 board) */
371
372static struct target_ops mon2000_ops;
373static struct monitor_ops mon2000_cmds;
374
375static void
376init_mon2000_cmds (void)
377{
378 mon2000_cmds.flags = MO_CLR_BREAK_USES_ADDR | MO_REGISTER_VALUE_FIRST;
379 mon2000_cmds.init = m32r_inits; /* Init strings */
380 mon2000_cmds.cont = "go\r"; /* continue command */
381 mon2000_cmds.step = "step\r"; /* single step */
382 mon2000_cmds.stop = NULL; /* interrupt command */
383 mon2000_cmds.set_break = "%x +bp\r"; /* set a breakpoint */
384 mon2000_cmds.clr_break = "%x -bp\r"; /* clear a breakpoint */
385 mon2000_cmds.clr_all_break = "bpoff\r"; /* clear all breakpoints */
386 mon2000_cmds.fill = "%x %x %x fill\r"; /* fill (start length val) */
387 mon2000_cmds.setmem.cmdb = "%x 1 %x fill\r"; /* setmem.cmdb (addr, value) */
388 mon2000_cmds.setmem.cmdw = "%x 1 %x fillh\r"; /* setmem.cmdw (addr, value) */
389 mon2000_cmds.setmem.cmdl = "%x 1 %x fillw\r"; /* setmem.cmdl (addr, value) */
390 mon2000_cmds.setmem.cmdll = NULL; /* setmem.cmdll (addr, value) */
391 mon2000_cmds.setmem.resp_delim = NULL; /* setmem.resp_delim */
392 mon2000_cmds.setmem.term = NULL; /* setmem.term */
393 mon2000_cmds.setmem.term_cmd = NULL; /* setmem.term_cmd */
394 mon2000_cmds.getmem.cmdb = "%x %x dump\r"; /* getmem.cmdb (addr, len) */
395 mon2000_cmds.getmem.cmdw = NULL; /* getmem.cmdw (addr, len) */
396 mon2000_cmds.getmem.cmdl = NULL; /* getmem.cmdl (addr, len) */
397 mon2000_cmds.getmem.cmdll = NULL; /* getmem.cmdll (addr, len) */
398 mon2000_cmds.getmem.resp_delim = ": "; /* getmem.resp_delim */
399 mon2000_cmds.getmem.term = NULL; /* getmem.term */
400 mon2000_cmds.getmem.term_cmd = NULL; /* getmem.term_cmd */
401 mon2000_cmds.setreg.cmd = "%x to %%%s\r"; /* setreg.cmd (name, value) */
402 mon2000_cmds.setreg.resp_delim = NULL; /* setreg.resp_delim */
403 mon2000_cmds.setreg.term = NULL; /* setreg.term */
404 mon2000_cmds.setreg.term_cmd = NULL; /* setreg.term_cmd */
405 mon2000_cmds.getreg.cmd = NULL; /* getreg.cmd (name) */
406 mon2000_cmds.getreg.resp_delim = NULL; /* getreg.resp_delim */
407 mon2000_cmds.getreg.term = NULL; /* getreg.term */
408 mon2000_cmds.getreg.term_cmd = NULL; /* getreg.term_cmd */
409 mon2000_cmds.dump_registers = ".reg\r"; /* dump_registers */
025bb325
MS
410 /* register_pattern */
411 mon2000_cmds.register_pattern = "\\(\\w+\\) += \\([0-9a-fA-F]+\\b\\)";
23a6d369 412 mon2000_cmds.supply_register = m32r_supply_register;
d95a8903
AC
413 mon2000_cmds.load = NULL; /* download command */
414 mon2000_cmds.loadresp = NULL; /* load response */
415 mon2000_cmds.prompt = "Mon2000>"; /* monitor command prompt */
416 mon2000_cmds.line_term = "\r"; /* end-of-line terminator */
417 mon2000_cmds.cmd_end = NULL; /* optional command terminator */
418 mon2000_cmds.target = &mon2000_ops; /* target operations */
419 mon2000_cmds.stopbits = SERIAL_1_STOPBITS; /* number of stop bits */
420 mon2000_cmds.regnames = m32r_regnames; /* registers names */
421 mon2000_cmds.magic = MONITOR_OPS_MAGIC; /* magic */
422} /* init_mon2000_cmds */
423
424static void
425mon2000_open (char *args, int from_tty)
426{
427 monitor_open (args, &mon2000_cmds, from_tty);
428}
429
d95a8903
AC
430static void
431m32r_upload_command (char *args, int from_tty)
432{
433 bfd *abfd;
434 asection *s;
2b71414d 435 struct timeval start_time, end_time;
d95a8903
AC
436 int resp_len, data_count = 0;
437 char buf[1024];
438 struct hostent *hostent;
439 struct in_addr inet_addr;
d6ad71ba 440 struct cleanup *cleanup;
d95a8903 441
025bb325 442 /* First check to see if there's an ethernet port! */
d95a8903
AC
443 monitor_printf ("ust\r");
444 resp_len = monitor_expect_prompt (buf, sizeof (buf));
445 if (!strchr (buf, ':'))
8a3fe4f8 446 error (_("No ethernet connection!"));
d95a8903
AC
447
448 if (board_addr == 0)
449 {
025bb325 450 /* Scan second colon in the output from the "ust" command. */
d95a8903
AC
451 char *myIPaddress = strchr (strchr (buf, ':') + 1, ':') + 1;
452
529480d0 453 myIPaddress = skip_spaces (myIPaddress);
d95a8903
AC
454
455 if (!strncmp (myIPaddress, "0.0.", 4)) /* empty */
35ecd2d6
MS
456 error (_("Please use 'set board-address' to "
457 "set the M32R-EVA board's IP address."));
d95a8903
AC
458 if (strchr (myIPaddress, '('))
459 *(strchr (myIPaddress, '(')) = '\0'; /* delete trailing junk */
460 board_addr = xstrdup (myIPaddress);
461 }
462 if (server_addr == 0)
463 {
cbba9205
KI
464#ifdef __MINGW32__
465 WSADATA wd;
025bb325 466 /* Winsock initialization. */
cbba9205
KI
467 if (WSAStartup (MAKEWORD (1, 1), &wd))
468 error (_("Couldn't initialize WINSOCK."));
469#endif
470
d95a8903
AC
471 buf[0] = 0;
472 gethostname (buf, sizeof (buf));
473 if (buf[0] != 0)
d95a8903 474 {
880bc914
AC
475 hostent = gethostbyname (buf);
476 if (hostent != 0)
477 {
d95a8903 478#if 1
880bc914
AC
479 memcpy (&inet_addr.s_addr, hostent->h_addr,
480 sizeof (inet_addr.s_addr));
481 server_addr = (char *) inet_ntoa (inet_addr);
d95a8903 482#else
880bc914 483 server_addr = (char *) inet_ntoa (hostent->h_addr);
d95a8903 484#endif
880bc914 485 }
d95a8903 486 }
025bb325 487 if (server_addr == 0) /* failed? */
35ecd2d6
MS
488 error (_("Need to know gdb host computer's "
489 "IP address (use 'set server-address')"));
d95a8903
AC
490 }
491
025bb325
MS
492 if (args == 0 || args[0] == 0) /* No args: upload the current
493 file. */
d95a8903
AC
494 args = get_exec_file (1);
495
496 if (args[0] != '/' && download_path == 0)
497 {
498 if (current_directory)
499 download_path = xstrdup (current_directory);
500 else
35ecd2d6
MS
501 error (_("Need to know default download "
502 "path (use 'set download-path')"));
d95a8903
AC
503 }
504
2b71414d 505 gettimeofday (&start_time, NULL);
d95a8903 506 monitor_printf ("uhip %s\r", server_addr);
025bb325 507 resp_len = monitor_expect_prompt (buf, sizeof (buf)); /* parse result? */
d95a8903 508 monitor_printf ("ulip %s\r", board_addr);
025bb325 509 resp_len = monitor_expect_prompt (buf, sizeof (buf)); /* parse result? */
d95a8903
AC
510 if (args[0] != '/')
511 monitor_printf ("up %s\r", download_path); /* use default path */
512 else
513 monitor_printf ("up\r"); /* rooted filename/path */
025bb325 514 resp_len = monitor_expect_prompt (buf, sizeof (buf)); /* parse result? */
d95a8903
AC
515
516 if (strrchr (args, '.') && !strcmp (strrchr (args, '.'), ".srec"))
517 monitor_printf ("ul %s\r", args);
518 else /* add ".srec" suffix */
519 monitor_printf ("ul %s.srec\r", args);
025bb325 520 resp_len = monitor_expect_prompt (buf, sizeof (buf)); /* parse result? */
d95a8903
AC
521
522 if (buf[0] == 0 || strstr (buf, "complete") == 0)
35ecd2d6
MS
523 error (_("Upload file not found: %s.srec\n"
524 "Check IP addresses and download path."),
525 args);
d95a8903
AC
526 else
527 printf_filtered (" -- Ethernet load complete.\n");
528
2b71414d 529 gettimeofday (&end_time, NULL);
1c00ec6b 530 abfd = gdb_bfd_open (args, NULL, -1);
f9a062ff 531 cleanup = make_cleanup_bfd_unref (abfd);
d95a8903 532 if (abfd != NULL)
025bb325 533 { /* Download is done -- print section statistics. */
d95a8903
AC
534 if (bfd_check_format (abfd, bfd_object) == 0)
535 {
536 printf_filtered ("File is not an object file\n");
537 }
538 for (s = abfd->sections; s; s = s->next)
539 if (s->flags & SEC_LOAD)
540 {
541 bfd_size_type section_size = bfd_section_size (abfd, s);
542 bfd_vma section_base = bfd_section_lma (abfd, s);
d95a8903
AC
543
544 data_count += section_size;
545
546 printf_filtered ("Loading section %s, size 0x%lx lma ",
ec20a626
UW
547 bfd_section_name (abfd, s),
548 (unsigned long) section_size);
f5656ead 549 fputs_filtered (paddress (target_gdbarch (), section_base),
5af949e3 550 gdb_stdout);
d95a8903
AC
551 printf_filtered ("\n");
552 gdb_flush (gdb_stdout);
553 }
025bb325 554 /* Finally, make the PC point at the start address. */
fb14de7b
UW
555 regcache_write_pc (get_current_regcache (),
556 bfd_get_start_address (abfd));
ec20a626
UW
557 printf_filtered ("Start address 0x%lx\n",
558 (unsigned long) bfd_get_start_address (abfd));
2b71414d
DJ
559 print_transfer_performance (gdb_stdout, data_count, 0, &start_time,
560 &end_time);
d95a8903 561 }
025bb325 562 inferior_ptid = null_ptid; /* No process now. */
d95a8903
AC
563
564 /* This is necessary because many things were based on the PC at the
565 time that we attached to the monitor, which is no longer valid
566 now that we have loaded new code (and just changed the PC).
567 Another way to do this might be to call normal_stop, except that
568 the stack may not be valid, and things would get horribly
025bb325 569 confused... */
d95a8903 570
c1e56572 571 clear_symtab_users (0);
d6ad71ba 572 do_cleanups (cleanup);
d95a8903
AC
573}
574
63807e1d
PA
575/* Provide a prototype to silence -Wmissing-prototypes. */
576extern initialize_file_ftype _initialize_m32r_rom;
577
d95a8903
AC
578void
579_initialize_m32r_rom (void)
580{
025bb325 581 /* Initialize m32r RevC monitor target. */
d95a8903
AC
582 init_m32r_cmds ();
583 init_monitor_ops (&m32r_ops);
584
585 m32r_ops.to_shortname = "m32r";
586 m32r_ops.to_longname = "m32r monitor";
025bb325
MS
587 m32r_ops.to_load = m32r_load_gen; /* Monitor lacks a download
588 command. */
d95a8903
AC
589 m32r_ops.to_doc = "Debug via the m32r monitor.\n\
590Specify the serial device it is connected to (e.g. /dev/ttya).";
591 m32r_ops.to_open = m32r_open;
592 add_target (&m32r_ops);
593
594 /* Initialize mon2000 monitor target */
595 init_mon2000_cmds ();
596 init_monitor_ops (&mon2000_ops);
597
598 mon2000_ops.to_shortname = "mon2000";
599 mon2000_ops.to_longname = "Mon2000 monitor";
025bb325
MS
600 mon2000_ops.to_load = m32r_load_gen; /* Monitor lacks a download
601 command. */
d95a8903
AC
602 mon2000_ops.to_doc = "Debug via the Mon2000 monitor.\n\
603Specify the serial device it is connected to (e.g. /dev/ttya).";
604 mon2000_ops.to_open = mon2000_open;
605 add_target (&mon2000_ops);
606
7915a72c
AC
607 add_setshow_string_cmd ("download-path", class_obscure, &download_path, _("\
608Set the default path for downloadable SREC files."), _("\
609Show the default path for downloadable SREC files."), _("\
610Determines the default path for downloadable SREC files."),
2c5b56ce 611 NULL,
025bb325
MS
612 NULL, /* FIXME: i18n: The default path for
613 downloadable SREC files is %s. */
2c5b56ce 614 &setlist, &showlist);
7915a72c
AC
615
616 add_setshow_string_cmd ("board-address", class_obscure, &board_addr, _("\
617Set IP address for M32R-EVA target board."), _("\
618Show IP address for M32R-EVA target board."), _("\
619Determine the IP address for M32R-EVA target board."),
2c5b56ce 620 NULL,
025bb325
MS
621 NULL, /* FIXME: i18n: IP address for
622 M32R-EVA target board is %s. */
2c5b56ce 623 &setlist, &showlist);
7915a72c
AC
624
625 add_setshow_string_cmd ("server-address", class_obscure, &server_addr, _("\
626Set IP address for download server (GDB's host computer)."), _("\
627Show IP address for download server (GDB's host computer)."), _("\
628Determine the IP address for download server (GDB's host computer)."),
2c5b56ce 629 NULL,
025bb325
MS
630 NULL, /* FIXME: i18n: IP address for
631 download server (GDB's host
632 computer) is %s. */
2c5b56ce 633 &setlist, &showlist);
d95a8903 634
1bedd215
AC
635 add_com ("upload", class_obscure, m32r_upload_command, _("\
636Upload the srec file via the monitor's Ethernet upload capability."));
d95a8903 637
1bedd215 638 add_com ("tload", class_obscure, m32r_load, _("test upload command."));
d95a8903 639}