gdb/
[deliverable/binutils-gdb.git] / gdb / remote-mips.c
index 26cda1ac1f0a0f8a18a1da1bcaa2cbc47cc06216..f2fb8f3af48ca37a398a274b86b65030da0f9da5 100644 (file)
@@ -1,7 +1,7 @@
 /* Remote debugging interface for MIPS remote debugging protocol.
 
    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-   2003, 2004, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+   2003, 2004, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
 
    Contributed by Cygnus Support.  Written by Ian Lance Taylor
    <ian@cygnus.com>.
@@ -86,21 +86,14 @@ static void mips_close (int quitting);
 
 static void mips_detach (struct target_ops *ops, char *args, int from_tty);
 
-static void mips_resume (ptid_t ptid, int step,
-                         enum target_signal siggnal);
-
 static int mips_map_regno (struct gdbarch *, int);
 
-static void mips_fetch_registers (struct regcache *regcache, int regno);
-
 static void mips_prepare_to_store (struct regcache *regcache);
 
-static void mips_store_registers (struct regcache *regcache, int regno);
-
 static unsigned int mips_fetch_word (CORE_ADDR addr);
 
 static int mips_store_word (CORE_ADDR addr, unsigned int value,
-                           char *old_contents);
+                           int *old_contents);
 
 static int mips_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len,
                             int write, 
@@ -109,7 +102,7 @@ static int mips_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len,
 
 static void mips_files_info (struct target_ops *ignore);
 
-static void mips_mourn_inferior (void);
+static void mips_mourn_inferior (struct target_ops *ops);
 
 static int pmon_makeb64 (unsigned long v, char *p, int n, int *chksum);
 
@@ -1194,6 +1187,7 @@ mips_request (int cmd,
              int timeout,
              char *buff)
 {
+  int addr_size = gdbarch_addr_bit (target_gdbarch) / 8;
   char myBuff[DATA_MAXLEN + 1];
   int len;
   int rpid;
@@ -1209,7 +1203,8 @@ mips_request (int cmd,
       if (mips_need_reply)
        internal_error (__FILE__, __LINE__,
                        _("mips_request: Trying to send command before reply"));
-      sprintf (buff, "0x0 %c 0x%s 0x%s", cmd, paddr_nz (addr), paddr_nz (data));
+      sprintf (buff, "0x0 %c 0x%s 0x%s", cmd,
+              phex_nz (addr, addr_size), phex_nz (data, addr_size));
       mips_send_packet (buff, 1);
       mips_need_reply = 1;
     }
@@ -1580,7 +1575,7 @@ device is attached to the target board (e.g., /dev/ttya).\n"
 
   reinit_frame_cache ();
   registers_changed ();
-  stop_pc = read_pc ();
+  stop_pc = regcache_read_pc (get_current_regcache ());
   print_stack_frame (get_selected_frame (NULL), 0, SRC_AND_LOC);
   xfree (serial_port_name);
 }
@@ -1667,7 +1662,8 @@ mips_detach (struct target_ops *ops, char *args, int from_tty)
    where PMON does return a reply.  */
 
 static void
