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