* configure.host: Add x86_64-*-freebsd*.
[deliverable/binutils-gdb.git] / gdb / remote-mips.c
index 4366fb8a0196d458df167b431fdcea370de28151..96f39728f5414228f1129ec097dfb7900bb190e2 100644 (file)
@@ -1,5 +1,8 @@
 /* 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,
+   2002 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 +87,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 +107,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);
 
@@ -367,10 +364,10 @@ static int mips_receive_wait = 5;
 static int mips_need_reply = 0;
 
 /* Handle used to access serial I/O stream.  */
-static serial_t mips_desc;
+static struct serial *mips_desc;
 
 /* UDP handle used to download files to target.  */
-static serial_t udp_desc;
+static struct serial *udp_desc;
 static int udp_in_use;
 
 /* TFTP filename used to download files to DDB board, in the form
@@ -460,11 +457,11 @@ static void
 close_ports (void)
 {
   mips_is_open = 0;
-  SERIAL_CLOSE (mips_desc);
+  serial_close (mips_desc);
 
   if (udp_in_use)
     {
-      SERIAL_CLOSE (udp_desc);
+      serial_close (udp_desc);
       udp_in_use = 0;
     }
   tftp_in_use = 0;
@@ -500,7 +497,7 @@ mips_error (char *string,...)
   printf_unfiltered ("Ending remote MIPS debugging.\n");
   target_mourn_inferior ();
 
-  return_to_top_level (RETURN_ERROR);
+  throw_exception (RETURN_ERROR);
 }
 
 /* putc_readable - print a character, displaying non-printable chars in
@@ -539,7 +536,7 @@ fputs_readable (const char *string, struct ui_file *file)
    timed out.  TIMEOUT specifies timeout value in seconds.
  */
 
-int
+static int
 mips_expect_timeout (const char *string, int timeout)
 {
   const char *p = string;
@@ -551,15 +548,15 @@ mips_expect_timeout (const char *string, int timeout)
       fprintf_unfiltered (gdb_stdlog, "\", got \"");
     }
 
