]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - gdb/gnu-nat.c
* corelow.c (get_core_registers): Adjust.
[thirdparty/binutils-gdb.git] / gdb / gnu-nat.c
index 54b543be759de9e6215f4eb48376185a2d0cdca8..ddeaf7012670fb111840527aaf1fbf68467eaacd 100644 (file)
@@ -1,6 +1,6 @@
 /* Interface GDB to the GNU Hurd.
-   Copyright 1992, 1995, 1996, 1997, 1998, 1999, 2000
-   Free Software Foundation, Inc.
+   Copyright (C) 1992, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2006, 2007,
+   2008, 2009 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -10,7 +10,7 @@
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <ctype.h>
 #include <errno.h>
 #include <limits.h>
 #include <setjmp.h>
 #include <signal.h>
 #include <stdio.h>
-#include <string.h>
+#include "gdb_string.h"
 #include <sys/ptrace.h>
 
 #include <mach.h>
@@ -44,6 +43,9 @@
 #include <hurd/msg.h>
 #include <hurd/msg_request.h>
 #include <hurd/process.h>
+/* Defined in <hurd/process.h>, but we need forward declarations from
+   <hurd/process_request.h> as well.  */
+#undef _process_user_
 #include <hurd/process_request.h>
 #include <hurd/signal.h>
 #include <hurd/sigpreempt.h>
@@ -61,6 +63,7 @@
 #include "gdbcore.h"
 #include "gdbthread.h"
 #include "gdb_assert.h"
+#include "gdb_obstack.h"
 
 #include "gnu-nat.h"
 
@@ -96,12 +99,12 @@ void inf_validate_procs (struct inf *inf);
 void inf_steal_exc_ports (struct inf *inf);
 void inf_restore_exc_ports (struct inf *inf);
 struct proc *inf_tid_to_proc (struct inf *inf, int tid);
-inline void inf_set_threads_resume_sc (struct inf *inf,
-                                      struct proc *run_thread,
-                                      int run_others);
-inline int inf_set_threads_resume_sc_for_signal_thread (struct inf *inf);
-inline void inf_suspend (struct inf *inf);
-inline void inf_resume (struct inf *inf);
+void inf_set_threads_resume_sc (struct inf *inf,
+                               struct proc *run_thread,
+                               int run_others);
+int inf_set_threads_resume_sc_for_signal_thread (struct inf *inf);
+void inf_suspend (struct inf *inf);
+void inf_resume (struct inf *inf);
 void inf_set_step_thread (struct inf *inf, struct proc *proc);
 void inf_detach (struct inf *inf);
 void inf_attach (struct inf *inf, int pid);
@@ -298,7 +301,7 @@ proc_update_sc (struct proc *proc)
 
   proc_debug (proc, "is %s", err ? "dead" : running ? "running" : "suspended");
   if (err)
-    proc_debug (proc, "err = %s", strerror (err));
+    proc_debug (proc, "err = %s", safe_strerror (err));
 
   if (running)
     {
@@ -330,7 +333,7 @@ proc_abort (struct proc *proc, int force)
          proc->sc = 1;
          inf_update_suspends (proc->inf);
          running = 0;
-         warning ("Stopped %s.", proc_string (proc));
+         warning (_("Stopped %s."), proc_string (proc));
        }
       else if (proc == inf->wait.thread && inf->wait.exc.reply && !force)
        /* An exception is pending on PROC, which don't mess with.  */
@@ -466,8 +469,8 @@ proc_steal_exc_port (struct proc *proc, mach_port_t exc_port)
       if (!err)
        proc->exc_port = exc_port;
       else
-       warning ("Error setting exception port for %s: %s",
-                proc_string (proc), strerror (err));
+       warning (_("Error setting exception port for %s: %s"),
+                proc_string (proc), safe_strerror (err));
     }
 }
 
@@ -496,8 +499,8 @@ proc_restore_exc_port (struct proc *proc)
       if (!err)
        proc->exc_port = MACH_PORT_NULL;
       else
-       warning ("Error setting exception port for %s: %s",
-                proc_string (proc), strerror (err));
+       warning (_("Error setting exception port for %s: %s"),
+                proc_string (proc), safe_strerror (err));
     }
 }
 
@@ -539,7 +542,7 @@ make_proc (struct inf *inf, mach_port_t port, int tid)
 {
   error_t err;
   mach_port_t prev_port = MACH_PORT_NULL;
-  struct proc *proc = malloc (sizeof (struct proc));
+  struct proc *proc = xmalloc (sizeof (struct proc));
 
   proc->port = port;
   proc->tid = tid;
@@ -573,8 +576,8 @@ make_proc (struct inf *inf, mach_port_t port, int tid)
                                    MACH_MSG_TYPE_MAKE_SEND_ONCE,
                                    &prev_port);
   if (err)
-    warning ("Couldn't request notification for port %d: %s",
-            port, strerror (err));
+    warning (_("Couldn't request notification for port %d: %s"),
+            port, safe_strerror (err));
   else
     {
       proc_debug (proc, "notifications to: %d", inf->event_port);
@@ -636,10 +639,7 @@ _proc_free (struct proc *proc)
 struct inf *
 make_inf (void)
 {
-  struct inf *inf = malloc (sizeof (struct inf));
-
-  if (!inf)
-    return 0;
+  struct inf *inf = xmalloc (sizeof (struct inf));
 
   inf->task = 0;
   inf->threads = 0;
@@ -726,7 +726,7 @@ inf_startup (struct inf *inf, int pid)
   err = mach_port_allocate (mach_task_self (),
                            MACH_PORT_RIGHT_RECEIVE, &inf->event_port);
   if (err)
-    error ("Error allocating event port: %s", strerror (err));
+    error (_("Error allocating event port: %s"), safe_strerror (err));
 
   /* Make a send right for it, so we can easily copy it for other people.  */
   mach_port_insert_right (mach_task_self (), inf->event_port,
@@ -750,7 +750,7 @@ inf_set_pid (struct inf *inf, pid_t pid)
     {
       error_t err = proc_pid2task (proc_server, pid, &task_port);
       if (err)
-       error ("Error getting task for pid %d: %s", pid, strerror (err));
+       error (_("Error getting task for pid %d: %s"), pid, safe_strerror (err));
     }
 
   inf_debug (inf, "setting task: %d", task_port);
@@ -860,7 +860,7 @@ inf_validate_task_sc (struct inf *inf)
       target_terminal_inferior ();     /* Give it back to the child.  */
 
       if (abort)
-       error ("Additional task suspend count left untouched.");
+       error (_("Additional task suspend count left untouched."));
 
       inf->task->cur_sc = suspend_count;
     }
@@ -886,13 +886,13 @@ inf_set_traced (struct inf *inf, int on)
       if (err == EIEIO)
        {
          if (on)
-           warning ("Can't modify tracing state for pid %d: %s",
+           warning (_("Can't modify tracing state for pid %d: %s"),
                     inf->pid, "No signal thread");
          inf->traced = on;
        }
       else if (err)
-       warning ("Can't modify tracing state for pid %d: %s",
-                inf->pid, strerror (err));
+       warning (_("Can't modify tracing state for pid %d: %s"),
+                inf->pid, safe_strerror (err));
       else
        inf->traced = on;
     }
@@ -1025,7 +1025,7 @@ inf_validate_procs (struct inf *inf)
     /* The current thread we're considering. */
     struct proc *thread = inf->threads;
 
-    bzero (matched, sizeof (matched));
+    memset (matched, 0, sizeof (matched));
 
     while (thread)
       {
@@ -1051,7 +1051,10 @@ inf_validate_procs (struct inf *inf)
            proc_debug (thread, "died!");
            thread->port = MACH_PORT_NULL;
            thread = _proc_free (thread);       /* THREAD is dead.  */
-           (last ? last->next : inf->threads) = thread;
+           if (last)
+             last->next = thread;
+           else
+             inf->threads = thread;
          }
       }
 
@@ -1063,11 +1066,29 @@ inf_validate_procs (struct inf *inf)
        else
          /* THREADS[I] is a thread we don't know about yet!  */
          {
+           ptid_t ptid;
+
            thread = make_proc (inf, threads[i], next_thread_id++);
-           (last ? last->next : inf->threads) = thread;
+           if (last)
+             last->next = thread;
+           else
+             inf->threads = thread;
            last = thread;
            proc_debug (thread, "new thread: %d", threads[i]);
-           add_thread (thread->tid);   /* Tell GDB's generic thread code.  */
+
+           ptid = ptid_build (inf->pid, 0, thread->tid);
+
+           /* Tell GDB's generic thread code.  */
+
+           if (ptid_equal (inferior_ptid, pid_to_ptid (inf->pid)))
+             /* This is the first time we're hearing about thread
+                ids, after a fork-child.  */
+             thread_change_ptid (inferior_ptid, ptid);
+           else if (inf->pending_execs != 0)
+             /* This is a shell thread.  */
+             add_thread_silent (ptid);
+           else
+             add_thread (ptid);
          }
       }
 