-mips_resume (ptid_t ptid, int step, enum target_signal siggnal)
+mips_resume (struct target_ops *ops,
+            ptid_t ptid, int step, enum target_signal siggnal)
 {
   int err;
 
@@ -1701,7 +1697,7 @@ mips_signal_from_protocol (int sig)
 
 static ptid_t
 mips_wait (struct target_ops *ops,
-          ptid_t ptid, struct target_waitstatus *status)
+          ptid_t ptid, struct target_waitstatus *status, int options)
 {
   int rstatus;
   int err;
@@ -1753,26 +1749,27 @@ mips_wait (struct target_ops *ops,
     {
       struct regcache *regcache = get_current_regcache ();
       struct gdbarch *gdbarch = get_regcache_arch (regcache);
+      enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
       char buf[MAX_REGISTER_SIZE];
 
-      store_unsigned_integer (buf,
-                             register_size
-                               (gdbarch, gdbarch_pc_regnum (gdbarch)), rpc);
+      store_unsigned_integer
+       (buf, register_size (gdbarch, gdbarch_pc_regnum (gdbarch)),
+        byte_order, rpc);
       regcache_raw_supply (regcache, gdbarch_pc_regnum (gdbarch), buf);
 
       store_unsigned_integer
-       (buf, register_size (gdbarch, gdbarch_pc_regnum (gdbarch)), rfp);
+       (buf, register_size (gdbarch, gdbarch_pc_regnum (gdbarch)),
+        byte_order, rfp);
       regcache_raw_supply (regcache, 30, buf); /* This register they are avoiding and so it is unnamed */
 
-      store_unsigned_integer (buf, register_size (gdbarch,
-                             gdbarch_sp_regnum (gdbarch)), rsp);
+      store_unsigned_integer
+       (buf, register_size (gdbarch, gdbarch_sp_regnum (gdbarch)),
+        byte_order, rsp);
       regcache_raw_supply (regcache, gdbarch_sp_regnum (gdbarch), buf);
 
-      store_unsigned_integer (buf,
-                             register_size (gdbarch,
-                                            gdbarch_deprecated_fp_regnum
-                                              (gdbarch)),
-                             0);
+      store_unsigned_integer
+       (buf, register_size (gdbarch, gdbarch_deprecated_fp_regnum (gdbarch)),
+        byte_order, 0);
       regcache_raw_supply (regcache,
                           gdbarch_deprecated_fp_regnum (gdbarch), buf);
 
@@ -1798,7 +1795,7 @@ mips_wait (struct target_ops *ops,
          fetch breakpoint, not a data watchpoint.  FIXME when PMON
          provides some way to tell us what type of breakpoint it is.  */
       int i;
-      CORE_ADDR pc = read_pc ();
+      CORE_ADDR pc = regcache_read_pc (get_current_regcache ());
 
       hit_watchpoint = 1;
       for (i = 0; i < MAX_LSI_BREAKPOINTS; i++)
@@ -1849,7 +1846,7 @@ mips_wait (struct target_ops *ops,
        {
          char *func_name;
          CORE_ADDR func_start;
-         CORE_ADDR pc = read_pc ();
+         CORE_ADDR pc = regcache_read_pc (get_current_regcache ());
 
          find_pc_partial_function (pc, &func_name, &func_start, NULL);
          if (func_name != NULL && strcmp (func_name, "_exit") == 0
@@ -1899,16 +1896,18 @@ mips_map_regno (struct gdbarch *gdbarch, int regno)
 /* Fetch the remote registers.  */
 
 static void
-mips_fetch_registers (struct regcache *regcache, int regno)
+mips_fetch_registers (struct target_ops *ops,
+                     struct regcache *regcache, int regno)
 {
   struct gdbarch *gdbarch = get_regcache_arch (regcache);
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   unsigned LONGEST val;
   int err;
 
   if (regno == -1)
     {
       for (regno = 0; regno < gdbarch_num_regs (gdbarch); regno++)
-       mips_fetch_registers (regcache, regno);
+       mips_fetch_registers (ops, regcache, regno);
       return;
     }
 
@@ -1946,7 +1945,8 @@ mips_fetch_registers (struct regcache *regcache, int regno)
 
     /* We got the number the register holds, but gdb expects to see a
        value in the target byte ordering.  */
-    store_unsigned_integer (buf, register_size (gdbarch, regno), val);
+    store_unsigned_integer (buf, register_size (gdbarch, regno),
+                           byte_order, val);
     regcache_raw_supply (regcache, regno, buf);
   }
 }
@@ -1962,7 +1962,8 @@ mips_prepare_to_store (struct regcache *regcache)
 /* Store remote register(s).  */
 
 static void
-mips_store_registers (struct regcache *regcache, int regno)
+mips_store_registers (struct target_ops *ops,
+                     struct regcache *regcache, int regno)
 {
   struct gdbarch *gdbarch = get_regcache_arch (regcache);
   ULONGEST val;
@@ -1971,7 +1972,7 @@ mips_store_registers (struct regcache *regcache, int regno)
   if (regno == -1)
     {
       for (regno = 0; regno < gdbarch_num_regs (gdbarch); regno++)
-       mips_store_registers (regcache, regno);
+       mips_store_registers (ops, regcache, regno);
       return;
     }
 
@@ -1997,8 +1998,8 @@ mips_fetch_word (CORE_ADDR addr)
       val = mips_request ('i', addr, 0, &err,
                          mips_receive_wait, NULL);
       if (err)
-       mips_error ("Can't read address 0x%s: %s",
-                   paddr_nz (addr), safe_strerror (errno));
+       mips_error ("Can't read address %s: %s",
+                   paddress (target_gdbarch, addr), safe_strerror (errno));
     }
   return val;
 }
@@ -2009,7 +2010,7 @@ mips_fetch_word (CORE_ADDR addr)
 
 /* FIXME! make sure only 32-bit quantities get stored! */
 static int
-mips_store_word (CORE_ADDR addr, unsigned int val, char *old_contents)
+mips_store_word (CORE_ADDR addr, unsigned int val, int *old_contents)
 {
   int err;
   unsigned int oldcontents;
@@ -2025,7 +2026,7 @@ mips_store_word (CORE_ADDR addr, unsigned int val, char *old_contents)
        return errno;
     }
   if (old_contents != NULL)
-    store_unsigned_integer (old_contents, 4, oldcontents);
+    *old_contents = oldcontents;
   return 0;
 }
 
@@ -2042,6 +2043,7 @@ static int
 mips_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write,
                  struct mem_attrib *attrib, struct target_ops *target)
 {
+  enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch);
   int i;
   CORE_ADDR addr;
   int count;
@@ -2066,14 +2068,15 @@ mips_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write,
       if (addr != memaddr || len < 4)
        {
          /* Need part of initial word -- fetch it.  */
-         store_unsigned_integer (&buffer[0], 4, mips_fetch_word (addr));
+         store_unsigned_integer (&buffer[0], 4, byte_order,
+                                 mips_fetch_word (addr));
        }
 
       if (count > 1)
        {
          /* Need part of last word -- fetch it.  FIXME: we do this even
             if we don't need it.  */
-         store_unsigned_integer (&buffer[(count - 1) * 4], 4,
+         store_unsigned_integer (&buffer[(count - 1) * 4], 4, byte_order,
                                  mips_fetch_word (addr + (count - 1) * 4));
        }
 
@@ -2085,9 +2088,9 @@ mips_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write,
 
       for (i = 0; i < count; i++, addr += 4)
        {
-         status = mips_store_word (addr,
-                              extract_unsigned_integer (&buffer[i * 4], 4),
-                                   NULL);
+         int word;
+         word = extract_unsigned_integer (&buffer[i * 4], 4, byte_order);
+         status = mips_store_word (addr, word, NULL);
          /* Report each kilobyte (we download 32-bit words at a time) */
          if (i % 256 == 255)
            {
@@ -2109,7 +2112,8 @@ mips_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write,
       /* Read all the longwords */
       for (i = 0; i < count; i++, addr += 4)
        {
-         store_unsigned_integer (&buffer[i * 4], 4, mips_fetch_word (addr));
+         store_unsigned_integer (&buffer[i * 4], 4, byte_order,
+                                 mips_fetch_word (addr));
          QUIT;
        }
 
@@ -2133,7 +2137,7 @@ mips_files_info (struct target_ops *ignore)
    right port, we could interrupt the process with a break signal.  */
 
 static void
-mips_kill (void)
+mips_kill (struct target_ops *ops)
 {
   if (!mips_wait_flag)
     return;
@@ -2146,8 +2150,8 @@ mips_kill (void)
 
       target_terminal_ours ();
 
-      if (query ("Interrupted while waiting for the program.\n\
-Give up (and stop debugging it)? "))
+      if (query (_("Interrupted while waiting for the program.\n\
+Give up (and stop debugging it)? ")))
        {
          /* Clean up in such a way that mips_close won't try to talk to the
             board (it almost surely won't work since we weren't able to talk to
@@ -2186,7 +2190,8 @@ Give up (and stop debugging it)? "))
 /* Start running on the target board.  */
 
 static void
-mips_create_inferior (char *execfile, char *args, char **env, int from_tty)
+mips_create_inferior (struct target_ops *ops, char *execfile,
+                     char *args, char **env, int from_tty)
 {
   CORE_ADDR entry_pt;
 
@@ -2207,13 +2212,13 @@ Can't pass arguments to remote MIPS board; arguments ignored.");
 
   /* FIXME: Should we set inferior_ptid here?  */
 
-  write_pc (entry_pt);
+  regcache_write_pc (get_current_regcache (), entry_pt);
 }
 
 /* Clean up after a process.  Actually nothing to do.  */
 
 static void
-mips_mourn_inferior (void)
+mips_mourn_inferior (struct target_ops *ops)
 {
   if (current_ops != NULL)
     unpush_target (current_ops);
@@ -2231,28 +2236,30 @@ mips_mourn_inferior (void)
    target contents.  */
 
 static int
-mips_insert_breakpoint (struct bp_target_info *bp_tgt)
+mips_insert_breakpoint (struct gdbarch *gdbarch,
+                       struct bp_target_info *bp_tgt)
 {
   if (monitor_supports_breakpoints)
     return mips_set_breakpoint (bp_tgt->placed_address, MIPS_INSN32_SIZE,
                                BREAK_FETCH);
   else
-    return memory_insert_breakpoint (bp_tgt);
+    return memory_insert_breakpoint (gdbarch, bp_tgt);
 }
 
 static int
-mips_remove_breakpoint (struct bp_target_info *bp_tgt)
+mips_remove_breakpoint (struct gdbarch *gdbarch,
+                       struct bp_target_info *bp_tgt)
 {
   if (monitor_supports_breakpoints)
     return mips_clear_breakpoint (bp_tgt->placed_address, MIPS_INSN32_SIZE,
                                  BREAK_FETCH);
   else
-    return memory_remove_breakpoint (bp_tgt);
+    return memory_remove_breakpoint (gdbarch, bp_tgt);
 }
 
 /* Tell whether this target can support a hardware breakpoint.  CNT
    is the number of hardware breakpoints already installed.  This
-   implements the TARGET_CAN_USE_HARDWARE_WATCHPOINT macro.  */
+   implements the target_can_use_hardware_watchpoint macro.  */
 
 int
 mips_can_use_watchpoint (int type, int cnt, int othertype)
@@ -2342,7 +2349,7 @@ static int
 mips_check_lsi_error (CORE_ADDR addr, int rerrflg)
 {
   struct lsi_error *err;
-  char *saddr = paddr_nz (addr);       /* printable address string */
+  char *saddr = paddress (target_gdbarch, addr);
 
   if (rerrflg == 0)            /* no error */
     return 0;
@@ -2359,14 +2366,14 @@ mips_check_lsi_error (CORE_ADDR addr, int rerrflg)
                {
                  found = 1;
                  fprintf_unfiltered (gdb_stderr, "\
-mips_common_breakpoint (0x%s): Warning: %s\n",
+mips_common_breakpoint (%s): Warning: %s\n",
                                      saddr,
                                      err->string);
                }
            }
          if (!found)
            fprintf_unfiltered (gdb_stderr, "\
-mips_common_breakpoint (0x%s): Unknown warning: 0x%x\n",
+mips_common_breakpoint (%s): Unknown warning: 0x%x\n",
                                saddr,
                                rerrflg);
        }
@@ -2379,14 +2386,14 @@ mips_common_breakpoint (0x%s): Unknown warning: 0x%x\n",
       if ((err->code & rerrflg) == err->code)
        {
          fprintf_unfiltered (gdb_stderr, "\
-mips_common_breakpoint (0x%s): Error: %s\n",
+mips_common_breakpoint (%s): Error: %s\n",
                              saddr,
                              err->string);
          return 1;
        }
     }
   fprintf_unfiltered (gdb_stderr, "\
-mips_common_breakpoint (0x%s): Unknown error: 0x%x\n",
+mips_common_breakpoint (%s): Unknown error: 0x%x\n",
                      saddr,
                      rerrflg);
   return 1;
@@ -2409,6 +2416,7 @@ mips_common_breakpoint (0x%s): Unknown error: 0x%x\n",
 static int
 mips_common_breakpoint (int set, CORE_ADDR addr, int len, enum break_type type)
 {
+  int addr_size = gdbarch_addr_bit (target_gdbarch) / 8;
   char buf[DATA_MAXLEN + 1];
   char cmd, rcmd;
   int rpid, rerrflg, rresponse, rlen;
@@ -2442,7 +2450,7 @@ mips_common_breakpoint (int set, CORE_ADDR addr, int len, enum break_type type)
            {
              warning ("\
 mips_common_breakpoint: Attempt to clear bogus breakpoint at %s\n",
-                      paddr_nz (addr));
+                      paddress (target_gdbarch, addr));
              return 1;
            }
 
@@ -2491,15 +2499,16 @@ mips_common_breakpoint: Bad response from remote board: %s",
          if (type == BREAK_FETCH)      /* instruction breakpoint */
            {
              cmd = 'B';
-             sprintf (buf, "0x0 B 0x%s 0x0", paddr_nz (addr));
+             sprintf (buf, "0x0 B 0x%s 0x0", phex_nz (addr, addr_size));
            }
          else
            /* watchpoint */
            {
              cmd = 'A';
-             sprintf (buf, "0x0 A 0x%s 0x%x 0x%s", paddr_nz (addr),
-                    type == BREAK_READ ? 1 : (type == BREAK_WRITE ? 2 : 3),
-                      paddr_nz (addr + len - 1));
+             sprintf (buf, "0x0 A 0x%s 0x%x 0x%s",
+                      phex_nz (addr, addr_size),
+                      type == BREAK_READ ? 1 : (type == BREAK_WRITE ? 2 : 3),
+                      phex_nz (addr + len - 1, addr_size));
            }
          mips_send_packet (buf, 1);
 
@@ -2560,13 +2569,13 @@ mips_common_breakpoint: Bad response from remote board: %s",
            }
 
          cmd = 'B';
-         sprintf (buf, "0x0 B 0x%s 0x%s %s", paddr_nz (addr),
-                  paddr_nz (mask), flags);
+         sprintf (buf, "0x0 B 0x%s 0x%s %s", phex_nz (addr, addr_size),
+                  phex_nz (mask, addr_size), flags);
        }
       else
        {
          cmd = 'b';
-         sprintf (buf, "0x0 b 0x%s", paddr_nz (addr));
+         sprintf (buf, "0x0 b 0x%s", phex_nz (addr, addr_size));
        }
 
       mips_send_packet (buf, 1);
@@ -2590,8 +2599,8 @@ mips_common_breakpoint: Bad response from remote board: %s",
            rresponse = rerrflg;
          if (rresponse != 22)  /* invalid argument */
            fprintf_unfiltered (gdb_stderr, "\
-mips_common_breakpoint (0x%s):  Got error: 0x%x\n",
-                               paddr_nz (addr), rresponse);
+mips_common_breakpoint (%s):  Got error: 0x%x\n",
+                               paddress (target_gdbarch, addr), rresponse);
          return 1;
        }
     }
@@ -2617,7 +2626,8 @@ send_srec (char *srec, int len, CORE_ADDR addr)
        case 0x6:               /* ACK */
          return;
        case 0x15:              /* NACK */
-         fprintf_unfiltered (gdb_stderr, "Download got a NACK at byte 0x%s!  Retrying.\n", paddr_nz (addr));
+         fprintf_unfiltered (gdb_stderr, "Download got a NACK at byte %s!  Retrying.\n",
+                             paddress (target_gdbarch, addr));
          continue;
        default:
          error ("Download got unexpected ack char: 0x%x, retrying.\n", ch);
@@ -3261,6 +3271,8 @@ pmon_load_fast (char *file)
 static void
 mips_load (char *file, int from_tty)
 {
+  struct regcache *regcache;
+
   /* Get the board out of remote debugging mode.  */
   if (mips_exit_debug ())
     error ("mips_load:  Couldn't get into monitor mode.");
@@ -3273,18 +3285,17 @@ mips_load (char *file, int from_tty)
   mips_initialize ();
 
   /* Finally, make the PC point at the start address */
+  regcache = get_current_regcache ();
   if (mips_monitor != MON_IDT)
     {
       /* Work around problem where PMON monitor updates the PC after a load
          to a different value than GDB thinks it has. The following ensures
-         that the write_pc() WILL update the PC value: */
-      struct regcache *regcache = get_current_regcache ();
-      regcache_set_valid_p (regcache,
-                           gdbarch_pc_regnum (get_regcache_arch (regcache)),
-                                              0);
+         that the regcache_write_pc() WILL update the PC value: */
+      regcache_invalidate (regcache,
+                          gdbarch_pc_regnum (get_regcache_arch (regcache)));
     }
   if (exec_bfd)
-    write_pc (bfd_get_start_address (exec_bfd));
+    regcache_write_pc (regcache, bfd_get_start_address (exec_bfd));
 
   inferior_ptid = null_ptid;   /* No process now */
 
@@ -3342,11 +3353,11 @@ _initialize_remote_mips (void)
   mips_ops.to_mourn_inferior = mips_mourn_inferior;
   mips_ops.to_log_command = serial_log_command;
   mips_ops.to_stratum = process_stratum;
-  mips_ops.to_has_all_memory = 1;
-  mips_ops.to_has_memory = 1;
-  mips_ops.to_has_stack = 1;
-  mips_ops.to_has_registers = 1;
-  mips_ops.to_has_execution = 1;
+  mips_ops.to_has_all_memory = default_child_has_all_memory;
+  mips_ops.to_has_memory = default_child_has_memory;
+  mips_ops.to_has_stack = default_child_has_stack;
+  mips_ops.to_has_registers = default_child_has_registers;
+  mips_ops.to_has_execution = default_child_has_execution;
   mips_ops.to_magic = OPS_MAGIC;
 
   /* Copy the common fields to all four target vectors.  */
This page took 0.035154 seconds and 4 git commands to generate.