-  immediate_quit = 1;
+  immediate_quit++;
   while (1)
     {
       int c;
 
-/* Must use SERIAL_READCHAR here cuz mips_readchar would get confused if we
-   were waiting for the mips_monitor_prompt... */
+      /* Must use serial_readchar() here cuz mips_readchar would get
+        confused if we were waiting for the mips_monitor_prompt... */
 
-      c = SERIAL_READCHAR (mips_desc, timeout);
+      c = serial_readchar (mips_desc, timeout);
 
       if (c == SERIAL_TIMEOUT)
        {
@@ -575,7 +572,7 @@ mips_expect_timeout (const char *string, int timeout)
        {
          if (*p == '\0')
            {
-             immediate_quit = 0;
+             immediate_quit--;
              if (remote_debug)
                fprintf_unfiltered (gdb_stdlog, "\": OK\n");
              return 1;
@@ -595,29 +592,30 @@ mips_expect_timeout (const char *string, int timeout)
    mips_expect_timeout if a different timeout value is needed.
  */
 
-int
+static 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
    is assumed to be large enough). The only failure is a timeout. */
-int
+static int
 mips_getstring (char *string, int n)
 {
   char *p = string;
   int c;
 
-  immediate_quit = 1;
+  immediate_quit++;
   while (n > 0)
     {
-      c = SERIAL_READCHAR (mips_desc, 2);
+      c = serial_readchar (mips_desc, remote_timeout);
 
       if (c == SERIAL_TIMEOUT)
        {
          fprintf_unfiltered (gdb_stderr,
                 "Failed to read %d characters from target (TIMEOUT)\n", n);
+         immediate_quit--;
          return 0;
        }
 
@@ -625,17 +623,18 @@ mips_getstring (char *string, int n)
       n--;
     }
 
+  immediate_quit--;
   return 1;
 }
 
 /* Read a character from the remote, aborting on error.  Returns
-   SERIAL_TIMEOUT on timeout (since that's what SERIAL_READCHAR
-   returns).  FIXME: If we see the string mips_monitor_prompt from
-   the board, then we are debugging on the main console port, and we
-   have somehow dropped out of remote debugging mode.  In this case,
-   we automatically go back in to remote debugging mode.  This is a
-   hack, put in because I can't find any way for a program running on
-   the remote board to terminate without also ending remote debugging
+   SERIAL_TIMEOUT on timeout (since that's what serial_readchar()
+   returns).  FIXME: If we see the string mips_monitor_prompt from the
+   board, then we are debugging on the main console port, and we have
+   somehow dropped out of remote debugging mode.  In this case, we
+   automatically go back in to remote debugging mode.  This is a hack,
+   put in because I can't find any way for a program running on the
+   remote board to terminate without also ending remote debugging
    mode.  I assume users won't have any trouble with this; for one
    thing, the IDT documentation generally assumes that the remote
    debugging port is not the console port.  This is, however, very
@@ -659,7 +658,7 @@ mips_readchar (int timeout)
 
   if (state == mips_monitor_prompt_len)
     timeout = 1;
-  ch = SERIAL_READCHAR (mips_desc, timeout);
+  ch = serial_readchar (mips_desc, timeout);
 
   if (ch == SERIAL_TIMEOUT && timeout == -1)   /* Watchdog went off */
     {
@@ -885,7 +884,7 @@ mips_send_packet (const char *s, int get_ack)
          fprintf_unfiltered (gdb_stdlog, "Writing \"%s\"\n", packet + 1);
        }
 
-      if (SERIAL_WRITE (mips_desc, packet,
+      if (serial_write (mips_desc, packet,
                        HDR_LENGTH + len + TRLR_LENGTH) != 0)
        mips_error ("write to target failed: %s", safe_strerror (errno));
 
@@ -926,7 +925,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;
@@ -938,7 +937,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. */
@@ -1144,7 +1144,7 @@ mips_receive_packet (char *buff, int throw_error, int timeout)
                             ack + 1);
        }
 
-      if (SERIAL_WRITE (mips_desc, ack, HDR_LENGTH + TRLR_LENGTH) != 0)
+      if (serial_write (mips_desc, ack, HDR_LENGTH + TRLR_LENGTH) != 0)
        {
          if (throw_error)
            mips_error ("write to target failed: %s", safe_strerror (errno));
@@ -1184,7 +1184,7 @@ mips_receive_packet (char *buff, int throw_error, int timeout)
                         ack + 1);
     }
 
-  if (SERIAL_WRITE (mips_desc, ack, HDR_LENGTH + TRLR_LENGTH) != 0)
+  if (serial_write (mips_desc, ack, HDR_LENGTH + TRLR_LENGTH) != 0)
     {
       if (throw_error)
        mips_error ("write to target failed: %s", safe_strerror (errno));
@@ -1241,7 +1241,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;
@@ -1251,7 +1252,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;
 
@@ -1281,13 +1283,13 @@ mips_request (int cmd,
 }
 
 static void
-mips_initialize_cleanups (PTR arg)
+mips_initialize_cleanups (void *arg)
 {
   mips_initializing = 0;
 }
 
 static void
-mips_exit_cleanups (PTR arg)
+mips_exit_cleanups (void *arg)
 {
   mips_exiting = 0;
 }
@@ -1295,7 +1297,7 @@ mips_exit_cleanups (PTR arg)
 static void
 mips_send_command (const char *cmd, int prompt)
 {
-  SERIAL_WRITE (mips_desc, cmd, strlen (cmd));
+  serial_write (mips_desc, cmd, strlen (cmd));
   mips_expect (cmd);
   mips_expect ("\n");
   if (prompt)
@@ -1316,7 +1318,7 @@ mips_enter_debug (void)
     mips_send_command ("db tty0\r", 0);
 
   sleep (1);
-  SERIAL_WRITE (mips_desc, "\r", sizeof "\r" - 1);
+  serial_write (mips_desc, "\r", sizeof "\r" - 1);
 
   /* We don't need to absorb any spurious characters here, since the
      mips_receive_header will eat up a reasonable number of characters
@@ -1398,14 +1400,14 @@ mips_initialize (void)
       switch (j)
        {
        case 0:         /* First, try sending a CR */
-         SERIAL_FLUSH_INPUT (mips_desc);
-         SERIAL_WRITE (mips_desc, "\r", 1);
+         serial_flush_input (mips_desc);
+         serial_write (mips_desc, "\r", 1);
          break;
        case 1:         /* First, try sending a break */
-         SERIAL_SEND_BREAK (mips_desc);
+         serial_send_break (mips_desc);
          break;
        case 2:         /* Then, try a ^C */
-         SERIAL_WRITE (mips_desc, "\003", 1);
+         serial_write (mips_desc, "\003", 1);
          break;
        case 3:         /* Then, try escaping from download */
          {
@@ -1419,9 +1421,9 @@ mips_initialize (void)
                   packets. In-case we were downloading a large packet
                   we flush the output buffer before inserting a
                   termination sequence. */
-               SERIAL_FLUSH_OUTPUT (mips_desc);
+               serial_flush_output (mips_desc);
                sprintf (tbuff, "\r/E/E\r");
-               SERIAL_WRITE (mips_desc, tbuff, 6);
+               serial_write (mips_desc, tbuff, 6);
              }
            else
              {
@@ -1441,9 +1443,9 @@ mips_initialize (void)
 
                for (i = 1; i <= 33; i++)
                  {
-                   SERIAL_WRITE (mips_desc, srec, 8);
+                   serial_write (mips_desc, srec, 8);
 
-                   if (SERIAL_READCHAR (mips_desc, 0) >= 0)
+                   if (serial_readchar (mips_desc, 0) >= 0)
                      break;    /* Break immediatly if we get something from
                                   the board. */
                  }
@@ -1492,8 +1494,10 @@ mips_initialize (void)
      the request itself succeeds or fails.  */
 
   mips_request ('r', 0, 0, &err, mips_receive_wait, NULL);
-  set_current_frame (create_new_frame (read_fp (), read_pc ()));
-  select_frame (get_current_frame (), 0);
+  /* FIXME: cagney/2002-11-29: Force the update of selected frame.
+     This shouldn't be necessary, only many many places still refer to
+     selected_frame directly (instead of using get_selected_frame().  */
+  get_selected_frame (); /* Hack!!!  */
 }
 
 /* Open a connection to the remote board.  */
@@ -1525,7 +1529,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];
@@ -1539,20 +1543,20 @@ device is attached to the target board (e.g., /dev/ttya).\n"
     unpush_target (current_ops);
 
   /* Open and initialize the serial port.  */
-  mips_desc = SERIAL_OPEN (serial_port_name);
-  if (mips_desc == (serial_t) NULL)
+  mips_desc = serial_open (serial_port_name);
+  if (mips_desc == NULL)
     perror_with_name (serial_port_name);
 
   if (baud_rate != -1)
     {
-      if (SERIAL_SETBAUDRATE (mips_desc, baud_rate))
+      if (serial_setbaudrate (mips_desc, baud_rate))
        {
-         SERIAL_CLOSE (mips_desc);
+         serial_close (mips_desc);
          perror_with_name (serial_port_name);
        }
     }
 
-  SERIAL_RAW (mips_desc);
+  serial_raw (mips_desc);
 
   /* Open and initialize the optional download port.  If it is in the form
      hostname#portnumber, it's a UDP socket.  If it is in the form
@@ -1562,7 +1566,7 @@ device is attached to the target board (e.g., /dev/ttya).\n"
     {
       if (strchr (remote_name, '#'))
        {
-         udp_desc = SERIAL_OPEN (remote_name);
+         udp_desc = serial_open (remote_name);
          if (!udp_desc)
            perror_with_name ("Unable to open UDP port");
          udp_in_use = 1;
@@ -1573,16 +1577,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;
        }
     }
@@ -1592,7 +1596,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 ();
@@ -1608,20 +1612,18 @@ 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
-   doesn't happen here (in fact, it may not be possible to get the monitor to
-   send the appropriate packet).  */
+  /* 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 doesn't happen here (in fact, it may not be
+     possible to get the monitor to send the appropriate packet).  */
 
   flush_cached_frames ();
   registers_changed ();
   stop_pc = read_pc ();
-  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);
+  print_stack_frame (get_selected_frame (), -1, 1);
+  xfree (serial_port_name);
 }
 
 static void
@@ -1706,7 +1708,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;
 
@@ -1719,7 +1721,7 @@ mips_resume (int pid, int step, enum target_signal siggnal)
 
 /* Return the signal corresponding to SIG, where SIG is the number which
    the MIPS protocol uses for the signal.  */
-enum target_signal
+static enum target_signal
 mips_signal_from_protocol (int sig)
 {
   /* We allow a few more signals than the IDT board actually returns, on
@@ -1738,8 +1740,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;
@@ -1759,7 +1761,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.  */
@@ -1789,7 +1791,7 @@ mips_wait (int pid, struct target_waitstatus *status)
                    &rpc, &rfp, &rsp, flags);
   if (nfields >= 3)
     {
-      char buf[MAX_REGISTER_RAW_SIZE];
+      char buf[MAX_REGISTER_SIZE];
 
       store_unsigned_integer (buf, REGISTER_RAW_SIZE (PC_REGNUM), rpc);
       supply_register (PC_REGNUM, buf);
@@ -1800,8 +1802,8 @@ mips_wait (int pid, struct target_waitstatus *status)
       store_unsigned_integer (buf, REGISTER_RAW_SIZE (SP_REGNUM), rsp);
       supply_register (SP_REGNUM, buf);
 
-      store_unsigned_integer (buf, REGISTER_RAW_SIZE (FP_REGNUM), 0);
-      supply_register (FP_REGNUM, buf);
+      store_unsigned_integer (buf, REGISTER_RAW_SIZE (DEPRECATED_FP_REGNUM), 0);
+      supply_register (DEPRECATED_FP_REGNUM, buf);
 
       if (nfields == 9)
        {
@@ -1890,7 +1892,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
@@ -1941,9 +1943,9 @@ mips_fetch_registers (int regno)
       return;
     }
 
-  if (regno == FP_REGNUM || regno == ZERO_REGNUM)
-    /* FP_REGNUM on the mips is a hack which is just supposed to read
-       zero (see also mips-nat.c).  */
+  if (regno == DEPRECATED_FP_REGNUM || regno == ZERO_REGNUM)
+    /* DEPRECATED_FP_REGNUM on the mips is a hack which is just
+       supposed to read zero (see also mips-nat.c).  */
     val = 0;
   else
     {
@@ -1970,7 +1972,7 @@ mips_fetch_registers (int regno)
     }
 
   {
-    char buf[MAX_REGISTER_RAW_SIZE];
+    char buf[MAX_REGISTER_SIZE];
 
     /* We got the number the register holds, but gdb expects to see a
        value in the target byte ordering.  */
@@ -2066,7 +2068,7 @@ 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, struct target_ops *target)
 {
   int i;
   CORE_ADDR addr;
@@ -2184,7 +2186,7 @@ Give up (and stop debugging it)? "))
          printf_unfiltered ("Ending remote MIPS debugging.\n");
          target_mourn_inferior ();
 
-         return_to_top_level (RETURN_QUIT);
+         throw_exception (RETURN_QUIT);
        }
 
       target_terminal_inferior ();
@@ -2193,7 +2195,7 @@ Give up (and stop debugging it)? "))
   if (remote_debug > 0)
     printf_unfiltered ("Sending break\n");
 
-  SERIAL_SEND_BREAK (mips_desc);
+  serial_send_break (mips_desc);
 
 #if 0
   if (mips_is_open)
@@ -2202,7 +2204,7 @@ Give up (and stop debugging it)? "))
 
       /* Send a ^C.  */
       cc = '\003';
-      SERIAL_WRITE (mips_desc, &cc, 1);
+      serial_write (mips_desc, &cc, 1);
       sleep (1);
       target_mourn_inferior ();
     }
@@ -2231,7 +2233,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);
 }
