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