2004-07-28 Andrew Cagney <cagney@gnu.org>
[deliverable/binutils-gdb.git] / gdb / m32r-rom.c
index bbcc1c0cf7b6b31d807e48e40e87360deba93b16..c60f021b2b0d94b4c40ef8d087499d8daea61a69 100644 (file)
@@ -1,6 +1,8 @@
 /* Remote debugging interface to m32r and mon2000 ROM monitors for GDB, 
    the GNU debugger.
-   Copyright 1996 Free Software Foundation, Inc.
+
+   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2004 Free Software
+   Foundation, Inc.
 
    Adapted by Michael Snyder of Cygnus Support.
 
@@ -21,7 +23,7 @@
    Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-/* This module defines communication with the Mitsubishi m32r monitor */
+/* This module defines communication with the Renesas m32r monitor */
 
 #include "defs.h"
 #include "gdbcore.h"
 #include <time.h>              /* for time_t */
 #include "gdb_string.h"
 #include "objfiles.h"          /* for ALL_OBJFILES etc. */
+#include "inferior.h"          /* for write_pc() */
+#include <ctype.h>
+#include "regcache.h"
 
-
-extern void report_transfer_performance PARAMS ((unsigned long, time_t, time_t));
-
-#ifndef _MSC_VER
 /*
  * All this stuff just to get my host computer's IP address!
  */
@@ -49,23 +50,28 @@ extern void report_transfer_performance PARAMS ((unsigned long, time_t, time_t))
 #if 1
 #include <arpa/inet.h>         /* for inet_ntoa */
 #endif
-#endif
 
 static char *board_addr;       /* user-settable IP address for M32R-EVA */
 static char *server_addr;      /* user-settable IP address for gdb host */
 static char *download_path;    /* user-settable path for SREC files     */
 
 
+/* REGNUM */
+#define PSW_REGNUM      16
+#define SPI_REGNUM      18
+#define SPU_REGNUM      19
+#define ACCL_REGNUM     22
+#define ACCH_REGNUM     23
+
+
 /* 
  * Function: m32r_load_1 (helper function)
  */
 
 static void