@@ -2249,13 +2251,13 @@ mips_mourn_inferior (void)
 /* We can write a breakpoint and read the shadow contents in one
    operation.  */
 
-/* Insert a breakpoint.  On targets that don't have built-in breakpoint
-   support, we read the contents of the target location and stash it,
-   then overwrite it with a breakpoint instruction.  ADDR is the target
-   location in the target machine.  CONTENTS_CACHE is a pointer to 
-   memory allocated for saving the target contents.  It is guaranteed
-   by the caller to be long enough to save sizeof BREAKPOINT bytes (this
-   is accomplished via BREAKPOINT_MAX).  */
+/* Insert a breakpoint.  On targets that don't have built-in
+   breakpoint support, we read the contents of the target location and
+   stash it, then overwrite it with a breakpoint instruction.  ADDR is
+   the target location in the target machine.  CONTENTS_CACHE is a
+   pointer to memory allocated for saving the target contents.  It is
+   guaranteed by the caller to be long enough to save the breakpoint
+   length returned by BREAKPOINT_FROM_PC.  */
 
 static int
 mips_insert_breakpoint (CORE_ADDR addr, char *contents_cache)
@@ -2306,7 +2308,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)
@@ -2435,7 +2437,7 @@ calculate_mask (CORE_ADDR addr, int len)
 /* Insert a hardware breakpoint.  This works only on LSI targets, which
    implement ordinary breakpoints using hardware facilities.  */
 
