* ppc-opc.c: Support optional L form mtmsr.
[deliverable/binutils-gdb.git] / gdb / remote-m32r-sdi.c
index cca045e3cbc70b54d4c4e5f59de0ed6e34fb50c1..5a8e0c752ae1827a3eed3f35f71accb34c27c2ae 100644 (file)
@@ -1,6 +1,7 @@
 /* Remote debugging interface for M32R/SDI.
 
-   Copyright 2003, 2004 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008
+   Free Software Foundation, Inc.
 
    Contributed by Renesas Technology Co.
    Written by Kei Sakamoto <sakamoto.kei@renesas.com>.
@@ -9,7 +10,7 @@
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -18,9 +19,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
 #include "gdbcmd.h"
 #include "gdb_string.h"
 #include <ctype.h>
 #include <signal.h>
+#ifdef __MINGW32__
+#include <winsock.h>
+#else
 #include <netinet/in.h>
+#endif
 #include <sys/types.h>
 #include <sys/time.h>
 #include <signal.h>
@@ -312,10 +315,10 @@ m32r_create_inferior (char *execfile, char *args, char **env, int from_tty)
   CORE_ADDR entry_pt;
 
   if (args && *args)
-    error ("Cannot pass arguments to remote STDEBUG process");
+    error (_("Cannot pass arguments to remote STDEBUG process"));
 
   if (execfile == 0 || exec_bfd == 0)
-    error ("No executable file specified");
+    error (_("No executable file specified"));
 
   if (remote_debug)
     fprintf_unfiltered (gdb_stdlog, "m32r_create_inferior(%s,%s)\n", execfile,
@@ -338,7 +341,7 @@ m32r_create_inferior (char *execfile, char *args, char **env, int from_tty)
   /* Install inferior's terminal modes.  */
   target_terminal_inferior ();
 
-  proceed (entry_pt, TARGET_SIGNAL_DEFAULT, 0);
+  write_pc (entry_pt);
 }
 
 /* Open a connection to a remote debugger.
@@ -374,13 +377,13 @@ m32r_open (char *args, int from_tty)
 
   sdi_desc = serial_open (hostname);
   if (!sdi_desc)
-    error ("Connection refused\n");
+    error (_("Connection refused."));
 
   if (get_ack () == -1)
-    error ("Cannot connect to SDI target\n");
+    error (_("Cannot connect to SDI target."));
 
   if (send_cmd (SDI_OPEN) == -1)
-    error ("Cannot connect to SDI target\n");
+    error (_("Cannot connect to SDI target."));
 
   /* Get maximum number of ib breakpoints */
   send_one_arg_cmd (SDI_GET_ATTR, SDI_ATTR_BRK);
@@ -471,7 +474,7 @@ m32r_resume (ptid_t ptid, int step, enum target_signal sig)
       else
        {
          buf[0] = SDI_WRITE_MEMORY;
-         if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
+         if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
            store_long_parameter (buf + 1, pc_addr);
          else
            store_long_parameter (buf + 1, pc_addr - 1);
@@ -511,7 +514,7 @@ m32r_resume (ptid_t ptid, int step, enum target_signal sig)
        continue;
 
       /* Set PBP. */
-      if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
+      if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
        send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8000 + 4 * i, 4,
                            0x00000006);
       else
@@ -534,11 +537,11 @@ m32r_resume (ptid_t ptid, int step, enum target_signal sig)
 
       /* Write DBT instruction. */
       buf[0] = SDI_WRITE_MEMORY;