-m32r_load_section (abfd, s, data_count)
-     bfd *abfd;
-     asection *s;
-     unsigned int *data_count;
+m32r_load_section (bfd *abfd, asection *s, void *obj)
 {
+  unsigned int *data_count = obj;
   if (s->flags & SEC_LOAD)
     {
       bfd_size_type section_size = bfd_section_size (abfd, s);
@@ -79,7 +85,7 @@ m32r_load_section (abfd, s, data_count)
       print_address_numeric (section_base, 1, gdb_stdout);
       printf_filtered ("\n");
       gdb_flush (gdb_stdout);
-      monitor_printf ("%x mw\r", section_base);
+      monitor_printf ("%s mw\r", paddr_nz (section_base));
       for (i = 0; i < section_size; i += 4)
        {
          QUIT;
@@ -94,8 +100,7 @@ m32r_load_section (abfd, s, data_count)
 }
 
 static int
-m32r_load_1 (dummy)
-     void *dummy;
+m32r_load_1 (void *dummy)
 {
   int data_count = 0;
 
@@ -108,11 +113,8 @@ m32r_load_1 (dummy)
  */
 
 static void
-m32r_load (filename, from_tty)
-     char *filename;
-     int from_tty;
+m32r_load (char *filename, int from_tty)
 {
-  extern int inferior_pid;
   bfd *abfd;
   asection *s;
   unsigned int i, data_count = 0;
@@ -162,13 +164,14 @@ m32r_load (filename, from_tty)
 #endif
   end_time = time (NULL);
   printf_filtered ("Start address 0x%lx\n", bfd_get_start_address (abfd));
-  report_transfer_performance (data_count, start_time, end_time);
+  print_transfer_performance (gdb_stdout, data_count, 0,
+                             end_time - start_time);
 
   /* Finally, make the PC point at the start address */
   if (exec_bfd)
     write_pc (bfd_get_start_address (exec_bfd));
 
-  inferior_pid = 0;            /* No process now */
+  inferior_ptid = null_ptid;   /* No process now */
 
   /* This is necessary because many things were based on the PC at the
      time that we attached to the monitor, which is no longer valid
@@ -181,15 +184,13 @@ m32r_load (filename, from_tty)
 }
 
 static void
-m32r_load_gen (filename, from_tty)
-     char *filename;
-     int from_tty;
+m32r_load_gen (char *filename, int from_tty)
 {
   generic_load (filename, from_tty);
 }
 
-static void m32r_open PARAMS ((char *args, int from_tty));
-static void mon2000_open PARAMS ((char *args, int from_tty));
+static void m32r_open (char *args, int from_tty);
+static void mon2000_open (char *args, int from_tty);
 
 /* This array of registers needs to match the indexes used by GDB. The
    whole reason this exists is because the various ROM monitors use
@@ -197,17 +198,13 @@ static void mon2000_open PARAMS ((char *args, int from_tty));
    either. So, typing "info reg sp" becomes an "A7". */
 
 static char *m32r_regnames[] =
-{"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
- "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
- "psw", "cbr", "spi", "spu", "bpc", "pc", "accl", "acch",
+  { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
 "psw", "cbr", "spi", "spu", "bpc", "pc", "accl", "acch",
 };
 
 static void
-m32r_supply_register (regname, regnamelen, val, vallen)
-     char *regname;
-     int regnamelen;
-     char *val;
-     int vallen;
+m32r_supply_register (char *regname, int regnamelen, char *val, int vallen)
 {
   int regno;
   int num_regs = sizeof (m32r_regnames) / sizeof (m32r_regnames[0]);
@@ -267,7 +264,9 @@ m32r_supply_register (regname, regnamelen, val, vallen)
 
       if (regno == SPI_REGNUM || regno == SPU_REGNUM)
        {                       /* special handling for stack pointer (spu or spi) */
-         unsigned long stackmode = read_register (PSW_REGNUM) & 0x80;
+         ULONGEST stackmode, psw;
+         regcache_cooked_read_unsigned (current_regcache, PSW_REGNUM, &psw);
+         stackmode = psw & 0x80;
 
          if (regno == SPI_REGNUM && !stackmode)        /* SP == SPI */
            monitor_supply_register (SP_REGNUM, val);
@@ -281,8 +280,7 @@ m32r_supply_register (regname, regnamelen, val, vallen)
 
 static struct target_ops m32r_ops;
 
-static char *m32r_inits[] =
-{"\r", NULL};
+static char *m32r_inits[] = { "\r", NULL };
 
 static struct monitor_ops m32r_cmds;
 
@@ -322,7 +320,7 @@ init_m32r_cmds (void)
   m32r_cmds.getreg.term_cmd = NULL;    /* getreg.term_cmd */
   m32r_cmds.dump_registers = ".reg\r"; /* dump_registers */
   m32r_cmds.register_pattern = "\\(\\w+\\) += \\([0-9a-fA-F]+\\b\\)";  /* register_pattern */
-  m32r_cmds.supply_register = m32r_supply_register;    /* supply_register */
+  m32r_cmds.supply_register = m32r_supply_register;
   m32r_cmds.load_routine = NULL;       /* load_routine (defaults to SRECs) */
   m32r_cmds.load = NULL;       /* download command */
   m32r_cmds.loadresp = NULL;   /* load response */
@@ -336,9 +334,7 @@ init_m32r_cmds (void)
 }                              /* init_m32r_cmds */
 
 static void
-m32r_open (args, from_tty)
-     char *args;
-     int from_tty;
+m32r_open (char *args, int from_tty)
 {
   monitor_open (args, &m32r_cmds, from_tty);
 }
@@ -361,8 +357,8 @@ init_mon2000_cmds (void)
   mon2000_cmds.clr_all_break = "bpoff\r";      /* clear all breakpoints */
   mon2000_cmds.fill = "%x %x %x fill\r";       /* fill (start length val) */
   mon2000_cmds.setmem.cmdb = "%x 1 %x fill\r"; /* setmem.cmdb (addr, value) */
-  mon2000_cmds.setmem.cmdw = "%x 1 %x fillh\r";                /* setmem.cmdw (addr, value) */
-  mon2000_cmds.setmem.cmdl = "%x 1 %x fillw\r";                /* setmem.cmdl (addr, value) */
+  mon2000_cmds.setmem.cmdw = "%x 1 %x fillh\r";        /* setmem.cmdw (addr, value) */
+  mon2000_cmds.setmem.cmdl = "%x 1 %x fillw\r";        /* setmem.cmdl (addr, value) */
   mon2000_cmds.setmem.cmdll = NULL;    /* setmem.cmdll (addr, value) */
   mon2000_cmds.setmem.resp_delim = NULL;       /* setmem.resp_delim */
   mon2000_cmds.setmem.term = NULL;     /* setmem.term */
@@ -384,7 +380,7 @@ init_mon2000_cmds (void)
   mon2000_cmds.getreg.term_cmd = NULL; /* getreg.term_cmd */
   mon2000_cmds.dump_registers = ".reg\r";      /* dump_registers */
   mon2000_cmds.register_pattern = "\\(\\w+\\) += \\([0-9a-fA-F]+\\b\\)";       /* register_pattern */
-  mon2000_cmds.supply_register = m32r_supply_register; /* supply_register */
+  mon2000_cmds.supply_register = m32r_supply_register;
   mon2000_cmds.load_routine = NULL;    /* load_routine (defaults to SRECs) */
   mon2000_cmds.load = NULL;    /* download command */
   mon2000_cmds.loadresp = NULL;        /* load response */
@@ -398,87 +394,17 @@ init_mon2000_cmds (void)
 }                              /* init_mon2000_cmds */
 
 static void
-mon2000_open (args, from_tty)
-     char *args;
-     int from_tty;
+mon2000_open (char *args, int from_tty)
 {
   monitor_open (args, &mon2000_cmds, from_tty);
 }
 
-#ifndef _MSC_VER
-
-/* Function: set_board_address
-   Tell the BootOne monitor what it's ethernet IP address is. */
-
-static void
-m32r_set_board_address (args, from_tty)
-     char *args;
-     int from_tty;
-{
-  int resp_len;
-  char buf[1024];
-
-  if (args && *args)
-    {
-      monitor_printf ("ulip %s\n", args);
-      resp_len = monitor_expect_prompt (buf, sizeof (buf));
-      /* now parse the result for success */
-    }
-  else
-    error ("Requires argument (IP address for M32R-EVA board)");
-}
-
-/* Function: set_server_address
-   Tell the BootOne monitor what gdb's ethernet IP address is. */
-
 static void
-m32r_set_server_address (args, from_tty)
-     char *args;
-     int from_tty;
-{
-  int resp_len;
-  char buf[1024];
-
-  if (args && *args)
-    {
-      monitor_printf ("uhip %s\n", args);
-      resp_len = monitor_expect_prompt (buf, sizeof (buf));
-      /* now parse the result for success */
-    }
-  else
-    error ("Requires argument (IP address of GDB's host computer)");
-}
-
-/* Function: set_download_path
-   Tell the BootOne monitor the default path for downloadable SREC files. */
-
-static void
-m32r_set_download_path (args, from_tty)
-     char *args;
-     int from_tty;
-{
-  int resp_len;
-  char buf[1024];
-
-  if (args && *args)
-    {
-      monitor_printf ("up %s\n", args);
-      resp_len = monitor_expect_prompt (buf, sizeof (buf));
-      /* now parse the result for success */
-    }
-  else
-    error ("Requires argument (default path for downloadable SREC files)");
-}
-
-static void
-m32r_upload_command (args, from_tty)
-     char *args;
-     int from_tty;
+m32r_upload_command (char *args, int from_tty)
 {
   bfd *abfd;
   asection *s;
   time_t start_time, end_time; /* for timing of download */
-  extern int inferior_pid;
   int resp_len, data_count = 0;
   char buf[1024];
   struct hostent *hostent;
@@ -499,29 +425,33 @@ m32r_upload_command (args, from_tty)
        myIPaddress++;
 
       if (!strncmp (myIPaddress, "0.0.", 4))   /* empty */
-       error ("Please use 'set board-address' to set the M32R-EVA board's IP address.");
+       error
+         ("Please use 'set board-address' to set the M32R-EVA board's IP address.");
       if (strchr (myIPaddress, '('))
        *(strchr (myIPaddress, '(')) = '\0';    /* delete trailing junk */
-      board_addr = strsave (myIPaddress);
+      board_addr = xstrdup (myIPaddress);
     }
   if (server_addr == 0)
     {
       buf[0] = 0;
       gethostname (buf, sizeof (buf));
       if (buf[0] != 0)
-       hostent = gethostbyname (buf);
-      if (hostent != 0)
        {
+         hostent = gethostbyname (buf);
+         if (hostent != 0)
+           {
 #if 1
-         memcpy (&inet_addr.s_addr, hostent->h_addr,
-                 sizeof (inet_addr.s_addr));
-         server_addr = (char *) inet_ntoa (inet_addr);
+             memcpy (&inet_addr.s_addr, hostent->h_addr,
+                     sizeof (inet_addr.s_addr));
+             server_addr = (char *) inet_ntoa (inet_addr);
 #else
-         server_addr = (char *) inet_ntoa (hostent->h_addr);
+             server_addr = (char *) inet_ntoa (hostent->h_addr);
 #endif
+           }
        }
       if (server_addr == 0)    /* failed? */
-       error ("Need to know gdb host computer's IP address (use 'set server-address')");
+       error
+         ("Need to know gdb host computer's IP address (use 'set server-address')");
     }
 
   if (args == 0 || args[0] == 0)       /* no args: upload the current file */
@@ -530,30 +460,33 @@ m32r_upload_command (args, from_tty)
   if (args[0] != '/' && download_path == 0)
     {
       if (current_directory)
-       download_path = strsave (current_directory);
+       download_path = xstrdup (current_directory);
       else
-       error ("Need to know default download path (use 'set download-path')");
+       error
+         ("Need to know default download path (use 'set download-path')");
     }
 
   start_time = time (NULL);
   monitor_printf ("uhip %s\r", server_addr);
-  resp_len = monitor_expect_prompt (buf, sizeof (buf));                /* parse result? */
+  resp_len = monitor_expect_prompt (buf, sizeof (buf));        /* parse result? */
   monitor_printf ("ulip %s\r", board_addr);
-  resp_len = monitor_expect_prompt (buf, sizeof (buf));                /* parse result? */
+  resp_len = monitor_expect_prompt (buf, sizeof (buf));        /* parse result? */
   if (args[0] != '/')
     monitor_printf ("up %s\r", download_path); /* use default path */
   else
     monitor_printf ("up\r");   /* rooted filename/path */
-  resp_len = monitor_expect_prompt (buf, sizeof (buf));                /* parse result? */
+  resp_len = monitor_expect_prompt (buf, sizeof (buf));        /* parse result? */
 
   if (strrchr (args, '.') && !strcmp (strrchr (args, '.'), ".srec"))
     monitor_printf ("ul %s\r", args);
   else                         /* add ".srec" suffix */
     monitor_printf ("ul %s.srec\r", args);
-  resp_len = monitor_expect_prompt (buf, sizeof (buf));                /* parse result? */
+  resp_len = monitor_expect_prompt (buf, sizeof (buf));        /* parse result? */
 
   if (buf[0] == 0 || strstr (buf, "complete") == 0)
-    error ("Upload file not found: %s.srec\nCheck IP addresses and download path.", args);
+    error
+      ("Upload file not found: %s.srec\nCheck IP addresses and download path.",
+       args);
   else
     printf_filtered (" -- Ethernet load complete.\n");
 
@@ -582,10 +515,11 @@ m32r_upload_command (args, from_tty)
          }
       /* Finally, make the PC point at the start address */
       write_pc (bfd_get_start_address (abfd));
-      report_transfer_performance (data_count, start_time, end_time);
       printf_filtered ("Start address 0x%lx\n", bfd_get_start_address (abfd));
+      print_transfer_performance (gdb_stdout, data_count, 0,
+                                 end_time - start_time);
     }
-  inferior_pid = 0;            /* No process now */
+  inferior_ptid = null_ptid;   /* No process now */
 
   /* This is necessary because many things were based on the PC at the
      time that we attached to the monitor, which is no longer valid
@@ -597,10 +531,8 @@ m32r_upload_command (args, from_tty)
   clear_symtab_users ();
 }
 
-#endif /* ! _MSC_VER */
-
 void
-_initialize_m32r_rom ()
+_initialize_m32r_rom (void)
 {
   /* Initialize m32r RevC monitor target */
   init_m32r_cmds ();
@@ -626,31 +558,32 @@ Specify the serial device it is connected to (e.g. /dev/ttya).";
   mon2000_ops.to_open = mon2000_open;
   add_target (&mon2000_ops);
 
-#ifndef _MSC_VER
-  add_show_from_set
-    (add_set_cmd ("download-path", class_obscure, var_string,
-                 (char *) &download_path,
-                 "Set the default path for downloadable SREC files.",
-                 &setlist),
-     &showlist);
-
-  add_show_from_set
-    (add_set_cmd ("board-address", class_obscure, var_string,
-                 (char *) &board_addr,
-                 "Set IP address for M32R-EVA target board.",
-                 &setlist),
-     &showlist);
-
-  add_show_from_set
-    (add_set_cmd ("server-address", class_obscure, var_string,
-                 (char *) &server_addr,
-               "Set IP address for download server (GDB's host computer).",
-                 &setlist),
-     &showlist);
+  add_setshow_cmd ("download-path", class_obscure,
+                  var_string, &download_path, "\
+Set the default path for downloadable SREC files.", "\
+Show the default path for downloadable SREC files.", "\
+Determines the default path for downloadable SREC files.", "\
+The default path for downloadable SREC files is %s.",
+                  NULL, NULL, &setlist, &showlist);
+
+  add_setshow_cmd ("board-address", class_obscure,
+                  var_string, &board_addr, "\
+Set IP address for M32R-EVA target board.", "\
+Show IP address for M32R-EVA target board.", "\
+Determine the IP address for M32R-EVA target board.", "\
+IP address for M32R-EVA target board is %s",
+                  NULL, NULL, &setlist, &showlist);
+
+  add_setshow_cmd ("server-address", class_obscure,
+                  var_string, &server_addr, "\
+Set IP address for download server (GDB's host computer).", "\
+Show IP address for download server (GDB's host computer).", "\
+Determine the IP address for download server (GDB's host computer).", "\
+IP address for download server (GDB's host computer) is %s.",
+                  NULL, NULL, &setlist, &showlist);
 
   add_com ("upload", class_obscure, m32r_upload_command,
-      "Upload the srec file via the monitor's Ethernet upload capability.");
+          "Upload the srec file via the monitor's Ethernet upload capability.");
 
   add_com ("tload", class_obscure, m32r_load, "test upload command.");
-#endif
 }
This page took 0.035337 seconds and 4 git commands to generate.