binutils/
[external/binutils.git] / gdb / monitor.c
index 410ce62..2eeb705 100644 (file)
@@ -1,7 +1,8 @@
 /* Remote debugging interface for boot monitors, for GDB.
 
    Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-   2000, 2001, 2002, 2006, 2007 Free Software Foundation, Inc.
+   2000, 2001, 2002, 2006, 2007, 2008, 2009, 2010, 2011
+   Free Software Foundation, Inc.
 
    Contributed by Cygnus Support.  Written by Rob Savoye for Cygnus.
    Resurrected from the ashes by Stu Grossman.
@@ -21,9 +22,9 @@
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
-/* This file was derived from various remote-* modules. It is a collection
+/* This file was derived from various remote-* modules.  It is a collection
    of generic support functions so GDB can talk directly to a ROM based
-   monitor. This saves use from having to hack an exception based handler
+   monitor.  This saves use from having to hack an exception based handler
    into existence, and makes for quick porting.
 
    This module talks to a debug monitor called 'MONITOR', which
 #include "gdb_regex.h"
 #include "srec.h"
 #include "regcache.h"
+#include "gdbthread.h"
 
 static char *dev_name;
 static struct target_ops *targ_ops;
 
 static void monitor_interrupt_query (void);
 static void monitor_interrupt_twice (int);
-static void monitor_stop (void);
+static void monitor_stop (ptid_t);
 static void monitor_dump_regs (struct regcache *regcache);
 
 #if 0
@@ -69,13 +71,13 @@ static int from_hex (int a);
 
 static struct monitor_ops *current_monitor;
 
-static int hashmark;           /* flag set by "set hash" */
+static int hashmark;           /* flag set by "set hash" */
 
 static int timeout = 30;
 
-static int in_monitor_wait = 0;        /* Non-zero means we are in monitor_wait() */
+static int in_monitor_wait = 0;        /* Non-zero means we are in monitor_wait() */
 
-static void (*ofunc) ();       /* Old SIGINT signal handler */
+static void (*ofunc) ();       /* Old SIGINT signal handler */
 
 static CORE_ADDR *breakaddr;
 
@@ -85,7 +87,7 @@ static CORE_ADDR *breakaddr;
 
 static struct serial *monitor_desc = NULL;
 
-/* Pointer to regexp pattern matching data */
+/* Pointer to regexp pattern matching data */
 
 static struct re_pattern_buffer register_pattern;
 static char register_fastmap[256];
@@ -102,21 +104,29 @@ static char setreg_resp_delim_fastmap[256];
 static int dump_reg_flag;      /* Non-zero means do a dump_registers cmd when
                                   monitor_wait wakes up.  */
 
-static int first_time = 0;     /* is this the first time we're executing after 
-                                  gaving created the child proccess? */
+static int first_time = 0;     /* Is this the first time we're
+                                  executing after gaving created the
+                                  child proccess?  */
+
+
+/* This is the ptid we use while we're connected to a monitor.  Its
+   value is arbitrary, as monitor targets don't have a notion of
+   processes or threads, but we need something non-null to place in
+   inferior_ptid.  */
+static ptid_t monitor_ptid;
 
 #define TARGET_BUF_SIZE 2048
 
 /* Monitor specific debugging information.  Typically only useful to
-   the developer of a new monitor interface. */
+   the developer of a new monitor interface.  */
 
-static void monitor_debug (const char *fmt, ...) ATTR_FORMAT(printf, 1, 2);
+static void monitor_debug (const char *fmt, ...) ATTRIBUTE_PRINTF (1, 2);
 
 static int monitor_debug_p = 0;
 
 /* NOTE: This file alternates between monitor_debug_p and remote_debug
    when determining if debug information is printed.  Perhaps this
-   could be simplified. */
+   could be simplified.  */
 
 static void
 monitor_debug (const char *fmt, ...)