@@ -1078,7 +1099,7 @@ inf_validate_procs (struct inf *inf)
 
 \f
 /* Makes sure that INF's thread list is synced with the actual process.  */
-inline int
+int
 inf_update_procs (struct inf *inf)
 {
   if (!inf->task)
@@ -1091,7 +1112,7 @@ inf_update_procs (struct inf *inf)
 /* Sets the resume_sc of each thread in inf.  That of RUN_THREAD is set to 0,
    and others are set to their run_sc if RUN_OTHERS is true, and otherwise
    their pause_sc.  */
-inline void
+void
 inf_set_threads_resume_sc (struct inf *inf,
                           struct proc *run_thread, int run_others)
 {
@@ -1109,7 +1130,7 @@ inf_set_threads_resume_sc (struct inf *inf,
 \f
 /* Cause INF to continue execution immediately; individual threads may still
    be suspended (but their suspend counts will be updated).  */
-inline void
+void
 inf_resume (struct inf *inf)
 {
   struct proc *thread;
@@ -1134,7 +1155,7 @@ inf_resume (struct inf *inf)
 
 /* Cause INF to stop execution immediately; individual threads may still
    be running.  */
-inline void
+void
 inf_suspend (struct inf *inf)
 {
   struct proc *thread;
@@ -1180,7 +1201,7 @@ inf_set_step_thread (struct inf *inf, struct proc *thread)
 /* Set up the thread resume_sc's so that only the signal thread is running
    (plus whatever other thread are set to always run).  Returns true if we
    did so, or false if we can't find a signal thread.  */
-inline int
+int
 inf_set_threads_resume_sc_for_signal_thread (struct inf *inf)
 {
   if (inf->signal_thread)
@@ -1326,7 +1347,7 @@ inf_signal (struct inf *inf, enum target_signal sig)
                                     e->exception, e->code, e->subcode);
        }
       else
-       error ("Can't forward spontaneous exception (%s).", NAME);
+       error (_("Can't forward spontaneous exception (%s)."), NAME);
     }
   else
     /* A Unix signal.  */
@@ -1366,9 +1387,9 @@ inf_signal (struct inf *inf, enum target_signal sig)
 
   if (err == EIEIO)
     /* Can't do too much... */
-    warning ("Can't deliver signal %s: No signal thread.", NAME);
+    warning (_("Can't deliver signal %s: No signal thread."), NAME);
   else if (err)
-    warning ("Delivering signal %s: %s", NAME, strerror (err));
+    warning (_("Delivering signal %s: %s"), NAME, safe_strerror (err));
 
 #undef NAME
 }
@@ -1399,20 +1420,21 @@ inf_continue (struct inf *inf)
     }
 
   if (err)
-    warning ("Can't continue process: %s", strerror (err));
+    warning (_("Can't continue process: %s"), safe_strerror (err));
 }
 
 \f
 /* The inferior used for all gdb target ops.  */
-struct inf *current_inferior = 0;
+struct inf *gnu_current_inf = 0;
 
 /* The inferior being waited for by gnu_wait.  Since GDB is decidely not
    multi-threaded, we don't bother to lock this.  */
 struct inf *waiting_inf;
 
 /* Wait for something to happen in the inferior, returning what in STATUS. */
-static int
-gnu_wait (int tid, struct target_waitstatus *status)
+static ptid_t
+gnu_wait (struct target_ops *ops,
+         ptid_t ptid, struct target_waitstatus *status)
 {
   struct msg
     {
@@ -1422,7 +1444,7 @@ gnu_wait (int tid, struct target_waitstatus *status)
     } msg;
   error_t err;
   struct proc *thread;
-  struct inf *inf = current_inferior;
+  struct inf *inf = gnu_current_inf;
 
   extern int exc_server (mach_msg_header_t *, mach_msg_header_t *);
   extern int msg_reply_server (mach_msg_header_t *, mach_msg_header_t *);
@@ -1438,12 +1460,12 @@ gnu_wait (int tid, struct target_waitstatus *status)
     {
       inf_validate_procs (inf);
       if (!inf->threads && !inf->task->dead)
-       error ("There are no threads; try again later.");
+       error (_("There are no threads; try again later."));
     }
 
   waiting_inf = inf;
 
-  inf_debug (inf, "waiting for: %d", tid);
+  inf_debug (inf, "waiting for: %s", target_pid_to_str (ptid));
 
 rewait:
   if (proc_wait_pid != inf->pid && !inf->no_wait)
@@ -1462,7 +1484,7 @@ rewait:
       err =
        proc_wait_request (proc_server, inf->event_port, inf->pid, WUNTRACED);
       if (err)
-       warning ("wait request failed: %s", strerror (err));
+       warning (_("wait request failed: %s"), safe_strerror (err));
       else
        {
          inf_debug (inf, "waits pending: %d", proc_waits_pending);
@@ -1498,7 +1520,7 @@ rewait:
   if (err == EMACH_RCV_INTERRUPTED)
     inf_debug (inf, "interrupted");
   else if (err)
-    error ("Couldn't wait for an event: %s", strerror (err));
+    error (_("Couldn't wait for an event: %s"), safe_strerror (err));
   else
     {
       struct
@@ -1518,11 +1540,11 @@ rewait:
          && !process_reply_server (&msg.hdr, &reply.hdr)
          && !msg_reply_server (&msg.hdr, &reply.hdr))
        /* Whatever it is, it's something strange.  */
-       error ("Got a strange event, msg id = %d.", msg.hdr.msgh_id);
+       error (_("Got a strange event, msg id = %d."), msg.hdr.msgh_id);
 
       if (reply.err)
-       error ("Handling event, msgid = %d: %s",
-              msg.hdr.msgh_id, strerror (reply.err));
+       error (_("Handling event, msgid = %d: %s"),
+              msg.hdr.msgh_id, safe_strerror (reply.err));
     }
 
   if (inf->pending_execs)
@@ -1575,24 +1597,28 @@ rewait:
     }
 
   /* Pass back out our results.  */
-  bcopy (&inf->wait.status, status, sizeof (*status));
+  memcpy (status, &inf->wait.status, sizeof (*status));
 
   thread = inf->wait.thread;
   if (thread)
-    tid = thread->tid;
+    ptid = ptid_build (inf->pid, 0, thread->tid);
+  else if (ptid_equal (ptid, minus_one_ptid))
+    thread = inf_tid_to_thread (inf, -1);
   else
-    thread = inf_tid_to_thread (inf, tid);
+    thread = inf_tid_to_thread (inf, ptid_get_tid (ptid));
 
   if (!thread || thread->port == MACH_PORT_NULL)
     {
       /* TID is dead; try and find a new thread.  */
       if (inf_update_procs (inf) && inf->threads)
-       tid = inf->threads->tid; /* The first available thread.  */
+       ptid = ptid_build (inf->pid, 0, inf->threads->tid); /* The first available thread.  */
       else
-       tid = inferior_pid;     /* let wait_for_inferior handle exit case */
+       ptid = inferior_ptid;   /* let wait_for_inferior handle exit case */
     }
 
-  if (thread && tid >= 0 && status->kind != TARGET_WAITKIND_SPURIOUS
+  if (thread
+      && !ptid_equal (ptid, minus_one_ptid)
+      && status->kind != TARGET_WAITKIND_SPURIOUS
       && inf->pause_sc == 0 && thread->pause_sc == 0)
     /* If something actually happened to THREAD, make sure we
        suspend it.  */
@@ -1601,7 +1627,8 @@ rewait:
       inf_update_suspends (inf);
     }
 
-  inf_debug (inf, "returning tid = %d, status = %s (%d)", tid,
+  inf_debug (inf, "returning ptid = %s, status = %s (%d)",
+            target_pid_to_str (ptid),
             status->kind == TARGET_WAITKIND_EXITED ? "EXITED"
             : status->kind == TARGET_WAITKIND_STOPPED ? "STOPPED"
             : status->kind == TARGET_WAITKIND_SIGNALLED ? "SIGNALLED"
@@ -1610,7 +1637,7 @@ rewait:
             : "?",
             status->value.integer);
 
-  return tid;
+  return ptid;
 }
 
 \f
