* write.c (relax_segment <rs_space>): Calculate growth using
[deliverable/binutils-gdb.git] / gdb / remote-mips.c
index e2faeacc5211dc513a2752b267431e244c098418..882cbca163c78c6be8d0212f258905dbecde9446 100644 (file)
@@ -1,5 +1,6 @@
 /* Remote debugging interface for MIPS remote debugging protocol.
-   Copyright 1993, 1994, 1995, 2000 Free Software Foundation, Inc.
+   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+   Free Software Foundation, Inc.
    Contributed by Cygnus Support.  Written by Ian Lance Taylor
    <ian@cygnus.com>.
 
 #include "inferior.h"
 #include "bfd.h"
 #include "symfile.h"
-#include "gdb_wait.h"
 #include "gdbcmd.h"
 #include "gdbcore.h"
 #include "serial.h"
 #include "target.h"
 #include "remote-utils.h"
 #include "gdb_string.h"
-
-#include <signal.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
+#include "gdb_stat.h"
+#include "regcache.h"
 #include <ctype.h>
-
-/* Microsoft C's stat.h doesn't define all the POSIX file modes.  */
-#ifndef S_IROTH
-#define S_IROTH S_IREAD
-#endif
-
 \f
 
 /* Breakpoint types.  Values 0, 1, and 2 must agree with the watch
@@ -94,9 +85,11 @@ static void mips_close (int quitting);
 
 static void mips_detach (char *args, int from_tty);
 
-static void mips_resume (int pid, int step, enum target_signal siggnal);
+static void mips_resume (ptid_t ptid, int step,
+                         enum target_signal siggnal);
 
-static int mips_wait (int pid, struct target_waitstatus *status);
+static ptid_t mips_wait (ptid_t ptid,
+                               struct target_waitstatus *status);
 
 static int mips_map_regno (int regno);
 
@@ -112,7 +105,9 @@ static int mips_store_word (CORE_ADDR addr, unsigned int value,
                            char *old_contents);
 
 static int mips_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len,
-                            int write, struct target_ops *ignore);
+                            int write, 
+                            struct mem_attrib *attrib,
+                            struct target_ops *target);
 
 static void mips_files_info (struct target_ops *ignore);
 
@@ -598,7 +593,7 @@ mips_expect_timeout (const char *string, int timeout)
 int
 mips_expect (const char *string)
 {
-  return mips_expect_timeout (string, 2);
+  return mips_expect_timeout (string, remote_timeout);
 }
 
 /* Read the required number of characters into the given buffer (which
@@ -612,7 +607,7 @@ mips_getstring (char *string, int n)
   immediate_quit++;
   while (n > 0)
     {
-      c = SERIAL_READCHAR (mips_desc, 2);
+      c = SERIAL_READCHAR (mips_desc, remote_timeout);
 
       if (c == SERIAL_TIMEOUT)
        {
@@ -928,7 +923,7 @@ mips_send_packet (const char *s, int get_ack)
                {
                  int rch;
 
-                 rch = mips_readchar (2);
+                 rch = mips_readchar (remote_timeout);
                  if (rch == SYN)
                    {
                      ch = SYN;
@@ -940,7 +935,8 @@ mips_send_packet (const char *s, int get_ack)
                }
 
              if (i == len)
-               (void) mips_receive_trailer (trlr, &garbage, &ch, 2);
+               (void) mips_receive_trailer (trlr, &garbage, &ch,
+                                            remote_timeout);
 
              /* We don't bother checking the checksum, or providing an
                 ACK to the packet. */
