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