-      store_long_parameter (buf + 1, bp_addr);
+      store_long_parameter (buf + 1, (bp_addr & 0xfffffffc));
       store_long_parameter (buf + 5, 4);
       if ((bp_addr & 2) == 0 && bp_addr != (pc_addr & 0xfffffffc))
        {
-         if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
+         if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
            {
              buf[9] = dbt_bp_entry[0];
              buf[10] = dbt_bp_entry[1];
@@ -555,7 +558,7 @@ m32r_resume (ptid_t ptid, int step, enum target_signal sig)
        }
       else
        {
-         if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
+         if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
            {
              if ((bp_addr & 2) == 0)
                {
@@ -602,7 +605,7 @@ m32r_resume (ptid_t ptid, int step, enum target_signal sig)
        continue;
 
       /* DBC register */
-      if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
+      if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
        {
          switch (ab_type[i])
            {
@@ -703,13 +706,13 @@ m32r_wait (ptid_t ptid, struct target_waitstatus *status)
   /* Wait for ready */
   buf[0] = SDI_WAIT_FOR_READY;
   if (serial_write (sdi_desc, buf, 1) != 0)
-    error ("Remote connection closed");
+    error (_("Remote connection closed"));
 
   while (1)
     {
       c = serial_readchar (sdi_desc, SDI_TIMEOUT);
       if (c < 0)
-       error ("Remote connection closed");
+       error (_("Remote connection closed"));
 
       if (c == '-')            /* error */
        {
@@ -725,7 +728,7 @@ m32r_wait (ptid_t ptid, struct target_waitstatus *status)
       else
        ret = serial_write (sdi_desc, ".", 1);  /* packet to wait */
       if (ret != 0)
-       error ("Remote connection closed");
+       error (_("Remote connection closed"));
     }
 
   status->kind = TARGET_WAITKIND_STOPPED;
@@ -743,7 +746,7 @@ m32r_wait (ptid_t ptid, struct target_waitstatus *status)
   if (last_pc_addr != 0xffffffff)
     {
       buf[0] = SDI_WRITE_MEMORY;
-      if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
+      if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
        store_long_parameter (buf + 1, last_pc_addr);
       else
        store_long_parameter (buf + 1, last_pc_addr - 1);
@@ -772,7 +775,7 @@ m32r_wait (ptid_t ptid, struct target_waitstatus *status)
             address, we have to take care of it later. */
          if ((pc_addr & 0x2) != 0)
            {
-             if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
+             if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
                {
                  if ((bp_data[i][2] & 0x80) != 0)
                    {
@@ -810,7 +813,7 @@ m32r_wait (ptid_t ptid, struct target_waitstatus *status)
        {
          if (!mmu_on)
            bp_addr &= 0x7fffffff;
-         buf[0] = SDI_READ_MEMORY;
+         buf[0] = SDI_WRITE_MEMORY;
          store_long_parameter (buf + 1, bp_addr & 0xfffffffc);
          store_long_parameter (buf + 5, 4);
          buf[9] = bp_data[i][0];
@@ -834,7 +837,7 @@ m32r_wait (ptid_t ptid, struct target_waitstatus *status)
          c = serial_readchar (sdi_desc, SDI_TIMEOUT);
          if (c != '-' && recv_data (buf, 4) != -1)
            {
-             if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
+             if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
                {
                  if ((buf[3] & 0x1) == 0x1)
                    hit_watchpoint_addr = ab_address[i];
@@ -899,26 +902,28 @@ get_reg_id (int regno)
 
 /* Read the remote registers into the block REGS.  */
 
-static void m32r_fetch_register (int);
+static void m32r_fetch_register (struct regcache *, int);
 
 static void
-m32r_fetch_registers (void)
+m32r_fetch_registers (struct regcache *regcache)
 {
   int regno;
 
-  for (regno = 0; regno < NUM_REGS; regno++)
-    m32r_fetch_register (regno);
+  for (regno = 0;
+       regno < gdbarch_num_regs (get_regcache_arch (regcache));
+       regno++)
+    m32r_fetch_register (regcache, regno);
 }
 
 /* Fetch register REGNO, or all registers if REGNO is -1.
    Returns errno value.  */
 static void
-m32r_fetch_register (int regno)
+m32r_fetch_register (struct regcache *regcache, int regno)
 {
   unsigned long val, val2, regid;
 
   if (regno == -1)
-    m32r_fetch_registers ();
+    m32r_fetch_registers (regcache);
   else
     {
       char buffer[MAX_REGISTER_SIZE];
@@ -931,7 +936,7 @@ m32r_fetch_register (int regno)
        {
          send_one_arg_cmd (SDI_READ_CPU_REG, SDI_REG_BBPSW);
          val2 = recv_long_data ();
-         val = ((0x00c1 & val2) << 8) | ((0xc100 & val) >> 8);
+         val = ((0x00cf & val2) << 8) | ((0xcf00 & val) >> 8);
        }
 
       if (remote_debug)
@@ -941,22 +946,24 @@ m32r_fetch_register (int regno)
       /* We got the number the register holds, but gdb expects to see a
          value in the target byte ordering.  */
       store_unsigned_integer (buffer, 4, val);
-      regcache_raw_supply (current_regcache, regno, buffer);
+      regcache_raw_supply (regcache, regno, buffer);
     }
   return;
 }
 
 /* Store the remote registers from the contents of the block REGS.  */
 
-static void m32r_store_register (int);
+static void m32r_store_register (struct regcache *, int);
 
 static void
-m32r_store_registers (void)
+m32r_store_registers (struct regcache *regcache)
 {
   int regno;
 
-  for (regno = 0; regno < NUM_REGS; regno++)
-    m32r_store_register (regno);
+  for (regno = 0;
+       regno < gdbarch_num_regs (get_regcache_arch (regcache));
+       regno++)
+    m32r_store_register (regcache, regno);
 
   registers_changed ();
 }
@@ -964,16 +971,16 @@ m32r_store_registers (void)
 /* Store register REGNO, or all if REGNO == 0.
    Return errno value.  */
 static void
-m32r_store_register (int regno)
+m32r_store_register (struct regcache *regcache, int regno)
 {
   int regid;
   ULONGEST regval, tmp;
 
   if (regno == -1)
-    m32r_store_registers ();
+    m32r_store_registers (regcache);
   else
     {
-      regcache_cooked_read_unsigned (current_regcache, regno, &regval);
+      regcache_cooked_read_unsigned (regcache, regno, &regval);
       regid = get_reg_id (regno);
 
       if (regid == SDI_REG_PSW)
@@ -986,10 +993,10 @@ m32r_store_register (int regno)
          send_one_arg_cmd (SDI_READ_CPU_REG, SDI_REG_BBPSW);
          bbpsw = recv_long_data ();
 
-         tmp = (0x00c1 & psw) | ((0x00c1 & regval) << 8);
+         tmp = (0x00cf & psw) | ((0x00cf & regval) << 8);
          send_two_arg_cmd (SDI_WRITE_CPU_REG, SDI_REG_PSW, tmp);
 
-         tmp = (0x0030 & bbpsw) | ((0xc100 & regval) >> 8);
+         tmp = (0x0030 & bbpsw) | ((0xcf00 & regval) >> 8);
          send_two_arg_cmd (SDI_WRITE_CPU_REG, SDI_REG_BBPSW, tmp);
        }
       else
@@ -1010,7 +1017,7 @@ m32r_store_register (int regno)
    debugged.  */
 
 static void
-m32r_prepare_to_store (void)
+m32r_prepare_to_store (struct regcache *regcache)
 {
   /* Do nothing, since we can store individual regs */
   if (remote_debug)
@@ -1032,7 +1039,7 @@ m32r_files_info (struct target_ops *target)
 
 /* Read/Write memory.  */
 static int
-m32r_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len,
+m32r_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len,
                  int write,
                  struct mem_attrib *attrib, struct target_ops *target)
 {
@@ -1051,11 +1058,11 @@ m32r_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len,
   if (remote_debug)
     {
       if (write)
-       fprintf_unfiltered (gdb_stdlog, "m32r_xfer_memory(%08lx,%d,write)\n",
-                           memaddr, len);
+       fprintf_unfiltered (gdb_stdlog, "m32r_xfer_memory(%s,%d,write)\n",
+                           paddr (memaddr), len);
       else
-       fprintf_unfiltered (gdb_stdlog, "m32r_xfer_memory(%08lx,%d,read)\n",
-                           memaddr, len);
+       fprintf_unfiltered (gdb_stdlog, "m32r_xfer_memory(%s,%d,read)\n",
+                           paddr (memaddr), len);
     }
 
   if (write)
@@ -1141,15 +1148,16 @@ m32r_mourn_inferior (void)
 }
 
 static int
-m32r_insert_breakpoint (CORE_ADDR addr, char *shadow)
+m32r_insert_breakpoint (struct bp_target_info *bp_tgt)
 {
+  CORE_ADDR addr = bp_tgt->placed_address;
   int ib_breakpoints;
   unsigned char buf[13];
   int i, c;
 
   if (remote_debug)
-    fprintf_unfiltered (gdb_stdlog, "m32r_insert_breakpoint(%08lx,\"%s\")\n",
-                       addr, shadow);
+    fprintf_unfiltered (gdb_stdlog, "m32r_insert_breakpoint(%s,...)\n",
+                       paddr (addr));
 
   if (use_ib_breakpoints)
     ib_breakpoints = max_ib_breakpoints;
@@ -1178,18 +1186,19 @@ m32r_insert_breakpoint (CORE_ADDR addr, char *shadow)
        }
     }
 
-  error ("Too many breakpoints");
+  error (_("Too many breakpoints"));
   return 1;
 }
 
 static int
-m32r_remove_breakpoint (CORE_ADDR addr, char *shadow)
+m32r_remove_breakpoint (struct bp_target_info *bp_tgt)
 {
+  CORE_ADDR addr = bp_tgt->placed_address;
   int i;
 
   if (remote_debug)
-    fprintf_unfiltered (gdb_stdlog, "m32r_remove_breakpoint(%08lx,\"%s\")\n",
-                       addr, shadow);
+    fprintf_unfiltered (gdb_stdlog, "m32r_remove_breakpoint(%s)\n",
+                       paddr (addr));
 
   for (i = 0; i < MAX_BREAKPOINTS; i++)
     {
@@ -1213,7 +1222,7 @@ m32r_load (char *args, int from_tty)
   char *filename;
   int quiet;
   int nostart;
-  time_t start_time, end_time; /* Start and end times of download */
+  struct timeval start_time, end_time;
   unsigned long data_count;    /* Number of bytes transferred to memory */
   int ret;
   static RETSIGTYPE (*prev_sigint) ();
@@ -1245,7 +1254,7 @@ m32r_load (char *args, int from_tty)
       else if (strncmp (arg, "-nostart", strlen (arg)) == 0)
        nostart = 1;
       else
-       error ("Unknown option `%s'", arg);
+       error (_("Unknown option `%s'"), arg);
     }
 
   if (!filename)
@@ -1260,10 +1269,10 @@ m32r_load (char *args, int from_tty)
   old_chain = make_cleanup_bfd_close (pbfd);
 
   if (!bfd_check_format (pbfd, bfd_object))
-    error ("\"%s\" is not an object file: %s", filename,
+    error (_("\"%s\" is not an object file: %s"), filename,
           bfd_errmsg (bfd_get_error ()));
 
-  start_time = time (NULL);
+  gettimeofday (&start_time, NULL);
   data_count = 0;
 
   interrupted = 0;
@@ -1290,7 +1299,8 @@ m32r_load (char *args, int from_tty)
          if (!quiet)
            printf_filtered ("[Loading section %s at 0x%lx (%d bytes)]\n",
                             bfd_get_section_name (pbfd, section),
-                            section_address, (int) section_size);
+                            (unsigned long) section_address,
+                            (int) section_size);
 
          fptr = 0;
 
@@ -1310,7 +1320,7 @@ m32r_load (char *args, int from_tty)
 
              bfd_get_section_contents (pbfd, section, buf + 9, fptr, count);
              if (send_data (buf, count + 9) <= 0)
-               error ("Error while downloading %s section.",
+               error (_("Error while downloading %s section."),
                       bfd_get_section_name (pbfd, section));
 
              if (!quiet)
@@ -1349,7 +1359,7 @@ m32r_load (char *args, int from_tty)
   interrupted = 0;
   signal (SIGINT, prev_sigint);
 
-  end_time = time (NULL);
+  gettimeofday (&end_time, NULL);
 
   /* Make the PC point at the start address */
   if (exec_bfd)
@@ -1370,11 +1380,12 @@ m32r_load (char *args, int from_tty)
       entry = bfd_get_start_address (pbfd);
 
       if (!quiet)
-       printf_unfiltered ("[Starting %s at 0x%lx]\n", filename, entry);
+       printf_unfiltered ("[Starting %s at 0x%lx]\n", filename,
+                          (unsigned long) entry);
     }
 
-  print_transfer_performance (gdb_stdout, data_count, 0,
-                             end_time - start_time);
+  print_transfer_performance (gdb_stdout, data_count, 0, &start_time,
+                             &end_time);
 
   do_cleanups (old_chain);
 }
@@ -1411,8 +1422,8 @@ m32r_insert_watchpoint (CORE_ADDR addr, int len, int type)
   int i;
 
   if (remote_debug)
-    fprintf_unfiltered (gdb_stdlog, "m32r_insert_watchpoint(%08lx,%d,%d)\n",
-                       addr, len, type);
+    fprintf_unfiltered (gdb_stdlog, "m32r_insert_watchpoint(%s,%d,%d)\n",
+                       paddr (addr), len, type);
 
   for (i = 0; i < MAX_ACCESS_BREAKS; i++)
     {
@@ -1425,7 +1436,7 @@ m32r_insert_watchpoint (CORE_ADDR addr, int len, int type)
        }
     }
 
-  error ("Too many watchpoints");
+  error (_("Too many watchpoints"));
   return 1;
 }
 
@@ -1435,8 +1446,8 @@ m32r_remove_watchpoint (CORE_ADDR addr, int len, int type)
   int i;
 
   if (remote_debug)
-    fprintf_unfiltered (gdb_stdlog, "m32r_remove_watchpoint(%08lx,%d,%d)\n",
-                       addr, len, type);
+    fprintf_unfiltered (gdb_stdlog, "m32r_remove_watchpoint(%s,%d,%d)\n",
+                       paddr (addr), len, type);
 
   for (i = 0; i < MAX_ACCESS_BREAKS; i++)
     {
@@ -1589,6 +1600,7 @@ init_m32r_ops (void)
   m32r_ops.to_create_inferior = m32r_create_inferior;
   m32r_ops.to_mourn_inferior = m32r_mourn_inferior;
   m32r_ops.to_stop = m32r_stop;
+  m32r_ops.to_log_command = serial_log_command;
   m32r_ops.to_stratum = process_stratum;
   m32r_ops.to_has_all_memory = 1;
   m32r_ops.to_has_memory = 1;
@@ -1619,21 +1631,21 @@ _initialize_remote_m32r (void)
   add_target (&m32r_ops);
 
   add_com ("sdireset", class_obscure, sdireset_command,
-          "Reset SDI connection.");
+          _("Reset SDI connection."));
 
   add_com ("sdistatus", class_obscure, sdistatus_command,
-          "Show status of SDI connection.");
+          _("Show status of SDI connection."));
 
   add_com ("debug_chaos", class_obscure, debug_chaos_command,
-          "Debug M32R/Chaos.");
+          _("Debug M32R/Chaos."));
 
   add_com ("use_debug_dma", class_obscure, use_debug_dma_command,
-          "Use debug DMA mem access.");
+          _("Use debug DMA mem access."));
   add_com ("use_mon_code", class_obscure, use_mon_code_command,
-          "Use mon code mem access.");
+          _("Use mon code mem access."));
 
   add_com ("use_ib_break", class_obscure, use_ib_breakpoints_command,
-          "Set breakpoints by IB break.");
+          _("Set breakpoints by IB break."));
   add_com ("use_dbt_break", class_obscure, use_dbt_breakpoints_command,
-          "Set breakpoints by dbt.");
+          _("Set breakpoints by dbt."));
 }
This page took 0.036299 seconds and 4 git commands to generate.