@@ -1704,7 +1731,7 @@ S_exception_raise_request (mach_port_t port, mach_port_t reply_port,
 void
 inf_task_died_status (struct inf *inf)
 {
-  warning ("Pid %d died with unknown exit status, using SIGKILL.", inf->pid);
+  warning (_("Pid %d died with unknown exit status, using SIGKILL."), inf->pid);
   inf->wait.status.kind = TARGET_WAITKIND_SIGNALLED;
   inf->wait.status.value.sig = TARGET_SIGNAL_KILL;
 }
@@ -1754,38 +1781,38 @@ do_mach_notify_dead_name (mach_port_t notify, mach_port_t dead_port)
 static error_t
 ill_rpc (char *fun)
 {
-  warning ("illegal rpc: %s", fun);
+  warning (_("illegal rpc: %s"), fun);
   return 0;
 }
 
 error_t
 do_mach_notify_no_senders (mach_port_t notify, mach_port_mscount_t count)
 {
-  return ill_rpc (__FUNCTION__);
+  return ill_rpc ("do_mach_notify_no_senders");
 }
 
 error_t
 do_mach_notify_port_deleted (mach_port_t notify, mach_port_t name)
 {
-  return ill_rpc (__FUNCTION__);
+  return ill_rpc ("do_mach_notify_port_deleted");
 }
 
 error_t
 do_mach_notify_msg_accepted (mach_port_t notify, mach_port_t name)
 {
-  return ill_rpc (__FUNCTION__);
+  return ill_rpc ("do_mach_notify_msg_accepted");
 }
 
 error_t
 do_mach_notify_port_destroyed (mach_port_t notify, mach_port_t name)
 {
-  return ill_rpc (__FUNCTION__);
+  return ill_rpc ("do_mach_notify_port_destroyed");
 }
 
 error_t
 do_mach_notify_send_once (mach_port_t notify)
 {
-  return ill_rpc (__FUNCTION__);
+  return ill_rpc ("do_mach_notify_send_once");
 }
 
 \f
@@ -1798,7 +1825,7 @@ S_proc_wait_reply (mach_port_t reply, error_t err,
   struct inf *inf = waiting_inf;
 
   inf_debug (inf, "err = %s, pid = %d, status = 0x%x, sigcode = %d",
-            err ? strerror (err) : "0", pid, status, sigcode);
+            err ? safe_strerror (err) : "0", pid, status, sigcode);
 
   if (err && proc_wait_pid && (!inf->task || !inf->task->port))
     /* Ack.  The task has died, but the task-died notification code didn't
@@ -1819,7 +1846,7 @@ S_proc_wait_reply (mach_port_t reply, error_t err,
     {
       if (err != EINTR)
        {
-         warning ("Can't wait for pid %d: %s", inf->pid, strerror (err));
+         warning (_("Can't wait for pid %d: %s"), inf->pid, safe_strerror (err));
          inf->no_wait = 1;
 
          /* Since we can't see the inferior's signals, don't trap them.  */
@@ -1847,13 +1874,13 @@ error_t
 S_proc_setmsgport_reply (mach_port_t reply, error_t err,
                         mach_port_t old_msg_port)
 {
-  return ill_rpc (__FUNCTION__);
+  return ill_rpc ("S_proc_setmsgport_reply");
 }
 
 error_t
 S_proc_getmsgport_reply (mach_port_t reply, error_t err, mach_port_t msg_port)
 {
-  return ill_rpc (__FUNCTION__);
+  return ill_rpc ("S_proc_getmsgport_reply");
 }
 
 \f
@@ -1875,7 +1902,7 @@ S_msg_sig_post_untraced_reply (mach_port_t reply, error_t err)
       inf->wait.status.value.sig = TARGET_SIGNAL_0;
     }
   else if (err)
-    warning ("Signal delivery failed: %s", strerror (err));
+    warning (_("Signal delivery failed: %s"), safe_strerror (err));
 
   if (err)
     /* We only get this reply when we've posted a signal to a process which we
@@ -1892,7 +1919,7 @@ S_msg_sig_post_untraced_reply (mach_port_t reply, error_t err)
 error_t
 S_msg_sig_post_reply (mach_port_t reply, error_t err)
 {
-  return ill_rpc (__FUNCTION__);
+  return ill_rpc ("S_msg_sig_post_reply");
 }
 
 \f
@@ -1928,12 +1955,15 @@ port_msgs_queued (mach_port_t port)
    in multiple events returned by wait).
  */
 static void