@@ -124,6 +134,7 @@ monitor_debug (const char *fmt, ...)
   if (monitor_debug_p)
     {
       va_list args;
+
       va_start (args, fmt);
       vfprintf_filtered (gdb_stdlog, fmt, args);
       va_end (args);
@@ -133,7 +144,7 @@ monitor_debug (const char *fmt, ...)
 
 /* Convert a string into a printable representation, Return # byte in
    the new string.  When LEN is >0 it specifies the size of the
-   string.  Otherwize strlen(oldstr) is used. */
+   string.  Otherwize strlen(oldstr) is used.  */
 
 static void
 monitor_printable_string (char *newstr, char *oldstr, int len)
@@ -203,12 +214,17 @@ monitor_error (char *function, char *message,
 {
   int real_len = (len == 0 && string != (char *) 0) ? strlen (string) : len;
   char *safe_string = alloca ((real_len * 4) + 1);
+
   monitor_printable_string (safe_string, string, real_len);
 
   if (final_char)
-    error (_("%s (0x%s): %s: %s%c"), function, paddr_nz (memaddr), message, safe_string, final_char);
+    error (_("%s (%s): %s: %s%c"),
+          function, paddress (target_gdbarch, memaddr),
+          message, safe_string, final_char);
   else
-    error (_("%s (0x%s): %s: %s"), function, paddr_nz (memaddr), message, safe_string);
+    error (_("%s (%s): %s: %s"),
+          function, paddress (target_gdbarch, memaddr),
+          message, safe_string);
 }
 
 /* Convert hex digit A to a number.  */
@@ -237,12 +253,12 @@ fromhex (int a)
    If it is a '%s' format, the argument is a string; otherwise the
    argument is assumed to be a long integer.
 
-   %% is also turned into a single %.
- */
+   %% is also turned into a single %.  */
 
 static void
 monitor_vsprintf (char *sndbuf, char *pattern, va_list args)
 {
+  int addr_bit = gdbarch_addr_bit (target_gdbarch);
   char format[10];
   char fmt;
   char *p;
@@ -271,7 +287,7 @@ monitor_vsprintf (char *sndbuf, char *pattern, va_list args)
              break;
            case 'A':
              arg_addr = va_arg (args, CORE_ADDR);
-             strcpy (sndbuf, paddr_nz (arg_addr));
+             strcpy (sndbuf, phex_nz (arg_addr, addr_bit / 8));
              break;
            case 's':
              arg_string = va_arg (args, char *);
@@ -307,11 +323,13 @@ monitor_printf_noecho (char *pattern,...)
 
   len = strlen (sndbuf);
   if (len + 1 > sizeof sndbuf)
-    internal_error (__FILE__, __LINE__, _("failed internal consistency check"));
+    internal_error (__FILE__, __LINE__,
+                   _("failed internal consistency check"));
 
   if (monitor_debug_p)
     {
       char *safe_string = (char *) alloca ((strlen (sndbuf) * 4) + 1);
+
       monitor_printable_string (safe_string, sndbuf, 0);
       fprintf_unfiltered (gdb_stdlog, "sent[%s]\n", safe_string);
     }
@@ -335,21 +353,24 @@ monitor_printf (char *pattern,...)
 
   len = strlen (sndbuf);
   if (len + 1 > sizeof sndbuf)
-    internal_error (__FILE__, __LINE__, _("failed internal consistency check"));
+    internal_error (__FILE__, __LINE__,
+                   _("failed internal consistency check"));
 
   if (monitor_debug_p)
     {
       char *safe_string = (char *) alloca ((len * 4) + 1);
+
       monitor_printable_string (safe_string, sndbuf, 0);
       fprintf_unfiltered (gdb_stdlog, "sent[%s]\n", safe_string);
     }
 
   monitor_write (sndbuf, len);
 
-  /* We used to expect that the next immediate output was the characters we
-     just output, but sometimes some extra junk appeared before the characters
-     we expected, like an extra prompt, or a portmaster sending telnet negotiations.
-     So, just start searching for what we sent, and skip anything unknown.  */
+  /* We used to expect that the next immediate output was the
+     characters we just output, but sometimes some extra junk appeared
+     before the characters we expected, like an extra prompt, or a
+     portmaster sending telnet negotiations.  So, just start searching
+     for what we sent, and skip anything unknown.  */
   monitor_debug ("ExpectEcho\n");
   monitor_expect (sndbuf, (char *) 0, 0);
 }
@@ -419,10 +440,11 @@ readchar (int timeout)
        {
          c &= 0x7f;
          /* This seems to interfere with proper function of the
-            input stream */
+            input stream */
          if (monitor_debug_p || remote_debug)
            {
              char buf[2];
+
              buf[0] = c;
              buf[1] = '\0';
              puts_debug ("read -->", buf, "<--");
@@ -430,7 +452,7 @@ readchar (int timeout)
 
        }
 
-      /* Canonicialize \n\r combinations into one \r */
+      /* Canonicialize \n\r combinations into one \r */
       if ((current_monitor->flags & MO_HANDLE_NL) != 0)
        {
          if ((c == '\r' && state == last_nl)
@@ -457,8 +479,8 @@ readchar (int timeout)
 
   if (c == SERIAL_TIMEOUT)
 #if 0
-    /* I fail to see how detaching here can be useful */
-    if (in_monitor_wait)       /* Watchdog went off */
+    /* I fail to see how detaching here can be useful */
+    if (in_monitor_wait)       /* Watchdog went off */
       {
        target_mourn_inferior ();
        error (_("GDB serial timeout has expired.  Target detached."));
@@ -512,7 +534,7 @@ monitor_expect (char *string, char *buf, int buflen)
       else
        c = readchar (timeout);
 
-      /* Don't expect any ^C sent to be echoed */
+      /* Don't expect any ^C sent to be echoed */
 
       if (*p == '\003' || c == *p)
        {
@@ -552,7 +574,7 @@ monitor_expect (char *string, char *buf, int buflen)
             p, since we know no prefix can be longer than that.
 
             Note that we can use STRING itself, along with C, as a record
-            of what we've received so far.  :) */
+            of what we've received so far.  :)  */
          int i;
 
          for (i = (p - string) - 1; i >= 0; i--)
@@ -560,7 +582,7 @@ monitor_expect (char *string, char *buf, int buflen)
              {
                /* Is this prefix a suffix of what we've read so far?
                   In other words, does
-                     string[0 .. i-1] == string[p - i, p - 1]? */
+                     string[0 .. i-1] == string[p - i, p - 1]?  */
                if (! memcmp (string, p - i, i))
                  {
                    p = string + i + 1;
@@ -580,6 +602,7 @@ monitor_expect_regexp (struct re_pattern_buffer *pat, char *buf, int buflen)
 {
   char *mybuf;
   char *p;
+
   monitor_debug ("MON Expecting regexp\n");
   if (buf)
     mybuf = buf;
@@ -595,10 +618,10 @@ monitor_expect_regexp (struct re_pattern_buffer *pat, char *buf, int buflen)
       int retval;
 
       if (p - mybuf >= buflen)
-       {                       /* Buffer about to overflow */
+       {                       /* Buffer about to overflow */
 
 /* On overflow, we copy the upper half of the buffer to the lower half.  Not
-   great, but it usually works... */
+   great, but it usually works...  */
 
          memcpy (mybuf, mybuf + buflen / 2, buflen / 2);
          p = mybuf + buflen / 2;
@@ -678,13 +701,14 @@ compile_pattern (char *pattern, struct re_pattern_buffer *compiled_pattern,
   re_set_syntax (tmp);
 
   if (val)
-    error (_("compile_pattern: Can't compile pattern string `%s': %s!"), pattern, val);
+    error (_("compile_pattern: Can't compile pattern string `%s': %s!"),
+          pattern, val);
 
   if (fastmap)
     re_compile_fastmap (compiled_pattern);
 }
 
-/* Open a connection to a remote debugger. NAME is the filename used
+/* Open a connection to a remote debugger.  NAME is the filename used
    for communication.  */
 
 void
@@ -692,6 +716,7 @@ monitor_open (char *args, struct monitor_ops *mon_ops, int from_tty)
 {
   char *name;
   char **p;
+  struct inferior *inf;
 
   if (mon_ops->magic != MONITOR_OPS_MAGIC)
     error (_("Magic number of monitor_ops struct wrong."));
@@ -700,12 +725,12 @@ monitor_open (char *args, struct monitor_ops *mon_ops, int from_tty)
   name = targ_ops->to_shortname;
 
   if (!args)
-    error (_("Use `target %s DEVICE-NAME' to use a serial port, or \n\
+    error (_("Use `target %s DEVICE-NAME' to use a serial port, or\n\
 `target %s HOST-NAME:PORT-NUMBER' to use a network connection."), name, name);
 
   target_preopen (from_tty);
 
-  /* Setup pattern for register dump */
+  /* Setup pattern for register dump */
 
   if (mon_ops->register_pattern)
     compile_pattern (mon_ops->register_pattern, &register_pattern,
@@ -747,7 +772,7 @@ monitor_open (char *args, struct monitor_ops *mon_ops, int from_tty)
 
   serial_flush_input (monitor_desc);
 
-  /* some systems only work with 2 stop bits */
+  /* some systems only work with 2 stop bits */
 
   serial_setstopbits (monitor_desc, mon_ops->stopbits);
 
@@ -758,7 +783,7 @@ monitor_open (char *args, struct monitor_ops *mon_ops, int from_tty)
 
   if (current_monitor->stop)
     {
-      monitor_stop ();
+      monitor_stop (inferior_ptid);
       if ((current_monitor->flags & MO_NO_ECHO_ON_OPEN) == 0)
        {
          monitor_debug ("EXP Open echo\n");
@@ -766,11 +791,11 @@ monitor_open (char *args, struct monitor_ops *mon_ops, int from_tty)
        }
     }
 
-  /* wake up the monitor and see if it's alive */
+  /* wake up the monitor and see if it's alive */
   for (p = mon_ops->init; *p != NULL; p++)
     {
       /* Some of the characters we send may not be echoed,
-         but we hope to get a prompt at the end of it all. */
+         but we hope to get a prompt at the end of it all.  */
 
       if ((current_monitor->flags & MO_NO_ECHO_ON_OPEN) == 0)
        monitor_printf (*p);
@@ -787,11 +812,12 @@ monitor_open (char *args, struct monitor_ops *mon_ops, int from_tty)
       if (mon_ops->num_breakpoints == 0)
        mon_ops->num_breakpoints = 8;
 
-      breakaddr = (CORE_ADDR *) xmalloc (mon_ops->num_breakpoints * sizeof (CORE_ADDR));
+      breakaddr = (CORE_ADDR *)
+       xmalloc (mon_ops->num_breakpoints * sizeof (CORE_ADDR));
       memset (breakaddr, 0, mon_ops->num_breakpoints * sizeof (CORE_ADDR));
     }
 
-  /* Remove all breakpoints */
+  /* Remove all breakpoints */
 
   if (mon_ops->clr_all_break)
     {
@@ -800,16 +826,26 @@ monitor_open (char *args, struct monitor_ops *mon_ops, int from_tty)
     }
 
   if (from_tty)
-    printf_unfiltered (_("Remote target %s connected to %s\n"), name, dev_name);
+    printf_unfiltered (_("Remote target %s connected to %s\n"),
+                      name, dev_name);
 
   push_target (targ_ops);
 
-  inferior_ptid = pid_to_ptid (42000); /* Make run command think we are busy... */
+  /* Start afresh.  */
+  init_thread_list ();
+
+  /* Make run command think we are busy...  */
+  inferior_ptid = monitor_ptid;
+  inf = current_inferior ();
+  inferior_appeared (inf, ptid_get_pid (inferior_ptid));
+  add_thread_silent (inferior_ptid);
 
-  /* Give monitor_wait something to read */
+  /* Give monitor_wait something to read */
 
   monitor_printf (current_monitor->line_term);
 
+  init_wait_for_inferior ();
+
   start_remote (from_tty);
 }
 
@@ -822,7 +858,7 @@ monitor_close (int quitting)
   if (monitor_desc)
     serial_close (monitor_desc);
 
-  /* Free breakpoint memory */
+  /* Free breakpoint memory */
   if (breakaddr != NULL)
     {
       xfree (breakaddr);
@@ -830,15 +866,18 @@ monitor_close (int quitting)
     }
 
   monitor_desc = NULL;
+
+  delete_thread_silent (monitor_ptid);
+  delete_inferior_silent (ptid_get_pid (monitor_ptid));
 }
 
 /* Terminate the open connection to the remote debugger.  Use this
    when you want to detach and do something else with your gdb.  */
 
 static void
-monitor_detach (char *args, int from_tty)
+monitor_detach (struct target_ops *ops, char *args, int from_tty)
 {
-  pop_target ();               /* calls monitor_close to do the real work */
+  pop_target ();               /* calls monitor_close to do the real work */
   if (from_tty)
     printf_unfiltered (_("Ending remote %s debugging\n"), target_shortname);
 }
@@ -848,6 +887,8 @@ monitor_detach (char *args, int from_tty)
 char *
 monitor_supply_register (struct regcache *regcache, int regno, char *valstr)
 {
+  struct gdbarch *gdbarch = get_regcache_arch (regcache);
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   ULONGEST val;
   unsigned char regbuf[MAX_REGISTER_SIZE];
   char *p;
@@ -881,10 +922,9 @@ monitor_supply_register (struct regcache *regcache, int regno, char *valstr)
     error (_("monitor_supply_register (%d):  bad value from monitor: %s."),
           regno, valstr);
 
-  /* supply register stores in target byte order, so swap here */
+  /* supply register stores in target byte order, so swap here */
 
-  store_unsigned_integer (regbuf,
-                         register_size (get_regcache_arch (regcache), regno),
+  store_unsigned_integer (regbuf, register_size (gdbarch, regno), byte_order,
                          val);
 
   regcache_raw_supply (regcache, regno, regbuf);
@@ -895,9 +935,10 @@ monitor_supply_register (struct regcache *regcache, int regno, char *valstr)
 /* Tell the remote machine to resume.  */
 
 static void
-monitor_resume (ptid_t ptid, int step, enum target_signal sig)
+monitor_resume (struct target_ops *ops,
+               ptid_t ptid, int step, enum target_signal sig)
 {
-  /* Some monitors require a different command when starting a program */
+  /* Some monitors require a different command when starting a program */
   monitor_debug ("MON resume\n");
   if (current_monitor->flags & MO_RUN_FIRST_TIME && first_time == 1)
     {
@@ -933,6 +974,7 @@ parse_register_dump (struct regcache *regcache, char *buf, int len)
     {
       int regnamelen, vallen;
       char *regname, *val;
+
       /* Element 0 points to start of register name, and element 1
          points to the start of the register value.  */
       struct re_registers register_strings;
@@ -968,7 +1010,7 @@ monitor_interrupt (int signo)
   if (monitor_debug_p || remote_debug)
     fprintf_unfiltered (gdb_stdlog, "monitor_interrupt called\n");
 
-  target_stop ();
+  target_stop (inferior_ptid);
 }
 
 /* The user typed ^C twice.  */
@@ -990,8 +1032,8 @@ monitor_interrupt_query (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)? ")))
     {
       target_mourn_inferior ();
       deprecated_throw_reason (RETURN_QUIT);
@@ -1017,18 +1059,21 @@ monitor_wait_filter (char *buf,
                     struct target_waitstatus *status)
 {
   int resp_len;
+
   do
     {
       resp_len = monitor_expect_prompt (buf, bufmax);
       *ext_resp_len = resp_len;
 
       if (resp_len <= 0)
-       fprintf_unfiltered (gdb_stderr, "monitor_wait:  excessive response from monitor: %s.", buf);
+       fprintf_unfiltered (gdb_stderr,
+                           "monitor_wait:  excessive "
+                           "response from monitor: %s.", buf);
     }
   while (resp_len < 0);
 
   /* Print any output characters that were preceded by ^O.  */
-  /* FIXME - This would be great as a user settabgle flag */
+  /* FIXME - This would be great as a user settabgle flag */
   if (monitor_debug_p || remote_debug
       || current_monitor->flags & MO_PRINT_PROGRAM_OUTPUT)
     {
@@ -1046,7 +1091,8 @@ monitor_wait_filter (char *buf,
    status just as `wait' would.  */
 
 static ptid_t
-monitor_wait (ptid_t ptid, struct target_waitstatus *status)
+monitor_wait (struct target_ops *ops,
+             ptid_t ptid, struct target_waitstatus *status, int options)
 {
   int old_timeout = timeout;
   char buf[TARGET_BUF_SIZE];
@@ -1060,11 +1106,11 @@ monitor_wait (ptid_t ptid, struct target_waitstatus *status)
   monitor_debug ("MON wait\n");
 
 #if 0
-  /* This is somthing other than a maintenance command */
+  /* This is somthing other than a maintenance command */
     in_monitor_wait = 1;
   timeout = watchdog > 0 ? watchdog : -1;
 #else
-  timeout = -1;                /* Don't time out -- user program is running. */
+  timeout = -1;                /* Don't time out -- user program is running.  */
 #endif
 
   ofunc = (void (*)()) signal (SIGINT, monitor_interrupt);
@@ -1074,18 +1120,20 @@ monitor_wait (ptid_t ptid, struct target_waitstatus *status)
   else
     monitor_wait_filter (buf, sizeof (buf), &resp_len, status);
 
-#if 0                          /* Transferred to monitor wait filter */
+#if 0                          /* Transferred to monitor wait filter */
   do
     {
       resp_len = monitor_expect_prompt (buf, sizeof (buf));
 
       if (resp_len <= 0)
-       fprintf_unfiltered (gdb_stderr, "monitor_wait:  excessive response from monitor: %s.", buf);
+       fprintf_unfiltered (gdb_stderr,
+                           "monitor_wait:  excessive "
+                           "response from monitor: %s.", buf);
     }
   while (resp_len < 0);
 
   /* Print any output characters that were preceded by ^O.  */
-  /* FIXME - This would be great as a user settabgle flag */
+  /* FIXME - This would be great as a user settabgle flag */
   if (monitor_debug_p || remote_debug
       || current_monitor->flags & MO_PRINT_PROGRAM_OUTPUT)
     {
@@ -1125,7 +1173,7 @@ monitor_wait (ptid_t ptid, struct target_waitstatus *status)
   return inferior_ptid;
 }
 
-/* Fetch register REGNO, or all registers if REGNO is -1. Returns
+/* Fetch register REGNO, or all registers if REGNO is -1.  Returns
    errno value.  */
 
 static void
@@ -1153,7 +1201,7 @@ monitor_fetch_register (struct regcache *regcache, int regno)
       return;
     }
 
-  /* send the register examine command */
+  /* Send the register examine command.  */
 
   monitor_printf (current_monitor->getreg.cmd, name);
 
@@ -1174,17 +1222,19 @@ monitor_fetch_register (struct regcache *regcache, int regno)
        }
     }
 
-  /* Skip leading spaces and "0x" if MO_HEX_PREFIX flag is set */
+  /* Skip leading spaces and "0x" if MO_HEX_PREFIX flag is set */
   if (current_monitor->flags & MO_HEX_PREFIX)
     {
       int c;
+
       c = readchar (timeout);
       while (c == ' ')
        c = readchar (timeout);
       if ((c == '0') && ((c = readchar (timeout)) == 'x'))
        ;
       else
-       error (_("Bad value returned from monitor while fetching register %x."),
+       error (_("Bad value returned from monitor "
+                "while fetching register %x."),
               regno);
     }
 
@@ -1195,6 +1245,7 @@ monitor_fetch_register (struct regcache *regcache, int regno)
   for (i = 0; i < register_size (get_regcache_arch (regcache), regno) * 2; i++)
     {
       int c;
+
       c = readchar (timeout);
       while (c == ' ')
        c = readchar (timeout);
@@ -1205,7 +1256,7 @@ monitor_fetch_register (struct regcache *regcache, int regno)
       regbuf[i] = c;
     }
 
-  regbuf[i] = '\000';          /* terminate the number */
+  regbuf[i] = '\000';          /* Terminate the number.  */
   monitor_debug ("REGVAL '%s'\n", regbuf);
 
   /* If TERM is present, we wait for that to show up.  Also, (if TERM
@@ -1216,7 +1267,8 @@ monitor_fetch_register (struct regcache *regcache, int regno)
   if (current_monitor->getreg.term)
     {
       monitor_debug ("EXP getreg.term\n");
-      monitor_expect (current_monitor->getreg.term, NULL, 0);          /* get response */
+      monitor_expect (current_monitor->getreg.term, NULL, 0); /* Get
+                                                                response.  */
     }
 
   if (current_monitor->getreg.term_cmd)
@@ -1225,21 +1277,22 @@ monitor_fetch_register (struct regcache *regcache, int regno)
       monitor_printf (current_monitor->getreg.term_cmd);
     }
   if (!current_monitor->getreg.term || /* Already expected or */
-      current_monitor->getreg.term_cmd)                /* ack expected */
-    monitor_expect_prompt (NULL, 0);   /* get response */
+      current_monitor->getreg.term_cmd)                /* ack expected */
+    monitor_expect_prompt (NULL, 0);   /* Get response.  */
 
   monitor_supply_register (regcache, regno, regbuf);
 }
 
-/* Sometimes, it takes several commands to dump the registers */
+/* Sometimes, it takes several commands to dump the registers */
 /* This is a primitive for use by variations of monitor interfaces in
-   case they need to compose the operation.
- */
+   case they need to compose the operation.  */
+
 int
 monitor_dump_reg_block (struct regcache *regcache, char *block_cmd)
 {
   char buf[TARGET_BUF_SIZE];
   int resp_len;
+
   monitor_printf (block_cmd);
   resp_len = monitor_expect_prompt (buf, sizeof (buf));
   parse_register_dump (regcache, buf, resp_len);
@@ -1248,27 +1301,31 @@ monitor_dump_reg_block (struct regcache *regcache, char *block_cmd)
 
 
 /* Read the remote registers into the block regs.  */
-/* Call the specific function if it has been provided */
+/* Call the specific function if it has been provided */
 
 static void
 monitor_dump_regs (struct regcache *regcache)
 {
   char buf[TARGET_BUF_SIZE];
   int resp_len;
+
   if (current_monitor->dumpregs)
-    (*(current_monitor->dumpregs)) (regcache); /* call supplied function */
-  else if (current_monitor->dump_registers)    /* default version */
+    (*(current_monitor->dumpregs)) (regcache); /* Call supplied function.  */
+  else if (current_monitor->dump_registers)    /* Default version.  */
     {
       monitor_printf (current_monitor->dump_registers);
       resp_len = monitor_expect_prompt (buf, sizeof (buf));
       parse_register_dump (regcache, buf, resp_len);
     }
   else
-    internal_error (__FILE__, __LINE__, _("failed internal consistency check"));                       /* Need some way to read registers */
+    /* Need some way to read registers.  */
+    internal_error (__FILE__, __LINE__,
+                   _("failed internal consistency check"));
 }
 
 static void
-monitor_fetch_registers (struct regcache *regcache, int regno)
+monitor_fetch_registers (struct target_ops *ops,
+                        struct regcache *regcache, int regno)
 {
   monitor_debug ("MON fetchregs\n");
   if (current_monitor->getreg.cmd)
@@ -1294,6 +1351,7 @@ monitor_fetch_registers (struct regcache *regcache, int regno)
 static void
 monitor_store_register (struct regcache *regcache, int regno)
 {
+  int reg_size = register_size (get_regcache_arch (regcache), regno);
   const char *name;
   ULONGEST val;
   
@@ -1309,11 +1367,9 @@ monitor_store_register (struct regcache *regcache, int regno)
     }
 
   regcache_cooked_read_unsigned (regcache, regno, &val);
-  monitor_debug ("MON storeg %d %s\n", regno,
-                phex (val,
-                      register_size (get_regcache_arch (regcache), regno)));
+  monitor_debug ("MON storeg %d %s\n", regno, phex (val, reg_size));
 
-  /* send the register deposit command */
+  /* Send the register deposit command.  */
 
   if (current_monitor->flags & MO_REGISTER_VALUE_FIRST)
     monitor_printf (current_monitor->setreg.cmd, val, name);
@@ -1327,19 +1383,19 @@ monitor_store_register (struct regcache *regcache, int regno)
       monitor_debug ("EXP setreg.resp_delim\n");
       monitor_expect_regexp (&setreg_resp_delim_pattern, NULL, 0);
       if (current_monitor->flags & MO_SETREG_INTERACTIVE)
-       monitor_printf ("%s\r", paddr_nz (val));
+       monitor_printf ("%s\r", phex_nz (val, reg_size));
     }
   if (current_monitor->setreg.term)
     {
       monitor_debug ("EXP setreg.term\n");
       monitor_expect (current_monitor->setreg.term, NULL, 0);
       if (current_monitor->flags & MO_SETREG_INTERACTIVE)
-       monitor_printf ("%s\r", paddr_nz (val));
+       monitor_printf ("%s\r", phex_nz (val, reg_size));
       monitor_expect_prompt (NULL, 0);
     }
   else
     monitor_expect_prompt (NULL, 0);
-  if (current_monitor->setreg.term_cmd)                /* Mode exit required */
+  if (current_monitor->setreg.term_cmd)                /* Mode exit required */
     {
       monitor_debug ("EXP setreg_termcmd\n");
       monitor_printf ("%s", current_monitor->setreg.term_cmd);
@@ -1350,7 +1406,8 @@ monitor_store_register (struct regcache *regcache, int regno)
 /* Store the remote registers.  */
 
 static void
-monitor_store_registers (struct regcache *regcache, int regno)
+monitor_store_registers (struct target_ops *ops,
+                        struct regcache *regcache, int regno)
 {
   if (regno >= 0)
     {
@@ -1372,7 +1429,7 @@ monitor_store_registers (struct regcache *regcache, int regno)
 static void
 monitor_prepare_to_store (struct regcache *regcache)
 {
-  /* Do nothing, since we can store individual regs */
+  /* Do nothing, since we can store individual regs */
 }
 
 static void
@@ -1384,14 +1441,15 @@ monitor_files_info (struct target_ops *ops)
 static int
 monitor_write_memory (CORE_ADDR memaddr, char *myaddr, int len)
 {
+  enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch);
   unsigned int val, hostval;
   char *cmd;
   int i;
 
-  monitor_debug ("MON write %d %s\n", len, paddr (memaddr));
+  monitor_debug ("MON write %d %s\n", len, paddress (target_gdbarch, memaddr));
 
   if (current_monitor->flags & MO_ADDR_BITS_REMOVE)
-    memaddr = gdbarch_addr_bits_remove (current_gdbarch, memaddr);
+    memaddr = gdbarch_addr_bits_remove (target_gdbarch, memaddr);
 
   /* Use memory fill command for leading 0 bytes.  */
 
@@ -1401,11 +1459,12 @@ monitor_write_memory (CORE_ADDR memaddr, char *myaddr, int len)
        if (myaddr[i] != 0)
          break;
 
-      if (i > 4)               /* More than 4 zeros is worth doing */
+      if (i > 4)               /* More than 4 zeros is worth doing */
        {
          monitor_debug ("MON FILL %d\n", i);
          if (current_monitor->flags & MO_FILL_USES_ADDR)
-           monitor_printf (current_monitor->fill, memaddr, (memaddr + i) - 1, 0);
+           monitor_printf (current_monitor->fill, memaddr,
+                           (memaddr + i) - 1, 0);
          else
            monitor_printf (current_monitor->fill, memaddr, i, 0);
 
@@ -1440,7 +1499,7 @@ monitor_write_memory (CORE_ADDR memaddr, char *myaddr, int len)
       cmd = current_monitor->setmem.cmdb;
     }
 
-  val = extract_unsigned_integer (myaddr, len);
+  val = extract_unsigned_integer (myaddr, len, byte_order);
 
   if (len == 4)
     {
@@ -1453,7 +1512,6 @@ monitor_write_memory (CORE_ADDR memaddr, char *myaddr, int len)
     monitor_printf_noecho (cmd, memaddr, val);
   else if (current_monitor->flags & MO_SETMEM_INTERACTIVE)
     {
-
       monitor_printf_noecho (cmd, memaddr);
 
       if (current_monitor->setmem.resp_delim)
@@ -1469,9 +1527,9 @@ monitor_write_memory (CORE_ADDR memaddr, char *myaddr, int len)
          monitor_printf ("%x\r", val);
        }
       if (current_monitor->setmem.term_cmd)
-       {                       /* Emit this to get out of the memory editing state */
+       {       /* Emit this to get out of the memory editing state.  */
          monitor_printf ("%s", current_monitor->setmem.term_cmd);
-         /* Drop through to expecting a prompt */
+         /* Drop through to expecting a prompt */
        }
     }
   else
@@ -1488,9 +1546,10 @@ monitor_write_memory_bytes (CORE_ADDR memaddr, char *myaddr, int len)
 {
   unsigned char val;
   int written = 0;
+
   if (len == 0)
     return 0;
-  /* Enter the sub mode */
+  /* Enter the sub mode */
   monitor_printf (current_monitor->setmem.cmdb, memaddr);
   monitor_expect_prompt (NULL, 0);
   while (len)
@@ -1500,11 +1559,11 @@ monitor_write_memory_bytes (CORE_ADDR memaddr, char *myaddr, int len)
       myaddr++;
       memaddr++;
       written++;
-      /* If we wanted to, here we could validate the address */
+      /* If we wanted to, here we could validate the address */
       monitor_expect_prompt (NULL, 0);
       len--;
     }
-  /* Now exit the sub mode */
+  /* Now exit the sub mode */
   monitor_printf (current_monitor->getreg.term_cmd);
   monitor_expect_prompt (NULL, 0);
   return written;
@@ -1516,6 +1575,7 @@ longlongendswap (unsigned char *a)
 {
   int i, j;
   unsigned char x;
+
   i = 0;
   j = 7;
   while (i < 4)
@@ -1526,7 +1586,7 @@ longlongendswap (unsigned char *a)
       i++, j--;
     }
 }
-/* Format 32 chars of long long value, advance the pointer */
+/* Format 32 chars of long long value, advance the pointer */
 static char *hexlate = "0123456789abcdef";
 static char *
 longlong_hexchars (unsigned long long value,
@@ -1543,23 +1603,25 @@ longlong_hexchars (unsigned long long value,
       unsigned char *scan, *limit;     /* loop controls */
       unsigned char c, nib;
       int leadzero = 1;
+
       scan = disbuf;
       limit = scan + 8;
       {
        unsigned long long *dp;
+
        dp = (unsigned long long *) scan;
        *dp = value;
       }
-      longlongendswap (disbuf);        /* FIXME: ONly on big endian hosts */
+      longlongendswap (disbuf);        /* FIXME: ONly on big endian hosts */
       while (scan < limit)
        {
-         c = *scan++;          /* a byte of our long long value */
+         c = *scan++;          /* A byte of our long long value.  */
          if (leadzero)
            {
              if (c == 0)
                continue;
              else
-               leadzero = 0;   /* henceforth we print even zeroes */
+               leadzero = 0;   /* Henceforth we print even zeroes.  */
            }
          nib = c >> 4;         /* high nibble bits */
          *outbuff++ = hexlate[nib];
@@ -1573,16 +1635,17 @@ longlong_hexchars (unsigned long long value,
 
 
 /* I am only going to call this when writing virtual byte streams.
-   Which possably entails endian conversions
- */
+   Which possably entails endian conversions.  */
+
 static int
 monitor_write_memory_longlongs (CORE_ADDR memaddr, char *myaddr, int len)
 {
-  static char hexstage[20];    /* At least 16 digits required, plus null */
+  static char hexstage[20];    /* At least 16 digits required, plus null */
   char *endstring;
   long long *llptr;
   long long value;
   int written = 0;
+
   llptr = (unsigned long long *) myaddr;
   if (len == 0)
     return 0;
@@ -1592,16 +1655,16 @@ monitor_write_memory_longlongs (CORE_ADDR memaddr, char *myaddr, int len)
     {
       value = *llptr;
       endstring = longlong_hexchars (*llptr, hexstage);
-      *endstring = '\0';       /* NUll terminate for printf */
+      *endstring = '\0';       /* NUll terminate for printf */
       monitor_printf ("%s\r", hexstage);
       llptr++;
       memaddr += 8;
       written += 8;
-      /* If we wanted to, here we could validate the address */
+      /* If we wanted to, here we could validate the address */
       monitor_expect_prompt (NULL, 0);
       len -= 8;
     }
-  /* Now exit the sub mode */
+  /* Now exit the sub mode */
   monitor_printf (current_monitor->getreg.term_cmd);
   monitor_expect_prompt (NULL, 0);
   return written;
@@ -1619,16 +1682,16 @@ monitor_write_memory_longlongs (CORE_ADDR memaddr, char *myaddr, int len)
    MO_SETMEM_INTERACTIVE
    ! MO_NO_ECHO_ON_SETMEM
    To use this, the you have to patch the monitor_cmds block with
-   this function. Otherwise, its not tuned up for use by all
-   monitor variations.
- */
+   this function.  Otherwise, its not tuned up for use by all
+   monitor variations.  */
 
 static int
 monitor_write_memory_block (CORE_ADDR memaddr, char *myaddr, int len)
 {
   int written;
+
   written = 0;
-  /* FIXME: This would be a good place to put the zero test */
+  /* FIXME: This would be a good place to put the zero test */
 #if 1
   if ((len > 8) && (((len & 0x07)) == 0) && current_monitor->setmem.cmdll)
     {
@@ -1645,6 +1708,7 @@ monitor_write_memory_block (CORE_ADDR memaddr, char *myaddr, int len)
 static int
 monitor_read_memory_single (CORE_ADDR memaddr, char *myaddr, int len)
 {
+  enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch);
   unsigned int val;
   char membuf[sizeof (int) * 2 + 1];
   char *p;
@@ -1695,7 +1759,7 @@ monitor_read_memory_single (CORE_ADDR memaddr, char *myaddr, int len)
   /* Now, read the appropriate number of hex digits for this loc,
      skipping spaces.  */
 
-  /* Skip leading spaces and "0x" if MO_HEX_PREFIX flag is set. */
+  /* Skip leading spaces and "0x" if MO_HEX_PREFIX flag is set.  */
   if (current_monitor->flags & MO_HEX_PREFIX)
     {
       int c;
@@ -1713,6 +1777,7 @@ monitor_read_memory_single (CORE_ADDR memaddr, char *myaddr, int len)
 
   {
     int i;
+
     for (i = 0; i < len * 2; i++)
       {
        int c;
@@ -1731,7 +1796,7 @@ monitor_read_memory_single (CORE_ADDR memaddr, char *myaddr, int len)
          }
       membuf[i] = c;
     }
-    membuf[i] = '\000';                /* terminate the number */
+    membuf[i] = '\000';                /* Terminate the number.  */
   }
 
 /* If TERM is present, we wait for that to show up.  Also, (if TERM is
@@ -1740,7 +1805,8 @@ monitor_read_memory_single (CORE_ADDR memaddr, char *myaddr, int len)
 
   if (current_monitor->getmem.term)
     {
-      monitor_expect (current_monitor->getmem.term, NULL, 0);  /* get response */
+      monitor_expect (current_monitor->getmem.term, NULL, 0); /* Get
+                                                                response.  */
 
       if (current_monitor->getmem.term_cmd)
        {
@@ -1749,7 +1815,7 @@ monitor_read_memory_single (CORE_ADDR memaddr, char *myaddr, int len)
        }
     }
   else
-    monitor_expect_prompt (NULL, 0);   /* get response */
+    monitor_expect_prompt (NULL, 0);   /* Get response.  */
 
   p = membuf;
   val = strtoul (membuf, &p, 16);
@@ -1759,9 +1825,9 @@ monitor_read_memory_single (CORE_ADDR memaddr, char *myaddr, int len)
                   "bad value from monitor",
                   memaddr, 0, membuf, 0);
 
-  /* supply register stores in target byte order, so swap here */
+  /* supply register stores in target byte order, so swap here */
 
-  store_unsigned_integer (myaddr, len, val);
+  store_unsigned_integer (myaddr, len, byte_order, val);
 
   return len;
 }
@@ -1786,21 +1852,21 @@ monitor_read_memory (CORE_ADDR memaddr, char *myaddr, int len)
       return 0;
     }
 
-  monitor_debug ("MON read block ta(%s) ha(%lx) %d\n",
-                paddr_nz (memaddr), (long) myaddr, len);
+  monitor_debug ("MON read block ta(%s) ha(%s) %d\n",
+                paddress (target_gdbarch, memaddr),
+                host_address_to_string (myaddr), len);
 
   if (current_monitor->flags & MO_ADDR_BITS_REMOVE)
-    memaddr = gdbarch_addr_bits_remove (current_gdbarch, memaddr);
+    memaddr = gdbarch_addr_bits_remove (target_gdbarch, memaddr);
 
   if (current_monitor->flags & MO_GETMEM_READ_SINGLE)
     return monitor_read_memory_single (memaddr, myaddr, len);
 
   len = min (len, 16);
 
-  /* Some dumpers align the first data with the preceeding 16
-     byte boundary. Some print blanks and start at the
-     requested boundary. EXACT_DUMPADDR
-   */
+  /* Some dumpers align the first data with the preceding 16
+     byte boundary.  Some print blanks and start at the
+     requested boundary.  EXACT_DUMPADDR  */
 
   dumpaddr = (current_monitor->flags & MO_EXACT_DUMPADDR)
     ? memaddr : memaddr & ~0x0f;
@@ -1809,7 +1875,7 @@ monitor_read_memory (CORE_ADDR memaddr, char *myaddr, int len)
   if (((memaddr ^ (memaddr + len - 1)) & ~0xf) != 0)
     len = ((memaddr + len) & ~0xf) - memaddr;
 
-  /* send the memory examine command */
+  /* Send the memory examine command.  */
 
   if (current_monitor->flags & MO_GETMEM_NEEDS_RANGE)
     monitor_printf (current_monitor->getmem.cmdb, memaddr, memaddr + len);
@@ -1825,7 +1891,8 @@ monitor_read_memory (CORE_ADDR memaddr, char *myaddr, int len)
 
   if (current_monitor->getmem.term)
     {
-      resp_len = monitor_expect (current_monitor->getmem.term, buf, sizeof buf);       /* get response */
+      resp_len = monitor_expect (current_monitor->getmem.term,
+                                buf, sizeof buf);      /* Get response.  */
 
       if (resp_len <= 0)
        monitor_error ("monitor_read_memory",
@@ -1840,7 +1907,7 @@ monitor_read_memory (CORE_ADDR memaddr, char *myaddr, int len)
        }
     }
   else
-    resp_len = monitor_expect_prompt (buf, sizeof buf);                /* get response */
+    resp_len = monitor_expect_prompt (buf, sizeof buf);         /* Get response.  */
 
   p = buf;
 
@@ -1852,7 +1919,9 @@ monitor_read_memory (CORE_ADDR memaddr, char *myaddr, int len)
     {
       int retval, tmp;
       struct re_registers resp_strings;
-      monitor_debug ("MON getmem.resp_delim %s\n", current_monitor->getmem.resp_delim);
+
+      monitor_debug ("MON getmem.resp_delim %s\n",
+                    current_monitor->getmem.resp_delim);
 
       memset (&resp_strings, 0, sizeof (struct re_registers));
       tmp = strlen (p);
@@ -1874,7 +1943,8 @@ monitor_read_memory (CORE_ADDR memaddr, char *myaddr, int len)
       p += strlen (current_monitor->getmem.resp_delim);
 #endif
     }
-  monitor_debug ("MON scanning  %d ,%lx '%s'\n", len, (long) p, p);
+  monitor_debug ("MON scanning  %d ,%s '%s'\n", len,
+                host_address_to_string (p), p);
   if (current_monitor->flags & MO_GETMEM_16_BOUNDARY)
     {
       char c;
@@ -1899,20 +1969,21 @@ monitor_read_memory (CORE_ADDR memaddr, char *myaddr, int len)
              ++dumpaddr;
              ++p;
            }
-         ++p;                  /* skip a blank or other non hex char */
+         ++p;                  /* Skip a blank or other non hex char.  */
          c = *p;
        }
       if (fetched == 0)
        error (_("Failed to read via monitor"));
       if (monitor_debug_p || remote_debug)
        fprintf_unfiltered (gdb_stdlog, "\n");
-      return fetched;          /* Return the number of bytes actually read */
+      return fetched;          /* Return the number of bytes actually
+                                  read.  */
     }
   monitor_debug ("MON scanning bytes\n");
 
   for (i = len; i > 0; i--)
     {
-      /* Skip non-hex chars, but bomb on end of string and newlines */
+      /* Skip non-hex chars, but bomb on end of string and newlines */
 
       while (1)
        {
@@ -1945,8 +2016,8 @@ monitor_read_memory (CORE_ADDR memaddr, char *myaddr, int len)
 }
 
 /* Transfer LEN bytes between target address MEMADDR and GDB address
-   MYADDR.  Returns 0 for success, errno code for failure. TARGET is
-   unused. */
+   MYADDR.  Returns 0 for success, errno code for failure.  TARGET is
+   unused.  */
 
 static int
 monitor_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write,
@@ -1970,23 +2041,24 @@ monitor_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write,
 }
 
 static void
-monitor_kill (void)
+monitor_kill (struct target_ops *ops)
 {
-  return;                      /* ignore attempts to kill target system */
+  return;                      /* Ignore attempts to kill target system.  */
 }
 
 /* All we actually do is set the PC to the start address of exec_bfd.  */
 
 static void
-monitor_create_inferior (char *exec_file, char *args, char **env,
-                        int from_tty)
+monitor_create_inferior (struct target_ops *ops, char *exec_file,
+                        char *args, char **env, int from_tty)
 {
   if (args && (*args != '\000'))
     error (_("Args are not supported by the monitor."));
 
   first_time = 1;
   clear_proceed_status ();
-  write_pc (bfd_get_start_address (exec_bfd));
+  regcache_write_pc (get_current_regcache (),
+                    bfd_get_start_address (exec_bfd));
 }
 
 /* Clean up when a program exits.
@@ -1995,31 +2067,32 @@ monitor_create_inferior (char *exec_file, char *args, char **env,
    instructions.  */
 
 static void
-monitor_mourn_inferior (void)
+monitor_mourn_inferior (struct target_ops *ops)
 {
   unpush_target (targ_ops);
-  generic_mourn_inferior ();   /* Do all the proper things now */
+  generic_mourn_inferior ();   /* Do all the proper things now.  */
+  delete_thread_silent (monitor_ptid);
 }
 
 /* Tell the monitor to add a breakpoint.  */
 
 static int
-monitor_insert_breakpoint (struct bp_target_info *bp_tgt)
+monitor_insert_breakpoint (struct gdbarch *gdbarch,
+                          struct bp_target_info *bp_tgt)
 {
   CORE_ADDR addr = bp_tgt->placed_address;
   int i;
-  const unsigned char *bp;
   int bplen;
 
-  monitor_debug ("MON inst bkpt %s\n", paddr (addr));
+  monitor_debug ("MON inst bkpt %s\n", paddress (gdbarch, addr));
   if (current_monitor->set_break == NULL)
     error (_("No set_break defined for this monitor"));
 
   if (current_monitor->flags & MO_ADDR_BITS_REMOVE)
-    addr = gdbarch_addr_bits_remove (current_gdbarch, addr);
+    addr = gdbarch_addr_bits_remove (gdbarch, addr);
 
   /* Determine appropriate breakpoint size for this address.  */
-  bp = gdbarch_breakpoint_from_pc (current_gdbarch, &addr, &bplen);
+  gdbarch_breakpoint_from_pc (gdbarch, &addr, &bplen);
   bp_tgt->placed_address = addr;
   bp_tgt->placed_size = bplen;
 
@@ -2034,18 +2107,20 @@ monitor_insert_breakpoint (struct bp_target_info *bp_tgt)
        }
     }
 
-  error (_("Too many breakpoints (> %d) for monitor."), current_monitor->num_breakpoints);
+  error (_("Too many breakpoints (> %d) for monitor."),
+        current_monitor->num_breakpoints);
 }
 
 /* Tell the monitor to remove a breakpoint.  */
 
 static int
-monitor_remove_breakpoint (struct bp_target_info *bp_tgt)
+monitor_remove_breakpoint (struct gdbarch *gdbarch,
+                          struct bp_target_info *bp_tgt)
 {
   CORE_ADDR addr = bp_tgt->placed_address;
   int i;
 
-  monitor_debug ("MON rmbkpt %s\n", paddr (addr));
+  monitor_debug ("MON rmbkpt %s\n", paddress (gdbarch, addr));
   if (current_monitor->clr_break == NULL)
     error (_("No clr_break defined for this monitor"));
 
@@ -2054,7 +2129,7 @@ monitor_remove_breakpoint (struct bp_target_info *bp_tgt)
       if (breakaddr[i] == addr)
        {
          breakaddr[i] = 0;
-         /* some monitors remove breakpoints based on the address */
+         /* Some monitors remove breakpoints based on the address.  */
          if (current_monitor->flags & MO_CLR_BREAK_USES_ADDR)
            monitor_printf (current_monitor->clr_break, addr);
          else if (current_monitor->flags & MO_CLR_BREAK_1_BASED)
@@ -2066,8 +2141,8 @@ monitor_remove_breakpoint (struct bp_target_info *bp_tgt)
        }
     }
   fprintf_unfiltered (gdb_stderr,
-                     "Can't find breakpoint associated with 0x%s\n",
-                     paddr_nz (addr));
+                     "Can't find breakpoint associated with %s\n",
+                     paddress (gdbarch, addr));
   return 1;
 }
 
@@ -2098,7 +2173,7 @@ monitor_wait_srec_ack (void)
   return 1;
 }
 
-/* monitor_load -- download a file. */
+/* monitor_load -- download a file.  */
 
 static void
 monitor_load (char *file, int from_tty)
@@ -2108,12 +2183,12 @@ monitor_load (char *file, int from_tty)
   if (current_monitor->load_routine)
     current_monitor->load_routine (monitor_desc, file, hashmark);
   else
-    {                          /* The default is ascii S-records */
+    {                          /* The default is ascii S-records */
       int n;
       unsigned long load_offset;
       char buf[128];
 
-      /* enable user to specify address for downloading as 2nd arg to load */
+      /* Enable user to specify address for downloading as 2nd arg to load.  */
       n = sscanf (file, "%s 0x%lx", buf, &load_offset);
       if (n > 1)
        file = buf;
@@ -2132,9 +2207,10 @@ monitor_load (char *file, int from_tty)
       monitor_expect_prompt (NULL, 0);
     }
 
-  /* Finally, make the PC point at the start address */
+  /* Finally, make the PC point at the start address */
   if (exec_bfd)
-    write_pc (bfd_get_start_address (exec_bfd));
+    regcache_write_pc (get_current_regcache (),
+                      bfd_get_start_address (exec_bfd));
 
   /* There used to be code here which would clear inferior_ptid and
      call clear_symtab_users.  None of that should be necessary:
@@ -2152,7 +2228,7 @@ monitor_load (char *file, int from_tty)
 }
 
 static void
-monitor_stop (void)
+monitor_stop (ptid_t ptid)
 {
   monitor_debug ("MON stop\n");
   if ((current_monitor->flags & MO_SEND_BREAK_ON_STOP) != 0)
@@ -2162,7 +2238,7 @@ monitor_stop (void)
 }
 
 /* Put a COMMAND string out to MONITOR.  Output from MONITOR is placed
-   in OUTPUT until the prompt is seen. FIXME: We read the characters
+   in OUTPUT until the prompt is seen.  FIXME: We read the characters
    ourseleves here cause of a nasty echo.  */
 
 static void
@@ -2185,7 +2261,7 @@ monitor_rcmd (char *command,
 
   resp_len = monitor_expect_prompt (buf, sizeof buf);
 
-  fputs_unfiltered (buf, outbuf);      /* Output the response */
+  fputs_unfiltered (buf, outbuf);      /* Output the response */
 }
 
 /* Convert hex digit A to a number.  */
@@ -2211,6 +2287,35 @@ monitor_get_dev_name (void)
   return dev_name;
 }
 
+/* Check to see if a thread is still alive.  */
+
+static int
+monitor_thread_alive (struct target_ops *ops, ptid_t ptid)
+{
+  if (ptid_equal (ptid, monitor_ptid))
+    /* The monitor's task is always alive.  */
+    return 1;
+
+  return 0;
+}
+
+/* Convert a thread ID to a string.  Returns the string in a static
+   buffer.  */
+
+static char *
+monitor_pid_to_str (struct target_ops *ops, ptid_t ptid)
+{
+  static char buf[64];
+
+  if (ptid_equal (monitor_ptid, ptid))
+    {
+      xsnprintf (buf, sizeof buf, "Thread <main>");
+      return buf;
+    }
+
+  return normal_pid_to_str (ptid);
+}
+
 static struct target_ops monitor_ops;
 
 static void
@@ -2233,16 +2338,19 @@ init_base_monitor_ops (void)
   monitor_ops.to_mourn_inferior = monitor_mourn_inferior;
   monitor_ops.to_stop = monitor_stop;
   monitor_ops.to_rcmd = monitor_rcmd;
+  monitor_ops.to_log_command = serial_log_command;
+  monitor_ops.to_thread_alive = monitor_thread_alive;
+  monitor_ops.to_pid_to_str = monitor_pid_to_str;
   monitor_ops.to_stratum = process_stratum;
-  monitor_ops.to_has_all_memory = 1;
-  monitor_ops.to_has_memory = 1;
-  monitor_ops.to_has_stack = 1;
-  monitor_ops.to_has_registers = 1;
-  monitor_ops.to_has_execution = 1;
+  monitor_ops.to_has_all_memory = default_child_has_all_memory;
+  monitor_ops.to_has_memory = default_child_has_memory;
+  monitor_ops.to_has_stack = default_child_has_stack;
+  monitor_ops.to_has_registers = default_child_has_registers;
+  monitor_ops.to_has_execution = default_child_has_execution;
   monitor_ops.to_magic = OPS_MAGIC;
 }                              /* init_base_monitor_ops */
 
-/* Init the target_ops structure pointed at by OPS */
+/* Init the target_ops structure pointed at by OPS */
 
 void
 init_monitor_ops (struct target_ops *ops)
@@ -2255,7 +2363,8 @@ init_monitor_ops (struct target_ops *ops)
 
 /* Define additional commands that are usually only used by monitors.  */
 
-extern initialize_file_ftype _initialize_remote_monitors; /* -Wmissing-prototypes */
+/* -Wmissing-prototypes */
+extern initialize_file_ftype _initialize_remote_monitors;
 
 void
 _initialize_remote_monitors (void)
@@ -2277,4 +2386,8 @@ is displayed."),
                            NULL,
                            NULL, /* FIXME: i18n: */
                            &setdebuglist, &showdebuglist);
+
+  /* Yes, 42000 is arbitrary.  The only sense out of it, is that it
+     isn't 0.  */
+  monitor_ptid = ptid_build (42000, 0, 42000);
 }