xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/gnu-nat.c (revision 8b657b0747480f8989760d71343d6dd33f8d4cf9)
1 /* Interface GDB to the GNU Hurd.
2    Copyright (C) 1992-2023 Free Software Foundation, Inc.
3 
4    This file is part of GDB.
5 
6    Written by Miles Bader <miles@gnu.ai.mit.edu>
7 
8    Some code and ideas from m3-nat.c by Jukka Virtanen <jtv@hut.fi>
9 
10    This program is free software; you can redistribute it and/or modify
11    it under the terms of the GNU General Public License as published by
12    the Free Software Foundation; either version 3 of the License, or
13    (at your option) any later version.
14 
15    This program is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18    GNU General Public License for more details.
19 
20    You should have received a copy of the GNU General Public License
21    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
22 
23 /* Include this first, to pick up the <mach.h> 'thread_info' diversion.  */
24 #include "gnu-nat.h"
25 
26 /* Mach/Hurd headers are not yet ready for C++ compilation.  */
27 extern "C"
28 {
29 #include <mach.h>
30 #include <mach_error.h>
31 #include <mach/exception.h>
32 #include <mach/message.h>
33 #include <mach/notify.h>
34 #include <mach/vm_attributes.h>
35 #include <mach/vm_param.h>
36 
37 #include <hurd.h>
38 #include <hurd/interrupt.h>
39 #include <hurd/msg.h>
40 #include <hurd/msg_request.h>
41 #include <hurd/process.h>
42 /* Defined in <hurd/process.h>, but we need forward declarations from
43    <hurd/process_request.h> as well.  */
44 #undef _process_user_
45 #include <hurd/process_request.h>
46 #include <hurd/signal.h>
47 #include <hurd/sigpreempt.h>
48 
49 #include <portinfo.h>
50 }
51 
52 #include "defs.h"
53 
54 #include <ctype.h>
55 #include <limits.h>
56 #include <setjmp.h>
57 #include <signal.h>
58 #include <sys/ptrace.h>
59 #include <elf.h>
60 #include <link.h>
61 
62 #include "inferior.h"
63 #include "symtab.h"
64 #include "value.h"
65 #include "language.h"
66 #include "target.h"
67 #include "gdbsupport/gdb_wait.h"
68 #include "gdbarch.h"
69 #include "gdbcmd.h"
70 #include "gdbcore.h"
71 #include "gdbthread.h"
72 #include "gdbsupport/gdb_obstack.h"
73 #include "tid-parse.h"
74 #include "nat/fork-inferior.h"
75 
76 #include "inf-child.h"
77 
78 /* MIG stubs are not yet ready for C++ compilation.  */
79 extern "C"
80 {
81 #include "exc_request_S.h"
82 #include "notify_S.h"
83 #include "process_reply_S.h"
84 #include "msg_reply_S.h"
85 #include "exc_request_U.h"
86 #include "msg_U.h"
87 
88 #include "gnu-nat-mig.h"
89 }
90 
91 struct gnu_nat_target *gnu_target;
92 
93 static process_t proc_server = MACH_PORT_NULL;
94 
95 /* If we've sent a proc_wait_request to the proc server, the pid of the
96    process we asked about.  We can only ever have one outstanding.  */
97 int proc_wait_pid = 0;
98 
99 /* The number of wait requests we've sent, and expect replies from.  */
100 int proc_waits_pending = 0;
101 
102 bool gnu_debug_flag = false;
103 
104 /* Forward decls */
105 
106 static struct inf *make_inf ();
107 
108 #define inf_debug(_inf, msg, args...) \
109   do { struct inf *__inf = (_inf); \
110        debug ("{inf %d %s}: " msg, __inf->pid, \
111        host_address_to_string (__inf) , ##args); } while (0)
112 
113 /* Evaluate RPC_EXPR in a scope with the variables MSGPORT and REFPORT bound
114    to INF's msg port and task port respectively.  If it has no msg port,
115    EIEIO is returned.  INF must refer to a running process!  */
116 #define INF_MSGPORT_RPC(inf, rpc_expr) \
117   HURD_MSGPORT_RPC (proc_getmsgport (proc_server, inf->pid, &msgport), \
118 		    (refport = inf->task->port, 0), 0, \
119 		    msgport ? (rpc_expr) : EIEIO)
120 
121 /* Like INF_MSGPORT_RPC, but will also resume the signal thread to ensure
122    there's someone around to deal with the RPC (and resuspend things
123    afterwards).  This effects INF's threads' resume_sc count.  */
124 #define INF_RESUME_MSGPORT_RPC(inf, rpc_expr) \
125   (inf_set_threads_resume_sc_for_signal_thread (inf) \
126    ? ({ kern_return_t __e; \
127 	inf_resume (inf); \
128 	__e = INF_MSGPORT_RPC (inf, rpc_expr); \
129 	inf_suspend (inf); \
130 	__e; }) \
131    : EIEIO)
132 
133 
134 /* The state passed by an exception message.  */
135 struct exc_state
136   {
137     int exception;		/* The exception code.  */
138     int code, subcode;
139     mach_port_t handler;	/* The real exception port to handle this.  */
140     mach_port_t reply;		/* The reply port from the exception call.  */
141   };
142 
143 /* The results of the last wait an inf did.  */
144 struct inf_wait
145   {
146     struct target_waitstatus status;	/* The status returned to gdb.  */
147     struct exc_state exc;	/* The exception that caused us to return.  */
148     struct proc *thread;	/* The thread in question.  */
149     int suppress;		/* Something trivial happened.  */
150   };
151 
152 /* Further Hurd-specific state of an inferior.  */
153 struct inf
154   {
155     /* Fields describing the current inferior.  */
156 
157     struct proc *task;		/* The mach task.   */
158     struct proc *threads;	/* A linked list of all threads in TASK.  */
159 
160     /* True if THREADS needn't be validated by querying the task.  We
161        assume that we and the task in question are the only ones
162        frobbing the thread list, so as long as we don't let any code
163        run, we don't have to worry about THREADS changing.  */
164     int threads_up_to_date;
165 
166     pid_t pid;			/* The real system PID.  */
167 
168     struct inf_wait wait;	/* What to return from target_wait.  */
169 
170     /* One thread proc in INF may be in `single-stepping mode'.  This
171        is it.  */
172     struct proc *step_thread;
173 
174     /* The thread we think is the signal thread.  */
175     struct proc *signal_thread;
176 
177     mach_port_t event_port;	/* Where we receive various msgs.  */
178 
179     /* True if we think at least one thread in the inferior could currently be
180        running.  */
181     unsigned int running:1;
182 
183     /* True if the process has stopped (in the proc server sense).  Note that
184        since a proc server `stop' leaves the signal thread running, the inf can
185        be RUNNING && STOPPED...  */
186     unsigned int stopped:1;
187 
188     /* True if the inferior has no message port.  */
189     unsigned int nomsg:1;
190 
191     /* True if the inferior is traced.  */
192     unsigned int traced:1;
193 
194     /* True if we shouldn't try waiting for the inferior, usually because we
195        can't for some reason.  */
196     unsigned int no_wait:1;
197 
198     /* When starting a new inferior, we don't try to validate threads until all
199        the proper execs have been done, which this flag states we still
200        expect to happen.  */
201     unsigned int pending_execs:1;
202 
203     /* Fields describing global state.  */
204 
205     /* The task suspend count used when gdb has control.  This is normally 1 to
206        make things easier for us, but sometimes (like when attaching to vital
207        system servers) it may be desirable to let the task continue to run
208        (pausing individual threads as necessary).  */
209     int pause_sc;
210 
211     /* The task suspend count left when detaching from a task.  */
212     int detach_sc;
213 
214     /* The initial values used for the run_sc and pause_sc of newly discovered
215        threads -- see the definition of those fields in struct proc.  */
216     int default_thread_run_sc;
217     int default_thread_pause_sc;
218     int default_thread_detach_sc;
219 
220     /* True if the process should be traced when started/attached.  Newly
221        started processes *must* be traced at first to exec them properly, but
222        if this is false, tracing is turned off as soon it has done so.  */
223     int want_signals;
224 
225     /* True if exceptions from the inferior process should be trapped.  This
226        must be on to use breakpoints.  */
227     int want_exceptions;
228   };
229 
230 
231 int
232 __proc_pid (struct proc *proc)
233 {
234   return proc->inf->pid;
235 }
236 
237 
238 /* Update PROC's real suspend count to match it's desired one.  Returns true
239    if we think PROC is now in a runnable state.  */
240 int
241 gnu_nat_target::proc_update_sc (struct proc *proc)
242 {
243   int running;
244   int err = 0;
245   int delta = proc->sc - proc->cur_sc;
246 
247   if (delta)
248     proc_debug (proc, "sc: %d --> %d", proc->cur_sc, proc->sc);
249 
250   if (proc->sc == 0 && proc->state_changed)
251     /* Since PROC may start running, we must write back any state changes.  */
252     {
253       gdb_assert (proc_is_thread (proc));
254       proc_debug (proc, "storing back changed thread state");
255       err = thread_set_state (proc->port, THREAD_STATE_FLAVOR,
256 			 (thread_state_t) &proc->state, THREAD_STATE_SIZE);
257       if (!err)
258 	proc->state_changed = 0;
259     }
260 
261   if (delta > 0)
262     {
263       while (delta-- > 0 && !err)
264 	{
265 	  if (proc_is_task (proc))
266 	    err = task_suspend (proc->port);
267 	  else
268 	    err = thread_suspend (proc->port);
269 	}
270     }
271   else
272     {
273       while (delta++ < 0 && !err)
274 	{
275 	  if (proc_is_task (proc))
276 	    err = task_resume (proc->port);
277 	  else
278 	    err = thread_resume (proc->port);
279 	}
280     }
281   if (!err)
282     proc->cur_sc = proc->sc;
283 
284   /* If we got an error, then the task/thread has disappeared.  */
285   running = !err && proc->sc == 0;
286 
287   proc_debug (proc, "is %s", err ? "dead" : running ? "running" : "suspended");
288   if (err)
289     proc_debug (proc, "err = %s", safe_strerror (err));
290 
291   if (running)
292     {
293       proc->aborted = 0;
294       proc->state_valid = proc->state_changed = 0;
295       proc->fetched_regs = 0;
296     }
297 
298   return running;
299 }
300 
301 
302 /* Thread_abort is called on PROC if needed.  PROC must be a thread proc.
303    If PROC is deemed `precious', then nothing is done unless FORCE is true.
304    In particular, a thread is precious if it's running (in which case forcing
305    it includes suspending it first), or if it has an exception pending.  */
306 void
307 gnu_nat_target::proc_abort (struct proc *proc, int force)
308 {
309   gdb_assert (proc_is_thread (proc));
310 
311   if (!proc->aborted)
312     {
313       struct inf *inf = proc->inf;
314       int running = (proc->cur_sc == 0 && inf->task->cur_sc == 0);
315 
316       if (running && force)
317 	{
318 	  proc->sc = 1;
319 	  inf_update_suspends (proc->inf);
320 	  running = 0;
321 	  warning (_("Stopped %s."), proc_string (proc));
322 	}
323       else if (proc == inf->wait.thread && inf->wait.exc.reply && !force)
324 	/* An exception is pending on PROC, which don't mess with.  */
325 	running = 1;
326 
327       if (!running)
328 	/* We only abort the thread if it's not actually running.  */
329 	{
330 	  thread_abort (proc->port);
331 	  proc_debug (proc, "aborted");
332 	  proc->aborted = 1;
333 	}
334       else
335 	proc_debug (proc, "not aborting");
336     }
337 }
338 
339 /* Make sure that the state field in PROC is up to date, and return a pointer
340    to it, or 0 if something is wrong.  If WILL_MODIFY is true, makes sure
341    that the thread is stopped and aborted first, and sets the state_changed
342    field in PROC to true.  */
343 thread_state_t
344 gnu_nat_target::proc_get_state (struct proc *proc, int will_modify)
345 {
346   int was_aborted = proc->aborted;
347 
348   proc_debug (proc, "updating state info%s",
349 	      will_modify ? " (with intention to modify)" : "");
350 
351   proc_abort (proc, will_modify);
352 
353   if (!was_aborted && proc->aborted)
354     /* PROC's state may have changed since we last fetched it.  */
355     proc->state_valid = 0;
356 
357   if (!proc->state_valid)
358     {
359       mach_msg_type_number_t state_size = THREAD_STATE_SIZE;
360       kern_return_t err =
361 	thread_get_state (proc->port, THREAD_STATE_FLAVOR,
362 			  (thread_state_t) &proc->state, &state_size);
363 
364       proc_debug (proc, "getting thread state");
365       proc->state_valid = !err;
366     }
367 
368   if (proc->state_valid)
369     {
370       if (will_modify)
371 	proc->state_changed = 1;
372       return (thread_state_t) &proc->state;
373     }
374   else
375     return 0;
376 }
377 
378 
379 /* Set PORT to PROC's exception port.  */
380 kern_return_t
381 gnu_nat_target::proc_get_exception_port (struct proc * proc, mach_port_t * port)
382 {
383   if (proc_is_task (proc))
384     return task_get_exception_port (proc->port, port);
385   else
386     return thread_get_exception_port (proc->port, port);
387 }
388 
389 /* Set PROC's exception port to PORT.  */
390 kern_return_t
391 gnu_nat_target::proc_set_exception_port (struct proc * proc, mach_port_t port)
392 {
393   proc_debug (proc, "setting exception port: %lu", port);
394   if (proc_is_task (proc))
395     return task_set_exception_port (proc->port, port);
396   else
397     return thread_set_exception_port (proc->port, port);
398 }
399 
400 /* Get PROC's exception port, cleaning up a bit if proc has died.  */
401 mach_port_t
402 gnu_nat_target::_proc_get_exc_port (struct proc *proc)
403 {
404   mach_port_t exc_port;
405   kern_return_t err = proc_get_exception_port (proc, &exc_port);
406 
407   if (err)
408     /* PROC must be dead.  */
409     {
410       if (proc->exc_port)
411 	mach_port_deallocate (mach_task_self (), proc->exc_port);
412       proc->exc_port = MACH_PORT_NULL;
413       if (proc->saved_exc_port)
414 	mach_port_deallocate (mach_task_self (), proc->saved_exc_port);
415       proc->saved_exc_port = MACH_PORT_NULL;
416     }
417 
418   return exc_port;
419 }
420 
421 /* Replace PROC's exception port with EXC_PORT, unless it's already
422    been done.  Stash away any existing exception port so we can
423    restore it later.  */
424 void
425 gnu_nat_target::proc_steal_exc_port (struct proc *proc, mach_port_t exc_port)
426 {
427   mach_port_t cur_exc_port = _proc_get_exc_port (proc);
428 
429   if (cur_exc_port)
430     {
431       kern_return_t err = 0;
432 
433       proc_debug (proc, "inserting exception port: %lu", exc_port);
434 
435       if (cur_exc_port != exc_port)
436 	/* Put in our exception port.  */
437 	err = proc_set_exception_port (proc, exc_port);
438 
439       if (err || cur_exc_port == proc->exc_port)
440 	/* We previously set the exception port, and it's still set.  So we
441 	   just keep the old saved port which is what the proc set.  */
442 	{
443 	  if (cur_exc_port)
444 	    mach_port_deallocate (mach_task_self (), cur_exc_port);
445 	}
446       else
447 	/* Keep a copy of PROC's old exception port so it can be restored.  */
448 	{
449 	  if (proc->saved_exc_port)
450 	    mach_port_deallocate (mach_task_self (), proc->saved_exc_port);
451 	  proc->saved_exc_port = cur_exc_port;
452 	}
453 
454       proc_debug (proc, "saved exception port: %lu", proc->saved_exc_port);
455 
456       if (!err)
457 	proc->exc_port = exc_port;
458       else
459 	warning (_("Error setting exception port for %s: %s"),
460 		 proc_string (proc), safe_strerror (err));
461     }
462 }
463 
464 /* If we previously replaced PROC's exception port, put back what we
465    found there at the time, unless *our* exception port has since been
466    overwritten, in which case who knows what's going on.  */
467 void
468 gnu_nat_target::proc_restore_exc_port (struct proc *proc)
469 {
470   mach_port_t cur_exc_port = _proc_get_exc_port (proc);
471 
472   if (cur_exc_port)
473     {
474       kern_return_t err = 0;
475 
476       proc_debug (proc, "restoring real exception port");
477 
478       if (proc->exc_port == cur_exc_port)
479 	/* Our's is still there.  */
480 	err = proc_set_exception_port (proc, proc->saved_exc_port);
481 
482       if (proc->saved_exc_port)
483 	mach_port_deallocate (mach_task_self (), proc->saved_exc_port);
484       proc->saved_exc_port = MACH_PORT_NULL;
485 
486       if (!err)
487 	proc->exc_port = MACH_PORT_NULL;
488       else
489 	warning (_("Error setting exception port for %s: %s"),
490 		 proc_string (proc), safe_strerror (err));
491     }
492 }
493 
494 
495 /* Turns hardware tracing in PROC on or off when SET is true or false,
496    respectively.  Returns true on success.  */
497 int
498 gnu_nat_target::proc_trace (struct proc *proc, int set)
499 {
500   thread_state_t state = proc_get_state (proc, 1);
501 
502   if (!state)
503     return 0;			/* The thread must be dead.  */
504 
505   proc_debug (proc, "tracing %s", set ? "on" : "off");
506 
507   if (set)
508     {
509       /* XXX We don't get the exception unless the thread has its own
510 	 exception port????  */
511       if (proc->exc_port == MACH_PORT_NULL)
512 	proc_steal_exc_port (proc, proc->inf->event_port);
513       THREAD_STATE_SET_TRACED (state);
514     }
515   else
516     THREAD_STATE_CLEAR_TRACED (state);
517 
518   return 1;
519 }
520 
521 
522 /* A variable from which to assign new TIDs.  */
523 static int next_thread_id = 1;
524 
525 /* Returns a new proc structure with the given fields.  Also adds a
526    notification for PORT becoming dead to be sent to INF's notify port.  */
527 struct proc *
528 gnu_nat_target::make_proc (struct inf *inf, mach_port_t port, int tid)
529 {
530   kern_return_t err;
531   mach_port_t prev_port = MACH_PORT_NULL;
532   struct proc *proc = XNEW (struct proc);
533 
534   proc->port = port;
535   proc->tid = tid;
536   proc->inf = inf;
537   proc->next = 0;
538   proc->saved_exc_port = MACH_PORT_NULL;
539   proc->exc_port = MACH_PORT_NULL;
540 
541   proc->sc = 0;
542   proc->cur_sc = 0;
543 
544   /* Note that these are all the values for threads; the task simply uses the
545      corresponding field in INF directly.  */
546   proc->run_sc = inf->default_thread_run_sc;
547   proc->pause_sc = inf->default_thread_pause_sc;
548   proc->detach_sc = inf->default_thread_detach_sc;
549   proc->resume_sc = proc->run_sc;
550 
551   proc->aborted = 0;
552   proc->dead = 0;
553   proc->state_valid = 0;
554   proc->state_changed = 0;
555 
556   proc_debug (proc, "is new");
557 
558   /* Get notified when things die.  */
559   err =
560     mach_port_request_notification (mach_task_self (), port,
561 				    MACH_NOTIFY_DEAD_NAME, 1,
562 				    inf->event_port,
563 				    MACH_MSG_TYPE_MAKE_SEND_ONCE,
564 				    &prev_port);
565   if (err)
566     warning (_("Couldn't request notification for port %lu: %s"),
567 	     port, safe_strerror (err));
568   else
569     {
570       proc_debug (proc, "notifications to: %lu", inf->event_port);
571       if (prev_port != MACH_PORT_NULL)
572 	mach_port_deallocate (mach_task_self (), prev_port);
573     }
574 
575   if (inf->want_exceptions)
576     {
577       if (proc_is_task (proc))
578 	/* Make the task exception port point to us.  */
579 	proc_steal_exc_port (proc, inf->event_port);
580       else
581 	/* Just clear thread exception ports -- they default to the
582 	   task one.  */
583 	proc_steal_exc_port (proc, MACH_PORT_NULL);
584     }
585 
586   return proc;
587 }
588 
589 /* Frees PROC and any resources it uses, and returns the value of PROC's
590    next field.  */
591 struct proc *
592 gnu_nat_target::_proc_free (struct proc *proc)
593 {
594   struct inf *inf = proc->inf;
595   struct proc *next = proc->next;
596 
597   proc_debug (proc, "freeing...");
598 
599   if (proc == inf->step_thread)
600     /* Turn off single stepping.  */
601     inf_set_step_thread (inf, 0);
602   if (proc == inf->wait.thread)
603     inf_clear_wait (inf);
604   if (proc == inf->signal_thread)
605     inf->signal_thread = 0;
606 
607   if (proc->port != MACH_PORT_NULL)
608     {
609       if (proc->exc_port != MACH_PORT_NULL)
610 	/* Restore the original exception port.  */
611 	proc_restore_exc_port (proc);
612       if (proc->cur_sc != 0)
613 	/* Resume the thread/task.  */
614 	{
615 	  proc->sc = 0;
616 	  proc_update_sc (proc);
617 	}
618       mach_port_deallocate (mach_task_self (), proc->port);
619     }
620 
621   xfree (proc);
622   return next;
623 }
624 
625 
626 static struct inf *
627 make_inf (void)
628 {
629   struct inf *inf = new struct inf;
630 
631   inf->task = 0;
632   inf->threads = 0;
633   inf->threads_up_to_date = 0;
634   inf->pid = 0;
635   inf->wait.status.set_spurious ();
636   inf->wait.thread = 0;
637   inf->wait.exc.handler = MACH_PORT_NULL;
638   inf->wait.exc.reply = MACH_PORT_NULL;
639   inf->step_thread = 0;
640   inf->signal_thread = 0;
641   inf->event_port = MACH_PORT_NULL;
642   inf->running = 0;
643   inf->stopped = 0;
644   inf->nomsg = 1;
645   inf->traced = 0;
646   inf->no_wait = 0;
647   inf->pending_execs = 0;
648   inf->pause_sc = 1;
649   inf->detach_sc = 0;
650   inf->default_thread_run_sc = 0;
651   inf->default_thread_pause_sc = 0;
652   inf->default_thread_detach_sc = 0;
653   inf->want_signals = 1;	/* By default */
654   inf->want_exceptions = 1;	/* By default */
655 
656   return inf;
657 }
658 
659 /* Clear INF's target wait status.  */
660 void
661 gnu_nat_target::inf_clear_wait (struct inf *inf)
662 {
663   inf_debug (inf, "clearing wait");
664   inf->wait.status.set_spurious ();
665   inf->wait.thread = 0;
666   inf->wait.suppress = 0;
667   if (inf->wait.exc.handler != MACH_PORT_NULL)
668     {
669       mach_port_deallocate (mach_task_self (), inf->wait.exc.handler);
670       inf->wait.exc.handler = MACH_PORT_NULL;
671     }
672   if (inf->wait.exc.reply != MACH_PORT_NULL)
673     {
674       mach_port_deallocate (mach_task_self (), inf->wait.exc.reply);
675       inf->wait.exc.reply = MACH_PORT_NULL;
676     }
677 }
678 
679 
680 void
681 gnu_nat_target::inf_cleanup (struct inf *inf)
682 {
683   inf_debug (inf, "cleanup");
684 
685   inf_clear_wait (inf);
686 
687   inf_set_pid (inf, -1);
688   inf->pid = 0;
689   inf->running = 0;
690   inf->stopped = 0;
691   inf->nomsg = 1;
692   inf->traced = 0;
693   inf->no_wait = 0;
694   inf->pending_execs = 0;
695 
696   if (inf->event_port)
697     {
698       mach_port_destroy (mach_task_self (), inf->event_port);
699       inf->event_port = MACH_PORT_NULL;
700     }
701 }
702 
703 void
704 gnu_nat_target::inf_startup (struct inf *inf, int pid)
705 {
706   kern_return_t err;
707 
708   inf_debug (inf, "startup: pid = %d", pid);
709 
710   inf_cleanup (inf);
711 
712   /* Make the port on which we receive all events.  */
713   err = mach_port_allocate (mach_task_self (),
714 			    MACH_PORT_RIGHT_RECEIVE, &inf->event_port);
715   if (err)
716     error (_("Error allocating event port: %s"), safe_strerror (err));
717 
718   /* Make a send right for it, so we can easily copy it for other people.  */
719   mach_port_insert_right (mach_task_self (), inf->event_port,
720 			  inf->event_port, MACH_MSG_TYPE_MAKE_SEND);
721   inf_set_pid (inf, pid);
722 }
723 
724 
725 /* Close current process, if any, and attach INF to process PORT.  */
726 void
727 gnu_nat_target::inf_set_pid (struct inf *inf, pid_t pid)
728 {
729   task_t task_port;
730   struct proc *task = inf->task;
731 
732   inf_debug (inf, "setting pid: %d", pid);
733 
734   if (pid < 0)
735     task_port = MACH_PORT_NULL;
736   else
737     {
738       kern_return_t err = proc_pid2task (proc_server, pid, &task_port);
739 
740       if (err)
741 	error (_("Error getting task for pid %d: %s"),
742 	       pid, safe_strerror (err));
743     }
744 
745   inf_debug (inf, "setting task: %lu", task_port);
746 
747   if (inf->pause_sc)
748     task_suspend (task_port);
749 
750   if (task && task->port != task_port)
751     {
752       inf->task = 0;
753       inf_validate_procs (inf);	/* Trash all the threads.  */
754       _proc_free (task);	/* And the task.  */
755     }
756 
757   if (task_port != MACH_PORT_NULL)
758     {
759       inf->task = make_proc (inf, task_port, PROC_TID_TASK);
760       inf->threads_up_to_date = 0;
761     }
762 
763   if (inf->task)
764     {
765       inf->pid = pid;
766       if (inf->pause_sc)
767 	/* Reflect task_suspend above.  */
768 	inf->task->sc = inf->task->cur_sc = 1;
769     }
770   else
771     inf->pid = -1;
772 }
773 
774 
775 /* Validates INF's stopped, nomsg and traced field from the actual
776    proc server state.  Note that the traced field is only updated from
777    the proc server state if we do not have a message port.  If we do
778    have a message port we'd better look at the tracemask itself.  */
779 void
780 gnu_nat_target::inf_validate_procinfo (struct inf *inf)
781 {
782   char *noise;
783   mach_msg_type_number_t noise_len = 0;
784   struct procinfo *pi;
785   mach_msg_type_number_t pi_len = 0;
786   int info_flags = 0;
787   kern_return_t err =
788     proc_getprocinfo (proc_server, inf->pid, &info_flags,
789 		      (procinfo_t *) &pi, &pi_len, &noise, &noise_len);
790 
791   if (!err)
792     {
793       inf->stopped = !!(pi->state & PI_STOPPED);
794       inf->nomsg = !!(pi->state & PI_NOMSG);
795       if (inf->nomsg)
796 	inf->traced = !!(pi->state & PI_TRACED);
797       vm_deallocate (mach_task_self (), (vm_address_t) pi,
798 		     pi_len * sizeof (*(procinfo_t) 0));
799       if (noise_len > 0)
800 	vm_deallocate (mach_task_self (), (vm_address_t) noise, noise_len);
801     }
802 }
803 
804 /* Validates INF's task suspend count.  If it's higher than we expect,
805    verify with the user before `stealing' the extra count.  */
806 void
807 gnu_nat_target::inf_validate_task_sc (struct inf *inf)
808 {
809   char *noise;
810   mach_msg_type_number_t noise_len = 0;
811   struct procinfo *pi;
812   mach_msg_type_number_t pi_len = 0;
813   int info_flags = PI_FETCH_TASKINFO;
814   int suspend_count = -1;
815   kern_return_t err;
816 
817  retry:
818   err = proc_getprocinfo (proc_server, inf->pid, &info_flags,
819 			  (procinfo_t *) &pi, &pi_len, &noise, &noise_len);
820   if (err)
821     {
822       inf->task->dead = 1; /* oh well */
823       return;
824     }
825 
826   if (inf->task->cur_sc < pi->taskinfo.suspend_count && suspend_count == -1)
827     {
828       /* The proc server might have suspended the task while stopping
829 	 it.  This happens when the task is handling a traced signal.
830 	 Refetch the suspend count.  The proc server should be
831 	 finished stopping the task by now.  */
832       suspend_count = pi->taskinfo.suspend_count;
833       goto retry;
834     }
835 
836   suspend_count = pi->taskinfo.suspend_count;
837 
838   vm_deallocate (mach_task_self (), (vm_address_t) pi,
839 		 pi_len * sizeof (*(procinfo_t) 0));
840   if (noise_len > 0)
841     vm_deallocate (mach_task_self (), (vm_address_t) noise, noise_len);
842 
843   if (inf->task->cur_sc < suspend_count)
844     {
845       if (!query (_("Pid %d has an additional task suspend count of %d;"
846 		    " clear it? "), inf->pid,
847 		  suspend_count - inf->task->cur_sc))
848 	error (_("Additional task suspend count left untouched."));
849 
850       inf->task->cur_sc = suspend_count;
851     }
852 }
853 
854 /* Turns tracing for INF on or off, depending on ON, unless it already
855    is.  If INF is running, the resume_sc count of INF's threads will
856    be modified, and the signal thread will briefly be run to change
857    the trace state.  */
858 void
859 gnu_nat_target::inf_set_traced (struct inf *inf, int on)
860 {
861   if (on == inf->traced)
862     return;
863 
864   if (inf->task && !inf->task->dead)
865     /* Make it take effect immediately.  */
866     {
867       sigset_t mask = on ? ~(sigset_t) 0 : 0;
868       kern_return_t err =
869 	INF_RESUME_MSGPORT_RPC (inf, msg_set_init_int (msgport, refport,
870 						       INIT_TRACEMASK, mask));
871 
872       if (err == EIEIO)
873 	{
874 	  if (on)
875 	    warning (_("Can't modify tracing state for pid %d: %s"),
876 		     inf->pid, "No signal thread");
877 	  inf->traced = on;
878 	}
879       else if (err)
880 	warning (_("Can't modify tracing state for pid %d: %s"),
881 		 inf->pid, safe_strerror (err));
882       else
883 	inf->traced = on;
884     }
885   else
886     inf->traced = on;
887 }
888 
889 
890 /* Makes all the real suspend count deltas of all the procs in INF
891    match the desired values.  Careful to always do thread/task suspend
892    counts in the safe order.  Returns true if at least one thread is
893    thought to be running.  */
894 int
895 gnu_nat_target::inf_update_suspends (struct inf *inf)
896 {
897   struct proc *task = inf->task;
898 
899   /* We don't have to update INF->threads even though we're iterating over it
900      because we'll change a thread only if it already has an existing proc
901      entry.  */
902   inf_debug (inf, "updating suspend counts");
903 
904   if (task)
905     {
906       struct proc *thread;
907       int task_running = (task->sc == 0), thread_running = 0;
908 
909       if (task->sc > task->cur_sc)
910 	/* The task is becoming _more_ suspended; do before any threads.  */
911 	task_running = proc_update_sc (task);
912 
913       if (inf->pending_execs)
914 	/* When we're waiting for an exec, things may be happening behind our
915 	   back, so be conservative.  */
916 	thread_running = 1;
917 
918       /* Do all the thread suspend counts.  */
919       for (thread = inf->threads; thread; thread = thread->next)
920 	thread_running |= proc_update_sc (thread);
921 
922       if (task->sc != task->cur_sc)
923 	/* We didn't do the task first, because we wanted to wait for the
924 	   threads; do it now.  */
925 	task_running = proc_update_sc (task);
926 
927       inf_debug (inf, "%srunning...",
928 		 (thread_running && task_running) ? "" : "not ");
929 
930       inf->running = thread_running && task_running;
931 
932       /* Once any thread has executed some code, we can't depend on the
933 	 threads list any more.  */
934       if (inf->running)
935 	inf->threads_up_to_date = 0;
936 
937       return inf->running;
938     }
939 
940   return 0;
941 }
942 
943 
944 /* Converts a GDB pid to a struct proc.  */
945 struct proc *
946 inf_tid_to_thread (struct inf *inf, int tid)
947 {
948   struct proc *thread = inf->threads;
949 
950   while (thread)
951     if (thread->tid == tid)
952       return thread;
953     else
954       thread = thread->next;
955   return 0;
956 }
957 
958 /* Converts a thread port to a struct proc.  */
959 static struct proc *
960 inf_port_to_thread (struct inf *inf, mach_port_t port)
961 {
962   struct proc *thread = inf->threads;
963 
964   while (thread)
965     if (thread->port == port)
966       return thread;
967     else
968       thread = thread->next;
969   return 0;
970 }
971 
972 /* See gnu-nat.h.  */
973 
974 void
975 inf_threads (struct inf *inf, inf_threads_ftype *f, void *arg)
976 {
977   struct proc *thread;
978 
979   for (thread = inf->threads; thread; thread = thread->next)
980     f (thread, arg);
981 }
982 
983 
984 /* Make INF's list of threads be consistent with reality of TASK.  */
985 void
986 gnu_nat_target::inf_validate_procs (struct inf *inf)
987 {
988   thread_array_t threads;
989   mach_msg_type_number_t num_threads, i;
990   struct proc *task = inf->task;
991 
992   /* If no threads are currently running, this function will guarantee that
993      things are up to date.  The exception is if there are zero threads --
994      then it is almost certainly in an odd state, and probably some outside
995      agent will create threads.  */
996   inf->threads_up_to_date = inf->threads ? !inf->running : 0;
997 
998   if (task)
999     {
1000       kern_return_t err = task_threads (task->port, &threads, &num_threads);
1001 
1002       inf_debug (inf, "fetching threads");
1003       if (err)
1004 	/* TASK must be dead.  */
1005 	{
1006 	  task->dead = 1;
1007 	  task = 0;
1008 	}
1009     }
1010 
1011   if (!task)
1012     {
1013       num_threads = 0;
1014       inf_debug (inf, "no task");
1015     }
1016 
1017   {
1018     /* Make things normally linear.  */
1019     mach_msg_type_number_t search_start = 0;
1020     /* Which thread in PROCS corresponds to each task thread, & the task.  */
1021     struct proc *matched[num_threads + 1];
1022     /* The last thread in INF->threads, so we can add to the end.  */
1023     struct proc *last = 0;
1024     /* The current thread we're considering.  */
1025     struct proc *thread = inf->threads;
1026 
1027     memset (matched, 0, sizeof (matched));
1028 
1029     while (thread)
1030       {
1031 	mach_msg_type_number_t left;
1032 
1033 	for (i = search_start, left = num_threads; left; i++, left--)
1034 	  {
1035 	    if (i >= num_threads)
1036 	      i -= num_threads;	/* I wrapped around.  */
1037 	    if (thread->port == threads[i])
1038 	      /* We already know about this thread.  */
1039 	      {
1040 		matched[i] = thread;
1041 		last = thread;
1042 		thread = thread->next;
1043 		search_start++;
1044 		break;
1045 	      }
1046 	  }
1047 
1048 	if (!left)
1049 	  {
1050 	    proc_debug (thread, "died!");
1051 	    thread->port = MACH_PORT_NULL;
1052 	    thread = _proc_free (thread);	/* THREAD is dead.  */
1053 	    if (last)
1054 	      last->next = thread;
1055 	    else
1056 	      inf->threads = thread;
1057 	  }
1058       }
1059 
1060     for (i = 0; i < num_threads; i++)
1061       {
1062 	if (matched[i])
1063 	  /* Throw away the duplicate send right.  */
1064 	  mach_port_deallocate (mach_task_self (), threads[i]);
1065 	else
1066 	  /* THREADS[I] is a thread we don't know about yet!  */
1067 	  {
1068 	    ptid_t ptid;
1069 
1070 	    thread = make_proc (inf, threads[i], next_thread_id++);
1071 	    if (last)
1072 	      last->next = thread;
1073 	    else
1074 	      inf->threads = thread;
1075 	    last = thread;
1076 	    proc_debug (thread, "new thread: %lu", threads[i]);
1077 
1078 	    ptid = ptid_t (inf->pid, thread->tid, 0);
1079 
1080 	    /* Tell GDB's generic thread code.  */
1081 
1082 	    if (inferior_ptid == ptid_t (inf->pid))
1083 	      /* This is the first time we're hearing about thread
1084 		 ids, after a fork-child.  */
1085 	      thread_change_ptid (this, inferior_ptid, ptid);
1086 	    else if (inf->pending_execs != 0)
1087 	      /* This is a shell thread.  */
1088 	      add_thread_silent (this, ptid);
1089 	    else
1090 	      add_thread (this, ptid);
1091 	  }
1092       }
1093 
1094     vm_deallocate (mach_task_self (),
1095 		   (vm_address_t) threads, (num_threads * sizeof (thread_t)));
1096   }
1097 }
1098 
1099 
1100 /* Makes sure that INF's thread list is synced with the actual process.  */
1101 int
1102 inf_update_procs (struct inf *inf)
1103 {
1104   if (!inf->task)
1105     return 0;
1106   if (!inf->threads_up_to_date)
1107     gnu_target->inf_validate_procs (inf);
1108   return !!inf->task;
1109 }
1110 
1111 /* Sets the resume_sc of each thread in inf.  That of RUN_THREAD is set to 0,
1112    and others are set to their run_sc if RUN_OTHERS is true, and otherwise
1113    their pause_sc.  */
1114 void
1115 gnu_nat_target::inf_set_threads_resume_sc (struct inf *inf,
1116 					   struct proc *run_thread, int run_others)
1117 {
1118   struct proc *thread;
1119 
1120   inf_update_procs (inf);
1121   for (thread = inf->threads; thread; thread = thread->next)
1122     if (thread == run_thread)
1123       thread->resume_sc = 0;
1124     else if (run_others)
1125       thread->resume_sc = thread->run_sc;
1126     else
1127       thread->resume_sc = thread->pause_sc;
1128 }
1129 
1130 
1131 /* Cause INF to continue execution immediately; individual threads may still
1132    be suspended (but their suspend counts will be updated).  */
1133 void
1134 gnu_nat_target::inf_resume (struct inf *inf)
1135 {
1136   struct proc *thread;
1137 
1138   inf_update_procs (inf);
1139 
1140   for (thread = inf->threads; thread; thread = thread->next)
1141     thread->sc = thread->resume_sc;
1142 
1143   if (inf->task)
1144     {
1145       if (!inf->pending_execs)
1146 	/* Try to make sure our task count is correct -- in the case where
1147 	   we're waiting for an exec though, things are too volatile, so just
1148 	   assume things will be reasonable (which they usually will be).  */
1149 	inf_validate_task_sc (inf);
1150       inf->task->sc = 0;
1151     }
1152 
1153   inf_update_suspends (inf);
1154 }
1155 
1156 /* Cause INF to stop execution immediately; individual threads may still
1157    be running.  */
1158 void
1159 gnu_nat_target::inf_suspend (struct inf *inf)
1160 {
1161   struct proc *thread;
1162 
1163   inf_update_procs (inf);
1164 
1165   for (thread = inf->threads; thread; thread = thread->next)
1166     thread->sc = thread->pause_sc;
1167 
1168   if (inf->task)
1169     inf->task->sc = inf->pause_sc;
1170 
1171   inf_update_suspends (inf);
1172 }
1173 
1174 
1175 /* INF has one thread PROC that is in single-stepping mode.  This
1176    function changes it to be PROC, changing any old step_thread to be
1177    a normal one.  A PROC of 0 clears any existing value.  */
1178 void
1179 gnu_nat_target::inf_set_step_thread (struct inf *inf, struct proc *thread)
1180 {
1181   gdb_assert (!thread || proc_is_thread (thread));
1182 
1183   if (thread)
1184     inf_debug (inf, "setting step thread: %d/%d", inf->pid, thread->tid);
1185   else
1186     inf_debug (inf, "clearing step thread");
1187 
1188   if (inf->step_thread != thread)
1189     {
1190       if (inf->step_thread && inf->step_thread->port != MACH_PORT_NULL)
1191 	if (!proc_trace (inf->step_thread, 0))
1192 	  return;
1193       if (thread && proc_trace (thread, 1))
1194 	inf->step_thread = thread;
1195       else
1196 	inf->step_thread = 0;
1197     }
1198 }
1199 
1200 
1201 /* Set up the thread resume_sc's so that only the signal thread is running
1202    (plus whatever other thread are set to always run).  Returns true if we
1203    did so, or false if we can't find a signal thread.  */
1204 int
1205 gnu_nat_target::inf_set_threads_resume_sc_for_signal_thread (struct inf *inf)
1206 {
1207   if (inf->signal_thread)
1208     {
1209       inf_set_threads_resume_sc (inf, inf->signal_thread, 0);
1210       return 1;
1211     }
1212   else
1213     return 0;
1214 }
1215 
1216 static void
1217 inf_update_signal_thread (struct inf *inf)
1218 {
1219   /* XXX for now we assume that if there's a msgport, the 2nd thread is
1220      the signal thread.  */
1221   inf->signal_thread = inf->threads ? inf->threads->next : 0;
1222 }
1223 
1224 
1225 /* Detachs from INF's inferior task, letting it run once again...  */
1226 void
1227 gnu_nat_target::inf_detach (struct inf *inf)
1228 {
1229   struct proc *task = inf->task;
1230 
1231   inf_debug (inf, "detaching...");
1232 
1233   inf_clear_wait (inf);
1234   inf_set_step_thread (inf, 0);
1235 
1236   if (task)
1237     {
1238       struct proc *thread;
1239 
1240       inf_validate_procinfo (inf);
1241 
1242       inf_set_traced (inf, 0);
1243       if (inf->stopped)
1244 	{
1245 	  if (inf->nomsg)
1246 	    inf_continue (inf);
1247 	  else
1248 	    inf_signal (inf, GDB_SIGNAL_0);
1249 	}
1250 
1251       proc_restore_exc_port (task);
1252       task->sc = inf->detach_sc;
1253 
1254       for (thread = inf->threads; thread; thread = thread->next)
1255 	{
1256 	  proc_restore_exc_port (thread);
1257 	  thread->sc = thread->detach_sc;
1258 	}
1259 
1260       inf_update_suspends (inf);
1261     }
1262 
1263   inf_cleanup (inf);
1264 }
1265 
1266 /* Attaches INF to the process with process id PID, returning it in a
1267    suspended state suitable for debugging.  */
1268 void
1269 gnu_nat_target::inf_attach (struct inf *inf, int pid)
1270 {
1271   inf_debug (inf, "attaching: %d", pid);
1272 
1273   if (inf->pid)
1274     inf_detach (inf);
1275 
1276   inf_startup (inf, pid);
1277 }
1278 
1279 
1280 /* Makes sure that we've got our exception ports entrenched in the process.  */
1281 void
1282 gnu_nat_target::inf_steal_exc_ports (struct inf *inf)
1283 {
1284   struct proc *thread;
1285 
1286   inf_debug (inf, "stealing exception ports");
1287 
1288   inf_set_step_thread (inf, 0);	/* The step thread is special.  */
1289 
1290   proc_steal_exc_port (inf->task, inf->event_port);
1291   for (thread = inf->threads; thread; thread = thread->next)
1292     proc_steal_exc_port (thread, MACH_PORT_NULL);
1293 }
1294 
1295 /* Makes sure the process has its own exception ports.  */
1296 void
1297 gnu_nat_target::inf_restore_exc_ports (struct inf *inf)
1298 {
1299   struct proc *thread;
1300 
1301   inf_debug (inf, "restoring exception ports");
1302 
1303   inf_set_step_thread (inf, 0);	/* The step thread is special.  */
1304 
1305   proc_restore_exc_port (inf->task);
1306   for (thread = inf->threads; thread; thread = thread->next)
1307     proc_restore_exc_port (thread);
1308 }
1309 
1310 
1311 /* Deliver signal SIG to INF.  If INF is stopped, delivering a signal, even
1312    signal 0, will continue it.  INF is assumed to be in a paused state, and
1313    the resume_sc's of INF's threads may be affected.  */
1314 void
1315 gnu_nat_target::inf_signal (struct inf *inf, enum gdb_signal sig)
1316 {
1317   kern_return_t err = 0;
1318   int host_sig = gdb_signal_to_host (sig);
1319 
1320 #define NAME gdb_signal_to_name (sig)
1321 
1322   if (host_sig >= _NSIG)
1323     /* A mach exception.  Exceptions are encoded in the signal space by
1324        putting them after _NSIG; this assumes they're positive (and not
1325        extremely large)!  */
1326     {
1327       struct inf_wait *w = &inf->wait;
1328 
1329       if (w->status.kind () == TARGET_WAITKIND_STOPPED
1330 	  && w->status.sig () == sig
1331 	  && w->thread && !w->thread->aborted)
1332 	/* We're passing through the last exception we received.  This is
1333 	   kind of bogus, because exceptions are per-thread whereas gdb
1334 	   treats signals as per-process.  We just forward the exception to
1335 	   the correct handler, even it's not for the same thread as TID --
1336 	   i.e., we pretend it's global.  */
1337 	{
1338 	  struct exc_state *e = &w->exc;
1339 
1340 	  inf_debug (inf, "passing through exception:"
1341 		     " task = %lu, thread = %lu, exc = %d"
1342 		     ", code = %d, subcode = %d",
1343 		     w->thread->port, inf->task->port,
1344 		     e->exception, e->code, e->subcode);
1345 	  err =
1346 	    exception_raise_request (e->handler,
1347 				     e->reply, MACH_MSG_TYPE_MOVE_SEND_ONCE,
1348 				     w->thread->port, inf->task->port,
1349 				     e->exception, e->code, e->subcode);
1350 	}
1351       else
1352 	error (_("Can't forward spontaneous exception (%s)."), NAME);
1353     }
1354   else
1355     /* A Unix signal.  */
1356   if (inf->stopped)
1357     /* The process is stopped and expecting a signal.  Just send off a
1358        request and let it get handled when we resume everything.  */
1359     {
1360       inf_debug (inf, "sending %s to stopped process", NAME);
1361       err =
1362 	INF_MSGPORT_RPC (inf,
1363 			 msg_sig_post_untraced_request (msgport,
1364 							inf->event_port,
1365 					       MACH_MSG_TYPE_MAKE_SEND_ONCE,
1366 							host_sig, 0,
1367 							refport));
1368       if (!err)
1369 	/* Posting an untraced signal automatically continues it.
1370 	   We clear this here rather than when we get the reply
1371 	   because we'd rather assume it's not stopped when it
1372 	   actually is, than the reverse.  */
1373 	inf->stopped = 0;
1374     }
1375   else
1376     /* It's not expecting it.  We have to let just the signal thread
1377        run, and wait for it to get into a reasonable state before we
1378        can continue the rest of the process.  When we finally resume the
1379        process the signal we request will be the very first thing that
1380        happens.  */
1381     {
1382       inf_debug (inf, "sending %s to unstopped process"
1383 		 " (so resuming signal thread)", NAME);
1384       err =
1385 	INF_RESUME_MSGPORT_RPC (inf,
1386 				msg_sig_post_untraced (msgport, host_sig,
1387 						       0, refport));
1388     }
1389 
1390   if (err == EIEIO)
1391     /* Can't do too much...  */
1392     warning (_("Can't deliver signal %s: No signal thread."), NAME);
1393   else if (err)
1394     warning (_("Delivering signal %s: %s"), NAME, safe_strerror (err));
1395 
1396 #undef NAME
1397 }
1398 
1399 
1400 /* Continue INF without delivering a signal.  This is meant to be used
1401    when INF does not have a message port.  */
1402 void
1403 gnu_nat_target::inf_continue (struct inf *inf)
1404 {
1405   process_t proc;
1406   kern_return_t err = proc_pid2proc (proc_server, inf->pid, &proc);
1407 
1408   if (!err)
1409     {
1410       inf_debug (inf, "continuing process");
1411 
1412       err = proc_mark_cont (proc);
1413       if (!err)
1414 	{
1415 	  struct proc *thread;
1416 
1417 	  for (thread = inf->threads; thread; thread = thread->next)
1418 	    thread_resume (thread->port);
1419 
1420 	  inf->stopped = 0;
1421 	}
1422     }
1423 
1424   if (err)
1425     warning (_("Can't continue process: %s"), safe_strerror (err));
1426 }
1427 
1428 
1429 /* The inferior used for all gdb target ops.  */
1430 struct inf *gnu_current_inf = 0;
1431 
1432 /* The inferior being waited for by gnu_wait.  Since GDB is decidely not
1433    multi-threaded, we don't bother to lock this.  */
1434 static struct inf *waiting_inf;
1435 
1436 /* Wait for something to happen in the inferior, returning what in STATUS.  */
1437 
1438 ptid_t
1439 gnu_nat_target::wait (ptid_t ptid, struct target_waitstatus *status,
1440 		      target_wait_flags options)
1441 {
1442   struct msg
1443     {
1444       mach_msg_header_t hdr;
1445       mach_msg_type_t type;
1446       int data[8000];
1447     } msg;
1448   kern_return_t err;
1449   struct proc *thread;
1450   struct inf *inf = gnu_current_inf;
1451 
1452   gdb_assert (inf->task);
1453 
1454   if (!inf->threads && !inf->pending_execs)
1455     /* No threads!  Assume that maybe some outside agency is frobbing our
1456        task, and really look for new threads.  If we can't find any, just tell
1457        the user to try again later.  */
1458     {
1459       inf_validate_procs (inf);
1460       if (!inf->threads && !inf->task->dead)
1461 	error (_("There are no threads; try again later."));
1462     }
1463 
1464   waiting_inf = inf;
1465 
1466   inf_debug (inf, "waiting for: %s", ptid.to_string ().c_str ());
1467 
1468 rewait:
1469   if (proc_wait_pid != inf->pid && !inf->no_wait)
1470     /* Always get information on events from the proc server.  */
1471     {
1472       inf_debug (inf, "requesting wait on pid %d", inf->pid);
1473 
1474       if (proc_wait_pid)
1475 	/* The proc server is single-threaded, and only allows a single
1476 	   outstanding wait request, so we have to cancel the previous one.  */
1477 	{
1478 	  inf_debug (inf, "cancelling previous wait on pid %d", proc_wait_pid);
1479 	  interrupt_operation (proc_server, 0);
1480 	}
1481 
1482       err =
1483 	proc_wait_request (proc_server, inf->event_port, inf->pid, WUNTRACED);
1484       if (err)
1485 	warning (_("wait request failed: %s"), safe_strerror (err));
1486       else
1487 	{
1488 	  inf_debug (inf, "waits pending: %d", proc_waits_pending);
1489 	  proc_wait_pid = inf->pid;
1490 	  /* Even if proc_waits_pending was > 0 before, we still won't
1491 	     get any other replies, because it was either from a
1492 	     different INF, or a different process attached to INF --
1493 	     and the event port, which is the wait reply port, changes
1494 	     when you switch processes.  */
1495 	  proc_waits_pending = 1;
1496 	}
1497     }
1498 
1499   inf_clear_wait (inf);
1500 
1501   /* What can happen? (1) Dead name notification; (2) Exceptions arrive;
1502      (3) wait reply from the proc server.  */
1503 
1504   inf_debug (inf, "waiting for an event...");
1505   err = mach_msg (&msg.hdr, MACH_RCV_MSG | MACH_RCV_INTERRUPT,
1506 		  0, sizeof (struct msg), inf->event_port,
1507 		  MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
1508 
1509   /* Re-suspend the task.  */
1510   inf_suspend (inf);
1511 
1512   if (!inf->task && inf->pending_execs)
1513     /* When doing an exec, it's possible that the old task wasn't reused
1514        (e.g., setuid execs).  So if the task seems to have disappeared,
1515        attempt to refetch it, as the pid should still be the same.  */
1516     inf_set_pid (inf, inf->pid);
1517 
1518   if (err == EMACH_RCV_INTERRUPTED)
1519     inf_debug (inf, "interrupted");
1520   else if (err)
1521     error (_("Couldn't wait for an event: %s"), safe_strerror (err));
1522   else
1523     {
1524       struct
1525 	{
1526 	  mach_msg_header_t hdr;
1527 	  mach_msg_type_t err_type;
1528 	  kern_return_t err;
1529 	  char noise[200];
1530 	}
1531       reply;
1532 
1533       inf_debug (inf, "event: msgid = %d", msg.hdr.msgh_id);
1534 
1535       /* Handle what we got.  */
1536       if (!notify_server (&msg.hdr, &reply.hdr)
1537 	  && !exc_server (&msg.hdr, &reply.hdr)
1538 	  && !process_reply_server (&msg.hdr, &reply.hdr)
1539 	  && !msg_reply_server (&msg.hdr, &reply.hdr))
1540 	/* Whatever it is, it's something strange.  */
1541 	error (_("Got a strange event, msg id = %d."), msg.hdr.msgh_id);
1542 
1543       if (reply.err)
1544 	error (_("Handling event, msgid = %d: %s"),
1545 	       msg.hdr.msgh_id, safe_strerror (reply.err));
1546     }
1547 
1548   if (inf->pending_execs)
1549     /* We're waiting for the inferior to finish execing.  */
1550     {
1551       struct inf_wait *w = &inf->wait;
1552       enum target_waitkind kind = w->status.kind ();
1553 
1554       if (kind == TARGET_WAITKIND_SPURIOUS)
1555 	/* Since gdb is actually counting the number of times the inferior
1556 	   stops, expecting one stop per exec, we only return major events
1557 	   while execing.  */
1558 	{
1559 	  w->suppress = 1;
1560 	  inf_debug (inf, "pending_execs, ignoring minor event");
1561 	}
1562       else if (kind == TARGET_WAITKIND_STOPPED
1563 	       && w->status.sig () == GDB_SIGNAL_TRAP)
1564 	/* Ah hah!  A SIGTRAP from the inferior while starting up probably
1565 	   means we've succesfully completed an exec!  */
1566 	{
1567 	  inf_debug (inf, "one pending exec completed");
1568 	}
1569       else if (kind == TARGET_WAITKIND_STOPPED)
1570 	/* It's possible that this signal is because of a crashed process
1571 	   being handled by the hurd crash server; in this case, the process
1572 	   will have an extra task suspend, which we need to know about.
1573 	   Since the code in inf_resume that normally checks for this is
1574 	   disabled while INF->pending_execs, we do the check here instead.  */
1575 	inf_validate_task_sc (inf);
1576     }
1577 
1578   if (inf->wait.suppress)
1579     /* Some totally spurious event happened that we don't consider
1580        worth returning to gdb.  Just keep waiting.  */
1581     {
1582       inf_debug (inf, "suppressing return, rewaiting...");
1583       inf_resume (inf);
1584       goto rewait;
1585     }
1586 
1587   /* Pass back out our results.  */
1588   *status = inf->wait.status;
1589 
1590   thread = inf->wait.thread;
1591   if (thread)
1592     ptid = ptid_t (inf->pid, thread->tid, 0);
1593   else if (ptid == minus_one_ptid)
1594     thread = inf_tid_to_thread (inf, -1);
1595   else
1596     thread = inf_tid_to_thread (inf, ptid.lwp ());
1597 
1598   if (!thread || thread->port == MACH_PORT_NULL)
1599     {
1600       /* TID is dead; try and find a new thread.  */
1601       if (inf_update_procs (inf) && inf->threads)
1602 	ptid = ptid_t (inf->pid, inf->threads->tid, 0); /* The first
1603 							       available
1604 							       thread.  */
1605       else
1606 	{
1607 	  /* The process exited. */
1608 	  ptid = ptid_t (inf->pid);
1609 	}
1610     }
1611 
1612   if (thread
1613       && ptid != minus_one_ptid
1614       && status->kind () != TARGET_WAITKIND_SPURIOUS
1615       && inf->pause_sc == 0 && thread->pause_sc == 0)
1616     /* If something actually happened to THREAD, make sure we
1617        suspend it.  */
1618     {
1619       thread->sc = 1;
1620       inf_update_suspends (inf);
1621     }
1622 
1623   inf_debug (inf, "returning ptid = %s, %s",
1624 	     ptid.to_string ().c_str (),
1625 	     status->to_string ().c_str ());
1626 
1627   return ptid;
1628 }
1629 
1630 
1631 /* The rpc handler called by exc_server.  */
1632 kern_return_t
1633 S_exception_raise_request (mach_port_t port, mach_port_t reply_port,
1634 			   thread_t thread_port, task_t task_port,
1635 			   int exception, int code, int subcode)
1636 {
1637   struct inf *inf = waiting_inf;
1638   struct proc *thread = inf_port_to_thread (inf, thread_port);
1639 
1640   inf_debug (waiting_inf,
1641 	     "thread = %lu, task = %lu, exc = %d, code = %d, subcode = %d",
1642 	     thread_port, task_port, exception, code, subcode);
1643 
1644   if (!thread)
1645     /* We don't know about thread?  */
1646     {
1647       inf_update_procs (inf);
1648       thread = inf_port_to_thread (inf, thread_port);
1649       if (!thread)
1650 	/* Give up, the generating thread is gone.  */
1651 	return 0;
1652     }
1653 
1654   mach_port_deallocate (mach_task_self (), thread_port);
1655   mach_port_deallocate (mach_task_self (), task_port);
1656 
1657   if (!thread->aborted)
1658     /* THREAD hasn't been aborted since this exception happened (abortion
1659        clears any exception state), so it must be real.  */
1660     {
1661       /* Store away the details; this will destroy any previous info.  */
1662       inf->wait.thread = thread;
1663 
1664       if (exception == EXC_BREAKPOINT)
1665 	/* GDB likes to get SIGTRAP for breakpoints.  */
1666 	{
1667 	  inf->wait.status.set_stopped (GDB_SIGNAL_TRAP);
1668 	  mach_port_deallocate (mach_task_self (), reply_port);
1669 	}
1670       else
1671 	/* Record the exception so that we can forward it later.  */
1672 	{
1673 	  if (thread->exc_port == port)
1674 	    {
1675 	      inf_debug (waiting_inf, "Handler is thread exception port <%lu>",
1676 			 thread->saved_exc_port);
1677 	      inf->wait.exc.handler = thread->saved_exc_port;
1678 	    }
1679 	  else
1680 	    {
1681 	      inf_debug (waiting_inf, "Handler is task exception port <%lu>",
1682 			 inf->task->saved_exc_port);
1683 	      inf->wait.exc.handler = inf->task->saved_exc_port;
1684 	      gdb_assert (inf->task->exc_port == port);
1685 	    }
1686 	  if (inf->wait.exc.handler != MACH_PORT_NULL)
1687 	    /* Add a reference to the exception handler.  */
1688 	    mach_port_mod_refs (mach_task_self (),
1689 				inf->wait.exc.handler, MACH_PORT_RIGHT_SEND,
1690 				1);
1691 
1692 	  inf->wait.exc.exception = exception;
1693 	  inf->wait.exc.code = code;
1694 	  inf->wait.exc.subcode = subcode;
1695 	  inf->wait.exc.reply = reply_port;
1696 
1697 	  /* Exceptions are encoded in the signal space by putting
1698 	     them after _NSIG; this assumes they're positive (and not
1699 	     extremely large)!  */
1700 	  inf->wait.status.set_stopped
1701 	    (gdb_signal_from_host (_NSIG + exception));
1702 	}
1703     }
1704   else
1705     /* A suppressed exception, which ignore.  */
1706     {
1707       inf->wait.suppress = 1;
1708       mach_port_deallocate (mach_task_self (), reply_port);
1709     }
1710 
1711   return 0;
1712 }
1713 
1714 
1715 /* Fill in INF's wait field after a task has died without giving us more
1716    detailed information.  */
1717 static void
1718 inf_task_died_status (struct inf *inf)
1719 {
1720   warning (_("Pid %d died with unknown exit status, using SIGKILL."),
1721 	   inf->pid);
1722   inf->wait.status.set_signalled (GDB_SIGNAL_KILL);
1723 }
1724 
1725 /* Notify server routines.  The only real one is dead name notification.  */
1726 kern_return_t
1727 do_mach_notify_dead_name (mach_port_t notify, mach_port_t dead_port)
1728 {
1729   struct inf *inf = waiting_inf;
1730 
1731   inf_debug (waiting_inf, "port = %lu", dead_port);
1732 
1733   if (inf->task && inf->task->port == dead_port)
1734     {
1735       proc_debug (inf->task, "is dead");
1736       inf->task->port = MACH_PORT_NULL;
1737       if (proc_wait_pid == inf->pid)
1738 	/* We have a wait outstanding on the process, which will return more
1739 	   detailed information, so delay until we get that.  */
1740 	inf->wait.suppress = 1;
1741       else
1742 	/* We never waited for the process (maybe it wasn't a child), so just
1743 	   pretend it got a SIGKILL.  */
1744 	inf_task_died_status (inf);
1745     }
1746   else
1747     {
1748       struct proc *thread = inf_port_to_thread (inf, dead_port);
1749 
1750       if (thread)
1751 	{
1752 	  proc_debug (thread, "is dead");
1753 	  thread->port = MACH_PORT_NULL;
1754 	}
1755 
1756       if (inf->task->dead)
1757 	/* Since the task is dead, its threads are dying with it.  */
1758 	inf->wait.suppress = 1;
1759     }
1760 
1761   mach_port_deallocate (mach_task_self (), dead_port);
1762   inf->threads_up_to_date = 0;	/* Just in case.  */
1763 
1764   return 0;
1765 }
1766 
1767 
1768 #define ILL_RPC(fun, ...) \
1769   extern "C" kern_return_t fun (__VA_ARGS__); \
1770   kern_return_t fun (__VA_ARGS__) \
1771   { \
1772     warning (_("illegal rpc: %s"), #fun); \
1773     return 0; \
1774   }
1775 
1776 ILL_RPC (do_mach_notify_no_senders,
1777 	 mach_port_t notify, mach_port_mscount_t count)
1778 ILL_RPC (do_mach_notify_port_deleted,
1779 	 mach_port_t notify, mach_port_t name)
1780 ILL_RPC (do_mach_notify_msg_accepted,
1781 	 mach_port_t notify, mach_port_t name)
1782 ILL_RPC (do_mach_notify_port_destroyed,
1783 	 mach_port_t notify, mach_port_t name)
1784 ILL_RPC (do_mach_notify_send_once,
1785 	 mach_port_t notify)
1786 
1787 /* Process_reply server routines.  We only use process_wait_reply.  */
1788 
1789 kern_return_t
1790 S_proc_wait_reply (mach_port_t reply, kern_return_t err,
1791 		   int status, int sigcode, rusage_t rusage, pid_t pid)
1792 {
1793   struct inf *inf = waiting_inf;
1794 
1795   inf_debug (inf, "err = %s, pid = %d, status = 0x%x, sigcode = %d",
1796 	     err ? safe_strerror (err) : "0", pid, status, sigcode);
1797 
1798   if (err && proc_wait_pid && (!inf->task || !inf->task->port))
1799     /* Ack.  The task has died, but the task-died notification code didn't
1800        tell anyone because it thought a more detailed reply from the
1801        procserver was forthcoming.  However, we now learn that won't
1802        happen...  So we have to act like the task just died, and this time,
1803        tell the world.  */
1804     inf_task_died_status (inf);
1805 
1806   if (--proc_waits_pending == 0)
1807     /* PROC_WAIT_PID represents the most recent wait.  We will always get
1808        replies in order because the proc server is single threaded.  */
1809     proc_wait_pid = 0;
1810 
1811   inf_debug (inf, "waits pending now: %d", proc_waits_pending);
1812 
1813   if (err)
1814     {
1815       if (err != EINTR)
1816 	{
1817 	  warning (_("Can't wait for pid %d: %s"),
1818 		   inf->pid, safe_strerror (err));
1819 	  inf->no_wait = 1;
1820 
1821 	  /* Since we can't see the inferior's signals, don't trap them.  */
1822 	  gnu_target->inf_set_traced (inf, 0);
1823 	}
1824     }
1825   else if (pid == inf->pid)
1826     {
1827       inf->wait.status = host_status_to_waitstatus (status);
1828       if (inf->wait.status.kind () == TARGET_WAITKIND_STOPPED)
1829 	/* The process has sent us a signal, and stopped itself in a sane
1830 	   state pending our actions.  */
1831 	{
1832 	  inf_debug (inf, "process has stopped itself");
1833 	  inf->stopped = 1;
1834 	}
1835     }
1836   else
1837     inf->wait.suppress = 1;	/* Something odd happened.  Ignore.  */
1838 
1839   return 0;
1840 }
1841 
1842 ILL_RPC (S_proc_setmsgport_reply,
1843 	 mach_port_t reply_port, kern_return_t return_code,
1844 	 mach_port_t oldmsgport)
1845 ILL_RPC (S_proc_getmsgport_reply,
1846 	 mach_port_t reply_port, kern_return_t return_code,
1847 	 mach_port_t msgports, mach_msg_type_name_t msgportsPoly)
1848 ILL_RPC (S_proc_pid2task_reply,
1849 	 mach_port_t reply_port, kern_return_t return_code, mach_port_t task)
1850 ILL_RPC (S_proc_task2pid_reply,
1851 	 mach_port_t reply_port, kern_return_t return_code, pid_t pid)
1852 ILL_RPC (S_proc_task2proc_reply,
1853 	 mach_port_t reply_port, kern_return_t return_code,
1854 	 mach_port_t proc, mach_msg_type_name_t procPoly)
1855 ILL_RPC (S_proc_proc2task_reply,
1856 	 mach_port_t reply_port, kern_return_t return_code, mach_port_t task)
1857 ILL_RPC (S_proc_pid2proc_reply,
1858 	 mach_port_t reply_port, kern_return_t return_code,
1859 	 mach_port_t proc, mach_msg_type_name_t procPoly)
1860 ILL_RPC (S_proc_getprocinfo_reply,
1861 	 mach_port_t reply_port, kern_return_t return_code,
1862 	 int flags, const_procinfo_t procinfo, mach_msg_type_number_t procinfoCnt,
1863 	 const_data_t threadwaits, mach_msg_type_number_t threadwaitsCnt)
1864 ILL_RPC (S_proc_getprocargs_reply,
1865 	 mach_port_t reply_port, kern_return_t return_code,
1866 	 const_data_t procargs, mach_msg_type_number_t procargsCnt)
1867 ILL_RPC (S_proc_getprocenv_reply,
1868 	 mach_port_t reply_port, kern_return_t return_code,
1869 	 const_data_t procenv, mach_msg_type_number_t procenvCnt)
1870 ILL_RPC (S_proc_getloginid_reply,
1871 	 mach_port_t reply_port, kern_return_t return_code, pid_t login_id)
1872 ILL_RPC (S_proc_getloginpids_reply,
1873 	 mach_port_t reply_port, kern_return_t return_code,
1874 	 const_pidarray_t pids, mach_msg_type_number_t pidsCnt)
1875 ILL_RPC (S_proc_getlogin_reply,
1876 	 mach_port_t reply_port, kern_return_t return_code, const_string_t logname)
1877 ILL_RPC (S_proc_getsid_reply,
1878 	 mach_port_t reply_port, kern_return_t return_code, pid_t sid)
1879 ILL_RPC (S_proc_getsessionpgids_reply,
1880 	 mach_port_t reply_port, kern_return_t return_code,
1881 	 const_pidarray_t pgidset, mach_msg_type_number_t pgidsetCnt)
1882 ILL_RPC (S_proc_getsessionpids_reply,
1883 	 mach_port_t reply_port, kern_return_t return_code,
1884 	 const_pidarray_t pidset, mach_msg_type_number_t pidsetCnt)
1885 ILL_RPC (S_proc_getsidport_reply,
1886 	 mach_port_t reply_port, kern_return_t return_code,
1887 	 mach_port_t sessport)
1888 ILL_RPC (S_proc_getpgrp_reply,
1889 	 mach_port_t reply_port, kern_return_t return_code, pid_t pgrp)
1890 ILL_RPC (S_proc_getpgrppids_reply,
1891 	 mach_port_t reply_port, kern_return_t return_code,
1892 	 const_pidarray_t pidset, mach_msg_type_number_t pidsetCnt)
1893 ILL_RPC (S_proc_get_tty_reply,
1894 	 mach_port_t reply_port, kern_return_t return_code, mach_port_t tty)
1895 ILL_RPC (S_proc_getnports_reply,
1896 	 mach_port_t reply_port, kern_return_t return_code,
1897 	 mach_msg_type_number_t nports)
1898 ILL_RPC (S_proc_is_important_reply,
1899 	 mach_port_t reply_port, kern_return_t return_code,
1900 	 boolean_t essential)
1901 ILL_RPC (S_proc_get_code_reply,
1902 	 mach_port_t reply_port, kern_return_t return_code,
1903 	 vm_address_t start_code, vm_address_t end_code)
1904 
1905 /* Msg_reply server routines.  We only use msg_sig_post_untraced_reply.  */
1906 
1907 kern_return_t
1908 S_msg_sig_post_untraced_reply (mach_port_t reply, kern_return_t err)
1909 {
1910   struct inf *inf = waiting_inf;
1911 
1912   if (err == EBUSY)
1913     /* EBUSY is what we get when the crash server has grabbed control of the
1914        process and doesn't like what signal we tried to send it.  Just act
1915        like the process stopped (using a signal of 0 should mean that the
1916        *next* time the user continues, it will pass signal 0, which the crash
1917        server should like).  */
1918     inf->wait.status.set_stopped (GDB_SIGNAL_0);
1919   else if (err)
1920     warning (_("Signal delivery failed: %s"), safe_strerror (err));
1921 
1922   if (err)
1923     /* We only get this reply when we've posted a signal to a process which we
1924        thought was stopped, and which we expected to continue after the signal.
1925        Given that the signal has failed for some reason, it's reasonable to
1926        assume it's still stopped.  */
1927     inf->stopped = 1;
1928   else
1929     inf->wait.suppress = 1;
1930 
1931   return 0;
1932 }
1933 
1934 ILL_RPC (S_msg_sig_post_reply,
1935 	 mach_port_t reply, kern_return_t err)
1936 
1937 /* Returns the number of messages queued for the receive right PORT.  */
1938 static mach_port_msgcount_t
1939 port_msgs_queued (mach_port_t port)
1940 {
1941   struct mach_port_status status;
1942   kern_return_t err =
1943     mach_port_get_receive_status (mach_task_self (), port, &status);
1944 
1945   if (err)
1946     return 0;
1947   else
1948     return status.mps_msgcount;
1949 }
1950 
1951 
1952 /* Resume execution of the inferior process.
1953 
1954    If STEP is nonzero, single-step it.
1955    If SIGNAL is nonzero, give it that signal.
1956 
1957    TID  STEP:
1958    -1   true   Single step the current thread allowing other threads to run.
1959    -1   false  Continue the current thread allowing other threads to run.
1960    X    true   Single step the given thread, don't allow any others to run.
1961    X    false  Continue the given thread, do not allow any others to run.
1962    (Where X, of course, is anything except -1)
1963 
1964    Note that a resume may not `take' if there are pending exceptions/&c
1965    still unprocessed from the last resume we did (any given resume may result
1966    in multiple events returned by wait).  */
1967 
1968 void
1969 gnu_nat_target::resume (ptid_t ptid, int step, enum gdb_signal sig)
1970 {
1971   struct proc *step_thread = 0;
1972   int resume_all;
1973   struct inf *inf = gnu_current_inf;
1974 
1975   inf_debug (inf, "ptid = %s, step = %d, sig = %d",
1976 	     ptid.to_string ().c_str (), step, sig);
1977 
1978   inf_validate_procinfo (inf);
1979 
1980   if (sig != GDB_SIGNAL_0 || inf->stopped)
1981     {
1982       if (sig == GDB_SIGNAL_0 && inf->nomsg)
1983 	inf_continue (inf);
1984       else
1985 	inf_signal (inf, sig);
1986     }
1987   else if (inf->wait.exc.reply != MACH_PORT_NULL)
1988     /* We received an exception to which we have chosen not to forward, so
1989        abort the faulting thread, which will perhaps retake it.  */
1990     {
1991       proc_abort (inf->wait.thread, 1);
1992       warning (_("Aborting %s with unforwarded exception %s."),
1993 	       proc_string (inf->wait.thread),
1994 	       gdb_signal_to_name (inf->wait.status.sig ()));
1995     }
1996 
1997   if (port_msgs_queued (inf->event_port))
1998     /* If there are still messages in our event queue, don't bother resuming
1999        the process, as we're just going to stop it right away anyway.  */
2000     return;
2001 
2002   inf_update_procs (inf);
2003 
2004   /* A specific PTID means `step only this process id'.  */
2005   resume_all = ptid == minus_one_ptid;
2006 
2007   if (resume_all)
2008     /* Allow all threads to run, except perhaps single-stepping one.  */
2009     {
2010       inf_debug (inf, "running all threads; tid = %d",
2011 		 inferior_ptid.pid ());
2012       ptid = inferior_ptid;	/* What to step.  */
2013       inf_set_threads_resume_sc (inf, 0, 1);
2014     }
2015   else
2016     /* Just allow a single thread to run.  */
2017     {
2018       struct proc *thread = inf_tid_to_thread (inf, ptid.lwp ());
2019 
2020       if (!thread)
2021 	error (_("Can't run single thread id %s: no such thread!"),
2022 	       target_pid_to_str (ptid).c_str ());
2023       inf_debug (inf, "running one thread: %s",
2024 		 ptid.to_string ().c_str ());
2025       inf_set_threads_resume_sc (inf, thread, 0);
2026     }
2027 
2028   if (step)
2029     {
2030       step_thread = inf_tid_to_thread (inf, ptid.lwp ());
2031       if (!step_thread)
2032 	warning (_("Can't step thread id %s: no such thread."),
2033 		 target_pid_to_str (ptid).c_str ());
2034       else
2035 	inf_debug (inf, "stepping thread: %s",
2036 		   ptid.to_string ().c_str ());
2037     }
2038   if (step_thread != inf->step_thread)
2039     inf_set_step_thread (inf, step_thread);
2040 
2041   inf_debug (inf, "here we go...");
2042   inf_resume (inf);
2043 }
2044 
2045 
2046 void
2047 gnu_nat_target::kill ()
2048 {
2049   struct proc *task = gnu_current_inf->task;
2050 
2051   if (task)
2052     {
2053       proc_debug (task, "terminating...");
2054       task_terminate (task->port);
2055       inf_set_pid (gnu_current_inf, -1);
2056     }
2057   target_mourn_inferior (inferior_ptid);
2058 }
2059 
2060 /* Clean up after the inferior dies.  */
2061 void
2062 gnu_nat_target::mourn_inferior ()
2063 {
2064   inf_debug (gnu_current_inf, "rip");
2065   inf_detach (gnu_current_inf);
2066   inf_child_target::mourn_inferior ();
2067 }
2068 
2069 
2070 /* Fork an inferior process, and start debugging it.  */
2071 
2072 /* Set INFERIOR_PID to the first thread available in the child, if any.  */
2073 static int
2074 inf_pick_first_thread (void)
2075 {
2076   if (gnu_current_inf->task && gnu_current_inf->threads)
2077     /* The first thread.  */
2078     return gnu_current_inf->threads->tid;
2079   else
2080     /* What may be the next thread.  */
2081     return next_thread_id;
2082 }
2083 
2084 static struct inf *
2085 cur_inf (void)
2086 {
2087   if (!gnu_current_inf)
2088     gnu_current_inf = make_inf ();
2089   return gnu_current_inf;
2090 }
2091 
2092 static void
2093 gnu_ptrace_me (void)
2094 {
2095   /* We're in the child; make this process stop as soon as it execs.  */
2096   struct inf *inf = cur_inf ();
2097   inf_debug (inf, "tracing self");
2098   if (ptrace (PTRACE_TRACEME) != 0)
2099     trace_start_error_with_name ("ptrace");
2100 }
2101 
2102 void
2103 gnu_nat_target::create_inferior (const char *exec_file,
2104 				 const std::string &allargs,
2105 				 char **env,
2106 				 int from_tty)
2107 {
2108   struct inf *inf = cur_inf ();
2109   inferior *inferior = current_inferior ();
2110   int pid;
2111 
2112   inf_debug (inf, "creating inferior");
2113 
2114   if (!inferior->target_is_pushed (this))
2115     inferior->push_target (this);
2116 
2117   pid = fork_inferior (exec_file, allargs, env, gnu_ptrace_me,
2118 		       NULL, NULL, NULL, NULL);
2119 
2120   /* We have something that executes now.  We'll be running through
2121      the shell at this point (if startup-with-shell is true), but the
2122      pid shouldn't change.  */
2123   thread_info *thr = add_thread_silent (this, ptid_t (pid));
2124   switch_to_thread (thr);
2125 
2126   /* Attach to the now stopped child, which is actually a shell...  */
2127   inf_debug (inf, "attaching to child: %d", pid);
2128 
2129   inf_attach (inf, pid);
2130 
2131   inf->pending_execs = 1;
2132   inf->nomsg = 1;
2133   inf->traced = 1;
2134 
2135   /* Now let the child run again, knowing that it will stop
2136      immediately because of the ptrace.  */
2137   inf_resume (inf);
2138 
2139   /* We now have thread info.  */
2140   thread_change_ptid (this, inferior_ptid,
2141 		      ptid_t (inf->pid, inf_pick_first_thread (), 0));
2142 
2143   gdb_startup_inferior (pid, START_INFERIOR_TRAPS_EXPECTED);
2144 
2145   inf->pending_execs = 0;
2146   /* Get rid of the old shell threads.  */
2147   prune_threads ();
2148 
2149   inf_validate_procinfo (inf);
2150   inf_update_signal_thread (inf);
2151   inf_set_traced (inf, inf->want_signals);
2152 
2153   /* Execing the process will have trashed our exception ports; steal them
2154      back (or make sure they're restored if the user wants that).  */
2155   if (inf->want_exceptions)
2156     inf_steal_exc_ports (inf);
2157   else
2158     inf_restore_exc_ports (inf);
2159 }
2160 
2161 
2162 /* Attach to process PID, then initialize for debugging it
2163    and wait for the trace-trap that results from attaching.  */
2164 void
2165 gnu_nat_target::attach (const char *args, int from_tty)
2166 {
2167   int pid;
2168   struct inf *inf = cur_inf ();
2169   struct inferior *inferior;
2170 
2171   pid = parse_pid_to_attach (args);
2172 
2173   if (pid == getpid ())		/* Trying to masturbate?  */
2174     error (_("I refuse to debug myself!"));
2175 
2176   target_announce_attach (from_tty, pid);
2177 
2178   inf_debug (inf, "attaching to pid: %d", pid);
2179 
2180   inf_attach (inf, pid);
2181 
2182   inferior = current_inferior ();
2183   inferior->push_target (this);
2184 
2185   inferior_appeared (inferior, pid);
2186   inferior->attach_flag = true;
2187 
2188   inf_update_procs (inf);
2189 
2190   thread_info *thr
2191     = find_thread_ptid (this, ptid_t (pid, inf_pick_first_thread ()));
2192   switch_to_thread (thr);
2193 
2194   /* We have to initialize the terminal settings now, since the code
2195      below might try to restore them.  */
2196   target_terminal::init ();
2197 
2198   /* If the process was stopped before we attached, make it continue the next
2199      time the user does a continue.  */
2200   inf_validate_procinfo (inf);
2201 
2202   inf_update_signal_thread (inf);
2203   inf_set_traced (inf, inf->want_signals);
2204 
2205 #if 0				/* Do we need this?  */
2206   renumber_threads (0);		/* Give our threads reasonable names.  */
2207 #endif
2208 }
2209 
2210 
2211 /* Take a program previously attached to and detaches it.
2212    The program resumes execution and will no longer stop
2213    on signals, etc.  We'd better not have left any breakpoints
2214    in the program or it'll die when it hits one.  For this
2215    to work, it may be necessary for the process to have been
2216    previously attached.  It *might* work if the program was
2217    started via fork.  */
2218 void
2219 gnu_nat_target::detach (inferior *inf, int from_tty)
2220 {
2221   target_announce_detach (from_tty);
2222 
2223   inf_detach (gnu_current_inf);
2224 
2225   switch_to_no_thread ();
2226   detach_inferior (inf);
2227 
2228   maybe_unpush_target ();
2229 }
2230 
2231 
2232 void
2233 gnu_nat_target::stop (ptid_t ptid)
2234 {
2235   error (_("stop target function not implemented"));
2236 }
2237 
2238 bool
2239 gnu_nat_target::thread_alive (ptid_t ptid)
2240 {
2241   inf_update_procs (gnu_current_inf);
2242   return !!inf_tid_to_thread (gnu_current_inf,
2243 			      ptid.lwp ());
2244 }
2245 
2246 
2247 /* Read inferior task's LEN bytes from ADDR and copy it to MYADDR in
2248    gdb's address space.  Return 0 on failure; number of bytes read
2249    otherwise.  */
2250 static int
2251 gnu_read_inferior (task_t task, CORE_ADDR addr, gdb_byte *myaddr, int length)
2252 {
2253   kern_return_t err;
2254   vm_address_t low_address = (vm_address_t) trunc_page (addr);
2255   vm_size_t aligned_length =
2256   (vm_size_t) round_page (addr + length) - low_address;
2257   pointer_t copied;
2258   mach_msg_type_number_t copy_count;
2259 
2260   /* Get memory from inferior with page aligned addresses.  */
2261   err = vm_read (task, low_address, aligned_length, &copied, &copy_count);
2262   if (err)
2263     return 0;
2264 
2265   err = hurd_safe_copyin (myaddr, (void *) (addr - low_address + copied),
2266 			  length);
2267   if (err)
2268     {
2269       warning (_("Read from inferior faulted: %s"), safe_strerror (err));
2270       length = 0;
2271     }
2272 
2273   err = vm_deallocate (mach_task_self (), copied, copy_count);
2274   if (err)
2275     warning (_("gnu_read_inferior vm_deallocate failed: %s"),
2276 	     safe_strerror (err));
2277 
2278   return length;
2279 }
2280 
2281 #define CHK_GOTO_OUT(str,ret) \
2282   do if (ret != KERN_SUCCESS) { errstr = #str; goto out; } while(0)
2283 
2284 struct vm_region_list
2285 {
2286   struct vm_region_list *next;
2287   vm_prot_t protection;
2288   vm_address_t start;
2289   vm_size_t length;
2290 };
2291 
2292 struct obstack region_obstack;
2293 
2294 /* Write gdb's LEN bytes from MYADDR and copy it to ADDR in inferior
2295    task's address space.  */
2296 static int
2297 gnu_write_inferior (task_t task, CORE_ADDR addr,
2298 		    const gdb_byte *myaddr, int length)
2299 {
2300   kern_return_t err;
2301   vm_address_t low_address = (vm_address_t) trunc_page (addr);
2302   vm_size_t aligned_length =
2303   (vm_size_t) round_page (addr + length) - low_address;
2304   pointer_t copied;
2305   mach_msg_type_number_t copy_count;
2306   int deallocate = 0;
2307 
2308   const char *errstr = "Bug in gnu_write_inferior";
2309 
2310   struct vm_region_list *region_element;
2311   struct vm_region_list *region_head = NULL;
2312 
2313   /* Get memory from inferior with page aligned addresses.  */
2314   err = vm_read (task,
2315 		 low_address,
2316 		 aligned_length,
2317 		 &copied,
2318 		 &copy_count);
2319   CHK_GOTO_OUT ("gnu_write_inferior vm_read failed", err);
2320 
2321   deallocate++;
2322 
2323   err = hurd_safe_copyout ((void *) (addr - low_address + copied),
2324 			   myaddr, length);
2325   CHK_GOTO_OUT ("Write to inferior faulted", err);
2326 
2327   obstack_init (&region_obstack);
2328 
2329   /* Do writes atomically.
2330      First check for holes and unwritable memory.  */
2331   {
2332     vm_size_t remaining_length = aligned_length;
2333     vm_address_t region_address = low_address;
2334 
2335     struct vm_region_list *scan;
2336 
2337     while (region_address < low_address + aligned_length)
2338       {
2339 	vm_prot_t protection;
2340 	vm_prot_t max_protection;
2341 	vm_inherit_t inheritance;
2342 	boolean_t shared;
2343 	mach_port_t object_name;
2344 	vm_offset_t offset;
2345 	vm_size_t region_length = remaining_length;
2346 	vm_address_t old_address = region_address;
2347 
2348 	err = vm_region (task,
2349 			 &region_address,
2350 			 &region_length,
2351 			 &protection,
2352 			 &max_protection,
2353 			 &inheritance,
2354 			 &shared,
2355 			 &object_name,
2356 			 &offset);
2357 	CHK_GOTO_OUT ("vm_region failed", err);
2358 
2359 	/* Check for holes in memory.  */
2360 	if (old_address != region_address)
2361 	  {
2362 	    warning (_("No memory at 0x%lx. Nothing written"),
2363 		     old_address);
2364 	    err = KERN_SUCCESS;
2365 	    length = 0;
2366 	    goto out;
2367 	  }
2368 
2369 	if (!(max_protection & VM_PROT_WRITE))
2370 	  {
2371 	    warning (_("Memory at address 0x%lx is unwritable. "
2372 		       "Nothing written"),
2373 		     old_address);
2374 	    err = KERN_SUCCESS;
2375 	    length = 0;
2376 	    goto out;
2377 	  }
2378 
2379 	/* Chain the regions for later use.  */
2380 	region_element = XOBNEW (&region_obstack, struct vm_region_list);
2381 
2382 	region_element->protection = protection;
2383 	region_element->start = region_address;
2384 	region_element->length = region_length;
2385 
2386 	/* Chain the regions along with protections.  */
2387 	region_element->next = region_head;
2388 	region_head = region_element;
2389 
2390 	region_address += region_length;
2391 	remaining_length = remaining_length - region_length;
2392       }
2393 
2394     /* If things fail after this, we give up.
2395        Somebody is messing up inferior_task's mappings.  */
2396 
2397     /* Enable writes to the chained vm regions.  */
2398     for (scan = region_head; scan; scan = scan->next)
2399       {
2400 	if (!(scan->protection & VM_PROT_WRITE))
2401 	  {
2402 	    err = vm_protect (task,
2403 			      scan->start,
2404 			      scan->length,
2405 			      FALSE,
2406 			      scan->protection | VM_PROT_WRITE);
2407 	    CHK_GOTO_OUT ("vm_protect: enable write failed", err);
2408 	  }
2409       }
2410 
2411     err = vm_write (task,
2412 		    low_address,
2413 		    copied,
2414 		    aligned_length);
2415     CHK_GOTO_OUT ("vm_write failed", err);
2416 
2417     /* Set up the original region protections, if they were changed.  */
2418     for (scan = region_head; scan; scan = scan->next)
2419       {
2420 	if (!(scan->protection & VM_PROT_WRITE))
2421 	  {
2422 	    err = vm_protect (task,
2423 			      scan->start,
2424 			      scan->length,
2425 			      FALSE,
2426 			      scan->protection);
2427 	    CHK_GOTO_OUT ("vm_protect: enable write failed", err);
2428 	  }
2429       }
2430   }
2431 
2432 out:
2433   if (deallocate)
2434     {
2435       obstack_free (&region_obstack, 0);
2436 
2437       (void) vm_deallocate (mach_task_self (),
2438 			    copied,
2439 			    copy_count);
2440     }
2441 
2442   if (err != KERN_SUCCESS)
2443     {
2444       warning (_("%s: %s"), errstr, mach_error_string (err));
2445       return 0;
2446     }
2447 
2448   return length;
2449 }
2450 
2451 
2452 
2453 /* Implement the to_xfer_partial target_ops method for
2454    TARGET_OBJECT_MEMORY.  */
2455 
2456 static enum target_xfer_status
2457 gnu_xfer_memory (gdb_byte *readbuf, const gdb_byte *writebuf,
2458 		 CORE_ADDR memaddr, ULONGEST len, ULONGEST *xfered_len)
2459 {
2460   task_t task = (gnu_current_inf
2461 		 ? (gnu_current_inf->task
2462 		    ? gnu_current_inf->task->port : 0)
2463 		 : 0);
2464   int res;
2465 
2466   if (task == MACH_PORT_NULL)
2467     return TARGET_XFER_E_IO;
2468 
2469   if (writebuf != NULL)
2470     {
2471       inf_debug (gnu_current_inf, "writing %s[%s] <-- %s",
2472 		 paddress (target_gdbarch (), memaddr), pulongest (len),
2473 		 host_address_to_string (writebuf));
2474       res = gnu_write_inferior (task, memaddr, writebuf, len);
2475     }
2476   else
2477     {
2478       inf_debug (gnu_current_inf, "reading %s[%s] --> %s",
2479 		 paddress (target_gdbarch (), memaddr), pulongest (len),
2480 		 host_address_to_string (readbuf));
2481       res = gnu_read_inferior (task, memaddr, readbuf, len);
2482     }
2483   gdb_assert (res >= 0);
2484   if (res == 0)
2485     return TARGET_XFER_E_IO;
2486   else
2487     {
2488       *xfered_len = (ULONGEST) res;
2489       return TARGET_XFER_OK;
2490     }
2491 }
2492 
2493 /* GNU does not have auxv, but we can at least fake the AT_ENTRY entry for PIE
2494    binaries.  */
2495 static enum target_xfer_status
2496 gnu_xfer_auxv (gdb_byte *readbuf, const gdb_byte *writebuf,
2497 	       CORE_ADDR memaddr, ULONGEST len, ULONGEST *xfered_len)
2498 {
2499   task_t task = (gnu_current_inf
2500 		 ? (gnu_current_inf->task
2501 		    ? gnu_current_inf->task->port : 0)
2502 		 : 0);
2503   process_t proc;
2504   kern_return_t err;
2505   vm_address_t entry;
2506   ElfW(auxv_t) auxv[2];
2507 
2508   if (task == MACH_PORT_NULL)
2509     return TARGET_XFER_E_IO;
2510   if (writebuf != NULL)
2511     return TARGET_XFER_E_IO;
2512 
2513   if (memaddr == sizeof (auxv))
2514     return TARGET_XFER_EOF;
2515   if (memaddr > sizeof (auxv))
2516     return TARGET_XFER_E_IO;
2517 
2518   err = proc_task2proc (proc_server, task, &proc);
2519   if (err != 0)
2520     return TARGET_XFER_E_IO;
2521 
2522   /* Get entry from proc server.  */
2523   err = proc_get_entry (proc, &entry);
2524   if (err != 0)
2525     return TARGET_XFER_E_IO;
2526 
2527   /* Fake auxv entry.  */
2528   auxv[0].a_type = AT_ENTRY;
2529   auxv[0].a_un.a_val = entry;
2530   auxv[1].a_type = AT_NULL;
2531   auxv[1].a_un.a_val = 0;
2532 
2533   inf_debug (gnu_current_inf, "reading auxv %s[%s] --> %s",
2534 	     paddress (target_gdbarch (), memaddr), pulongest (len),
2535 	     host_address_to_string (readbuf));
2536 
2537   if (memaddr + len > sizeof (auxv))
2538     len = sizeof (auxv) - memaddr;
2539 
2540   memcpy (readbuf, (gdb_byte *) &auxv + memaddr, len);
2541   *xfered_len = len;
2542 
2543   return TARGET_XFER_OK;
2544 }
2545 
2546 /* Target to_xfer_partial implementation.  */
2547 
2548 enum target_xfer_status
2549 gnu_nat_target::xfer_partial (enum target_object object,
2550 			      const char *annex, gdb_byte *readbuf,
2551 			      const gdb_byte *writebuf, ULONGEST offset,
2552 			      ULONGEST len, ULONGEST *xfered_len)
2553 {
2554   switch (object)
2555     {
2556     case TARGET_OBJECT_MEMORY:
2557       return gnu_xfer_memory (readbuf, writebuf, offset, len, xfered_len);
2558     case TARGET_OBJECT_AUXV:
2559       return gnu_xfer_auxv (readbuf, writebuf, offset, len, xfered_len);
2560     default:
2561       return TARGET_XFER_E_IO;
2562     }
2563 }
2564 
2565 /* Call FUNC on each memory region in the task.  */
2566 
2567 int
2568 gnu_nat_target::find_memory_regions (find_memory_region_ftype func,
2569 				     void *data)
2570 {
2571   kern_return_t err;
2572   task_t task;
2573   vm_address_t region_address, last_region_address, last_region_end;
2574   vm_prot_t last_protection;
2575 
2576   if (gnu_current_inf == 0 || gnu_current_inf->task == 0)
2577     return 0;
2578   task = gnu_current_inf->task->port;
2579   if (task == MACH_PORT_NULL)
2580     return 0;
2581 
2582   region_address = last_region_address = last_region_end = VM_MIN_ADDRESS;
2583   last_protection = VM_PROT_NONE;
2584   while (region_address < VM_MAX_ADDRESS)
2585     {
2586       vm_prot_t protection;
2587       vm_prot_t max_protection;
2588       vm_inherit_t inheritance;
2589       boolean_t shared;
2590       mach_port_t object_name;
2591       vm_offset_t offset;
2592       vm_size_t region_length = VM_MAX_ADDRESS - region_address;
2593 
2594       err = vm_region (task,
2595 		       &region_address,
2596 		       &region_length,
2597 		       &protection,
2598 		       &max_protection,
2599 		       &inheritance,
2600 		       &shared,
2601 		       &object_name,
2602 		       &offset);
2603       if (err == KERN_NO_SPACE)
2604 	break;
2605       if (err != KERN_SUCCESS)
2606 	{
2607 	  warning (_("vm_region failed: %s"), mach_error_string (err));
2608 	  return -1;
2609 	}
2610 
2611       if (protection == last_protection && region_address == last_region_end)
2612 	/* This region is contiguous with and indistinguishable from
2613 	   the previous one, so we just extend that one.  */
2614 	last_region_end = region_address += region_length;
2615       else
2616 	{
2617 	  /* This region is distinct from the last one we saw, so report
2618 	     that previous one.  */
2619 	  if (last_protection != VM_PROT_NONE)
2620 	    (*func) (last_region_address,
2621 		     last_region_end - last_region_address,
2622 		     last_protection & VM_PROT_READ,
2623 		     last_protection & VM_PROT_WRITE,
2624 		     last_protection & VM_PROT_EXECUTE,
2625 		     1, /* MODIFIED is unknown, pass it as true.  */
2626 		     false, /* No memory tags in the object file.  */
2627 		     data);
2628 	  last_region_address = region_address;
2629 	  last_region_end = region_address += region_length;
2630 	  last_protection = protection;
2631 	}
2632     }
2633 
2634   /* Report the final region.  */
2635   if (last_region_end > last_region_address && last_protection != VM_PROT_NONE)
2636     (*func) (last_region_address, last_region_end - last_region_address,
2637 	     last_protection & VM_PROT_READ,
2638 	     last_protection & VM_PROT_WRITE,
2639 	     last_protection & VM_PROT_EXECUTE,
2640 	     1, /* MODIFIED is unknown, pass it as true.  */
2641 	     false, /* No memory tags in the object file.  */
2642 	     data);
2643 
2644   return 0;
2645 }
2646 
2647 
2648 /* Return printable description of proc.  */
2649 char *
2650 proc_string (struct proc *proc)
2651 {
2652   static char tid_str[80];
2653 
2654   if (proc_is_task (proc))
2655     xsnprintf (tid_str, sizeof (tid_str), "process %d", proc->inf->pid);
2656   else
2657     xsnprintf (tid_str, sizeof (tid_str), "Thread %d.%d",
2658 	       proc->inf->pid, proc->tid);
2659   return tid_str;
2660 }
2661 
2662 std::string
2663 gnu_nat_target::pid_to_str (ptid_t ptid)
2664 {
2665   struct inf *inf = gnu_current_inf;
2666   int tid = ptid.lwp ();
2667   struct proc *thread = inf_tid_to_thread (inf, tid);
2668 
2669   if (thread)
2670     return proc_string (thread);
2671   else
2672     return string_printf ("bogus thread id %d", tid);
2673 }
2674 
2675 
2676 /* User task commands.  */
2677 
2678 static struct cmd_list_element *set_task_cmd_list = 0;
2679 static struct cmd_list_element *show_task_cmd_list = 0;
2680 /* User thread commands.  */
2681 
2682 /* Commands with a prefix of `set/show thread'.  */
2683 extern struct cmd_list_element *thread_cmd_list;
2684 struct cmd_list_element *set_thread_cmd_list = NULL;
2685 struct cmd_list_element *show_thread_cmd_list = NULL;
2686 
2687 /* Commands with a prefix of `set/show thread default'.  */
2688 struct cmd_list_element *set_thread_default_cmd_list = NULL;
2689 struct cmd_list_element *show_thread_default_cmd_list = NULL;
2690 
2691 static int
2692 parse_int_arg (const char *args, const char *cmd_prefix)
2693 {
2694   if (args)
2695     {
2696       char *arg_end;
2697       int val = strtoul (args, &arg_end, 10);
2698 
2699       if (*args && *arg_end == '\0')
2700 	return val;
2701     }
2702   error (_("Illegal argument for \"%s\" command, should be an integer."),
2703 	 cmd_prefix);
2704 }
2705 
2706 static int
2707 _parse_bool_arg (const char *args, const char *t_val, const char *f_val,
2708 		 const char *cmd_prefix)
2709 {
2710   if (!args || strcmp (args, t_val) == 0)
2711     return 1;
2712   else if (strcmp (args, f_val) == 0)
2713     return 0;
2714   else
2715     error (_("Illegal argument for \"%s\" command, "
2716 	     "should be \"%s\" or \"%s\"."),
2717 	   cmd_prefix, t_val, f_val);
2718 }
2719 
2720 #define parse_bool_arg(args, cmd_prefix) \
2721   _parse_bool_arg (args, "on", "off", cmd_prefix)
2722 
2723 static void
2724 check_empty (const char *args, const char *cmd_prefix)
2725 {
2726   if (args)
2727     error (_("Garbage after \"%s\" command: `%s'"), cmd_prefix, args);
2728 }
2729 
2730 /* Returns the alive thread named by INFERIOR_PID, or signals an error.  */
2731 static struct proc *
2732 cur_thread (void)
2733 {
2734   struct inf *inf = cur_inf ();
2735   struct proc *thread = inf_tid_to_thread (inf,
2736 					   inferior_ptid.lwp ());
2737   if (!thread)
2738     error (_("No current thread."));
2739   return thread;
2740 }
2741 
2742 /* Returns the current inferior, but signals an error if it has no task.  */
2743 static struct inf *
2744 active_inf (void)
2745 {
2746   struct inf *inf = cur_inf ();
2747 
2748   if (!inf->task)
2749     error (_("No current process."));
2750   return inf;
2751 }
2752 
2753 
2754 static void
2755 set_task_pause_cmd (int arg, int from_tty)
2756 {
2757   struct inf *inf = cur_inf ();
2758   int old_sc = inf->pause_sc;
2759 
2760   inf->pause_sc = arg;
2761 
2762   if (old_sc == 0 && inf->pause_sc != 0)
2763     /* If the task is currently unsuspended, immediately suspend it,
2764        otherwise wait until the next time it gets control.  */
2765     gnu_target->inf_suspend (inf);
2766 }
2767 
2768 static void
2769 set_task_pause_cmd (const char *args, int from_tty)
2770 {
2771   set_task_pause_cmd (parse_bool_arg (args, "set task pause"), from_tty);
2772 }
2773 
2774 static void
2775 show_task_pause_cmd (const char *args, int from_tty)
2776 {
2777   struct inf *inf = cur_inf ();
2778 
2779   check_empty (args, "show task pause");
2780   gdb_printf ("The inferior task %s suspended while gdb has control.\n",
2781 	      inf->task
2782 	      ? (inf->pause_sc == 0 ? "isn't" : "is")
2783 	      : (inf->pause_sc == 0 ? "won't be" : "will be"));
2784 }
2785 
2786 static void
2787 set_task_detach_sc_cmd (const char *args, int from_tty)
2788 {
2789   cur_inf ()->detach_sc = parse_int_arg (args,
2790 					 "set task detach-suspend-count");
2791 }
2792 
2793 static void
2794 show_task_detach_sc_cmd (const char *args, int from_tty)
2795 {
2796   check_empty (args, "show task detach-suspend-count");
2797   gdb_printf ("The inferior task will be left with a "
2798 	      "suspend count of %d when detaching.\n",
2799 	      cur_inf ()->detach_sc);
2800 }
2801 
2802 
2803 static void
2804 set_thread_default_pause_cmd (const char *args, int from_tty)
2805 {
2806   struct inf *inf = cur_inf ();
2807 
2808   inf->default_thread_pause_sc =
2809     parse_bool_arg (args, "set thread default pause") ? 0 : 1;
2810 }
2811 
2812 static void
2813 show_thread_default_pause_cmd (const char *args, int from_tty)
2814 {
2815   struct inf *inf = cur_inf ();
2816   int sc = inf->default_thread_pause_sc;
2817 
2818   check_empty (args, "show thread default pause");
2819   gdb_printf ("New threads %s suspended while gdb has control%s.\n",
2820 	      sc ? "are" : "aren't",
2821 	      !sc && inf->pause_sc ? " (but the task is)" : "");
2822 }
2823 
2824 static void
2825 set_thread_default_run_cmd (const char *args, int from_tty)
2826 {
2827   struct inf *inf = cur_inf ();
2828 
2829   inf->default_thread_run_sc =
2830     parse_bool_arg (args, "set thread default run") ? 0 : 1;
2831 }
2832 
2833 static void
2834 show_thread_default_run_cmd (const char *args, int from_tty)
2835 {
2836   struct inf *inf = cur_inf ();
2837 
2838   check_empty (args, "show thread default run");
2839   gdb_printf ("New threads %s allowed to run.\n",
2840 	      inf->default_thread_run_sc == 0 ? "are" : "aren't");
2841 }
2842 
2843 static void
2844 set_thread_default_detach_sc_cmd (const char *args, int from_tty)
2845 {
2846   cur_inf ()->default_thread_detach_sc =
2847     parse_int_arg (args, "set thread default detach-suspend-count");
2848 }
2849 
2850 static void
2851 show_thread_default_detach_sc_cmd (const char *args, int from_tty)
2852 {
2853   check_empty (args, "show thread default detach-suspend-count");
2854   gdb_printf ("New threads will get a detach-suspend-count of %d.\n",
2855 	      cur_inf ()->default_thread_detach_sc);
2856 }
2857 
2858 
2859 /* Steal a send right called NAME in the inferior task, and make it PROC's
2860    saved exception port.  */
2861 void
2862 gnu_nat_target::steal_exc_port (struct proc *proc, mach_port_t name)
2863 {
2864   kern_return_t err;
2865   mach_port_t port;
2866   mach_msg_type_name_t port_type;
2867 
2868   if (!proc || !proc->inf->task)
2869     error (_("No inferior task."));
2870 
2871   err = mach_port_extract_right (proc->inf->task->port,
2872 				 name, MACH_MSG_TYPE_COPY_SEND,
2873 				 &port, &port_type);
2874   if (err)
2875     error (_("Couldn't extract send right %lu from inferior: %s"),
2876 	   name, safe_strerror (err));
2877 
2878   if (proc->saved_exc_port)
2879     /* Get rid of our reference to the old one.  */
2880     mach_port_deallocate (mach_task_self (), proc->saved_exc_port);
2881 
2882   proc->saved_exc_port = port;
2883 
2884   if (!proc->exc_port)
2885     /* If PROC is a thread, we may not have set its exception port
2886        before.  We can't use proc_steal_exc_port because it also sets
2887        saved_exc_port.  */
2888     {
2889       proc->exc_port = proc->inf->event_port;
2890       err = proc_set_exception_port (proc, proc->exc_port);
2891       error (_("Can't set exception port for %s: %s"),
2892 	     proc_string (proc), safe_strerror (err));
2893     }
2894 }
2895 
2896 static void
2897 set_task_exc_port_cmd (const char *args, int from_tty)
2898 {
2899   struct inf *inf = cur_inf ();
2900 
2901   if (!args)
2902     error (_("No argument to \"set task exception-port\" command."));
2903   gnu_target->steal_exc_port (inf->task, parse_and_eval_address (args));
2904 }
2905 
2906 static void
2907 set_stopped_cmd (const char *args, int from_tty)
2908 {
2909   cur_inf ()->stopped = _parse_bool_arg (args, "yes", "no", "set stopped");
2910 }
2911 
2912 static void
2913 show_stopped_cmd (const char *args, int from_tty)
2914 {
2915   struct inf *inf = active_inf ();
2916 
2917   check_empty (args, "show stopped");
2918   gdb_printf ("The inferior process %s stopped.\n",
2919 	      inf->stopped ? "is" : "isn't");
2920 }
2921 
2922 static void
2923 set_sig_thread_cmd (const char *args, int from_tty)
2924 {
2925   struct inf *inf = cur_inf ();
2926 
2927   if (!args || (!isdigit (*args) && strcmp (args, "none") != 0))
2928     error (_("Illegal argument to \"set signal-thread\" command.\n"
2929 	     "Should be a thread ID, or \"none\"."));
2930 
2931   if (strcmp (args, "none") == 0)
2932     inf->signal_thread = 0;
2933   else
2934     {
2935       struct thread_info *tp = parse_thread_id (args, NULL);
2936       inf->signal_thread = inf_tid_to_thread (inf, tp->ptid.lwp ());
2937     }
2938 }
2939 
2940 static void
2941 show_sig_thread_cmd (const char *args, int from_tty)
2942 {
2943   struct inf *inf = active_inf ();
2944 
2945   check_empty (args, "show signal-thread");
2946   if (inf->signal_thread)
2947     gdb_printf ("The signal thread is %s.\n",
2948 		proc_string (inf->signal_thread));
2949   else
2950     gdb_printf ("There is no signal thread.\n");
2951 }
2952 
2953 
2954 static void
2955 set_signals_cmd (int arg, int from_tty)
2956 {
2957   struct inf *inf = cur_inf ();
2958 
2959   inf->want_signals = arg;
2960 
2961   if (inf->task && inf->want_signals != inf->traced)
2962     /* Make this take effect immediately in a running process.  */
2963     gnu_target->inf_set_traced (inf, inf->want_signals);
2964 }
2965 
2966 static void
2967 set_signals_cmd (const char *args, int from_tty)
2968 {
2969   set_signals_cmd(parse_bool_arg (args, "set signals"), from_tty);
2970 }
2971 
2972 static void
2973 show_signals_cmd (const char *args, int from_tty)
2974 {
2975   struct inf *inf = cur_inf ();
2976 
2977   check_empty (args, "show signals");
2978   gdb_printf ("The inferior process's signals %s intercepted.\n",
2979 	      inf->task
2980 	      ? (inf->traced ? "are" : "aren't")
2981 	      : (inf->want_signals ? "will be" : "won't be"));
2982 }
2983 
2984 static void
2985 set_exceptions_cmd (int arg, int from_tty)
2986 {
2987   struct inf *inf = cur_inf ();
2988 
2989   /* Make this take effect immediately in a running process.  */
2990   /* XXX */ ;
2991 
2992   inf->want_exceptions = arg;
2993 }
2994 
2995 static void
2996 set_exceptions_cmd (const char *args, int from_tty)
2997 {
2998   set_exceptions_cmd (parse_bool_arg (args, "set exceptions"), from_tty);
2999 }
3000 
3001 static void
3002 show_exceptions_cmd (const char *args, int from_tty)
3003 {
3004   struct inf *inf = cur_inf ();
3005 
3006   check_empty (args, "show exceptions");
3007   gdb_printf ("Exceptions in the inferior %s trapped.\n",
3008 	      inf->task
3009 	      ? (inf->want_exceptions ? "are" : "aren't")
3010 	      : (inf->want_exceptions ? "will be" : "won't be"));
3011 }
3012 
3013 
3014 static void
3015 set_task_cmd (const char *args, int from_tty)
3016 {
3017   gdb_printf ("\"set task\" must be followed by the name"
3018 	      " of a task property.\n");
3019 }
3020 
3021 static void
3022 show_task_cmd (const char *args, int from_tty)
3023 {
3024   struct inf *inf = cur_inf ();
3025 
3026   check_empty (args, "show task");
3027 
3028   show_signals_cmd (0, from_tty);
3029   show_exceptions_cmd (0, from_tty);
3030   show_task_pause_cmd (0, from_tty);
3031 
3032   if (inf->pause_sc == 0)
3033     show_thread_default_pause_cmd (0, from_tty);
3034   show_thread_default_run_cmd (0, from_tty);
3035 
3036   if (inf->task)
3037     {
3038       show_stopped_cmd (0, from_tty);
3039       show_sig_thread_cmd (0, from_tty);
3040     }
3041 
3042   if (inf->detach_sc != 0)
3043     show_task_detach_sc_cmd (0, from_tty);
3044   if (inf->default_thread_detach_sc != 0)
3045     show_thread_default_detach_sc_cmd (0, from_tty);
3046 }
3047 
3048 
3049 static void
3050 set_noninvasive_cmd (const char *args, int from_tty)
3051 {
3052   /* Invert the sense of the arg for each component.  */
3053   int inv_arg = parse_bool_arg (args, "set noninvasive") ? 0 : 1;
3054 
3055   set_task_pause_cmd (inv_arg, from_tty);
3056   set_signals_cmd (inv_arg, from_tty);
3057   set_exceptions_cmd (inv_arg, from_tty);
3058 }
3059 
3060 
3061 static void
3062 info_port_rights (const char *args, mach_port_type_t only)
3063 {
3064   struct inf *inf = active_inf ();
3065   scoped_value_mark vmark;
3066 
3067   if (args)
3068     /* Explicit list of port rights.  */
3069     {
3070       while (*args)
3071 	{
3072 	  struct value *val = parse_to_comma_and_eval (&args);
3073 	  long right = value_as_long (val);
3074 	  error_t err =
3075 	    print_port_info (right, 0, inf->task->port, PORTINFO_DETAILS,
3076 			     stdout);
3077 
3078 	  if (err)
3079 	    error (_("%ld: %s."), right, safe_strerror (err));
3080 	}
3081     }
3082   else
3083     /* Print all of them.  */
3084     {
3085       error_t err =
3086 	print_task_ports_info (inf->task->port, only, PORTINFO_DETAILS,
3087 			       stdout);
3088       if (err)
3089 	error (_("%s."), safe_strerror (err));
3090     }
3091 }
3092 
3093 static void
3094 info_send_rights_cmd (const char *args, int from_tty)
3095 {
3096   info_port_rights (args, MACH_PORT_TYPE_SEND);
3097 }
3098 
3099 static void
3100 info_recv_rights_cmd (const char *args, int from_tty)
3101 {
3102   info_port_rights (args, MACH_PORT_TYPE_RECEIVE);
3103 }
3104 
3105 static void
3106 info_port_sets_cmd (const char *args, int from_tty)
3107 {
3108   info_port_rights (args, MACH_PORT_TYPE_PORT_SET);
3109 }
3110 
3111 static void
3112 info_dead_names_cmd (const char *args, int from_tty)
3113 {
3114   info_port_rights (args, MACH_PORT_TYPE_DEAD_NAME);
3115 }
3116 
3117 static void
3118 info_port_rights_cmd (const char *args, int from_tty)
3119 {
3120   info_port_rights (args, ~0);
3121 }
3122 
3123 
3124 static void
3125 add_task_commands (void)
3126 {
3127   add_cmd ("pause", class_run, set_thread_default_pause_cmd, _("\
3128 Set whether the new threads are suspended while gdb has control.\n\
3129 This property normally has no effect because the whole task is\n\
3130 suspended, however, that may be disabled with \"set task pause off\".\n\
3131 The default value is \"off\"."),
3132 	   &set_thread_default_cmd_list);
3133   add_cmd ("pause", no_class, show_thread_default_pause_cmd, _("\
3134 Show whether new threads are suspended while gdb has control."),
3135 	   &show_thread_default_cmd_list);
3136 
3137   add_cmd ("run", class_run, set_thread_default_run_cmd, _("\
3138 Set whether new threads are allowed to run (once gdb has noticed them)."),
3139 	   &set_thread_default_cmd_list);
3140   add_cmd ("run", no_class, show_thread_default_run_cmd, _("\
3141 Show whether new threads are allowed to run (once gdb has noticed them)."),
3142 	   &show_thread_default_cmd_list);
3143 
3144   add_cmd ("detach-suspend-count", class_run, set_thread_default_detach_sc_cmd,
3145 	   _("Set the default detach-suspend-count value for new threads."),
3146 	   &set_thread_default_cmd_list);
3147   add_cmd ("detach-suspend-count", no_class, show_thread_default_detach_sc_cmd,
3148 	   _("Show the default detach-suspend-count value for new threads."),
3149 	   &show_thread_default_cmd_list);
3150 
3151   cmd_list_element *set_signals_cmd_
3152     = add_cmd ("signals", class_run, set_signals_cmd, _("\
3153 Set whether the inferior process's signals will be intercepted.\n\
3154 Mach exceptions (such as breakpoint traps) are not affected."),
3155 	       &setlist);
3156   add_alias_cmd ("sigs", set_signals_cmd_, class_run, 1, &setlist);
3157 
3158   cmd_list_element *show_signals_cmd_
3159     = add_cmd ("signals", no_class, show_signals_cmd, _("\
3160 Show whether the inferior process's signals will be intercepted."),
3161 	       &showlist);
3162   add_alias_cmd ("sigs", show_signals_cmd_, no_class, 1, &showlist);
3163 
3164   cmd_list_element *set_signal_thread_cmd_
3165     = add_cmd ("signal-thread", class_run, set_sig_thread_cmd, _("\
3166 Set the thread that gdb thinks is the libc signal thread.\n\
3167 This thread is run when delivering a signal to a non-stopped process."),
3168 	       &setlist);
3169   add_alias_cmd ("sigthread", set_signal_thread_cmd_, class_run, 1, &setlist);
3170 
3171   cmd_list_element *show_signal_thread_cmd_
3172     = add_cmd ("signal-thread", no_class, show_sig_thread_cmd, _("\
3173 Set the thread that gdb thinks is the libc signal thread."),
3174 	       &showlist);
3175   add_alias_cmd ("sigthread", show_signal_thread_cmd_, no_class, 1, &showlist);
3176 
3177   add_cmd ("stopped", class_run, set_stopped_cmd, _("\
3178 Set whether gdb thinks the inferior process is stopped as with SIGSTOP.\n\
3179 Stopped process will be continued by sending them a signal."),
3180 	   &setlist);
3181   add_cmd ("stopped", no_class, show_stopped_cmd, _("\
3182 Show whether gdb thinks the inferior process is stopped as with SIGSTOP."),
3183 	   &showlist);
3184 
3185   cmd_list_element *set_exceptions_cmd_
3186     = add_cmd ("exceptions", class_run, set_exceptions_cmd, _("\
3187 Set whether exceptions in the inferior process will be trapped.\n\
3188 When exceptions are turned off, neither breakpoints nor single-stepping\n\
3189 will work."), &setlist);
3190   /* Allow `set exc' despite conflict with `set exception-port'.  */
3191   add_alias_cmd ("exc", set_exceptions_cmd_, class_run, 1, &setlist);
3192 
3193   add_cmd ("exceptions", no_class, show_exceptions_cmd, _("\
3194 Show whether exceptions in the inferior process will be trapped."),
3195 	   &showlist);
3196 
3197   add_prefix_cmd ("task", no_class, set_task_cmd,
3198 		  _("Command prefix for setting task attributes."),
3199 		  &set_task_cmd_list, 0, &setlist);
3200   add_prefix_cmd ("task", no_class, show_task_cmd,
3201 		  _("Command prefix for showing task attributes."),
3202 		  &show_task_cmd_list, 0, &showlist);
3203 
3204   add_cmd ("pause", class_run, set_task_pause_cmd, _("\
3205 Set whether the task is suspended while gdb has control.\n\
3206 A value of \"on\" takes effect immediately, otherwise nothing happens\n\
3207 until the next time the program is continued.\n\
3208 When setting this to \"off\", \"set thread default pause on\" can be\n\
3209 used to pause individual threads by default instead."),
3210 	   &set_task_cmd_list);
3211   add_cmd ("pause", no_class, show_task_pause_cmd,
3212 	   _("Show whether the task is suspended while gdb has control."),
3213 	   &show_task_cmd_list);
3214 
3215   add_cmd ("detach-suspend-count", class_run, set_task_detach_sc_cmd,
3216 	   _("Set the suspend count will leave on the thread when detaching."),
3217 	   &set_task_cmd_list);
3218   add_cmd ("detach-suspend-count", no_class, show_task_detach_sc_cmd,
3219 	   _("Show the suspend count will leave "
3220 	     "on the thread when detaching."),
3221 	   &show_task_cmd_list);
3222 
3223   cmd_list_element *set_task_exception_port_cmd_
3224     = add_cmd ("exception-port", no_class, set_task_exc_port_cmd, _("\
3225 Set the task exception port to which we forward exceptions.\n\
3226 The argument should be the value of the send right in the task."),
3227 	       &set_task_cmd_list);
3228   add_alias_cmd ("excp", set_task_exception_port_cmd_, no_class, 1,
3229 		 &set_task_cmd_list);
3230   add_alias_cmd ("exc-port", set_task_exception_port_cmd_, no_class, 1,
3231 		 &set_task_cmd_list);
3232 
3233   /* A convenient way of turning on all options require to noninvasively
3234      debug running tasks.  */
3235   add_cmd ("noninvasive", no_class, set_noninvasive_cmd, _("\
3236 Set task options so that we interfere as little as possible.\n\
3237 This is the same as setting `task pause', `exceptions', and\n\
3238 `signals' to the opposite value."),
3239 	   &setlist);
3240 
3241   /* Commands to show information about the task's ports.  */
3242   add_info ("send-rights", info_send_rights_cmd,
3243 	    _("Show information about the task's send rights."));
3244   add_info ("receive-rights", info_recv_rights_cmd,
3245 	    _("Show information about the task's receive rights."));
3246   cmd_list_element *port_rights_cmd
3247     = add_info ("port-rights", info_port_rights_cmd,
3248 		_("Show information about the task's port rights."));
3249   cmd_list_element *port_sets_cmd
3250     = add_info ("port-sets", info_port_sets_cmd,
3251 		_("Show information about the task's port sets."));
3252   add_info ("dead-names", info_dead_names_cmd,
3253 	    _("Show information about the task's dead names."));
3254   add_info_alias ("ports", port_rights_cmd, 1);
3255   add_info_alias ("port", port_rights_cmd, 1);
3256   add_info_alias ("psets", port_sets_cmd, 1);
3257 }
3258 
3259 
3260 static void
3261 set_thread_pause_cmd (const char *args, int from_tty)
3262 {
3263   struct proc *thread = cur_thread ();
3264   int old_sc = thread->pause_sc;
3265 
3266   thread->pause_sc = parse_bool_arg (args, "set thread pause");
3267   if (old_sc == 0 && thread->pause_sc != 0 && thread->inf->pause_sc == 0)
3268     /* If the task is currently unsuspended, immediately suspend it,
3269        otherwise wait until the next time it gets control.  */
3270     gnu_target->inf_suspend (thread->inf);
3271 }
3272 
3273 static void
3274 show_thread_pause_cmd (const char *args, int from_tty)
3275 {
3276   struct proc *thread = cur_thread ();
3277   int sc = thread->pause_sc;
3278 
3279   check_empty (args, "show task pause");
3280   gdb_printf ("Thread %s %s suspended while gdb has control%s.\n",
3281 	      proc_string (thread),
3282 	      sc ? "is" : "isn't",
3283 	      !sc && thread->inf->pause_sc ? " (but the task is)" : "");
3284 }
3285 
3286 static void
3287 set_thread_run_cmd (const char *args, int from_tty)
3288 {
3289   struct proc *thread = cur_thread ();
3290 
3291   thread->run_sc = parse_bool_arg (args, "set thread run") ? 0 : 1;
3292 }
3293 
3294 static void
3295 show_thread_run_cmd (const char *args, int from_tty)
3296 {
3297   struct proc *thread = cur_thread ();
3298 
3299   check_empty (args, "show thread run");
3300   gdb_printf ("Thread %s %s allowed to run.",
3301 	      proc_string (thread),
3302 	      thread->run_sc == 0 ? "is" : "isn't");
3303 }
3304 
3305 static void
3306 set_thread_detach_sc_cmd (const char *args, int from_tty)
3307 {
3308   cur_thread ()->detach_sc = parse_int_arg (args,
3309 					    "set thread detach-suspend-count");
3310 }
3311 
3312 static void
3313 show_thread_detach_sc_cmd (const char *args, int from_tty)
3314 {
3315   struct proc *thread = cur_thread ();
3316 
3317   check_empty (args, "show thread detach-suspend-count");
3318   gdb_printf ("Thread %s will be left with a suspend count"
3319 	      " of %d when detaching.\n",
3320 	      proc_string (thread),
3321 	      thread->detach_sc);
3322 }
3323 
3324 static void
3325 set_thread_exc_port_cmd (const char *args, int from_tty)
3326 {
3327   struct proc *thread = cur_thread ();
3328 
3329   if (!args)
3330     error (_("No argument to \"set thread exception-port\" command."));
3331   gnu_target->steal_exc_port (thread, parse_and_eval_address (args));
3332 }
3333 
3334 #if 0
3335 static void
3336 show_thread_cmd (char *args, int from_tty)
3337 {
3338   struct proc *thread = cur_thread ();
3339 
3340   check_empty (args, "show thread");
3341   show_thread_run_cmd (0, from_tty);
3342   show_thread_pause_cmd (0, from_tty);
3343   if (thread->detach_sc != 0)
3344     show_thread_detach_sc_cmd (0, from_tty);
3345 }
3346 #endif
3347 
3348 static void
3349 thread_takeover_sc_cmd (const char *args, int from_tty)
3350 {
3351   struct proc *thread = cur_thread ();
3352 
3353   thread_basic_info_data_t _info;
3354   thread_basic_info_t info = &_info;
3355   mach_msg_type_number_t info_len = THREAD_BASIC_INFO_COUNT;
3356   kern_return_t err
3357     = mach_thread_info (thread->port, THREAD_BASIC_INFO,
3358 			(int *) &info, &info_len);
3359   if (err)
3360     error (("%s."), safe_strerror (err));
3361   thread->sc = info->suspend_count;
3362   if (from_tty)
3363     gdb_printf ("Suspend count was %d.\n", thread->sc);
3364   if (info != &_info)
3365     vm_deallocate (mach_task_self (), (vm_address_t) info,
3366 		   info_len * sizeof (int));
3367 }
3368 
3369 
3370 static void
3371 add_thread_commands (void)
3372 {
3373   add_setshow_prefix_cmd ("thread", no_class,
3374 			  _("Command prefix for setting thread properties."),
3375 			  _("Command prefix for showing thread properties."),
3376 			  &set_thread_cmd_list,
3377 			  &show_thread_cmd_list,
3378 			  &setlist, &showlist);
3379 
3380   add_setshow_prefix_cmd ("default", no_class,
3381 			  _("Command prefix for setting default thread properties."),
3382 			  _("Command prefix for showing default thread properties."),
3383 			  &set_thread_default_cmd_list,
3384 			  &show_thread_default_cmd_list,
3385 			  &set_thread_cmd_list, &show_thread_cmd_list);
3386 
3387   add_cmd ("pause", class_run, set_thread_pause_cmd, _("\
3388 Set whether the current thread is suspended while gdb has control.\n\
3389 A value of \"on\" takes effect immediately, otherwise nothing happens\n\
3390 until the next time the program is continued.  This property normally\n\
3391 has no effect because the whole task is suspended, however, that may\n\
3392 be disabled with \"set task pause off\".\n\
3393 The default value is \"off\"."),
3394 	   &set_thread_cmd_list);
3395   add_cmd ("pause", no_class, show_thread_pause_cmd, _("\
3396 Show whether the current thread is suspended while gdb has control."),
3397 	   &show_thread_cmd_list);
3398 
3399   add_cmd ("run", class_run, set_thread_run_cmd,
3400 	   _("Set whether the current thread is allowed to run."),
3401 	   &set_thread_cmd_list);
3402   add_cmd ("run", no_class, show_thread_run_cmd,
3403 	   _("Show whether the current thread is allowed to run."),
3404 	   &show_thread_cmd_list);
3405 
3406   add_cmd ("detach-suspend-count", class_run, set_thread_detach_sc_cmd, _("\
3407 Set the suspend count will leave on the thread when detaching.\n\
3408 Note that this is relative to suspend count when gdb noticed the thread;\n\
3409 use the `thread takeover-suspend-count' to force it to an absolute value."),
3410 	   &set_thread_cmd_list);
3411   add_cmd ("detach-suspend-count", no_class, show_thread_detach_sc_cmd, _("\
3412 Show the suspend count will leave on the thread when detaching.\n\
3413 Note that this is relative to suspend count when gdb noticed the thread;\n\
3414 use the `thread takeover-suspend-count' to force it to an absolute value."),
3415 	   &show_thread_cmd_list);
3416 
3417   cmd_list_element *set_thread_exception_port_cmd_
3418     = add_cmd ("exception-port", no_class, set_thread_exc_port_cmd, _("\
3419 Set the thread exception port to which we forward exceptions.\n\
3420 This overrides the task exception port.\n\
3421 The argument should be the value of the send right in the task."),
3422 	   &set_thread_cmd_list);
3423   add_alias_cmd ("excp", set_thread_exception_port_cmd_, no_class, 1,
3424 		 &set_thread_cmd_list);
3425   add_alias_cmd ("exc-port", set_thread_exception_port_cmd_, no_class, 1,
3426 		 &set_thread_cmd_list);
3427 
3428   add_cmd ("takeover-suspend-count", no_class, thread_takeover_sc_cmd, _("\
3429 Force the threads absolute suspend-count to be gdb's.\n\
3430 Prior to giving this command, gdb's thread suspend-counts are relative\n\
3431 to the thread's initial suspend-count when gdb notices the threads."),
3432 	   &thread_cmd_list);
3433 }
3434 
3435 void _initialize_gnu_nat ();
3436 void
3437 _initialize_gnu_nat ()
3438 {
3439   proc_server = getproc ();
3440 
3441   add_task_commands ();
3442   add_thread_commands ();
3443   add_setshow_boolean_cmd ("gnu-nat", class_maintenance,
3444 			   &gnu_debug_flag,
3445 			   _("Set debugging output for the gnu backend."),
3446 			   _("Show debugging output for the gnu backend."),
3447 			   NULL,
3448 			   NULL,
3449 			   NULL,
3450 			   &setdebuglist,
3451 			   &showdebuglist);
3452 }
3453 
3454 #ifdef	FLUSH_INFERIOR_CACHE
3455 
3456 /* When over-writing code on some machines the I-Cache must be flushed
3457    explicitly, because it is not kept coherent by the lazy hardware.
3458    This definitely includes breakpoints, for instance, or else we
3459    end up looping in mysterious Bpt traps.  */
3460 
3461 void
3462 flush_inferior_icache (CORE_ADDR pc, int amount)
3463 {
3464   vm_machine_attribute_val_t flush = MATTR_VAL_ICACHE_FLUSH;
3465   kern_return_t ret;
3466 
3467   ret = vm_machine_attribute (gnu_current_inf->task->port,
3468 			      pc,
3469 			      amount,
3470 			      MATTR_CACHE,
3471 			      &flush);
3472   if (ret != KERN_SUCCESS)
3473     warning (_("Error flushing inferior's cache : %s"), safe_strerror (ret));
3474 }
3475 #endif /* FLUSH_INFERIOR_CACHE */
3476