-int
+static int
 remote_mips_insert_hw_breakpoint (CORE_ADDR addr, char *contents_cache)
 {
   if (strcmp (target_shortname, "lsi") == 0)
@@ -2448,7 +2450,7 @@ remote_mips_insert_hw_breakpoint (CORE_ADDR addr, char *contents_cache)
 /* Remove a hardware breakpoint.  This works only on LSI targets, which
    implement ordinary breakpoints using hardware facilities.  */
 
-int
+static int
 remote_mips_remove_hw_breakpoint (CORE_ADDR addr, char *contents_cache)
 {
   if (strcmp (target_shortname, "lsi") == 0)
@@ -2724,7 +2726,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';
@@ -2772,9 +2774,9 @@ send_srec (char *srec, int len, CORE_ADDR addr)
     {
       int ch;
 
-      SERIAL_WRITE (mips_desc, srec, len);
+      serial_write (mips_desc, srec, len);
 
-      ch = mips_readchar (2);
+      ch = mips_readchar (remote_timeout);
 
       switch (ch)
        {
@@ -2844,6 +2846,9 @@ mips_load_srec (char *args)
              reclen = mips_make_srec (srec, '3', s->vma + i, buffer, numbytes);
              send_srec (srec, reclen, s->vma + i);
 
+             if (ui_load_progress_hook)
+               ui_load_progress_hook (s->name, i);
+
              if (hashmark)
                {
                  putchar_unfiltered ('#');
@@ -2865,7 +2870,7 @@ mips_load_srec (char *args)
 
   send_srec (srec, reclen, abfd->start_address);
 
-  SERIAL_FLUSH_INPUT (mips_desc);
+  serial_flush_input (mips_desc);
 }
 
 /*
@@ -3131,7 +3136,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,
@@ -3178,6 +3184,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)
 {
@@ -3206,7 +3232,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))
@@ -3218,24 +3244,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");
+      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");
-      mips_expect_timeout ("Entry address is ", tftp_in_use ? 15 : 2);
+      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 */
@@ -3247,7 +3270,7 @@ pmon_download (char *buffer, int length)
   if (tftp_in_use)
     fwrite (buffer, 1, length, tftp_file);
   else
-    SERIAL_WRITE (udp_in_use ? udp_desc : mips_desc, buffer, length);
+    serial_write (udp_in_use ? udp_desc : mips_desc, buffer, length);
 }
 
 static void
@@ -3347,6 +3370,9 @@ pmon_load_fast (char *file)
                            break;
                          }
 
+                       if (ui_load_progress_hook)
+                         ui_load_progress_hook (s->name, i);
+
                        if (hashmark)
                          {
                            putchar_unfiltered ('#');
@@ -3385,7 +3411,7 @@ pmon_load_fast (char *file)
 
   if (finished)
     {                          /* Ignore the termination message: */
-      SERIAL_FLUSH_INPUT (udp_in_use ? udp_desc : mips_desc);
+      serial_flush_input (udp_in_use ? udp_desc : mips_desc);
     }
   else
     {                          /* Deal with termination message: */
@@ -3417,12 +3443,12 @@ mips_load (char *file, int from_tty)
       /* 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: */
-      register_valid[PC_REGNUM] = 0;
+      deprecated_register_valid[PC_REGNUM] = 0;
     }
   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
@@ -3451,6 +3477,8 @@ pmon_command (char *args, int from_tty)
   printf_filtered ("Received packet: %s\n", buf);
 }
 \f
+extern initialize_file_ftype _initialize_remote_mips; /* -Wmissing-prototypes */
+
 void
 _initialize_remote_mips (void)
 {
This page took 0.044435 seconds and 4 git commands to generate.