-gnu_resume (int tid, int step, enum target_signal sig)
+gnu_resume (struct target_ops *ops,
+           ptid_t ptid, int step, enum target_signal sig)
 {
   struct proc *step_thread = 0;
-  struct inf *inf = current_inferior;
+  int resume_all;
+  struct inf *inf = gnu_current_inf;
 
-  inf_debug (inf, "tid = %d, step = %d, sig = %d", tid, step, sig);
+  inf_debug (inf, "ptid = %s, step = %d, sig = %d",
+            target_pid_to_str (ptid), step, sig);
 
   inf_validate_procinfo (inf);
 
@@ -1949,7 +1979,7 @@ gnu_resume (int tid, int step, enum target_signal sig)
        abort the faulting thread, which will perhaps retake it.  */
     {
       proc_abort (inf->wait.thread, 1);
-      warning ("Aborting %s with unforwarded exception %s.",
+      warning (_("Aborting %s with unforwarded exception %s."),
               proc_string (inf->wait.thread),
               target_signal_to_name (inf->wait.status.value.sig));
     }
@@ -1961,30 +1991,35 @@ gnu_resume (int tid, int step, enum target_signal sig)
 
   inf_update_procs (inf);
 
-  if (tid < 0)
+  /* A specific PTID means `step only this process id'.  */
+  resume_all = ptid_equal (ptid, minus_one_ptid);
+
+  if (resume_all)
     /* Allow all threads to run, except perhaps single-stepping one.  */
     {
-      inf_debug (inf, "running all threads; tid = %d", inferior_pid);
-      tid = inferior_pid;      /* What to step. */
+      inf_debug (inf, "running all threads; tid = %d", PIDGET (inferior_ptid));
+      ptid = inferior_ptid;    /* What to step. */
       inf_set_threads_resume_sc (inf, 0, 1);
     }
   else
     /* Just allow a single thread to run.  */
     {
-      struct proc *thread = inf_tid_to_thread (inf, tid);
+      struct proc *thread = inf_tid_to_thread (inf, ptid_get_tid (ptid));
       if (!thread)
-       error ("Can't run single thread id %d: no such thread!");
-      inf_debug (inf, "running one thread: %d/%d", inf->pid, thread->tid);
+       error (_("Can't run single thread id %s: no such thread!"),
+              target_pid_to_str (ptid));
+      inf_debug (inf, "running one thread: %s", target_pid_to_str (ptid));
       inf_set_threads_resume_sc (inf, thread, 0);
     }
 
   if (step)
     {
-      step_thread = inf_tid_to_thread (inf, tid);
+      step_thread = inf_tid_to_thread (inf, ptid_get_tid (ptid));
       if (!step_thread)
-       warning ("Can't step thread id %d: no such thread.", tid);
+       warning (_("Can't step thread id %s: no such thread."),
+                target_pid_to_str (ptid));
       else
-       inf_debug (inf, "stepping thread: %d/%d", inf->pid, step_thread->tid);
+       inf_debug (inf, "stepping thread: %s", target_pid_to_str (ptid));
     }
   if (step_thread != inf->step_thread)
     inf_set_step_thread (inf, step_thread);
@@ -1997,22 +2032,22 @@ gnu_resume (int tid, int step, enum target_signal sig)
 static void
 gnu_kill_inferior (void)
 {
-  struct proc *task = current_inferior->task;
+  struct proc *task = gnu_current_inf->task;
   if (task)
     {
       proc_debug (task, "terminating...");
       task_terminate (task->port);
-      inf_set_pid (current_inferior, -1);
+      inf_set_pid (gnu_current_inf, -1);
     }
   target_mourn_inferior ();
 }
 
 /* Clean up after the inferior dies.  */
 static void
-gnu_mourn_inferior (void)
+gnu_mourn_inferior (struct target_ops *ops)
 {
-  inf_debug (current_inferior, "rip");
-  inf_detach (current_inferior);
+  inf_debug (gnu_current_inf, "rip");
+  inf_detach (gnu_current_inf);
   unpush_target (&gnu_ops);
   generic_mourn_inferior ();
 }
@@ -2024,9 +2059,9 @@ gnu_mourn_inferior (void)
 static int
 inf_pick_first_thread (void)
 {
-  if (current_inferior->task && current_inferior->threads)
+  if (gnu_current_inf->task && gnu_current_inf->threads)
     /* The first thread.  */
-    return current_inferior->threads->tid;
+    return gnu_current_inf->threads->tid;
   else
     /* What may be the next thread.  */
     return next_thread_id;
@@ -2035,13 +2070,15 @@ inf_pick_first_thread (void)
 static struct inf *
 cur_inf (void)
 {
-  if (!current_inferior)
-    current_inferior = make_inf ();
-  return current_inferior;
+  if (!gnu_current_inf)
+    gnu_current_inf = make_inf ();
+  return gnu_current_inf;
 }
 
 static void
-gnu_create_inferior (char *exec_file, char *allargs, char **env)
+gnu_create_inferior (struct target_ops *ops, 
+                    char *exec_file, char *allargs, char **env,
+                    int from_tty)
 {
   struct inf *inf = cur_inf ();
 
@@ -2050,7 +2087,7 @@ gnu_create_inferior (char *exec_file, char *allargs, char **env)
     /* We're in the child; make this process stop as soon as it execs.  */
     inf_debug (inf, "tracing self");
     if (ptrace (PTRACE_TRACEME) != 0)
-      error ("ptrace (PTRACE_TRACEME) failed!");
+      error (_("ptrace (PTRACE_TRACEME) failed!"));
   }
   void attach_to_child (int pid)
   {
@@ -2059,7 +2096,6 @@ gnu_create_inferior (char *exec_file, char *allargs, char **env)
 
     inf_attach (inf, pid);
 
-    attach_flag = 0;
     push_target (&gnu_ops);
 
     inf->pending_execs = 2;
@@ -2069,7 +2105,10 @@ gnu_create_inferior (char *exec_file, char *allargs, char **env)
     /* Now let the child run again, knowing that it will stop immediately
        because of the ptrace. */
     inf_resume (inf);
-    inferior_pid = inf_pick_first_thread ();
+
+    /* We now have thread info.  */
+    thread_change_ptid (inferior_ptid,
+                       ptid_build (inf->pid, 0, inf_pick_first_thread ()));
 
     startup_inferior (inf->pending_execs);
   }
@@ -2089,9 +2128,6 @@ gnu_create_inferior (char *exec_file, char *allargs, char **env)
     inf_steal_exc_ports (inf);
   else
     inf_restore_exc_ports (inf);
-
-  /* Here we go!  */
-  proceed ((CORE_ADDR) -1, 0, 0);
 }
 
 /* Mark our target-struct as eligible for stray "run" and "attach"
@@ -2103,24 +2139,23 @@ gnu_can_run (void)
 }
 
 \f
-#ifdef ATTACH_DETACH
-
 /* Attach to process PID, then initialize for debugging it
    and wait for the trace-trap that results from attaching.  */
 static void
-gnu_attach (char *args, int from_tty)
+gnu_attach (struct target_ops *ops, char *args, int from_tty)
 {
   int pid;
   char *exec_file;
   struct inf *inf = cur_inf ();
+  struct inferior *inferior;
 
   if (!args)
-    error_no_arg ("process-id to attach");
+    error_no_arg (_("process-id to attach"));
 
   pid = atoi (args);
 
   if (pid == getpid ())                /* Trying to masturbate? */
-    error ("I refuse to debug myself!");
+    error (_("I refuse to debug myself!"));
 
   if (from_tty)
     {
@@ -2138,13 +2173,16 @@ gnu_attach (char *args, int from_tty)
   inf_debug (inf, "attaching to pid: %d", pid);
 
   inf_attach (inf, pid);
-  inf_update_procs (inf);
 
-  inferior_pid = inf_pick_first_thread ();
-
-  attach_flag = 1;
   push_target (&gnu_ops);
 
+  inferior = add_inferior (pid);
+  inferior->attach_flag = 1;
+
+  inf_update_procs (inf);
+
+  inferior_ptid = ptid_build (pid, 0, inf_pick_first_thread ());
+
   /* We have to initialize the terminal settings now, since the code
      below might try to restore them.  */
   target_terminal_init ();
@@ -2170,33 +2208,36 @@ gnu_attach (char *args, int from_tty)
    previously attached.  It *might* work if the program was
    started via fork.  */
 static void
-gnu_detach (char *args, int from_tty)
+gnu_detach (struct target_ops *ops, char *args, int from_tty)
 {
+  int pid;
+
   if (from_tty)
     {
       char *exec_file = get_exec_file (0);
       if (exec_file)
        printf_unfiltered ("Detaching from program `%s' pid %d\n",
-                          exec_file, current_inferior->pid);
+                          exec_file, gnu_current_inf->pid);
       else
-       printf_unfiltered ("Detaching from pid %d\n", current_inferior->pid);
+       printf_unfiltered ("Detaching from pid %d\n", gnu_current_inf->pid);
       gdb_flush (gdb_stdout);
     }
 
-  inf_detach (current_inferior);
+  pid = gnu_current_inf->pid;
+
+  inf_detach (gnu_current_inf);
 
-  inferior_pid = 0;
+  inferior_ptid = null_ptid;
+  detach_inferior (pid);
 
   unpush_target (&gnu_ops);    /* Pop out of handling an inferior */
 }
-#endif /* ATTACH_DETACH */
-
 \f
 static void
 gnu_terminal_init_inferior (void)
 {
-  gdb_assert (current_inferior);
-  terminal_init_inferior_with_pgrp (current_inferior->pid);
+  gdb_assert (gnu_current_inf);
+  terminal_init_inferior_with_pgrp (gnu_current_inf->pid);
 }
 
 /* Get ready to modify the registers array.  On machines which store
@@ -2205,38 +2246,28 @@ gnu_terminal_init_inferior (void)
    that registers contains all the registers from the program being
    debugged.  */
 static void
-gnu_prepare_to_store (void)
+gnu_prepare_to_store (struct regcache *regcache)
 {
-#ifdef CHILD_PREPARE_TO_STORE
-  CHILD_PREPARE_TO_STORE ();
-#endif
 }
 
 static void
 gnu_open (char *arg, int from_tty)
 {
-  error ("Use the \"run\" command to start a Unix child process.");
+  error (_("Use the \"run\" command to start a Unix child process."));
 }
 
 static void
-gnu_stop (void)
+gnu_stop (ptid_t ptid)
 {
-  error ("to_stop target function not implemented");
+  error (_("to_stop target function not implemented"));
 }
 
-static char *
-gnu_pid_to_exec_file (void)
-{
-  error ("to_pid_to_exec_file target function not implemented");
-  return NULL;
-}
-
-
 static int
-gnu_thread_alive (int tid)
+gnu_thread_alive (struct target_ops *ops, ptid_t ptid)
 {
-  inf_update_procs (current_inferior);
-  return !!inf_tid_to_thread (current_inferior, tid);
+  inf_update_procs (gnu_current_inf);
+  return !!inf_tid_to_thread (gnu_current_inf,
+                             ptid_get_tid (ptid));
 }
 
 \f
@@ -2258,16 +2289,16 @@ gnu_read_inferior (task_t task, CORE_ADDR addr, char *myaddr, int length)
   if (err)
     return 0;
 
-  err = hurd_safe_copyin (myaddr, (void *) addr - low_address + copied, length);
+  err = hurd_safe_copyin (myaddr, (void *) (addr - low_address + copied), length);
   if (err)
     {
-      warning ("Read from inferior faulted: %s", strerror (err));
+      warning (_("Read from inferior faulted: %s"), safe_strerror (err));
       length = 0;
     }
 
   err = vm_deallocate (mach_task_self (), copied, copy_count);
   if (err)
-    warning ("gnu_read_inferior vm_deallocate failed: %s", strerror (err));
+    warning (_("gnu_read_inferior vm_deallocate failed: %s"), safe_strerror (err));
 
   return length;
 }
@@ -2313,7 +2344,7 @@ gnu_write_inferior (task_t task, CORE_ADDR addr, char *myaddr, int length)
 
   deallocate++;
 
-  err = hurd_safe_copyout ((void *) addr - low_address + copied,
+  err = hurd_safe_copyout ((void *) (addr - low_address + copied),
                           myaddr, length);
   CHK_GOTO_OUT ("Write to inferior faulted", err);
 
@@ -2352,7 +2383,7 @@ gnu_write_inferior (task_t task, CORE_ADDR addr, char *myaddr, int length)
        /* Check for holes in memory */
        if (old_address != region_address)
          {
-           warning ("No memory at 0x%x. Nothing written",
+           warning (_("No memory at 0x%x. Nothing written"),
                     old_address);
            err = KERN_SUCCESS;
            length = 0;
@@ -2361,7 +2392,7 @@ gnu_write_inferior (task_t task, CORE_ADDR addr, char *myaddr, int length)
 
        if (!(max_protection & VM_PROT_WRITE))
          {
-           warning ("Memory at address 0x%x is unwritable. Nothing written",
+           warning (_("Memory at address 0x%x is unwritable. Nothing written"),
                     old_address);
            err = KERN_SUCCESS;
            length = 0;
@@ -2435,7 +2466,7 @@ out:
 
   if (err != KERN_SUCCESS)
     {
-      warning ("%s: %s", errstr, mach_error_string (err));
+      warning (_("%s: %s"), errstr, mach_error_string (err));
       return 0;
     }
 
@@ -2446,21 +2477,21 @@ out:
 /* Return 0 on failure, number of bytes handled otherwise.  TARGET
    is ignored. */
 static int
-gnu_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
+gnu_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write,
                 struct mem_attrib *attrib,
                 struct target_ops *target)
 {
-  task_t task = (current_inferior
-                ? (current_inferior->task
-                   ? current_inferior->task->port : 0)
+  task_t task = (gnu_current_inf
+                ? (gnu_current_inf->task
+                   ? gnu_current_inf->task->port : 0)
                 : 0);
 
   if (task == MACH_PORT_NULL)
     return 0;
   else
     {
-      inf_debug (current_inferior, "%s %p[%d] %s %p",
-                write ? "writing" : "reading", memaddr, len,
+      inf_debug (gnu_current_inf, "%s %p[%d] %s %p",
+                write ? "writing" : "reading", (void *) memaddr, len,
                 write ? "<--" : "-->", myaddr);
       if (write)
        return gnu_write_inferior (task, memaddr, myaddr, len);
@@ -2469,6 +2500,87 @@ gnu_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
     }
 }
 
+/* Call FUNC on each memory region in the task.  */
+static int
+gnu_find_memory_regions (int (*func) (CORE_ADDR,
+                                     unsigned long,
+                                     int, int, int,
+                                     void *),
+                        void *data)
+{
+  error_t err;
+  task_t task;
+  vm_address_t region_address, last_region_address, last_region_end;
+  vm_prot_t last_protection;
+
+  if (gnu_current_inf == 0 || gnu_current_inf->task == 0)
+    return 0;
+  task = gnu_current_inf->task->port;
+  if (task == MACH_PORT_NULL)
+    return 0;
+
+  region_address = last_region_address = last_region_end = VM_MIN_ADDRESS;
+  last_protection = VM_PROT_NONE;
+  while (region_address < VM_MAX_ADDRESS)
+    {
+      vm_prot_t protection;
+      vm_prot_t max_protection;
+      vm_inherit_t inheritance;
+      boolean_t shared;
+      mach_port_t object_name;
+      vm_offset_t offset;
+      vm_size_t region_length = VM_MAX_ADDRESS - region_address;
+      vm_address_t old_address = region_address;
+
+      err = vm_region (task,
+                      &region_address,
+                      &region_length,
+                      &protection,
+                      &max_protection,
+                      &inheritance,
+                      &shared,
+                      &object_name,
+                      &offset);
+      if (err == KERN_NO_SPACE)
+       break;
+      if (err != KERN_SUCCESS)
+       {
+         warning (_("vm_region failed: %s"), mach_error_string (err));
+         return -1;
+       }
+
+      if (protection == last_protection && region_address == last_region_end)
+       /* This region is contiguous with and indistinguishable from
+          the previous one, so we just extend that one.  */
+       last_region_end = region_address += region_length;
+      else
+       {
+         /* This region is distinct from the last one we saw, so report
+            that previous one.  */
+         if (last_protection != VM_PROT_NONE)
+           (*func) (last_region_address,
+                    last_region_end - last_region_address,
+                    last_protection & VM_PROT_READ,
+                    last_protection & VM_PROT_WRITE,
+                    last_protection & VM_PROT_EXECUTE,
+                    data);
+         last_region_address = region_address;
+         last_region_end = region_address += region_length;
+         last_protection = protection;
+       }
+    }
+
+  /* Report the final region.  */
+  if (last_region_end > last_region_address && last_protection != VM_PROT_NONE)
+    (*func) (last_region_address, last_region_end - last_region_address,
+            last_protection & VM_PROT_READ,
+            last_protection & VM_PROT_WRITE,
+            last_protection & VM_PROT_EXECUTE,
+            data);
+
+  return 0;
+}
+
 \f
 /* Return printable description of proc.  */
 char *
@@ -2478,15 +2590,16 @@ proc_string (struct proc *proc)
   if (proc_is_task (proc))
     sprintf (tid_str, "process %d", proc->inf->pid);
   else
-    sprintf (tid_str, "thread %d.%d",
-            proc->inf->pid, pid_to_thread_id (proc->tid));
+    sprintf (tid_str, "Thread %d.%d",
+            proc->inf->pid, proc->tid);
   return tid_str;
 }
 
 static char *
-gnu_pid_to_str (int tid)
+gnu_pid_to_str (struct target_ops *ops, ptid_t ptid)
 {
-  struct inf *inf = current_inferior;
+  struct inf *inf = gnu_current_inf;
+  int tid = ptid_get_tid (ptid);
   struct proc *thread = inf_tid_to_thread (inf, tid);
 
   if (thread)
@@ -2500,8 +2613,10 @@ gnu_pid_to_str (int tid)
 }
 
 \f
-extern void gnu_store_registers (int regno);
-extern void gnu_fetch_registers (int regno);
+extern void gnu_store_registers (struct target_ops *ops,
+                                struct regcache *regcache, int regno);
+extern void gnu_fetch_registers (struct target_ops *ops,
+                                struct regcache *regcache, int regno);
 
 struct target_ops gnu_ops;
 
@@ -2512,68 +2627,37 @@ init_gnu_ops (void)
   gnu_ops.to_longname = "GNU Hurd process"; /* to_longname */
   gnu_ops.to_doc = "GNU Hurd process"; /* to_doc */
   gnu_ops.to_open = gnu_open;          /* to_open */
-  gnu_ops.to_close = 0;                        /* to_close */
   gnu_ops.to_attach = gnu_attach;      /* to_attach */
-  gnu_ops.to_post_attach = NULL;
-  gnu_ops.to_require_attach = NULL;    /* to_require_attach */
+  gnu_ops.to_attach_no_wait = 1;       /* to_attach_no_wait */
   gnu_ops.to_detach = gnu_detach;      /* to_detach */
-  gnu_ops.to_require_detach = NULL;    /* to_require_detach */
   gnu_ops.to_resume = gnu_resume;      /* to_resume */
   gnu_ops.to_wait = gnu_wait;          /* to_wait */
-  gnu_ops.to_post_wait = NULL;         /* to_post_wait */
   gnu_ops.to_fetch_registers = gnu_fetch_registers;    /* to_fetch_registers */
   gnu_ops.to_store_registers = gnu_store_registers;    /* to_store_registers */
   gnu_ops.to_prepare_to_store = gnu_prepare_to_store; /* to_prepare_to_store */
-  gnu_ops.to_xfer_memory = gnu_xfer_memory; /* to_xfer_memory */
-  gnu_ops.to_files_info = 0;           /* to_files_info */
+  gnu_ops.deprecated_xfer_memory = gnu_xfer_memory;
+  gnu_ops.to_find_memory_regions = gnu_find_memory_regions;
   gnu_ops.to_insert_breakpoint = memory_insert_breakpoint;
   gnu_ops.to_remove_breakpoint = memory_remove_breakpoint;
   gnu_ops.to_terminal_init = gnu_terminal_init_inferior;
   gnu_ops.to_terminal_inferior = terminal_inferior;
   gnu_ops.to_terminal_ours_for_output = terminal_ours_for_output;
+  gnu_ops.to_terminal_save_ours = terminal_save_ours;
   gnu_ops.to_terminal_ours = terminal_ours;
   gnu_ops.to_terminal_info = child_terminal_info;
   gnu_ops.to_kill = gnu_kill_inferior; /* to_kill */
-  gnu_ops.to_load = 0;                 /* to_load */
-  gnu_ops.to_lookup_symbol = 0;                /* to_lookup_symbol */
   gnu_ops.to_create_inferior = gnu_create_inferior; /* to_create_inferior */
-  gnu_ops.to_post_startup_inferior = NULL;    /* to_post_startup_inferior */
-  /* to_acknowledge_created_inferior */
-  gnu_ops.to_acknowledge_created_inferior = NULL;
-  /* to_clone_and_follow_inferior */
-  gnu_ops.to_clone_and_follow_inferior = NULL;
-  /* to_post_follow_inferior_by_clone */
-  gnu_ops.to_post_follow_inferior_by_clone = NULL;
-  gnu_ops.to_insert_fork_catchpoint = NULL;
-  gnu_ops.to_remove_fork_catchpoint = NULL;
-  gnu_ops.to_insert_vfork_catchpoint = NULL;
-  gnu_ops.to_remove_vfork_catchpoint = NULL;
-  gnu_ops.to_has_forked = NULL;                /* to_has_forked */
-  gnu_ops.to_has_vforked = NULL;       /* to_has_vforked */
-  gnu_ops.to_can_follow_vfork_prior_to_exec = NULL;
-  gnu_ops.to_post_follow_vfork = NULL; /* to_post_follow_vfork */
-  gnu_ops.to_insert_exec_catchpoint = NULL;
-  gnu_ops.to_remove_exec_catchpoint = NULL;
-  gnu_ops.to_has_execd = NULL;
-  gnu_ops.to_reported_exec_events_per_exec_call = NULL;
-  gnu_ops.to_has_exited = NULL;
   gnu_ops.to_mourn_inferior = gnu_mourn_inferior;      /* to_mourn_inferior */
   gnu_ops.to_can_run = gnu_can_run;    /* to_can_run */
-  gnu_ops.to_notice_signals = 0;       /* to_notice_signals */
   gnu_ops.to_thread_alive = gnu_thread_alive;  /* to_thread_alive */
   gnu_ops.to_pid_to_str = gnu_pid_to_str;   /* to_pid_to_str */
   gnu_ops.to_stop = gnu_stop;  /* to_stop */
-  gnu_ops.to_pid_to_exec_file = gnu_pid_to_exec_file; /* to_pid_to_exec_file */
-  gnu_ops.to_core_file_to_sym_file = NULL;
   gnu_ops.to_stratum = process_stratum;                /* to_stratum */
-  gnu_ops.DONT_USE = 0;                        /* to_next */
   gnu_ops.to_has_all_memory = 1;       /* to_has_all_memory */
   gnu_ops.to_has_memory = 1;           /* to_has_memory */
   gnu_ops.to_has_stack = 1;            /* to_has_stack */
   gnu_ops.to_has_registers = 1;                /* to_has_registers */
   gnu_ops.to_has_execution = 1;                /* to_has_execution */
-  gnu_ops.to_sections = 0;             /* sections */
-  gnu_ops.to_sections_end = 0;         /* sections_end */
   gnu_ops.to_magic = OPS_MAGIC;                /* to_magic */
 }                              /* init_gnu_ops */
 
@@ -2627,7 +2711,7 @@ parse_int_arg (char *args, char *cmd_prefix)
       if (*args && *arg_end == '\0')
        return val;
     }
-  error ("Illegal argument for \"%s\" command, should be an integer.", cmd_prefix);
+  error (_("Illegal argument for \"%s\" command, should be an integer."), cmd_prefix);
 }
 
 static int
@@ -2638,7 +2722,7 @@ _parse_bool_arg (char *args, char *t_val, char *f_val, char *cmd_prefix)
   else if (strcmp (args, f_val) == 0)
     return 0;
   else
-    error ("Illegal argument for \"%s\" command, should be \"%s\" or \"%s\".",
+    error (_("Illegal argument for \"%s\" command, should be \"%s\" or \"%s\"."),
           cmd_prefix, t_val, f_val);
 }
 
@@ -2649,7 +2733,7 @@ static void
 check_empty (char *args, char *cmd_prefix)
 {
   if (args)
-    error ("Garbage after \"%s\" command: `%s'", cmd_prefix, args);
+    error (_("Garbage after \"%s\" command: `%s'"), cmd_prefix, args);
 }
 
 /* Returns the alive thread named by INFERIOR_PID, or signals an error.  */
@@ -2657,9 +2741,10 @@ static struct proc *
 cur_thread (void)
 {
   struct inf *inf = cur_inf ();
-  struct proc *thread = inf_tid_to_thread (inf, inferior_pid);
+  struct proc *thread = inf_tid_to_thread (inf,
+                                          ptid_get_tid (inferior_ptid));
   if (!thread)
-    error ("No current thread.");
+    error (_("No current thread."));
   return thread;
 }
 
@@ -2669,7 +2754,7 @@ active_inf (void)
 {
   struct inf *inf = cur_inf ();
   if (!inf->task)
-    error ("No current process.");
+    error (_("No current process."));
   return inf;
 }
 
@@ -2776,14 +2861,14 @@ steal_exc_port (struct proc *proc, mach_port_t name)
   mach_msg_type_name_t port_type;
 
   if (!proc || !proc->inf->task)
-    error ("No inferior task.");
+    error (_("No inferior task."));
 
   err = mach_port_extract_right (proc->inf->task->port,
                                 name, MACH_MSG_TYPE_COPY_SEND,
                                 &port, &port_type);
   if (err)
-    error ("Couldn't extract send right %d from inferior: %s",
-          name, strerror (err));
+    error (_("Couldn't extract send right %d from inferior: %s"),
+          name, safe_strerror (err));
 
   if (proc->saved_exc_port)
     /* Get rid of our reference to the old one.  */
@@ -2797,8 +2882,8 @@ steal_exc_port (struct proc *proc, mach_port_t name)
     {
       proc->exc_port = proc->inf->event_port;
       err = proc_set_exception_port (proc, proc->exc_port);
-      error ("Can't set exception port for %s: %s",
-            proc_string (proc), strerror (err));
+      error (_("Can't set exception port for %s: %s"),
+            proc_string (proc), safe_strerror (err));
     }
 }
 
@@ -2807,7 +2892,7 @@ set_task_exc_port_cmd (char *args, int from_tty)
 {
   struct inf *inf = cur_inf ();
   if (!args)
-    error ("No argument to \"set task exception-port\" command.");
+    error (_("No argument to \"set task exception-port\" command."));
   steal_exc_port (inf->task, parse_and_eval_address (args));
 }
 
@@ -2832,17 +2917,17 @@ set_sig_thread_cmd (char *args, int from_tty)
   struct inf *inf = cur_inf ();
 
   if (!args || (!isdigit (*args) && strcmp (args, "none") != 0))
-    error ("Illegal argument to \"set signal-thread\" command.\n"
-          "Should be an integer thread ID, or `none'.");
+    error (_("Illegal argument to \"set signal-thread\" command.\n"
+          "Should be an integer thread ID, or `none'."));
 
   if (strcmp (args, "none") == 0)
     inf->signal_thread = 0;
   else
     {
-      int tid = thread_id_to_pid (atoi (args));
+      int tid = ptid_get_tid (thread_id_to_pid (atoi (args)));
       if (tid < 0)
-       error ("Thread ID %s not known.  Use the \"info threads\" command to\n"
-              "see the IDs of currently known threads.", args);
+       error (_("Thread ID %s not known.  Use the \"info threads\" command to\n"
+              "see the IDs of currently known threads."), args);
       inf->signal_thread = inf_tid_to_thread (inf, tid);
     }
 }
@@ -2959,20 +3044,20 @@ static void
 info_port_rights (char *args, mach_port_type_t only)
 {
   struct inf *inf = active_inf ();
-  value_ptr vmark = value_mark ();
+  struct value *vmark = value_mark ();
 
   if (args)
     /* Explicit list of port rights.  */
     {
       while (*args)
        {
-         value_ptr val = parse_to_comma_and_eval (&args);
+         struct value *val = parse_to_comma_and_eval (&args);
          long right = value_as_long (val);
          error_t err =
          print_port_info (right, 0, inf->task->port, PORTINFO_DETAILS,
                           stdout);
          if (err)
-           error ("%ld: %s.", right, strerror (err));
+           error (_("%ld: %s."), right, safe_strerror (err));
        }
     }
   else
@@ -2982,7 +3067,7 @@ info_port_rights (char *args, mach_port_type_t only)
       print_task_ports_info (inf->task->port, only, PORTINFO_DETAILS,
                             stdout);
       if (err)
-       error ("%s.", strerror (err));
+       error (_("%s."), safe_strerror (err));
     }
 
   value_free_to_mark (vmark);
@@ -3022,101 +3107,97 @@ info_port_rights_cmd (char *args, int from_tty)
 static void
 add_task_commands (void)
 {
-  add_cmd ("pause", class_run, set_thread_default_pause_cmd,
-          "Set whether the new threads are suspended while gdb has control.\n\
+  add_cmd ("pause", class_run, set_thread_default_pause_cmd, _("\
+Set whether the new threads are suspended while gdb has control.\n\
 This property normally has no effect because the whole task is\n\
 suspended, however, that may be disabled with \"set task pause off\".\n\
-The default value is \"off\".",
+The default value is \"off\"."),
           &set_thread_default_cmd_list);
-  add_cmd ("pause", no_class, show_thread_default_pause_cmd,
-          "Show whether new threads are suspended while gdb has control.",
+  add_cmd ("pause", no_class, show_thread_default_pause_cmd, _("\
+Show whether new threads are suspended while gdb has control."),
           &show_thread_default_cmd_list);
   
-  add_cmd ("run", class_run, set_thread_default_run_cmd,
-          "Set whether new threads are allowed to run \
-(once gdb has noticed them).",
+  add_cmd ("run", class_run, set_thread_default_run_cmd, _("\
+Set whether new threads are allowed to run (once gdb has noticed them)."),
           &set_thread_default_cmd_list);
-  add_cmd ("run", no_class, show_thread_default_run_cmd,
-          "Show whether new threads are allowed to run \
-(once gdb has noticed them).",
+  add_cmd ("run", no_class, show_thread_default_run_cmd, _("\
+Show whether new threads are allowed to run (once gdb has noticed them)."),
           &show_thread_default_cmd_list);
   
   add_cmd ("detach-suspend-count", class_run, set_thread_default_detach_sc_cmd,
-          "Set the default detach-suspend-count value for new threads.",
+          _("Set the default detach-suspend-count value for new threads."),
           &set_thread_default_cmd_list);
   add_cmd ("detach-suspend-count", no_class, show_thread_default_detach_sc_cmd,
-          "Show the default detach-suspend-count value for new threads.",
+          _("Show the default detach-suspend-count value for new threads."),
           &show_thread_default_cmd_list);
 
-  add_cmd ("signals", class_run, set_signals_cmd,
-          "Set whether the inferior process's signals will be intercepted.\n\
-Mach exceptions (such as breakpoint traps) are not affected.",
+  add_cmd ("signals", class_run, set_signals_cmd, _("\
+Set whether the inferior process's signals will be intercepted.\n\
+Mach exceptions (such as breakpoint traps) are not affected."),
           &setlist);
   add_alias_cmd ("sigs", "signals", class_run, 1, &setlist);
-  add_cmd ("signals", no_class, show_signals_cmd,
-          "Show whether the inferior process's signals will be intercepted.",
+  add_cmd ("signals", no_class, show_signals_cmd, _("\
+Show whether the inferior process's signals will be intercepted."),
           &showlist);
   add_alias_cmd ("sigs", "signals", no_class, 1, &showlist);
 
-  add_cmd ("signal-thread", class_run, set_sig_thread_cmd,
-          "Set the thread that gdb thinks is the libc signal thread.\n\
-This thread is run when delivering a signal to a non-stopped process.",
+  add_cmd ("signal-thread", class_run, set_sig_thread_cmd, _("\
+Set the thread that gdb thinks is the libc signal thread.\n\
+This thread is run when delivering a signal to a non-stopped process."),
           &setlist);
   add_alias_cmd ("sigthread", "signal-thread", class_run, 1, &setlist);
-  add_cmd ("signal-thread", no_class, show_sig_thread_cmd,
-          "Set the thread that gdb thinks is the libc signal thread.",
+  add_cmd ("signal-thread", no_class, show_sig_thread_cmd, _("\
+Set the thread that gdb thinks is the libc signal thread."),
           &showlist);
   add_alias_cmd ("sigthread", "signal-thread", no_class, 1, &showlist);
 
-  add_cmd ("stopped", class_run, set_stopped_cmd,
-          "Set whether gdb thinks the inferior process is stopped \
-as with SIGSTOP.\n\
-Stopped process will be continued by sending them a signal.",
+  add_cmd ("stopped", class_run, set_stopped_cmd, _("\
+Set whether gdb thinks the inferior process is stopped as with SIGSTOP.\n\
+Stopped process will be continued by sending them a signal."),
           &setlist);
-  add_cmd ("stopped", no_class, show_signals_cmd,
-          "Show whether gdb thinks the inferior process is stopped \
-as with SIGSTOP.",
+  add_cmd ("stopped", no_class, show_signals_cmd, _("\
+Show whether gdb thinks the inferior process is stopped as with SIGSTOP."),
           &showlist);
 
-  add_cmd ("exceptions", class_run, set_exceptions_cmd,
-          "Set whether exceptions in the inferior process will be trapped.\n\
+  add_cmd ("exceptions", class_run, set_exceptions_cmd, _("\
+Set whether exceptions in the inferior process will be trapped.\n\
 When exceptions are turned off, neither breakpoints nor single-stepping\n\
-will work.",
+will work."),
           &setlist);
   /* Allow `set exc' despite conflict with `set exception-port'.  */
   add_alias_cmd ("exc", "exceptions", class_run, 1, &setlist);
-  add_cmd ("exceptions", no_class, show_exceptions_cmd,
-          "Show whether exceptions in the inferior process will be trapped.",
+  add_cmd ("exceptions", no_class, show_exceptions_cmd, _("\
+Show whether exceptions in the inferior process will be trapped."),
           &showlist);
 
   add_prefix_cmd ("task", no_class, set_task_cmd,
-                 "Command prefix for setting task attributes.",
+                 _("Command prefix for setting task attributes."),
                  &set_task_cmd_list, "set task ", 0, &setlist);
   add_prefix_cmd ("task", no_class, show_task_cmd,
-                 "Command prefix for showing task attributes.",
+                 _("Command prefix for showing task attributes."),
                  &show_task_cmd_list, "show task ", 0, &showlist);
 
-  add_cmd ("pause", class_run, set_task_pause_cmd,
-          "Set whether the task is suspended while gdb has control.\n\
+  add_cmd ("pause", class_run, set_task_pause_cmd, _("\
+Set whether the task is suspended while gdb has control.\n\
 A value of \"on\" takes effect immediately, otherwise nothing happens\n\
 until the next time the program is continued.\n\
 When setting this to \"off\", \"set thread default pause on\" can be\n\
-used to pause individual threads by default instead.",
+used to pause individual threads by default instead."),
           &set_task_cmd_list);
   add_cmd ("pause", no_class, show_task_pause_cmd,
-          "Show whether the task is suspended while gdb has control.",
+          _("Show whether the task is suspended while gdb has control."),
           &show_task_cmd_list);
 
   add_cmd ("detach-suspend-count", class_run, set_task_detach_sc_cmd,
-          "Set the suspend count will leave on the thread when detaching.",
+          _("Set the suspend count will leave on the thread when detaching."),
           &set_task_cmd_list);
   add_cmd ("detach-suspend-count", no_class, show_task_detach_sc_cmd,
-          "Show the suspend count will leave on the thread when detaching.",
+          _("Show the suspend count will leave on the thread when detaching."),
           &show_task_cmd_list);
 
-  add_cmd ("exception-port", no_class, set_task_exc_port_cmd,
-          "Set the task exception port to which we forward exceptions.\n\
-The argument should be the value of the send right in the task.",
+  add_cmd ("exception-port", no_class, set_task_exc_port_cmd, _("\
+Set the task exception port to which we forward exceptions.\n\
+The argument should be the value of the send right in the task."),
           &set_task_cmd_list);
   add_alias_cmd ("excp", "exception-port", no_class, 1, &set_task_cmd_list);
   add_alias_cmd ("exc-port", "exception-port", no_class, 1,
@@ -3124,27 +3205,27 @@ The argument should be the value of the send right in the task.",
 
   /* A convenient way of turning on all options require to noninvasively
      debug running tasks.  */
-  add_cmd ("noninvasive", no_class, set_noninvasive_cmd,
-          "Set task options so that we interfere as little as possible.\n\
+  add_cmd ("noninvasive", no_class, set_noninvasive_cmd, _("\
+Set task options so that we interfere as little as possible.\n\
 This is the same as setting `task pause', `exceptions', and\n\
-`signals' to the opposite value.",
+`signals' to the opposite value."),
           &setlist);
 
   /* Commands to show information about the task's ports.  */
   add_cmd ("send-rights", class_info, info_send_rights_cmd,
-          "Show information about the task's send rights",
+          _("Show information about the task's send rights"),
           &infolist);
   add_cmd ("receive-rights", class_info, info_recv_rights_cmd,
-          "Show information about the task's receive rights",
+          _("Show information about the task's receive rights"),
           &infolist);
   add_cmd ("port-rights", class_info, info_port_rights_cmd,
-          "Show information about the task's port rights",
+          _("Show information about the task's port rights"),
           &infolist);
   add_cmd ("port-sets", class_info, info_port_sets_cmd,
-          "Show information about the task's port sets",
+          _("Show information about the task's port sets"),
           &infolist);
   add_cmd ("dead-names", class_info, info_dead_names_cmd,
-          "Show information about the task's dead names",
+          _("Show information about the task's dead names"),
           &infolist);
   add_info_alias ("ports", "port-rights", 1);
   add_info_alias ("port", "port-rights", 1);
@@ -3216,7 +3297,7 @@ set_thread_exc_port_cmd (char *args, int from_tty)
 {
   struct proc *thread = cur_thread ();
   if (!args)
-    error ("No argument to \"set thread exception-port\" command.");
+    error (_("No argument to \"set thread exception-port\" command."));
   steal_exc_port (thread, parse_and_eval_address (args));
 }
 
@@ -3243,7 +3324,7 @@ thread_takeover_sc_cmd (char *args, int from_tty)
   error_t err =
   thread_info (thread->port, THREAD_BASIC_INFO, (int *) &info, &info_len);
   if (err)
-    error ("%s.", strerror (err));
+    error (("%s."), safe_strerror (err));
   thread->sc = info->suspend_count;
   if (from_tty)
     printf_unfiltered ("Suspend count was %d.\n", thread->sc);
@@ -3257,65 +3338,63 @@ static void
 add_thread_commands (void)
 {
   add_prefix_cmd ("thread", no_class, set_thread_cmd,
-                 "Command prefix for setting thread properties.",
+                 _("Command prefix for setting thread properties."),
                  &set_thread_cmd_list, "set thread ", 0, &setlist);
   add_prefix_cmd ("default", no_class, show_thread_cmd,
-                 "Command prefix for setting default thread properties.",
+                 _("Command prefix for setting default thread properties."),
                  &set_thread_default_cmd_list, "set thread default ", 0,
                  &set_thread_cmd_list);
   add_prefix_cmd ("thread", no_class, set_thread_default_cmd,
-                 "Command prefix for showing thread properties.",
+                 _("Command prefix for showing thread properties."),
                  &show_thread_cmd_list, "show thread ", 0, &showlist);
   add_prefix_cmd ("default", no_class, show_thread_default_cmd,
-                 "Command prefix for showing default thread properties.",
+                 _("Command prefix for showing default thread properties."),
                  &show_thread_default_cmd_list, "show thread default ", 0,
                  &show_thread_cmd_list);
 
-  add_cmd ("pause", class_run, set_thread_pause_cmd,
-          "Set whether the current thread is suspended \
-while gdb has control.\n\
+  add_cmd ("pause", class_run, set_thread_pause_cmd, _("\
+Set whether the current thread is suspended while gdb has control.\n\
 A value of \"on\" takes effect immediately, otherwise nothing happens\n\
 until the next time the program is continued.  This property normally\n\
 has no effect because the whole task is suspended, however, that may\n\
 be disabled with \"set task pause off\".\n\
-The default value is \"off\".",
+The default value is \"off\"."),
           &set_thread_cmd_list);
-  add_cmd ("pause", no_class, show_thread_pause_cmd,
-          "Show whether the current thread is suspended \
-while gdb has control.",
+  add_cmd ("pause", no_class, show_thread_pause_cmd, _("\
+Show whether the current thread is suspended while gdb has control."),
           &show_thread_cmd_list);
 
   add_cmd ("run", class_run, set_thread_run_cmd,
-          "Set whether the current thread is allowed to run.",
+          _("Set whether the current thread is allowed to run."),
           &set_thread_cmd_list);
   add_cmd ("run", no_class, show_thread_run_cmd,
-          "Show whether the current thread is allowed to run.",
+          _("Show whether the current thread is allowed to run."),
           &show_thread_cmd_list);
 
-  add_cmd ("detach-suspend-count", class_run, set_thread_detach_sc_cmd,
-          "Set the suspend count will leave on the thread when detaching.\n\
+  add_cmd ("detach-suspend-count", class_run, set_thread_detach_sc_cmd, _("\
+Set the suspend count will leave on the thread when detaching.\n\
 Note that this is relative to suspend count when gdb noticed the thread;\n\
-use the `thread takeover-suspend-count' to force it to an absolute value.",
+use the `thread takeover-suspend-count' to force it to an absolute value."),
           &set_thread_cmd_list);
-  add_cmd ("detach-suspend-count", no_class, show_thread_detach_sc_cmd,
-          "Show the suspend count will leave on the thread when detaching.\n\
+  add_cmd ("detach-suspend-count", no_class, show_thread_detach_sc_cmd, _("\
+Show the suspend count will leave on the thread when detaching.\n\
 Note that this is relative to suspend count when gdb noticed the thread;\n\
-use the `thread takeover-suspend-count' to force it to an absolute value.",
+use the `thread takeover-suspend-count' to force it to an absolute value."),
           &show_thread_cmd_list);
 
-  add_cmd ("exception-port", no_class, set_thread_exc_port_cmd,
-          "Set the thread exception port to which we forward exceptions.\n\
+  add_cmd ("exception-port", no_class, set_thread_exc_port_cmd, _("\
+Set the thread exception port to which we forward exceptions.\n\
 This overrides the task exception port.\n\
-The argument should be the value of the send right in the task.",
+The argument should be the value of the send right in the task."),
           &set_thread_cmd_list);
   add_alias_cmd ("excp", "exception-port", no_class, 1, &set_thread_cmd_list);
   add_alias_cmd ("exc-port", "exception-port", no_class, 1,
                 &set_thread_cmd_list);
 
-  add_cmd ("takeover-suspend-count", no_class, thread_takeover_sc_cmd,
-          "Force the threads absolute suspend-count to be gdb's.\n\
+  add_cmd ("takeover-suspend-count", no_class, thread_takeover_sc_cmd, _("\
+Force the threads absolute suspend-count to be gdb's.\n\
 Prior to giving this command, gdb's thread suspend-counts are relative\n\
-to the thread's initial suspend-count when gdb notices the threads.",
+to the thread's initial suspend-count when gdb notices the threads."),
           &thread_cmd_list);
 }
 
@@ -3330,9 +3409,10 @@ _initialize_gnu_nat (void)
 
   add_task_commands ();
   add_thread_commands ();
-  add_set_cmd ("gnu-debug", class_maintenance,
-              var_boolean, (char *) &gnu_debug_flag,
-              "Set debugging output for the gnu backend.", &maintenancelist);
+  deprecated_add_set_cmd ("gnu-debug", class_maintenance,
+                         var_boolean, (char *) &gnu_debug_flag,
+                         "Set debugging output for the gnu backend.",
+                         &maintenancelist);
 }
 \f
 #ifdef FLUSH_INFERIOR_CACHE
@@ -3348,12 +3428,12 @@ flush_inferior_icache (CORE_ADDR pc, int amount)
   vm_machine_attribute_val_t flush = MATTR_VAL_ICACHE_FLUSH;
   error_t ret;
 
-  ret = vm_machine_attribute (current_inferior->task->port,
+  ret = vm_machine_attribute (gnu_current_inf->task->port,
                              pc,
                              amount,
                              MATTR_CACHE,
                              &flush);
   if (ret != KERN_SUCCESS)
-    warning ("Error flushing inferior's cache : %s", strerror (ret));
+    warning (_("Error flushing inferior's cache : %s"), safe_strerror (ret));
 }
 #endif /* FLUSH_INFERIOR_CACHE */