@@ -1243,7 +1239,8 @@ mips_request (int cmd,
   if (cmd != '\0')
     {
       if (mips_need_reply)
-       internal_error ("mips_request: Trying to send command before 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));
       mips_send_packet (buff, 1);
       mips_need_reply = 1;
@@ -1253,7 +1250,8 @@ mips_request (int cmd,
     return 0;
 
   if (!mips_need_reply)
-    internal_error ("mips_request: Trying to get reply before command");
+    internal_error (__FILE__, __LINE__,
+                   "mips_request: Trying to get reply before command");
 
   mips_need_reply = 0;
 
@@ -1527,7 +1525,7 @@ device is attached to the target board (e.g., /dev/ttya).\n"
     nomem (0);
   make_cleanup_freeargv (argv);
 
-  serial_port_name = strsave (argv[0]);
+  serial_port_name = xstrdup (argv[0]);
   if (argv[1])                 /* remote TFTP name specified? */
     {
       remote_name = argv[1];
@@ -1575,16 +1573,16 @@ device is attached to the target board (e.g., /dev/ttya).\n"
             the user didn't specify a local name, assume it's the same
             as the part of the remote name after the "host:".  */
          if (tftp_name)
-           free (tftp_name);
+           xfree (tftp_name);
          if (tftp_localname)
-           free (tftp_localname);
+           xfree (tftp_localname);
          if (local_name == NULL)
            if ((local_name = strchr (remote_name, ':')) != NULL)
              local_name++;     /* skip over the colon */
          if (local_name == NULL)
            local_name = remote_name;   /* local name same as remote name */
-         tftp_name = strsave (remote_name);
-         tftp_localname = strsave (local_name);
+         tftp_name = xstrdup (remote_name);
+         tftp_localname = xstrdup (local_name);
          tftp_in_use = 1;
        }
     }
@@ -1594,7 +1592,7 @@ device is attached to the target board (e.g., /dev/ttya).\n"
 
   /* Reset the expected monitor prompt if it's never been set before.  */
   if (mips_monitor_prompt == NULL)
-    mips_monitor_prompt = strsave (new_monitor_prompt);
+    mips_monitor_prompt = xstrdup (new_monitor_prompt);
   mips_monitor = new_monitor;
 
   mips_initialize ();
@@ -1610,7 +1608,7 @@ device is attached to the target board (e.g., /dev/ttya).\n"
   /* Try to figure out the processor model if possible.  */
   ptype = mips_read_processor_type ();
   if (ptype)
-    mips_set_processor_type_command (strsave (ptype), 0);
+    mips_set_processor_type_command (xstrdup (ptype), 0);
 
 /* This is really the job of start_remote however, that makes an assumption
    that the target is about to print out a status message of some sort.  That
@@ -1623,7 +1621,7 @@ device is attached to the target board (e.g., /dev/ttya).\n"
   set_current_frame (create_new_frame (read_fp (), stop_pc));
   select_frame (get_current_frame (), 0);
   print_stack_frame (selected_frame, -1, 1);
-  free (serial_port_name);
+  xfree (serial_port_name);
 }
 
 static void
@@ -1708,7 +1706,7 @@ mips_detach (char *args, int from_tty)
    where PMON does return a reply.  */
 
 static void
-mips_resume (int pid, int step, enum target_signal siggnal)
+mips_resume (ptid_t ptid, int step, enum target_signal siggnal)
 {
   int err;
 
@@ -1740,8 +1738,8 @@ mips_signal_from_protocol (int sig)
 
 /* Wait until the remote stops, and return a wait status.  */
 
-static int
-mips_wait (int pid, struct target_waitstatus *status)
+static ptid_t
+mips_wait (ptid_t ptid, struct target_waitstatus *status)
 {
   int rstatus;
   int err;
@@ -1761,7 +1759,7 @@ mips_wait (int pid, struct target_waitstatus *status)
     {
       status->kind = TARGET_WAITKIND_STOPPED;
       status->value.sig = TARGET_SIGNAL_TRAP;
-      return 0;
+      return inferior_ptid;
     }
 
   /* No timeout; we sit here as long as the program continues to execute.  */
@@ -1892,7 +1890,7 @@ mips_wait (int pid, struct target_waitstatus *status)
       status->value.sig = mips_signal_from_protocol (rstatus & 0x7f);
     }
 
-  return 0;
+  return inferior_ptid;
 }
 
 /* We have to map between the register numbers used by gdb and the
@@ -2068,7 +2066,8 @@ static int mask_address_p = 1;
 
 static int
 mips_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
-                 struct target_ops *ignore)
+                 struct mem_attrib *attrib ATTRIBUTE_UNUSED,
+                 struct target_ops *target ATTRIBUTE_UNUSED)
 {
   int i;
   CORE_ADDR addr;
@@ -2233,7 +2232,7 @@ Can't pass arguments to remote MIPS board; arguments ignored.");
 
   init_wait_for_inferior ();
 
-  /* FIXME: Should we set inferior_pid here?  */
+  /* FIXME: Should we set inferior_ptid here?  */
 
   proceed (entry_pt, TARGET_SIGNAL_DEFAULT, 0);
 }
@@ -2308,7 +2307,7 @@ pmon_insert_breakpoint (CORE_ADDR addr, char *contents_cache)
 
       mips_expect ("Bpt ");
 
-      if (!mips_getstring (tbuff, 2))
+      if (!mips_getstring (tbuff, remote_timeout))
        return 1;
       tbuff[2] = '\0';         /* terminate the string */
       if (sscanf (tbuff, "%d", &bpnum) != 1)
@@ -2726,7 +2725,7 @@ common_breakpoint (int set, CORE_ADDR addr, int len, enum break_type type)
              flags = "f";
              break;
            default:
-             abort ();
+             internal_error (__FILE__, __LINE__, "failed internal consistency check");
            }
 
          cmd = 'B';
@@ -2776,7 +2775,7 @@ send_srec (char *srec, int len, CORE_ADDR addr)
 
       SERIAL_WRITE (mips_desc, srec, len);
 
-      ch = mips_readchar (2);
+      ch = mips_readchar (remote_timeout);
 
       switch (ch)
        {
@@ -3133,7 +3132,8 @@ pmon_check_ack (char *mesg)
 
   if (!tftp_in_use)
     {
-      c = SERIAL_READCHAR (udp_in_use ? udp_desc : mips_desc, 2);
+      c = SERIAL_READCHAR (udp_in_use ? udp_desc : mips_desc,
+                          remote_timeout);
       if ((c == SERIAL_TIMEOUT) || (c != 0x06))
        {
          fprintf_unfiltered (gdb_stderr,
@@ -3180,6 +3180,26 @@ mips_expect_download (char *string)
     return 1;
 }
 
+static void
+pmon_check_entry_address (char *entry_address, int final)
+{
+  char hexnumber[9];           /* includes '\0' space */
+  mips_expect_timeout (entry_address, tftp_in_use ? 15 : remote_timeout);
+  sprintf (hexnumber, "%x", final);
+  mips_expect (hexnumber);
+  mips_expect ("\r\n");
+}
+
+static int
+pmon_check_total (int bintotal)
+{
+  char hexnumber[9];           /* includes '\0' space */
+  mips_expect ("\r\ntotal = 0x");
+  sprintf (hexnumber, "%x", bintotal);
+  mips_expect (hexnumber);
+  return mips_expect_download (" bytes\r\n");
+}
+
 static void
 pmon_end_download (int final, int bintotal)
 {
@@ -3208,7 +3228,7 @@ pmon_end_download (int final, int bintotal)
       strcat (cmd, tftp_name);
       strcat (cmd, "\r");
       mips_send_command (cmd, 0);
-      free (cmd);
+      xfree (cmd);
       if (!mips_expect_download ("Downloading from "))
        return;
       if (!mips_expect_download (tftp_name))
@@ -3220,24 +3240,21 @@ pmon_end_download (int final, int bintotal)
   /* Wait for the stuff that PMON prints after the load has completed.
      The timeout value for use in the tftp case (15 seconds) was picked
      arbitrarily but might be too small for really large downloads. FIXME. */
-  if (mips_monitor == MON_LSI)
+  switch (mips_monitor)
     {
+    case MON_LSI:
       pmon_check_ack ("termination");
-      mips_expect_timeout ("Entry address is ", tftp_in_use ? 15 : 2);
+      pmon_check_entry_address ("Entry address is ", final);
+      if (!pmon_check_total (bintotal))
+       return;
+      break;
+    default:
+      pmon_check_entry_address ("Entry Address  = ", final);
+      pmon_check_ack ("termination");
+      if (!pmon_check_total (bintotal))
+       return;
+      break;
     }
-  else
-    mips_expect_timeout ("Entry Address  = ", tftp_in_use ? 15 : 2);
-
-  sprintf (hexnumber, "%x", final);
-  mips_expect (hexnumber);
-  mips_expect ("\r\n");
-  if (mips_monitor != MON_LSI)
-    pmon_check_ack ("termination");
-  mips_expect ("\r\ntotal = 0x");
-  sprintf (hexnumber, "%x", bintotal);
-  mips_expect (hexnumber);
-  if (!mips_expect_download (" bytes\r\n"))
-    return;
 
   if (tftp_in_use)
     remove (tftp_localname);   /* Remove temporary file */
@@ -3424,7 +3441,7 @@ mips_load (char *file, int from_tty)
   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 now that we have loaded
This page took 0.0284 seconds and 4 git commands to generate.