Replace copyreloc-main.c with copyreloc-main.S
[platform/upstream/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 /* See gnu-nat.h.  */
987
988 void
989 inf_threads (struct inf *inf, inf_threads_ftype *f, void *arg)
990 {
991   struct proc *thread;
992
993   for (thread = inf->threads; thread; thread = thread->next)
994     f (thread, arg);
995 }
996
997 \f
998 /* Make INF's list of threads be consistent with reality of TASK.  */
999 void
1000 inf_validate_procs (struct inf *inf)
1001 {
1002   thread_array_t threads;
1003   mach_msg_type_number_t num_threads, i;
1004   struct proc *task = inf->task;
1005
1006   /* If no threads are currently running, this function will guarantee that
1007      things are up to date.  The exception is if there are zero threads --
1008      then it is almost certainly in an odd state, and probably some outside
1009      agent will create threads.  */
1010   inf->threads_up_to_date = inf->threads ? !inf->running : 0;
1011
1012   if (task)
1013     {
1014       error_t err = task_threads (task->port, &threads, &num_threads);
1015
1016       inf_debug (inf, "fetching threads");
1017       if (err)
1018         /* TASK must be dead.  */
1019         {
1020           task->dead = 1;
1021           task = 0;
1022         }
1023     }
1024
1025   if (!task)
1026     {
1027       num_threads = 0;
1028       inf_debug (inf, "no task");
1029     }
1030
1031   {
1032     /* Make things normally linear.  */
1033     mach_msg_type_number_t search_start = 0;
1034     /* Which thread in PROCS corresponds to each task thread, & the task.  */
1035     struct proc *matched[num_threads + 1];
1036     /* The last thread in INF->threads, so we can add to the end.  */
1037     struct proc *last = 0;
1038     /* The current thread we're considering.  */
1039     struct proc *thread = inf->threads;
1040
1041     memset (matched, 0, sizeof (matched));
1042
1043     while (thread)
1044       {
1045         mach_msg_type_number_t left;
1046
1047         for (i = search_start, left = num_threads; left; i++, left--)
1048           {
1049             if (i >= num_threads)
1050               i -= num_threads; /* I wrapped around.  */
1051             if (thread->port == threads[i])
1052               /* We already know about this thread.  */
1053               {
1054                 matched[i] = thread;
1055                 last = thread;
1056                 thread = thread->next;
1057                 search_start++;
1058                 break;
1059               }
1060           }
1061
1062         if (!left)
1063           {
1064             proc_debug (thread, "died!");
1065             thread->port = MACH_PORT_NULL;
1066             thread = _proc_free (thread);       /* THREAD is dead.  */
1067             if (last)
1068               last->next = thread;
1069             else
1070               inf->threads = thread;
1071           }
1072       }
1073
1074     for (i = 0; i < num_threads; i++)
1075       {
1076         if (matched[i])
1077           /* Throw away the duplicate send right.  */
1078           mach_port_deallocate (mach_task_self (), threads[i]);
1079         else
1080           /* THREADS[I] is a thread we don't know about yet!  */
1081           {
1082             ptid_t ptid;
1083
1084             thread = make_proc (inf, threads[i], next_thread_id++);
1085             if (last)
1086               last->next = thread;
1087             else
1088               inf->threads = thread;
1089             last = thread;
1090             proc_debug (thread, "new thread: %lu", threads[i]);
1091
1092             ptid = ptid_build (inf->pid, thread->tid, 0);
1093
1094             /* Tell GDB's generic thread code.  */
1095
1096             if (ptid_equal (inferior_ptid, pid_to_ptid (inf->pid)))
1097               /* This is the first time we're hearing about thread
1098                  ids, after a fork-child.  */
1099               thread_change_ptid (inferior_ptid, ptid);
1100             else if (inf->pending_execs != 0)
1101               /* This is a shell thread.  */
1102               add_thread_silent (ptid);
1103             else
1104               add_thread (ptid);
1105           }
1106       }
1107
1108     vm_deallocate (mach_task_self (),
1109                    (vm_address_t) threads, (num_threads * sizeof (thread_t)));
1110   }
1111 }
1112
1113 \f
1114 /* Makes sure that INF's thread list is synced with the actual process.  */
1115 int
1116 inf_update_procs (struct inf *inf)
1117 {
1118   if (!inf->task)
1119     return 0;
1120   if (!inf->threads_up_to_date)
1121     inf_validate_procs (inf);
1122   return !!inf->task;
1123 }
1124
1125 /* Sets the resume_sc of each thread in inf.  That of RUN_THREAD is set to 0,
1126    and others are set to their run_sc if RUN_OTHERS is true, and otherwise
1127    their pause_sc.  */
1128 void
1129 inf_set_threads_resume_sc (struct inf *inf,
1130                            struct proc *run_thread, int run_others)
1131 {
1132   struct proc *thread;
1133
1134   inf_update_procs (inf);
1135   for (thread = inf->threads; thread; thread = thread->next)
1136     if (thread == run_thread)
1137       thread->resume_sc = 0;
1138     else if (run_others)
1139       thread->resume_sc = thread->run_sc;
1140     else
1141       thread->resume_sc = thread->pause_sc;
1142 }
1143
1144 \f
1145 /* Cause INF to continue execution immediately; individual threads may still
1146    be suspended (but their suspend counts will be updated).  */
1147 void
1148 inf_resume (struct inf *inf)
1149 {
1150   struct proc *thread;
1151
1152   inf_update_procs (inf);
1153
1154   for (thread = inf->threads; thread; thread = thread->next)
1155     thread->sc = thread->resume_sc;
1156
1157   if (inf->task)
1158     {
1159       if (!inf->pending_execs)
1160         /* Try to make sure our task count is correct -- in the case where
1161            we're waiting for an exec though, things are too volatile, so just
1162            assume things will be reasonable (which they usually will be).  */
1163         inf_validate_task_sc (inf);
1164       inf->task->sc = 0;
1165     }
1166
1167   inf_update_suspends (inf);
1168 }
1169
1170 /* Cause INF to stop execution immediately; individual threads may still
1171    be running.  */
1172 void
1173 inf_suspend (struct inf *inf)
1174 {
1175   struct proc *thread;
1176
1177   inf_update_procs (inf);
1178
1179   for (thread = inf->threads; thread; thread = thread->next)
1180     thread->sc = thread->pause_sc;
1181
1182   if (inf->task)
1183     inf->task->sc = inf->pause_sc;
1184
1185   inf_update_suspends (inf);
1186 }
1187
1188 \f
1189 /* INF has one thread PROC that is in single-stepping mode.  This
1190    function changes it to be PROC, changing any old step_thread to be
1191    a normal one.  A PROC of 0 clears any existing value.  */
1192 void
1193 inf_set_step_thread (struct inf *inf, struct proc *thread)
1194 {
1195   gdb_assert (!thread || proc_is_thread (thread));
1196
1197   if (thread)
1198     inf_debug (inf, "setting step thread: %d/%d", inf->pid, thread->tid);
1199   else
1200     inf_debug (inf, "clearing step thread");
1201
1202   if (inf->step_thread != thread)
1203     {
1204       if (inf->step_thread && inf->step_thread->port != MACH_PORT_NULL)
1205         if (!proc_trace (inf->step_thread, 0))
1206           return;
1207       if (thread && proc_trace (thread, 1))
1208         inf->step_thread = thread;
1209       else
1210         inf->step_thread = 0;
1211     }
1212 }
1213
1214 \f
1215 /* Set up the thread resume_sc's so that only the signal thread is running
1216    (plus whatever other thread are set to always run).  Returns true if we
1217    did so, or false if we can't find a signal thread.  */
1218 int
1219 inf_set_threads_resume_sc_for_signal_thread (struct inf *inf)
1220 {
1221   if (inf->signal_thread)
1222     {
1223       inf_set_threads_resume_sc (inf, inf->signal_thread, 0);
1224       return 1;
1225     }
1226   else
1227     return 0;
1228 }
1229
1230 static void
1231 inf_update_signal_thread (struct inf *inf)
1232 {
1233   /* XXX for now we assume that if there's a msgport, the 2nd thread is
1234      the signal thread.  */
1235   inf->signal_thread = inf->threads ? inf->threads->next : 0;
1236 }
1237
1238 \f
1239 /* Detachs from INF's inferior task, letting it run once again...  */
1240 void
1241 inf_detach (struct inf *inf)
1242 {
1243   struct proc *task = inf->task;
1244
1245   inf_debug (inf, "detaching...");
1246
1247   inf_clear_wait (inf);
1248   inf_set_step_thread (inf, 0);
1249
1250   if (task)
1251     {
1252       struct proc *thread;
1253
1254       inf_validate_procinfo (inf);
1255
1256       inf_set_traced (inf, 0);
1257       if (inf->stopped)
1258         {
1259           if (inf->nomsg)
1260             inf_continue (inf);
1261           else
1262             inf_signal (inf, GDB_SIGNAL_0);
1263         }
1264
1265       proc_restore_exc_port (task);
1266       task->sc = inf->detach_sc;
1267
1268       for (thread = inf->threads; thread; thread = thread->next)
1269         {
1270           proc_restore_exc_port (thread);
1271           thread->sc = thread->detach_sc;
1272         }
1273
1274       inf_update_suspends (inf);
1275     }
1276
1277   inf_cleanup (inf);
1278 }
1279
1280 /* Attaches INF to the process with process id PID, returning it in a
1281    suspended state suitable for debugging.  */
1282 void
1283 inf_attach (struct inf *inf, int pid)
1284 {
1285   inf_debug (inf, "attaching: %d", pid);
1286
1287   if (inf->pid)
1288     inf_detach (inf);
1289
1290   inf_startup (inf, pid);
1291 }
1292
1293 \f
1294 /* Makes sure that we've got our exception ports entrenched in the process.  */
1295 void
1296 inf_steal_exc_ports (struct inf *inf)
1297 {
1298   struct proc *thread;
1299
1300   inf_debug (inf, "stealing exception ports");
1301
1302   inf_set_step_thread (inf, 0); /* The step thread is special.  */
1303
1304   proc_steal_exc_port (inf->task, inf->event_port);
1305   for (thread = inf->threads; thread; thread = thread->next)
1306     proc_steal_exc_port (thread, MACH_PORT_NULL);
1307 }
1308
1309 /* Makes sure the process has its own exception ports.  */
1310 void
1311 inf_restore_exc_ports (struct inf *inf)
1312 {
1313   struct proc *thread;
1314
1315   inf_debug (inf, "restoring exception ports");
1316
1317   inf_set_step_thread (inf, 0); /* The step thread is special.  */
1318
1319   proc_restore_exc_port (inf->task);
1320   for (thread = inf->threads; thread; thread = thread->next)
1321     proc_restore_exc_port (thread);
1322 }
1323
1324 \f
1325 /* Deliver signal SIG to INF.  If INF is stopped, delivering a signal, even
1326    signal 0, will continue it.  INF is assumed to be in a paused state, and
1327    the resume_sc's of INF's threads may be affected.  */
1328 void
1329 inf_signal (struct inf *inf, enum gdb_signal sig)
1330 {
1331   error_t err = 0;
1332   int host_sig = gdb_signal_to_host (sig);
1333
1334 #define NAME gdb_signal_to_name (sig)
1335
1336   if (host_sig >= _NSIG)
1337     /* A mach exception.  Exceptions are encoded in the signal space by
1338        putting them after _NSIG; this assumes they're positive (and not
1339        extremely large)!  */
1340     {
1341       struct inf_wait *w = &inf->wait;
1342
1343       if (w->status.kind == TARGET_WAITKIND_STOPPED
1344           && w->status.value.sig == sig
1345           && w->thread && !w->thread->aborted)
1346         /* We're passing through the last exception we received.  This is
1347            kind of bogus, because exceptions are per-thread whereas gdb
1348            treats signals as per-process.  We just forward the exception to
1349            the correct handler, even it's not for the same thread as TID --
1350            i.e., we pretend it's global.  */
1351         {
1352           struct exc_state *e = &w->exc;
1353
1354           inf_debug (inf, "passing through exception:"
1355                      " task = %lu, thread = %lu, exc = %d"
1356                      ", code = %d, subcode = %d",
1357                      w->thread->port, inf->task->port,
1358                      e->exception, e->code, e->subcode);
1359           err =
1360             exception_raise_request (e->handler,
1361                                      e->reply, MACH_MSG_TYPE_MOVE_SEND_ONCE,
1362                                      w->thread->port, inf->task->port,
1363                                      e->exception, e->code, e->subcode);
1364         }
1365       else
1366         error (_("Can't forward spontaneous exception (%s)."), NAME);
1367     }
1368   else
1369     /* A Unix signal.  */
1370   if (inf->stopped)
1371     /* The process is stopped and expecting a signal.  Just send off a
1372        request and let it get handled when we resume everything.  */
1373     {
1374       inf_debug (inf, "sending %s to stopped process", NAME);
1375       err =
1376         INF_MSGPORT_RPC (inf,
1377                          msg_sig_post_untraced_request (msgport,
1378                                                         inf->event_port,
1379                                                MACH_MSG_TYPE_MAKE_SEND_ONCE,
1380                                                         host_sig, 0,
1381                                                         refport));
1382       if (!err)
1383         /* Posting an untraced signal automatically continues it.
1384            We clear this here rather than when we get the reply
1385            because we'd rather assume it's not stopped when it
1386            actually is, than the reverse.  */
1387         inf->stopped = 0;
1388     }
1389   else
1390     /* It's not expecting it.  We have to let just the signal thread
1391        run, and wait for it to get into a reasonable state before we
1392        can continue the rest of the process.  When we finally resume the
1393        process the signal we request will be the very first thing that
1394        happens.  */
1395     {
1396       inf_debug (inf, "sending %s to unstopped process"
1397                  " (so resuming signal thread)", NAME);
1398       err =
1399         INF_RESUME_MSGPORT_RPC (inf,
1400                                 msg_sig_post_untraced (msgport, host_sig,
1401                                                        0, refport));
1402     }
1403
1404   if (err == EIEIO)
1405     /* Can't do too much...  */
1406     warning (_("Can't deliver signal %s: No signal thread."), NAME);
1407   else if (err)
1408     warning (_("Delivering signal %s: %s"), NAME, safe_strerror (err));
1409
1410 #undef NAME
1411 }
1412
1413 \f
1414 /* Continue INF without delivering a signal.  This is meant to be used
1415    when INF does not have a message port.  */
1416 void
1417 inf_continue (struct inf *inf)
1418 {
1419   process_t proc;
1420   error_t err = proc_pid2proc (proc_server, inf->pid, &proc);
1421
1422   if (!err)
1423     {
1424       inf_debug (inf, "continuing process");
1425
1426       err = proc_mark_cont (proc);
1427       if (!err)
1428         {
1429           struct proc *thread;
1430
1431           for (thread = inf->threads; thread; thread = thread->next)
1432             thread_resume (thread->port);
1433
1434           inf->stopped = 0;
1435         }
1436     }
1437
1438   if (err)
1439     warning (_("Can't continue process: %s"), safe_strerror (err));
1440 }
1441
1442 \f
1443 /* The inferior used for all gdb target ops.  */
1444 struct inf *gnu_current_inf = 0;
1445
1446 /* The inferior being waited for by gnu_wait.  Since GDB is decidely not
1447    multi-threaded, we don't bother to lock this.  */
1448 struct inf *waiting_inf;
1449
1450 /* Wait for something to happen in the inferior, returning what in STATUS.  */
1451 static ptid_t
1452 gnu_wait (struct target_ops *ops,
1453           ptid_t ptid, struct target_waitstatus *status, int options)
1454 {
1455   struct msg
1456     {
1457       mach_msg_header_t hdr;
1458       mach_msg_type_t type;
1459       int data[8000];
1460     } msg;
1461   error_t err;
1462   struct proc *thread;
1463   struct inf *inf = gnu_current_inf;
1464
1465   extern int exc_server (mach_msg_header_t *, mach_msg_header_t *);
1466   extern int msg_reply_server (mach_msg_header_t *, mach_msg_header_t *);
1467   extern int notify_server (mach_msg_header_t *, mach_msg_header_t *);
1468   extern int process_reply_server (mach_msg_header_t *, mach_msg_header_t *);
1469
1470   gdb_assert (inf->task);
1471
1472   if (!inf->threads && !inf->pending_execs)
1473     /* No threads!  Assume that maybe some outside agency is frobbing our
1474        task, and really look for new threads.  If we can't find any, just tell
1475        the user to try again later.  */
1476     {
1477       inf_validate_procs (inf);
1478       if (!inf->threads && !inf->task->dead)
1479         error (_("There are no threads; try again later."));
1480     }
1481
1482   waiting_inf = inf;
1483
1484   inf_debug (inf, "waiting for: %s", target_pid_to_str (ptid));
1485
1486 rewait:
1487   if (proc_wait_pid != inf->pid && !inf->no_wait)
1488     /* Always get information on events from the proc server.  */
1489     {
1490       inf_debug (inf, "requesting wait on pid %d", inf->pid);
1491
1492       if (proc_wait_pid)
1493         /* The proc server is single-threaded, and only allows a single
1494            outstanding wait request, so we have to cancel the previous one.  */
1495         {
1496           inf_debug (inf, "cancelling previous wait on pid %d", proc_wait_pid);
1497           interrupt_operation (proc_server, 0);
1498         }
1499
1500       err =
1501         proc_wait_request (proc_server, inf->event_port, inf->pid, WUNTRACED);
1502       if (err)
1503         warning (_("wait request failed: %s"), safe_strerror (err));
1504       else
1505         {
1506           inf_debug (inf, "waits pending: %d", proc_waits_pending);
1507           proc_wait_pid = inf->pid;
1508           /* Even if proc_waits_pending was > 0 before, we still won't
1509              get any other replies, because it was either from a
1510              different INF, or a different process attached to INF --
1511              and the event port, which is the wait reply port, changes
1512              when you switch processes.  */
1513           proc_waits_pending = 1;
1514         }
1515     }
1516
1517   inf_clear_wait (inf);
1518
1519   /* What can happen? (1) Dead name notification; (2) Exceptions arrive;
1520      (3) wait reply from the proc server.  */
1521
1522   inf_debug (inf, "waiting for an event...");
1523   err = mach_msg (&msg.hdr, MACH_RCV_MSG | MACH_RCV_INTERRUPT,
1524                   0, sizeof (struct msg), inf->event_port,
1525                   MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
1526
1527   /* Re-suspend the task.  */
1528   inf_suspend (inf);
1529
1530   if (!inf->task && inf->pending_execs)
1531     /* When doing an exec, it's possible that the old task wasn't reused
1532        (e.g., setuid execs).  So if the task seems to have disappeared,
1533        attempt to refetch it, as the pid should still be the same.  */
1534     inf_set_pid (inf, inf->pid);
1535
1536   if (err == EMACH_RCV_INTERRUPTED)
1537     inf_debug (inf, "interrupted");
1538   else if (err)
1539     error (_("Couldn't wait for an event: %s"), safe_strerror (err));
1540   else
1541     {
1542       struct
1543         {
1544           mach_msg_header_t hdr;
1545           mach_msg_type_t err_type;
1546           kern_return_t err;
1547           char noise[200];
1548         }
1549       reply;
1550
1551       inf_debug (inf, "event: msgid = %d", msg.hdr.msgh_id);
1552
1553       /* Handle what we got.  */
1554       if (!notify_server (&msg.hdr, &reply.hdr)
1555           && !exc_server (&msg.hdr, &reply.hdr)
1556           && !process_reply_server (&msg.hdr, &reply.hdr)
1557           && !msg_reply_server (&msg.hdr, &reply.hdr))
1558         /* Whatever it is, it's something strange.  */
1559         error (_("Got a strange event, msg id = %d."), msg.hdr.msgh_id);
1560
1561       if (reply.err)
1562         error (_("Handling event, msgid = %d: %s"),
1563                msg.hdr.msgh_id, safe_strerror (reply.err));
1564     }
1565
1566   if (inf->pending_execs)
1567     /* We're waiting for the inferior to finish execing.  */
1568     {
1569       struct inf_wait *w = &inf->wait;
1570       enum target_waitkind kind = w->status.kind;
1571
1572       if (kind == TARGET_WAITKIND_SPURIOUS)
1573         /* Since gdb is actually counting the number of times the inferior
1574            stops, expecting one stop per exec, we only return major events
1575            while execing.  */
1576         {
1577           w->suppress = 1;
1578           inf_debug (inf, "pending_execs, ignoring minor event");
1579         }
1580       else if (kind == TARGET_WAITKIND_STOPPED
1581                && w->status.value.sig == GDB_SIGNAL_TRAP)
1582         /* Ah hah!  A SIGTRAP from the inferior while starting up probably
1583            means we've succesfully completed an exec!  */
1584         {
1585           inf_debug (inf, "one pending exec completed");
1586         }
1587       else if (kind == TARGET_WAITKIND_STOPPED)
1588         /* It's possible that this signal is because of a crashed process
1589            being handled by the hurd crash server; in this case, the process
1590            will have an extra task suspend, which we need to know about.
1591            Since the code in inf_resume that normally checks for this is
1592            disabled while INF->pending_execs, we do the check here instead.  */
1593         inf_validate_task_sc (inf);
1594     }
1595
1596   if (inf->wait.suppress)
1597     /* Some totally spurious event happened that we don't consider
1598        worth returning to gdb.  Just keep waiting.  */
1599     {
1600       inf_debug (inf, "suppressing return, rewaiting...");
1601       inf_resume (inf);
1602       goto rewait;
1603     }
1604
1605   /* Pass back out our results.  */
1606   memcpy (status, &inf->wait.status, sizeof (*status));
1607
1608   thread = inf->wait.thread;
1609   if (thread)
1610     ptid = ptid_build (inf->pid, thread->tid, 0);
1611   else if (ptid_equal (ptid, minus_one_ptid))
1612     thread = inf_tid_to_thread (inf, -1);
1613   else
1614     thread = inf_tid_to_thread (inf, ptid_get_lwp (ptid));
1615
1616   if (!thread || thread->port == MACH_PORT_NULL)
1617     {
1618       /* TID is dead; try and find a new thread.  */
1619       if (inf_update_procs (inf) && inf->threads)
1620         ptid = ptid_build (inf->pid, inf->threads->tid, 0); /* The first
1621                                                                available
1622                                                                thread.  */
1623       else
1624         ptid = inferior_ptid;   /* let wait_for_inferior handle exit case */
1625     }
1626
1627   if (thread
1628       && !ptid_equal (ptid, minus_one_ptid)
1629       && status->kind != TARGET_WAITKIND_SPURIOUS
1630       && inf->pause_sc == 0 && thread->pause_sc == 0)
1631     /* If something actually happened to THREAD, make sure we
1632        suspend it.  */
1633     {
1634       thread->sc = 1;
1635       inf_update_suspends (inf);
1636     }
1637
1638   inf_debug (inf, "returning ptid = %s, status = %s (%d)",
1639              target_pid_to_str (ptid),
1640              status->kind == TARGET_WAITKIND_EXITED ? "EXITED"
1641              : status->kind == TARGET_WAITKIND_STOPPED ? "STOPPED"
1642              : status->kind == TARGET_WAITKIND_SIGNALLED ? "SIGNALLED"
1643              : status->kind == TARGET_WAITKIND_LOADED ? "LOADED"
1644              : status->kind == TARGET_WAITKIND_SPURIOUS ? "SPURIOUS"
1645              : "?",
1646              status->value.integer);
1647
1648   return ptid;
1649 }
1650
1651 \f
1652 /* The rpc handler called by exc_server.  */
1653 error_t
1654 S_exception_raise_request (mach_port_t port, mach_port_t reply_port,
1655                            thread_t thread_port, task_t task_port,
1656                            int exception, int code, int subcode)
1657 {
1658   struct inf *inf = waiting_inf;
1659   struct proc *thread = inf_port_to_thread (inf, thread_port);
1660
1661   inf_debug (waiting_inf,
1662              "thread = %lu, task = %lu, exc = %d, code = %d, subcode = %d",
1663              thread_port, task_port, exception, code, subcode);
1664
1665   if (!thread)
1666     /* We don't know about thread?  */
1667     {
1668       inf_update_procs (inf);
1669       thread = inf_port_to_thread (inf, thread_port);
1670       if (!thread)
1671         /* Give up, the generating thread is gone.  */
1672         return 0;
1673     }
1674
1675   mach_port_deallocate (mach_task_self (), thread_port);
1676   mach_port_deallocate (mach_task_self (), task_port);
1677
1678   if (!thread->aborted)
1679     /* THREAD hasn't been aborted since this exception happened (abortion
1680        clears any exception state), so it must be real.  */
1681     {
1682       /* Store away the details; this will destroy any previous info.  */
1683       inf->wait.thread = thread;
1684
1685       inf->wait.status.kind = TARGET_WAITKIND_STOPPED;
1686
1687       if (exception == EXC_BREAKPOINT)
1688         /* GDB likes to get SIGTRAP for breakpoints.  */
1689         {
1690           inf->wait.status.value.sig = GDB_SIGNAL_TRAP;
1691           mach_port_deallocate (mach_task_self (), reply_port);
1692         }
1693       else
1694         /* Record the exception so that we can forward it later.  */
1695         {
1696           if (thread->exc_port == port)
1697             {
1698               inf_debug (waiting_inf, "Handler is thread exception port <%lu>",
1699                          thread->saved_exc_port);
1700               inf->wait.exc.handler = thread->saved_exc_port;
1701             }
1702           else
1703             {
1704               inf_debug (waiting_inf, "Handler is task exception port <%lu>",
1705                          inf->task->saved_exc_port);
1706               inf->wait.exc.handler = inf->task->saved_exc_port;
1707               gdb_assert (inf->task->exc_port == port);
1708             }
1709           if (inf->wait.exc.handler != MACH_PORT_NULL)
1710             /* Add a reference to the exception handler.  */
1711             mach_port_mod_refs (mach_task_self (),
1712                                 inf->wait.exc.handler, MACH_PORT_RIGHT_SEND,
1713                                 1);
1714
1715           inf->wait.exc.exception = exception;
1716           inf->wait.exc.code = code;
1717           inf->wait.exc.subcode = subcode;
1718           inf->wait.exc.reply = reply_port;
1719
1720           /* Exceptions are encoded in the signal space by putting
1721              them after _NSIG; this assumes they're positive (and not
1722              extremely large)!  */
1723           inf->wait.status.value.sig =
1724             gdb_signal_from_host (_NSIG + exception);
1725         }
1726     }
1727   else
1728     /* A supppressed exception, which ignore.  */
1729     {
1730       inf->wait.suppress = 1;
1731       mach_port_deallocate (mach_task_self (), reply_port);
1732     }
1733
1734   return 0;
1735 }
1736
1737 \f
1738 /* Fill in INF's wait field after a task has died without giving us more
1739    detailed information.  */
1740 static void
1741 inf_task_died_status (struct inf *inf)
1742 {
1743   warning (_("Pid %d died with unknown exit status, using SIGKILL."),
1744            inf->pid);
1745   inf->wait.status.kind = TARGET_WAITKIND_SIGNALLED;
1746   inf->wait.status.value.sig = GDB_SIGNAL_KILL;
1747 }
1748
1749 /* Notify server routines.  The only real one is dead name notification.  */
1750 error_t
1751 do_mach_notify_dead_name (mach_port_t notify, mach_port_t dead_port)
1752 {
1753   struct inf *inf = waiting_inf;
1754
1755   inf_debug (waiting_inf, "port = %lu", dead_port);
1756
1757   if (inf->task && inf->task->port == dead_port)
1758     {
1759       proc_debug (inf->task, "is dead");
1760       inf->task->port = MACH_PORT_NULL;
1761       if (proc_wait_pid == inf->pid)
1762         /* We have a wait outstanding on the process, which will return more
1763            detailed information, so delay until we get that.  */
1764         inf->wait.suppress = 1;
1765       else
1766         /* We never waited for the process (maybe it wasn't a child), so just
1767            pretend it got a SIGKILL.  */
1768         inf_task_died_status (inf);
1769     }
1770   else
1771     {
1772       struct proc *thread = inf_port_to_thread (inf, dead_port);
1773
1774       if (thread)
1775         {
1776           proc_debug (thread, "is dead");
1777           thread->port = MACH_PORT_NULL;
1778         }
1779
1780       if (inf->task->dead)
1781         /* Since the task is dead, its threads are dying with it.  */
1782         inf->wait.suppress = 1;
1783     }
1784
1785   mach_port_deallocate (mach_task_self (), dead_port);
1786   inf->threads_up_to_date = 0;  /* Just in case.  */
1787
1788   return 0;
1789 }
1790
1791 \f
1792 #define ILL_RPC(fun, ...) \
1793   extern kern_return_t fun (__VA_ARGS__); \
1794   kern_return_t fun (__VA_ARGS__) \
1795   { \
1796     warning (_("illegal rpc: %s"), #fun); \
1797     return 0; \
1798   }
1799
1800 ILL_RPC (do_mach_notify_no_senders,
1801          mach_port_t notify, mach_port_mscount_t count)
1802 ILL_RPC (do_mach_notify_port_deleted,
1803          mach_port_t notify, mach_port_t name)
1804 ILL_RPC (do_mach_notify_msg_accepted,
1805          mach_port_t notify, mach_port_t name)
1806 ILL_RPC (do_mach_notify_port_destroyed,
1807          mach_port_t notify, mach_port_t name)
1808 ILL_RPC (do_mach_notify_send_once,
1809          mach_port_t notify)
1810 \f
1811 /* Process_reply server routines.  We only use process_wait_reply.  */
1812
1813 error_t
1814 S_proc_wait_reply (mach_port_t reply, error_t err,
1815                    int status, int sigcode, rusage_t rusage, pid_t pid)
1816 {
1817   struct inf *inf = waiting_inf;
1818
1819   inf_debug (inf, "err = %s, pid = %d, status = 0x%x, sigcode = %d",
1820              err ? safe_strerror (err) : "0", pid, status, sigcode);
1821
1822   if (err && proc_wait_pid && (!inf->task || !inf->task->port))
1823     /* Ack.  The task has died, but the task-died notification code didn't
1824        tell anyone because it thought a more detailed reply from the
1825        procserver was forthcoming.  However, we now learn that won't
1826        happen...  So we have to act like the task just died, and this time,
1827        tell the world.  */
1828     inf_task_died_status (inf);
1829
1830   if (--proc_waits_pending == 0)
1831     /* PROC_WAIT_PID represents the most recent wait.  We will always get
1832        replies in order because the proc server is single threaded.  */
1833     proc_wait_pid = 0;
1834
1835   inf_debug (inf, "waits pending now: %d", proc_waits_pending);
1836
1837   if (err)
1838     {
1839       if (err != EINTR)
1840         {
1841           warning (_("Can't wait for pid %d: %s"),
1842                    inf->pid, safe_strerror (err));
1843           inf->no_wait = 1;
1844
1845           /* Since we can't see the inferior's signals, don't trap them.  */
1846           inf_set_traced (inf, 0);
1847         }
1848     }
1849   else if (pid == inf->pid)
1850     {
1851       store_waitstatus (&inf->wait.status, status);
1852       if (inf->wait.status.kind == TARGET_WAITKIND_STOPPED)
1853         /* The process has sent us a signal, and stopped itself in a sane
1854            state pending our actions.  */
1855         {
1856           inf_debug (inf, "process has stopped itself");
1857           inf->stopped = 1;
1858         }
1859     }
1860   else
1861     inf->wait.suppress = 1;     /* Something odd happened.  Ignore.  */
1862
1863   return 0;
1864 }
1865
1866 ILL_RPC (S_proc_setmsgport_reply,
1867          mach_port_t reply_port, kern_return_t return_code,
1868          mach_port_t oldmsgport)
1869 ILL_RPC (S_proc_getmsgport_reply,
1870          mach_port_t reply_port, kern_return_t return_code,
1871          mach_port_t msgports)
1872 ILL_RPC (S_proc_pid2task_reply,
1873          mach_port_t reply_port, kern_return_t return_code, mach_port_t task)
1874 ILL_RPC (S_proc_task2pid_reply,
1875          mach_port_t reply_port, kern_return_t return_code, pid_t pid)
1876 ILL_RPC (S_proc_task2proc_reply,
1877          mach_port_t reply_port, kern_return_t return_code, mach_port_t proc)
1878 ILL_RPC (S_proc_proc2task_reply,
1879          mach_port_t reply_port, kern_return_t return_code, mach_port_t task)
1880 ILL_RPC (S_proc_pid2proc_reply,
1881          mach_port_t reply_port, kern_return_t return_code, mach_port_t proc)
1882 ILL_RPC (S_proc_getprocinfo_reply,
1883          mach_port_t reply_port, kern_return_t return_code,
1884          int flags, procinfo_t procinfo, mach_msg_type_number_t procinfoCnt,
1885          data_t threadwaits, mach_msg_type_number_t threadwaitsCnt)
1886 ILL_RPC (S_proc_getprocargs_reply,
1887          mach_port_t reply_port, kern_return_t return_code,
1888          data_t procargs, mach_msg_type_number_t procargsCnt)
1889 ILL_RPC (S_proc_getprocenv_reply,
1890          mach_port_t reply_port, kern_return_t return_code,
1891          data_t procenv, mach_msg_type_number_t procenvCnt)
1892 ILL_RPC (S_proc_getloginid_reply,
1893          mach_port_t reply_port, kern_return_t return_code, pid_t login_id)
1894 ILL_RPC (S_proc_getloginpids_reply,
1895          mach_port_t reply_port, kern_return_t return_code,
1896          pidarray_t pids, mach_msg_type_number_t pidsCnt)
1897 ILL_RPC (S_proc_getlogin_reply,
1898          mach_port_t reply_port, kern_return_t return_code, string_t logname)
1899 ILL_RPC (S_proc_getsid_reply,
1900          mach_port_t reply_port, kern_return_t return_code, pid_t sid)
1901 ILL_RPC (S_proc_getsessionpgids_reply,
1902          mach_port_t reply_port, kern_return_t return_code,
1903          pidarray_t pgidset, mach_msg_type_number_t pgidsetCnt)
1904 ILL_RPC (S_proc_getsessionpids_reply,
1905          mach_port_t reply_port, kern_return_t return_code,
1906          pidarray_t pidset, mach_msg_type_number_t pidsetCnt)
1907 ILL_RPC (S_proc_getsidport_reply,
1908          mach_port_t reply_port, kern_return_t return_code,
1909          mach_port_t sessport)
1910 ILL_RPC (S_proc_getpgrp_reply,
1911          mach_port_t reply_port, kern_return_t return_code, pid_t pgrp)
1912 ILL_RPC (S_proc_getpgrppids_reply,
1913          mach_port_t reply_port, kern_return_t return_code,
1914          pidarray_t pidset, mach_msg_type_number_t pidsetCnt)
1915 ILL_RPC (S_proc_get_tty_reply,
1916          mach_port_t reply_port, kern_return_t return_code, mach_port_t tty)
1917 ILL_RPC (S_proc_getnports_reply,
1918          mach_port_t reply_port, kern_return_t return_code,
1919          mach_msg_type_number_t nports)
1920 ILL_RPC (S_proc_is_important_reply,
1921          mach_port_t reply_port, kern_return_t return_code,
1922          boolean_t essential)
1923 ILL_RPC (S_proc_get_code_reply,
1924          mach_port_t reply_port, kern_return_t return_code,
1925          vm_address_t start_code, vm_address_t end_code)
1926 \f
1927 /* Msg_reply server routines.  We only use msg_sig_post_untraced_reply.  */
1928
1929 error_t
1930 S_msg_sig_post_untraced_reply (mach_port_t reply, error_t err)
1931 {
1932   struct inf *inf = waiting_inf;
1933
1934   if (err == EBUSY)
1935     /* EBUSY is what we get when the crash server has grabbed control of the
1936        process and doesn't like what signal we tried to send it.  Just act
1937        like the process stopped (using a signal of 0 should mean that the
1938        *next* time the user continues, it will pass signal 0, which the crash
1939        server should like).  */
1940     {
1941       inf->wait.status.kind = TARGET_WAITKIND_STOPPED;
1942       inf->wait.status.value.sig = GDB_SIGNAL_0;
1943     }
1944   else if (err)
1945     warning (_("Signal delivery failed: %s"), safe_strerror (err));
1946
1947   if (err)
1948     /* We only get this reply when we've posted a signal to a process which we
1949        thought was stopped, and which we expected to continue after the signal.
1950        Given that the signal has failed for some reason, it's reasonable to
1951        assume it's still stopped.  */
1952     inf->stopped = 1;
1953   else
1954     inf->wait.suppress = 1;
1955
1956   return 0;
1957 }
1958
1959 ILL_RPC (S_msg_sig_post_reply,
1960          mach_port_t reply, error_t err)
1961 \f
1962 /* Returns the number of messages queued for the receive right PORT.  */
1963 static mach_port_msgcount_t
1964 port_msgs_queued (mach_port_t port)
1965 {
1966   struct mach_port_status status;
1967   error_t err =
1968     mach_port_get_receive_status (mach_task_self (), port, &status);
1969
1970   if (err)
1971     return 0;
1972   else
1973     return status.mps_msgcount;
1974 }
1975
1976 \f
1977 /* Resume execution of the inferior process.
1978
1979    If STEP is nonzero, single-step it.
1980    If SIGNAL is nonzero, give it that signal.
1981
1982    TID  STEP:
1983    -1   true   Single step the current thread allowing other threads to run.
1984    -1   false  Continue the current thread allowing other threads to run.
1985    X    true   Single step the given thread, don't allow any others to run.
1986    X    false  Continue the given thread, do not allow any others to run.
1987    (Where X, of course, is anything except -1)
1988
1989    Note that a resume may not `take' if there are pending exceptions/&c
1990    still unprocessed from the last resume we did (any given resume may result
1991    in multiple events returned by wait).  */
1992
1993 static void
1994 gnu_resume (struct target_ops *ops,
1995             ptid_t ptid, int step, enum gdb_signal sig)
1996 {
1997   struct proc *step_thread = 0;
1998   int resume_all;
1999   struct inf *inf = gnu_current_inf;
2000
2001   inf_debug (inf, "ptid = %s, step = %d, sig = %d",
2002              target_pid_to_str (ptid), step, sig);
2003
2004   inf_validate_procinfo (inf);
2005
2006   if (sig != GDB_SIGNAL_0 || inf->stopped)
2007     {
2008       if (sig == GDB_SIGNAL_0 && inf->nomsg)
2009         inf_continue (inf);
2010       else
2011         inf_signal (inf, sig);
2012     }
2013   else if (inf->wait.exc.reply != MACH_PORT_NULL)
2014     /* We received an exception to which we have chosen not to forward, so
2015        abort the faulting thread, which will perhaps retake it.  */
2016     {
2017       proc_abort (inf->wait.thread, 1);
2018       warning (_("Aborting %s with unforwarded exception %s."),
2019                proc_string (inf->wait.thread),
2020                gdb_signal_to_name (inf->wait.status.value.sig));
2021     }
2022
2023   if (port_msgs_queued (inf->event_port))
2024     /* If there are still messages in our event queue, don't bother resuming
2025        the process, as we're just going to stop it right away anyway.  */
2026     return;
2027
2028   inf_update_procs (inf);
2029
2030   /* A specific PTID means `step only this process id'.  */
2031   resume_all = ptid_equal (ptid, minus_one_ptid);
2032
2033   if (resume_all)
2034     /* Allow all threads to run, except perhaps single-stepping one.  */
2035     {
2036       inf_debug (inf, "running all threads; tid = %d",
2037                  ptid_get_pid (inferior_ptid));
2038       ptid = inferior_ptid;     /* What to step.  */
2039       inf_set_threads_resume_sc (inf, 0, 1);
2040     }
2041   else
2042     /* Just allow a single thread to run.  */
2043     {
2044       struct proc *thread = inf_tid_to_thread (inf, ptid_get_lwp (ptid));
2045
2046       if (!thread)
2047         error (_("Can't run single thread id %s: no such thread!"),
2048                target_pid_to_str (ptid));
2049       inf_debug (inf, "running one thread: %s", target_pid_to_str (ptid));
2050       inf_set_threads_resume_sc (inf, thread, 0);
2051     }
2052
2053   if (step)
2054     {
2055       step_thread = inf_tid_to_thread (inf, ptid_get_lwp (ptid));
2056       if (!step_thread)
2057         warning (_("Can't step thread id %s: no such thread."),
2058                  target_pid_to_str (ptid));
2059       else
2060         inf_debug (inf, "stepping thread: %s", target_pid_to_str (ptid));
2061     }
2062   if (step_thread != inf->step_thread)
2063     inf_set_step_thread (inf, step_thread);
2064
2065   inf_debug (inf, "here we go...");
2066   inf_resume (inf);
2067 }
2068
2069 \f
2070 static void
2071 gnu_kill_inferior (struct target_ops *ops)
2072 {
2073   struct proc *task = gnu_current_inf->task;
2074
2075   if (task)
2076     {
2077       proc_debug (task, "terminating...");
2078       task_terminate (task->port);
2079       inf_set_pid (gnu_current_inf, -1);
2080     }
2081   target_mourn_inferior ();
2082 }
2083
2084 /* Clean up after the inferior dies.  */
2085 static void
2086 gnu_mourn_inferior (struct target_ops *ops)
2087 {
2088   inf_debug (gnu_current_inf, "rip");
2089   inf_detach (gnu_current_inf);
2090   inf_child_mourn_inferior (ops);
2091 }
2092
2093 \f
2094 /* Fork an inferior process, and start debugging it.  */
2095
2096 /* Set INFERIOR_PID to the first thread available in the child, if any.  */
2097 static int
2098 inf_pick_first_thread (void)
2099 {
2100   if (gnu_current_inf->task && gnu_current_inf->threads)
2101     /* The first thread.  */
2102     return gnu_current_inf->threads->tid;
2103   else
2104     /* What may be the next thread.  */
2105     return next_thread_id;
2106 }
2107
2108 static struct inf *
2109 cur_inf (void)
2110 {
2111   if (!gnu_current_inf)
2112     gnu_current_inf = make_inf ();
2113   return gnu_current_inf;
2114 }
2115
2116 static void
2117 gnu_create_inferior (struct target_ops *ops, 
2118                      char *exec_file, char *allargs, char **env,
2119                      int from_tty)
2120 {
2121   struct inf *inf = cur_inf ();
2122   int pid;
2123
2124   void trace_me (void)
2125   {
2126     /* We're in the child; make this process stop as soon as it execs.  */
2127     inf_debug (inf, "tracing self");
2128     if (ptrace (PTRACE_TRACEME) != 0)
2129       error (_("ptrace (PTRACE_TRACEME) failed!"));
2130   }
2131
2132   inf_debug (inf, "creating inferior");
2133
2134   pid = fork_inferior (exec_file, allargs, env, trace_me,
2135                        NULL, NULL, NULL, NULL);
2136
2137   /* Attach to the now stopped child, which is actually a shell...  */
2138   inf_debug (inf, "attaching to child: %d", pid);
2139
2140   inf_attach (inf, pid);
2141
2142   push_target (ops);
2143
2144   inf->pending_execs = 1;
2145   inf->nomsg = 1;
2146   inf->traced = 1;
2147
2148   /* Now let the child run again, knowing that it will stop
2149      immediately because of the ptrace.  */
2150   inf_resume (inf);
2151
2152   /* We now have thread info.  */
2153   thread_change_ptid (inferior_ptid,
2154                       ptid_build (inf->pid, inf_pick_first_thread (), 0));
2155
2156   startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
2157   inf->pending_execs = 0;
2158
2159   inf_validate_procinfo (inf);
2160   inf_update_signal_thread (inf);
2161   inf_set_traced (inf, inf->want_signals);
2162
2163   /* Execing the process will have trashed our exception ports; steal them
2164      back (or make sure they're restored if the user wants that).  */
2165   if (inf->want_exceptions)
2166     inf_steal_exc_ports (inf);
2167   else
2168     inf_restore_exc_ports (inf);
2169 }
2170
2171 \f
2172 /* Attach to process PID, then initialize for debugging it
2173    and wait for the trace-trap that results from attaching.  */
2174 static void
2175 gnu_attach (struct target_ops *ops, const char *args, int from_tty)
2176 {
2177   int pid;
2178   char *exec_file;
2179   struct inf *inf = cur_inf ();
2180   struct inferior *inferior;
2181
2182   pid = parse_pid_to_attach (args);
2183
2184   if (pid == getpid ())         /* Trying to masturbate?  */
2185     error (_("I refuse to debug myself!"));
2186
2187   if (from_tty)
2188     {
2189       exec_file = (char *) get_exec_file (0);
2190
2191       if (exec_file)
2192         printf_unfiltered ("Attaching to program `%s', pid %d\n",
2193                            exec_file, pid);
2194       else
2195         printf_unfiltered ("Attaching to pid %d\n", pid);
2196
2197       gdb_flush (gdb_stdout);
2198     }
2199
2200   inf_debug (inf, "attaching to pid: %d", pid);
2201
2202   inf_attach (inf, pid);
2203
2204   push_target (ops);
2205
2206   inferior = current_inferior ();
2207   inferior_appeared (inferior, pid);
2208   inferior->attach_flag = 1;
2209
2210   inf_update_procs (inf);
2211
2212   inferior_ptid = ptid_build (pid, inf_pick_first_thread (), 0);
2213
2214   /* We have to initialize the terminal settings now, since the code
2215      below might try to restore them.  */
2216   target_terminal_init ();
2217
2218   /* If the process was stopped before we attached, make it continue the next
2219      time the user does a continue.  */
2220   inf_validate_procinfo (inf);
2221
2222   inf_update_signal_thread (inf);
2223   inf_set_traced (inf, inf->want_signals);
2224
2225 #if 0                           /* Do we need this?  */
2226   renumber_threads (0);         /* Give our threads reasonable names.  */
2227 #endif
2228 }
2229
2230 \f
2231 /* Take a program previously attached to and detaches it.
2232    The program resumes execution and will no longer stop
2233    on signals, etc.  We'd better not have left any breakpoints
2234    in the program or it'll die when it hits one.  For this
2235    to work, it may be necessary for the process to have been
2236    previously attached.  It *might* work if the program was
2237    started via fork.  */
2238 static void
2239 gnu_detach (struct target_ops *ops, const char *args, int from_tty)
2240 {
2241   int pid;
2242
2243   if (from_tty)
2244     {
2245       char *exec_file = get_exec_file (0);
2246
2247       if (exec_file)
2248         printf_unfiltered ("Detaching from program `%s' pid %d\n",
2249                            exec_file, gnu_current_inf->pid);
2250       else
2251         printf_unfiltered ("Detaching from pid %d\n", gnu_current_inf->pid);
2252       gdb_flush (gdb_stdout);
2253     }
2254
2255   pid = gnu_current_inf->pid;
2256
2257   inf_detach (gnu_current_inf);
2258
2259   inferior_ptid = null_ptid;
2260   detach_inferior (pid);
2261
2262   inf_child_maybe_unpush_target (ops);
2263 }
2264 \f
2265 static void
2266 gnu_terminal_init (struct target_ops *self)
2267 {
2268   gdb_assert (gnu_current_inf);
2269   child_terminal_init_with_pgrp (gnu_current_inf->pid);
2270 }
2271
2272 static void
2273 gnu_stop (struct target_ops *self, ptid_t ptid)
2274 {
2275   error (_("to_stop target function not implemented"));
2276 }
2277
2278 static int
2279 gnu_thread_alive (struct target_ops *ops, ptid_t ptid)
2280 {
2281   inf_update_procs (gnu_current_inf);
2282   return !!inf_tid_to_thread (gnu_current_inf,
2283                               ptid_get_lwp (ptid));
2284 }
2285
2286 \f
2287 /* Read inferior task's LEN bytes from ADDR and copy it to MYADDR in
2288    gdb's address space.  Return 0 on failure; number of bytes read
2289    otherwise.  */
2290 static int
2291 gnu_read_inferior (task_t task, CORE_ADDR addr, gdb_byte *myaddr, int length)
2292 {
2293   error_t err;
2294   vm_address_t low_address = (vm_address_t) trunc_page (addr);
2295   vm_size_t aligned_length =
2296   (vm_size_t) round_page (addr + length) - low_address;
2297   pointer_t copied;
2298   mach_msg_type_number_t copy_count;
2299
2300   /* Get memory from inferior with page aligned addresses.  */
2301   err = vm_read (task, low_address, aligned_length, &copied, &copy_count);
2302   if (err)
2303     return 0;
2304
2305   err = hurd_safe_copyin (myaddr, (void *) (addr - low_address + copied),
2306                           length);
2307   if (err)
2308     {
2309       warning (_("Read from inferior faulted: %s"), safe_strerror (err));
2310       length = 0;
2311     }
2312
2313   err = vm_deallocate (mach_task_self (), copied, copy_count);
2314   if (err)
2315     warning (_("gnu_read_inferior vm_deallocate failed: %s"),
2316              safe_strerror (err));
2317
2318   return length;
2319 }
2320
2321 #define CHK_GOTO_OUT(str,ret) \
2322   do if (ret != KERN_SUCCESS) { errstr = #str; goto out; } while(0)
2323
2324 struct vm_region_list
2325 {
2326   struct vm_region_list *next;
2327   vm_prot_t protection;
2328   vm_address_t start;
2329   vm_size_t length;
2330 };
2331
2332 struct obstack region_obstack;
2333
2334 /* Write gdb's LEN bytes from MYADDR and copy it to ADDR in inferior
2335    task's address space.  */
2336 static int
2337 gnu_write_inferior (task_t task, CORE_ADDR addr,
2338                     const gdb_byte *myaddr, int length)
2339 {
2340   error_t err = 0;
2341   vm_address_t low_address = (vm_address_t) trunc_page (addr);
2342   vm_size_t aligned_length =
2343   (vm_size_t) round_page (addr + length) - low_address;
2344   pointer_t copied;
2345   mach_msg_type_number_t copy_count;
2346   int deallocate = 0;
2347
2348   char *errstr = "Bug in gnu_write_inferior";
2349
2350   struct vm_region_list *region_element;
2351   struct vm_region_list *region_head = (struct vm_region_list *) NULL;
2352
2353   /* Get memory from inferior with page aligned addresses.  */
2354   err = vm_read (task,
2355                  low_address,
2356                  aligned_length,
2357                  &copied,
2358                  &copy_count);
2359   CHK_GOTO_OUT ("gnu_write_inferior vm_read failed", err);
2360
2361   deallocate++;
2362
2363   err = hurd_safe_copyout ((void *) (addr - low_address + copied),
2364                            myaddr, length);
2365   CHK_GOTO_OUT ("Write to inferior faulted", err);
2366
2367   obstack_init (&region_obstack);
2368
2369   /* Do writes atomically.
2370      First check for holes and unwritable memory.  */
2371   {
2372     vm_size_t remaining_length = aligned_length;
2373     vm_address_t region_address = low_address;
2374
2375     struct vm_region_list *scan;
2376
2377     while (region_address < low_address + aligned_length)
2378       {
2379         vm_prot_t protection;
2380         vm_prot_t max_protection;
2381         vm_inherit_t inheritance;
2382         boolean_t shared;
2383         mach_port_t object_name;
2384         vm_offset_t offset;
2385         vm_size_t region_length = remaining_length;
2386         vm_address_t old_address = region_address;
2387
2388         err = vm_region (task,
2389                          &region_address,
2390                          &region_length,
2391                          &protection,
2392                          &max_protection,
2393                          &inheritance,
2394                          &shared,
2395                          &object_name,
2396                          &offset);
2397         CHK_GOTO_OUT ("vm_region failed", err);
2398
2399         /* Check for holes in memory.  */
2400         if (old_address != region_address)
2401           {
2402             warning (_("No memory at 0x%lx. Nothing written"),
2403                      old_address);
2404             err = KERN_SUCCESS;
2405             length = 0;
2406             goto out;
2407           }
2408
2409         if (!(max_protection & VM_PROT_WRITE))
2410           {
2411             warning (_("Memory at address 0x%lx is unwritable. "
2412                        "Nothing written"),
2413                      old_address);
2414             err = KERN_SUCCESS;
2415             length = 0;
2416             goto out;
2417           }
2418
2419         /* Chain the regions for later use.  */
2420         region_element =
2421           (struct vm_region_list *)
2422           obstack_alloc (&region_obstack, sizeof (struct vm_region_list));
2423
2424         region_element->protection = protection;
2425         region_element->start = region_address;
2426         region_element->length = region_length;
2427
2428         /* Chain the regions along with protections.  */
2429         region_element->next = region_head;
2430         region_head = region_element;
2431
2432         region_address += region_length;
2433         remaining_length = remaining_length - region_length;
2434       }
2435
2436     /* If things fail after this, we give up.
2437        Somebody is messing up inferior_task's mappings.  */
2438
2439     /* Enable writes to the chained vm regions.  */
2440     for (scan = region_head; scan; scan = scan->next)
2441       {
2442         if (!(scan->protection & VM_PROT_WRITE))
2443           {
2444             err = vm_protect (task,
2445                               scan->start,
2446                               scan->length,
2447                               FALSE,
2448                               scan->protection | VM_PROT_WRITE);
2449             CHK_GOTO_OUT ("vm_protect: enable write failed", err);
2450           }
2451       }
2452
2453     err = vm_write (task,
2454                     low_address,
2455                     copied,
2456                     aligned_length);
2457     CHK_GOTO_OUT ("vm_write failed", err);
2458
2459     /* Set up the original region protections, if they were changed.  */
2460     for (scan = region_head; scan; scan = scan->next)
2461       {
2462         if (!(scan->protection & VM_PROT_WRITE))
2463           {
2464             err = vm_protect (task,
2465                               scan->start,
2466                               scan->length,
2467                               FALSE,
2468                               scan->protection);
2469             CHK_GOTO_OUT ("vm_protect: enable write failed", err);
2470           }
2471       }
2472   }
2473
2474 out:
2475   if (deallocate)
2476     {
2477       obstack_free (&region_obstack, 0);
2478
2479       (void) vm_deallocate (mach_task_self (),
2480                             copied,
2481                             copy_count);
2482     }
2483
2484   if (err != KERN_SUCCESS)
2485     {
2486       warning (_("%s: %s"), errstr, mach_error_string (err));
2487       return 0;
2488     }
2489
2490   return length;
2491 }
2492
2493 \f
2494
2495 /* Implement the to_xfer_partial target_ops method for
2496    TARGET_OBJECT_MEMORY.  */
2497
2498 static enum target_xfer_status
2499 gnu_xfer_memory (gdb_byte *readbuf, const gdb_byte *writebuf,
2500                  CORE_ADDR memaddr, ULONGEST len, ULONGEST *xfered_len)
2501 {
2502   task_t task = (gnu_current_inf
2503                  ? (gnu_current_inf->task
2504                     ? gnu_current_inf->task->port : 0)
2505                  : 0);
2506   int res;
2507
2508   if (task == MACH_PORT_NULL)
2509     return TARGET_XFER_E_IO;
2510
2511   if (writebuf != NULL)
2512     {
2513       inf_debug (gnu_current_inf, "writing %s[%s] <-- %s",
2514                  paddress (target_gdbarch (), memaddr), pulongest (len),
2515                  host_address_to_string (writebuf));
2516       res = gnu_write_inferior (task, memaddr, writebuf, len);
2517     }
2518   else
2519     {
2520       inf_debug (gnu_current_inf, "reading %s[%s] --> %s",
2521                  paddress (target_gdbarch (), memaddr), pulongest (len),
2522                  host_address_to_string (readbuf));
2523       res = gnu_read_inferior (task, memaddr, readbuf, len);
2524     }
2525   gdb_assert (res >= 0);
2526   if (res == 0)
2527     return TARGET_XFER_E_IO;
2528   else
2529     {
2530       *xfered_len = (ULONGEST) res;
2531       return TARGET_XFER_OK;
2532     }
2533 }
2534
2535 /* Target to_xfer_partial implementation.  */
2536
2537 static enum target_xfer_status
2538 gnu_xfer_partial (struct target_ops *ops, enum target_object object,
2539                   const char *annex, gdb_byte *readbuf,
2540                   const gdb_byte *writebuf, ULONGEST offset, ULONGEST len,
2541                   ULONGEST *xfered_len)
2542 {
2543   switch (object)
2544     {
2545     case TARGET_OBJECT_MEMORY:
2546       return gnu_xfer_memory (readbuf, writebuf, offset, len, xfered_len);
2547     default:
2548       return TARGET_XFER_E_IO;
2549     }
2550 }
2551
2552 /* Call FUNC on each memory region in the task.  */
2553 static int
2554 gnu_find_memory_regions (struct target_ops *self,
2555                          find_memory_region_ftype func, void *data)
2556 {
2557   error_t err;
2558   task_t task;
2559   vm_address_t region_address, last_region_address, last_region_end;
2560   vm_prot_t last_protection;
2561
2562   if (gnu_current_inf == 0 || gnu_current_inf->task == 0)
2563     return 0;
2564   task = gnu_current_inf->task->port;
2565   if (task == MACH_PORT_NULL)
2566     return 0;
2567
2568   region_address = last_region_address = last_region_end = VM_MIN_ADDRESS;
2569   last_protection = VM_PROT_NONE;
2570   while (region_address < VM_MAX_ADDRESS)
2571     {
2572       vm_prot_t protection;
2573       vm_prot_t max_protection;
2574       vm_inherit_t inheritance;
2575       boolean_t shared;
2576       mach_port_t object_name;
2577       vm_offset_t offset;
2578       vm_size_t region_length = VM_MAX_ADDRESS - region_address;
2579       vm_address_t old_address = region_address;
2580
2581       err = vm_region (task,
2582                        &region_address,
2583                        &region_length,
2584                        &protection,
2585                        &max_protection,
2586                        &inheritance,
2587                        &shared,
2588                        &object_name,
2589                        &offset);
2590       if (err == KERN_NO_SPACE)
2591         break;
2592       if (err != KERN_SUCCESS)
2593         {
2594           warning (_("vm_region failed: %s"), mach_error_string (err));
2595           return -1;
2596         }
2597
2598       if (protection == last_protection && region_address == last_region_end)
2599         /* This region is contiguous with and indistinguishable from
2600            the previous one, so we just extend that one.  */
2601         last_region_end = region_address += region_length;
2602       else
2603         {
2604           /* This region is distinct from the last one we saw, so report
2605              that previous one.  */
2606           if (last_protection != VM_PROT_NONE)
2607             (*func) (last_region_address,
2608                      last_region_end - last_region_address,
2609                      last_protection & VM_PROT_READ,
2610                      last_protection & VM_PROT_WRITE,
2611                      last_protection & VM_PROT_EXECUTE,
2612                      1, /* MODIFIED is unknown, pass it as true.  */
2613                      data);
2614           last_region_address = region_address;
2615           last_region_end = region_address += region_length;
2616           last_protection = protection;
2617         }
2618     }
2619
2620   /* Report the final region.  */
2621   if (last_region_end > last_region_address && last_protection != VM_PROT_NONE)
2622     (*func) (last_region_address, last_region_end - last_region_address,
2623              last_protection & VM_PROT_READ,
2624              last_protection & VM_PROT_WRITE,
2625              last_protection & VM_PROT_EXECUTE,
2626              1, /* MODIFIED is unknown, pass it as true.  */
2627              data);
2628
2629   return 0;
2630 }
2631
2632 \f
2633 /* Return printable description of proc.  */
2634 char *
2635 proc_string (struct proc *proc)
2636 {
2637   static char tid_str[80];
2638
2639   if (proc_is_task (proc))
2640     xsnprintf (tid_str, sizeof (tid_str), "process %d", proc->inf->pid);
2641   else
2642     xsnprintf (tid_str, sizeof (tid_str), "Thread %d.%d",
2643                proc->inf->pid, proc->tid);
2644   return tid_str;
2645 }
2646
2647 static char *
2648 gnu_pid_to_str (struct target_ops *ops, ptid_t ptid)
2649 {
2650   struct inf *inf = gnu_current_inf;
2651   int tid = ptid_get_lwp (ptid);
2652   struct proc *thread = inf_tid_to_thread (inf, tid);
2653
2654   if (thread)
2655     return proc_string (thread);
2656   else
2657     {
2658       static char tid_str[80];
2659
2660       xsnprintf (tid_str, sizeof (tid_str), "bogus thread id %d", tid);
2661       return tid_str;
2662     }
2663 }
2664
2665 \f
2666 /* Create a prototype generic GNU/Hurd target.  The client can
2667    override it with local methods.  */
2668
2669 struct target_ops *
2670 gnu_target (void)
2671 {
2672   struct target_ops *t = inf_child_target ();
2673
2674   t->to_attach = gnu_attach;
2675   t->to_attach_no_wait = 1;
2676   t->to_detach = gnu_detach;
2677   t->to_resume = gnu_resume;
2678   t->to_wait = gnu_wait;
2679   t->to_xfer_partial = gnu_xfer_partial;
2680   t->to_find_memory_regions = gnu_find_memory_regions;
2681   t->to_terminal_init = gnu_terminal_init;
2682   t->to_kill = gnu_kill_inferior;
2683   t->to_create_inferior = gnu_create_inferior;
2684   t->to_mourn_inferior = gnu_mourn_inferior;
2685   t->to_thread_alive = gnu_thread_alive;
2686   t->to_pid_to_str = gnu_pid_to_str;
2687   t->to_stop = gnu_stop;
2688
2689   return t;
2690 }
2691
2692 \f
2693 /* User task commands.  */
2694
2695 static struct cmd_list_element *set_task_cmd_list = 0;
2696 static struct cmd_list_element *show_task_cmd_list = 0;
2697 /* User thread commands.  */
2698
2699 /* Commands with a prefix of `set/show thread'.  */
2700 extern struct cmd_list_element *thread_cmd_list;
2701 struct cmd_list_element *set_thread_cmd_list = NULL;
2702 struct cmd_list_element *show_thread_cmd_list = NULL;
2703
2704 /* Commands with a prefix of `set/show thread default'.  */
2705 struct cmd_list_element *set_thread_default_cmd_list = NULL;
2706 struct cmd_list_element *show_thread_default_cmd_list = NULL;
2707
2708 static void
2709 set_thread_cmd (char *args, int from_tty)
2710 {
2711   printf_unfiltered ("\"set thread\" must be followed by the "
2712                      "name of a thread property, or \"default\".\n");
2713 }
2714
2715 static void
2716 show_thread_cmd (char *args, int from_tty)
2717 {
2718   printf_unfiltered ("\"show thread\" must be followed by the "
2719                      "name of a thread property, or \"default\".\n");
2720 }
2721
2722 static void
2723 set_thread_default_cmd (char *args, int from_tty)
2724 {
2725   printf_unfiltered ("\"set thread default\" must be followed "
2726                      "by the name of a thread property.\n");
2727 }
2728
2729 static void
2730 show_thread_default_cmd (char *args, int from_tty)
2731 {
2732   printf_unfiltered ("\"show thread default\" must be followed "
2733                      "by the name of a thread property.\n");
2734 }
2735
2736 static int
2737 parse_int_arg (char *args, char *cmd_prefix)
2738 {
2739   if (args)
2740     {
2741       char *arg_end;
2742       int val = strtoul (args, &arg_end, 10);
2743
2744       if (*args && *arg_end == '\0')
2745         return val;
2746     }
2747   error (_("Illegal argument for \"%s\" command, should be an integer."),
2748          cmd_prefix);
2749 }
2750
2751 static int
2752 _parse_bool_arg (char *args, char *t_val, char *f_val, char *cmd_prefix)
2753 {
2754   if (!args || strcmp (args, t_val) == 0)
2755     return 1;
2756   else if (strcmp (args, f_val) == 0)
2757     return 0;
2758   else
2759     error (_("Illegal argument for \"%s\" command, "
2760              "should be \"%s\" or \"%s\"."),
2761            cmd_prefix, t_val, f_val);
2762 }
2763
2764 #define parse_bool_arg(args, cmd_prefix) \
2765   _parse_bool_arg (args, "on", "off", cmd_prefix)
2766
2767 static void
2768 check_empty (char *args, char *cmd_prefix)
2769 {
2770   if (args)
2771     error (_("Garbage after \"%s\" command: `%s'"), cmd_prefix, args);
2772 }
2773
2774 /* Returns the alive thread named by INFERIOR_PID, or signals an error.  */
2775 static struct proc *
2776 cur_thread (void)
2777 {
2778   struct inf *inf = cur_inf ();
2779   struct proc *thread = inf_tid_to_thread (inf,
2780                                            ptid_get_lwp (inferior_ptid));
2781   if (!thread)
2782     error (_("No current thread."));
2783   return thread;
2784 }
2785
2786 /* Returns the current inferior, but signals an error if it has no task.  */
2787 static struct inf *
2788 active_inf (void)
2789 {
2790   struct inf *inf = cur_inf ();
2791
2792   if (!inf->task)
2793     error (_("No current process."));
2794   return inf;
2795 }
2796
2797 \f
2798 static void
2799 set_task_pause_cmd (char *args, int from_tty)
2800 {
2801   struct inf *inf = cur_inf ();
2802   int old_sc = inf->pause_sc;
2803
2804   inf->pause_sc = parse_bool_arg (args, "set task pause");
2805
2806   if (old_sc == 0 && inf->pause_sc != 0)
2807     /* If the task is currently unsuspended, immediately suspend it,
2808        otherwise wait until the next time it gets control.  */
2809     inf_suspend (inf);
2810 }
2811
2812 static void
2813 show_task_pause_cmd (char *args, int from_tty)
2814 {
2815   struct inf *inf = cur_inf ();
2816
2817   check_empty (args, "show task pause");
2818   printf_unfiltered ("The inferior task %s suspended while gdb has control.\n",
2819                      inf->task
2820                      ? (inf->pause_sc == 0 ? "isn't" : "is")
2821                      : (inf->pause_sc == 0 ? "won't be" : "will be"));
2822 }
2823
2824 static void
2825 set_task_detach_sc_cmd (char *args, int from_tty)
2826 {
2827   cur_inf ()->detach_sc = parse_int_arg (args,
2828                                          "set task detach-suspend-count");
2829 }
2830
2831 static void
2832 show_task_detach_sc_cmd (char *args, int from_tty)
2833 {
2834   check_empty (args, "show task detach-suspend-count");
2835   printf_unfiltered ("The inferior task will be left with a "
2836                      "suspend count of %d when detaching.\n",
2837                      cur_inf ()->detach_sc);
2838 }
2839
2840 \f
2841 static void
2842 set_thread_default_pause_cmd (char *args, int from_tty)
2843 {
2844   struct inf *inf = cur_inf ();
2845
2846   inf->default_thread_pause_sc =
2847     parse_bool_arg (args, "set thread default pause") ? 0 : 1;
2848 }
2849
2850 static void
2851 show_thread_default_pause_cmd (char *args, int from_tty)
2852 {
2853   struct inf *inf = cur_inf ();
2854   int sc = inf->default_thread_pause_sc;
2855
2856   check_empty (args, "show thread default pause");
2857   printf_unfiltered ("New threads %s suspended while gdb has control%s.\n",
2858                      sc ? "are" : "aren't",
2859                      !sc && inf->pause_sc ? " (but the task is)" : "");
2860 }
2861
2862 static void
2863 set_thread_default_run_cmd (char *args, int from_tty)
2864 {
2865   struct inf *inf = cur_inf ();
2866
2867   inf->default_thread_run_sc =
2868     parse_bool_arg (args, "set thread default run") ? 0 : 1;
2869 }
2870
2871 static void
2872 show_thread_default_run_cmd (char *args, int from_tty)
2873 {
2874   struct inf *inf = cur_inf ();
2875
2876   check_empty (args, "show thread default run");
2877   printf_unfiltered ("New threads %s allowed to run.\n",
2878                      inf->default_thread_run_sc == 0 ? "are" : "aren't");
2879 }
2880
2881 static void
2882 set_thread_default_detach_sc_cmd (char *args, int from_tty)
2883 {
2884   cur_inf ()->default_thread_detach_sc =
2885     parse_int_arg (args, "set thread default detach-suspend-count");
2886 }
2887
2888 static void
2889 show_thread_default_detach_sc_cmd (char *args, int from_tty)
2890 {
2891   check_empty (args, "show thread default detach-suspend-count");
2892   printf_unfiltered ("New threads will get a detach-suspend-count of %d.\n",
2893                      cur_inf ()->default_thread_detach_sc);
2894 }
2895
2896 \f
2897 /* Steal a send right called NAME in the inferior task, and make it PROC's
2898    saved exception port.  */
2899 static void
2900 steal_exc_port (struct proc *proc, mach_port_t name)
2901 {
2902   error_t err;
2903   mach_port_t port;
2904   mach_msg_type_name_t port_type;
2905
2906   if (!proc || !proc->inf->task)
2907     error (_("No inferior task."));
2908
2909   err = mach_port_extract_right (proc->inf->task->port,
2910                                  name, MACH_MSG_TYPE_COPY_SEND,
2911                                  &port, &port_type);
2912   if (err)
2913     error (_("Couldn't extract send right %lu from inferior: %s"),
2914            name, safe_strerror (err));
2915
2916   if (proc->saved_exc_port)
2917     /* Get rid of our reference to the old one.  */
2918     mach_port_deallocate (mach_task_self (), proc->saved_exc_port);
2919
2920   proc->saved_exc_port = port;
2921
2922   if (!proc->exc_port)
2923     /* If PROC is a thread, we may not have set its exception port
2924        before.  We can't use proc_steal_exc_port because it also sets
2925        saved_exc_port.  */
2926     {
2927       proc->exc_port = proc->inf->event_port;
2928       err = proc_set_exception_port (proc, proc->exc_port);
2929       error (_("Can't set exception port for %s: %s"),
2930              proc_string (proc), safe_strerror (err));
2931     }
2932 }
2933
2934 static void
2935 set_task_exc_port_cmd (char *args, int from_tty)
2936 {
2937   struct inf *inf = cur_inf ();
2938
2939   if (!args)
2940     error (_("No argument to \"set task exception-port\" command."));
2941   steal_exc_port (inf->task, parse_and_eval_address (args));
2942 }
2943
2944 static void
2945 set_stopped_cmd (char *args, int from_tty)
2946 {
2947   cur_inf ()->stopped = _parse_bool_arg (args, "yes", "no", "set stopped");
2948 }
2949
2950 static void
2951 show_stopped_cmd (char *args, int from_tty)
2952 {
2953   struct inf *inf = active_inf ();
2954
2955   check_empty (args, "show stopped");
2956   printf_unfiltered ("The inferior process %s stopped.\n",
2957                      inf->stopped ? "is" : "isn't");
2958 }
2959
2960 static void
2961 set_sig_thread_cmd (char *args, int from_tty)
2962 {
2963   struct inf *inf = cur_inf ();
2964
2965   if (!args || (!isdigit (*args) && strcmp (args, "none") != 0))
2966     error (_("Illegal argument to \"set signal-thread\" command.\n"
2967            "Should be an integer thread ID, or `none'."));
2968
2969   if (strcmp (args, "none") == 0)
2970     inf->signal_thread = 0;
2971   else
2972     {
2973       ptid_t ptid = thread_id_to_pid (atoi (args));
2974
2975       if (ptid_equal (ptid, minus_one_ptid))
2976         error (_("Thread ID %s not known.  "
2977                  "Use the \"info threads\" command to\n"
2978                "see the IDs of currently known threads."), args);
2979       inf->signal_thread = inf_tid_to_thread (inf, ptid_get_lwp (ptid));
2980     }
2981 }
2982
2983 static void
2984 show_sig_thread_cmd (char *args, int from_tty)
2985 {
2986   struct inf *inf = active_inf ();
2987
2988   check_empty (args, "show signal-thread");
2989   if (inf->signal_thread)
2990     printf_unfiltered ("The signal thread is %s.\n",
2991                        proc_string (inf->signal_thread));
2992   else
2993     printf_unfiltered ("There is no signal thread.\n");
2994 }
2995
2996 \f
2997 static void
2998 set_signals_cmd (char *args, int from_tty)
2999 {
3000   struct inf *inf = cur_inf ();
3001
3002   inf->want_signals = parse_bool_arg (args, "set signals");
3003
3004   if (inf->task && inf->want_signals != inf->traced)
3005     /* Make this take effect immediately in a running process.  */
3006     inf_set_traced (inf, inf->want_signals);
3007 }
3008
3009 static void
3010 show_signals_cmd (char *args, int from_tty)
3011 {
3012   struct inf *inf = cur_inf ();
3013
3014   check_empty (args, "show signals");
3015   printf_unfiltered ("The inferior process's signals %s intercepted.\n",
3016                      inf->task
3017                      ? (inf->traced ? "are" : "aren't")
3018                      : (inf->want_signals ? "will be" : "won't be"));
3019 }
3020
3021 static void
3022 set_exceptions_cmd (char *args, int from_tty)
3023 {
3024   struct inf *inf = cur_inf ();
3025   int val = parse_bool_arg (args, "set exceptions");
3026
3027   /* Make this take effect immediately in a running process.  */
3028   /* XXX */ ;
3029
3030   inf->want_exceptions = val;
3031 }
3032
3033 static void
3034 show_exceptions_cmd (char *args, int from_tty)
3035 {
3036   struct inf *inf = cur_inf ();
3037
3038   check_empty (args, "show exceptions");
3039   printf_unfiltered ("Exceptions in the inferior %s trapped.\n",
3040                      inf->task
3041                      ? (inf->want_exceptions ? "are" : "aren't")
3042                      : (inf->want_exceptions ? "will be" : "won't be"));
3043 }
3044
3045 \f
3046 static void
3047 set_task_cmd (char *args, int from_tty)
3048 {
3049   printf_unfiltered ("\"set task\" must be followed by the name"
3050                      " of a task property.\n");
3051 }
3052
3053 static void
3054 show_task_cmd (char *args, int from_tty)
3055 {
3056   struct inf *inf = cur_inf ();
3057
3058   check_empty (args, "show task");
3059
3060   show_signals_cmd (0, from_tty);
3061   show_exceptions_cmd (0, from_tty);
3062   show_task_pause_cmd (0, from_tty);
3063
3064   if (inf->pause_sc == 0)
3065     show_thread_default_pause_cmd (0, from_tty);
3066   show_thread_default_run_cmd (0, from_tty);
3067
3068   if (inf->task)
3069     {
3070       show_stopped_cmd (0, from_tty);
3071       show_sig_thread_cmd (0, from_tty);
3072     }
3073
3074   if (inf->detach_sc != 0)
3075     show_task_detach_sc_cmd (0, from_tty);
3076   if (inf->default_thread_detach_sc != 0)
3077     show_thread_default_detach_sc_cmd (0, from_tty);
3078 }
3079
3080 \f
3081 static void
3082 set_noninvasive_cmd (char *args, int from_tty)
3083 {
3084   /* Invert the sense of the arg for each component.  */
3085   char *inv_args = parse_bool_arg (args, "set noninvasive") ? "off" : "on";
3086
3087   set_task_pause_cmd (inv_args, from_tty);
3088   set_signals_cmd (inv_args, from_tty);
3089   set_exceptions_cmd (inv_args, from_tty);
3090 }
3091
3092 \f
3093 static void
3094 info_port_rights (const char *args, mach_port_type_t only)
3095 {
3096   struct inf *inf = active_inf ();
3097   struct value *vmark = value_mark ();
3098
3099   if (args)
3100     /* Explicit list of port rights.  */
3101     {
3102       while (*args)
3103         {
3104           struct value *val = parse_to_comma_and_eval (&args);
3105           long right = value_as_long (val);
3106           error_t err =
3107             print_port_info (right, 0, inf->task->port, PORTINFO_DETAILS,
3108                              stdout);
3109
3110           if (err)
3111             error (_("%ld: %s."), right, safe_strerror (err));
3112         }
3113     }
3114   else
3115     /* Print all of them.  */
3116     {
3117       error_t err =
3118         print_task_ports_info (inf->task->port, only, PORTINFO_DETAILS,
3119                                stdout);
3120       if (err)
3121         error (_("%s."), safe_strerror (err));
3122     }
3123
3124   value_free_to_mark (vmark);
3125 }
3126
3127 static void
3128 info_send_rights_cmd (char *args, int from_tty)
3129 {
3130   info_port_rights (args, MACH_PORT_TYPE_SEND);
3131 }
3132
3133 static void
3134 info_recv_rights_cmd (char *args, int from_tty)
3135 {
3136   info_port_rights (args, MACH_PORT_TYPE_RECEIVE);
3137 }
3138
3139 static void
3140 info_port_sets_cmd (char *args, int from_tty)
3141 {
3142   info_port_rights (args, MACH_PORT_TYPE_PORT_SET);
3143 }
3144
3145 static void
3146 info_dead_names_cmd (char *args, int from_tty)
3147 {
3148   info_port_rights (args, MACH_PORT_TYPE_DEAD_NAME);
3149 }
3150
3151 static void
3152 info_port_rights_cmd (char *args, int from_tty)
3153 {
3154   info_port_rights (args, ~0);
3155 }
3156
3157 \f
3158 static void
3159 add_task_commands (void)
3160 {
3161   add_cmd ("pause", class_run, set_thread_default_pause_cmd, _("\
3162 Set whether the new threads are suspended while gdb has control.\n\
3163 This property normally has no effect because the whole task is\n\
3164 suspended, however, that may be disabled with \"set task pause off\".\n\
3165 The default value is \"off\"."),
3166            &set_thread_default_cmd_list);
3167   add_cmd ("pause", no_class, show_thread_default_pause_cmd, _("\
3168 Show whether new threads are suspended while gdb has control."),
3169            &show_thread_default_cmd_list);
3170   
3171   add_cmd ("run", class_run, set_thread_default_run_cmd, _("\
3172 Set whether new threads are allowed to run (once gdb has noticed them)."),
3173            &set_thread_default_cmd_list);
3174   add_cmd ("run", no_class, show_thread_default_run_cmd, _("\
3175 Show whether new threads are allowed to run (once gdb has noticed them)."),
3176            &show_thread_default_cmd_list);
3177   
3178   add_cmd ("detach-suspend-count", class_run, set_thread_default_detach_sc_cmd,
3179            _("Set the default detach-suspend-count value for new threads."),
3180            &set_thread_default_cmd_list);
3181   add_cmd ("detach-suspend-count", no_class, show_thread_default_detach_sc_cmd,
3182            _("Show the default detach-suspend-count value for new threads."),
3183            &show_thread_default_cmd_list);
3184
3185   add_cmd ("signals", class_run, set_signals_cmd, _("\
3186 Set whether the inferior process's signals will be intercepted.\n\
3187 Mach exceptions (such as breakpoint traps) are not affected."),
3188            &setlist);
3189   add_alias_cmd ("sigs", "signals", class_run, 1, &setlist);
3190   add_cmd ("signals", no_class, show_signals_cmd, _("\
3191 Show whether the inferior process's signals will be intercepted."),
3192            &showlist);
3193   add_alias_cmd ("sigs", "signals", no_class, 1, &showlist);
3194
3195   add_cmd ("signal-thread", class_run, set_sig_thread_cmd, _("\
3196 Set the thread that gdb thinks is the libc signal thread.\n\
3197 This thread is run when delivering a signal to a non-stopped process."),
3198            &setlist);
3199   add_alias_cmd ("sigthread", "signal-thread", class_run, 1, &setlist);
3200   add_cmd ("signal-thread", no_class, show_sig_thread_cmd, _("\
3201 Set the thread that gdb thinks is the libc signal thread."),
3202            &showlist);
3203   add_alias_cmd ("sigthread", "signal-thread", no_class, 1, &showlist);
3204
3205   add_cmd ("stopped", class_run, set_stopped_cmd, _("\
3206 Set whether gdb thinks the inferior process is stopped as with SIGSTOP.\n\
3207 Stopped process will be continued by sending them a signal."),
3208            &setlist);
3209   add_cmd ("stopped", no_class, show_stopped_cmd, _("\
3210 Show whether gdb thinks the inferior process is stopped as with SIGSTOP."),
3211            &showlist);
3212
3213   add_cmd ("exceptions", class_run, set_exceptions_cmd, _("\
3214 Set whether exceptions in the inferior process will be trapped.\n\
3215 When exceptions are turned off, neither breakpoints nor single-stepping\n\
3216 will work."),
3217            &setlist);
3218   /* Allow `set exc' despite conflict with `set exception-port'.  */
3219   add_alias_cmd ("exc", "exceptions", class_run, 1, &setlist);
3220   add_cmd ("exceptions", no_class, show_exceptions_cmd, _("\
3221 Show whether exceptions in the inferior process will be trapped."),
3222            &showlist);
3223
3224   add_prefix_cmd ("task", no_class, set_task_cmd,
3225                   _("Command prefix for setting task attributes."),
3226                   &set_task_cmd_list, "set task ", 0, &setlist);
3227   add_prefix_cmd ("task", no_class, show_task_cmd,
3228                   _("Command prefix for showing task attributes."),
3229                   &show_task_cmd_list, "show task ", 0, &showlist);
3230
3231   add_cmd ("pause", class_run, set_task_pause_cmd, _("\
3232 Set whether the task is suspended while gdb has control.\n\
3233 A value of \"on\" takes effect immediately, otherwise nothing happens\n\
3234 until the next time the program is continued.\n\
3235 When setting this to \"off\", \"set thread default pause on\" can be\n\
3236 used to pause individual threads by default instead."),
3237            &set_task_cmd_list);
3238   add_cmd ("pause", no_class, show_task_pause_cmd,
3239            _("Show whether the task is suspended while gdb has control."),
3240            &show_task_cmd_list);
3241
3242   add_cmd ("detach-suspend-count", class_run, set_task_detach_sc_cmd,
3243            _("Set the suspend count will leave on the thread when detaching."),
3244            &set_task_cmd_list);
3245   add_cmd ("detach-suspend-count", no_class, show_task_detach_sc_cmd,
3246            _("Show the suspend count will leave "
3247              "on the thread when detaching."),
3248            &show_task_cmd_list);
3249
3250   add_cmd ("exception-port", no_class, set_task_exc_port_cmd, _("\
3251 Set the task exception port to which we forward exceptions.\n\
3252 The argument should be the value of the send right in the task."),
3253            &set_task_cmd_list);
3254   add_alias_cmd ("excp", "exception-port", no_class, 1, &set_task_cmd_list);
3255   add_alias_cmd ("exc-port", "exception-port", no_class, 1,
3256                  &set_task_cmd_list);
3257
3258   /* A convenient way of turning on all options require to noninvasively
3259      debug running tasks.  */
3260   add_cmd ("noninvasive", no_class, set_noninvasive_cmd, _("\
3261 Set task options so that we interfere as little as possible.\n\
3262 This is the same as setting `task pause', `exceptions', and\n\
3263 `signals' to the opposite value."),
3264            &setlist);
3265
3266   /* Commands to show information about the task's ports.  */
3267   add_cmd ("send-rights", class_info, info_send_rights_cmd,
3268            _("Show information about the task's send rights"),
3269            &infolist);
3270   add_cmd ("receive-rights", class_info, info_recv_rights_cmd,
3271            _("Show information about the task's receive rights"),
3272            &infolist);
3273   add_cmd ("port-rights", class_info, info_port_rights_cmd,
3274            _("Show information about the task's port rights"),
3275            &infolist);
3276   add_cmd ("port-sets", class_info, info_port_sets_cmd,
3277            _("Show information about the task's port sets"),
3278            &infolist);
3279   add_cmd ("dead-names", class_info, info_dead_names_cmd,
3280            _("Show information about the task's dead names"),
3281            &infolist);
3282   add_info_alias ("ports", "port-rights", 1);
3283   add_info_alias ("port", "port-rights", 1);
3284   add_info_alias ("psets", "port-sets", 1);
3285 }
3286
3287 \f
3288 static void
3289 set_thread_pause_cmd (char *args, int from_tty)
3290 {
3291   struct proc *thread = cur_thread ();
3292   int old_sc = thread->pause_sc;
3293
3294   thread->pause_sc = parse_bool_arg (args, "set thread pause");
3295   if (old_sc == 0 && thread->pause_sc != 0 && thread->inf->pause_sc == 0)
3296     /* If the task is currently unsuspended, immediately suspend it,
3297        otherwise wait until the next time it gets control.  */
3298     inf_suspend (thread->inf);
3299 }
3300
3301 static void
3302 show_thread_pause_cmd (char *args, int from_tty)
3303 {
3304   struct proc *thread = cur_thread ();
3305   int sc = thread->pause_sc;
3306
3307   check_empty (args, "show task pause");
3308   printf_unfiltered ("Thread %s %s suspended while gdb has control%s.\n",
3309                      proc_string (thread),
3310                      sc ? "is" : "isn't",
3311                      !sc && thread->inf->pause_sc ? " (but the task is)" : "");
3312 }
3313
3314 static void
3315 set_thread_run_cmd (char *args, int from_tty)
3316 {
3317   struct proc *thread = cur_thread ();
3318
3319   thread->run_sc = parse_bool_arg (args, "set thread run") ? 0 : 1;
3320 }
3321
3322 static void
3323 show_thread_run_cmd (char *args, int from_tty)
3324 {
3325   struct proc *thread = cur_thread ();
3326
3327   check_empty (args, "show thread run");
3328   printf_unfiltered ("Thread %s %s allowed to run.",
3329                      proc_string (thread),
3330                      thread->run_sc == 0 ? "is" : "isn't");
3331 }
3332
3333 static void
3334 set_thread_detach_sc_cmd (char *args, int from_tty)
3335 {
3336   cur_thread ()->detach_sc = parse_int_arg (args,
3337                                             "set thread detach-suspend-count");
3338 }
3339
3340 static void
3341 show_thread_detach_sc_cmd (char *args, int from_tty)
3342 {
3343   struct proc *thread = cur_thread ();
3344
3345   check_empty (args, "show thread detach-suspend-count");
3346   printf_unfiltered ("Thread %s will be left with a suspend count"
3347                      " of %d when detaching.\n",
3348                      proc_string (thread),
3349                      thread->detach_sc);
3350 }
3351
3352 static void
3353 set_thread_exc_port_cmd (char *args, int from_tty)
3354 {
3355   struct proc *thread = cur_thread ();
3356
3357   if (!args)
3358     error (_("No argument to \"set thread exception-port\" command."));
3359   steal_exc_port (thread, parse_and_eval_address (args));
3360 }
3361
3362 #if 0
3363 static void
3364 show_thread_cmd (char *args, int from_tty)
3365 {
3366   struct proc *thread = cur_thread ();
3367
3368   check_empty (args, "show thread");
3369   show_thread_run_cmd (0, from_tty);
3370   show_thread_pause_cmd (0, from_tty);
3371   if (thread->detach_sc != 0)
3372     show_thread_detach_sc_cmd (0, from_tty);
3373 }
3374 #endif
3375
3376 static void
3377 thread_takeover_sc_cmd (char *args, int from_tty)
3378 {
3379   struct proc *thread = cur_thread ();
3380
3381   thread_basic_info_data_t _info;
3382   thread_basic_info_t info = &_info;
3383   mach_msg_type_number_t info_len = THREAD_BASIC_INFO_COUNT;
3384   error_t err =
3385   thread_info (thread->port, THREAD_BASIC_INFO, (int *) &info, &info_len);
3386   if (err)
3387     error (("%s."), safe_strerror (err));
3388   thread->sc = info->suspend_count;
3389   if (from_tty)
3390     printf_unfiltered ("Suspend count was %d.\n", thread->sc);
3391   if (info != &_info)
3392     vm_deallocate (mach_task_self (), (vm_address_t) info,
3393                    info_len * sizeof (int));
3394 }
3395
3396 \f
3397 static void
3398 add_thread_commands (void)
3399 {
3400   add_prefix_cmd ("thread", no_class, set_thread_cmd,
3401                   _("Command prefix for setting thread properties."),
3402                   &set_thread_cmd_list, "set thread ", 0, &setlist);
3403   add_prefix_cmd ("default", no_class, show_thread_cmd,
3404                   _("Command prefix for setting default thread properties."),
3405                   &set_thread_default_cmd_list, "set thread default ", 0,
3406                   &set_thread_cmd_list);
3407   add_prefix_cmd ("thread", no_class, set_thread_default_cmd,
3408                   _("Command prefix for showing thread properties."),
3409                   &show_thread_cmd_list, "show thread ", 0, &showlist);
3410   add_prefix_cmd ("default", no_class, show_thread_default_cmd,
3411                   _("Command prefix for showing default thread properties."),
3412                   &show_thread_default_cmd_list, "show thread default ", 0,
3413                   &show_thread_cmd_list);
3414
3415   add_cmd ("pause", class_run, set_thread_pause_cmd, _("\
3416 Set whether the current thread is suspended while gdb has control.\n\
3417 A value of \"on\" takes effect immediately, otherwise nothing happens\n\
3418 until the next time the program is continued.  This property normally\n\
3419 has no effect because the whole task is suspended, however, that may\n\
3420 be disabled with \"set task pause off\".\n\
3421 The default value is \"off\"."),
3422            &set_thread_cmd_list);
3423   add_cmd ("pause", no_class, show_thread_pause_cmd, _("\
3424 Show whether the current thread is suspended while gdb has control."),
3425            &show_thread_cmd_list);
3426
3427   add_cmd ("run", class_run, set_thread_run_cmd,
3428            _("Set whether the current thread is allowed to run."),
3429            &set_thread_cmd_list);
3430   add_cmd ("run", no_class, show_thread_run_cmd,
3431            _("Show whether the current thread is allowed to run."),
3432            &show_thread_cmd_list);
3433
3434   add_cmd ("detach-suspend-count", class_run, set_thread_detach_sc_cmd, _("\
3435 Set the suspend count will leave on the thread when detaching.\n\
3436 Note that this is relative to suspend count when gdb noticed the thread;\n\
3437 use the `thread takeover-suspend-count' to force it to an absolute value."),
3438            &set_thread_cmd_list);
3439   add_cmd ("detach-suspend-count", no_class, show_thread_detach_sc_cmd, _("\
3440 Show the suspend count will leave on the thread when detaching.\n\
3441 Note that this is relative to suspend count when gdb noticed the thread;\n\
3442 use the `thread takeover-suspend-count' to force it to an absolute value."),
3443            &show_thread_cmd_list);
3444
3445   add_cmd ("exception-port", no_class, set_thread_exc_port_cmd, _("\
3446 Set the thread exception port to which we forward exceptions.\n\
3447 This overrides the task exception port.\n\
3448 The argument should be the value of the send right in the task."),
3449            &set_thread_cmd_list);
3450   add_alias_cmd ("excp", "exception-port", no_class, 1, &set_thread_cmd_list);
3451   add_alias_cmd ("exc-port", "exception-port", no_class, 1,
3452                  &set_thread_cmd_list);
3453
3454   add_cmd ("takeover-suspend-count", no_class, thread_takeover_sc_cmd, _("\
3455 Force the threads absolute suspend-count to be gdb's.\n\
3456 Prior to giving this command, gdb's thread suspend-counts are relative\n\
3457 to the thread's initial suspend-count when gdb notices the threads."),
3458            &thread_cmd_list);
3459 }
3460
3461 \f
3462
3463 /* -Wmissing-prototypes */
3464 extern initialize_file_ftype _initialize_gnu_nat;
3465
3466 void
3467 _initialize_gnu_nat (void)
3468 {
3469   proc_server = getproc ();
3470
3471   add_task_commands ();
3472   add_thread_commands ();
3473   add_setshow_boolean_cmd ("gnu-nat", class_maintenance,
3474                            &gnu_debug_flag,
3475                            _("Set debugging output for the gnu backend."),
3476                            _("Show debugging output for the gnu backend."),
3477                            NULL,
3478                            NULL,
3479                            NULL,
3480                            &setdebuglist,
3481                            &showdebuglist);
3482 }
3483 \f
3484 #ifdef  FLUSH_INFERIOR_CACHE
3485
3486 /* When over-writing code on some machines the I-Cache must be flushed
3487    explicitly, because it is not kept coherent by the lazy hardware.
3488    This definitely includes breakpoints, for instance, or else we
3489    end up looping in mysterious Bpt traps.  */
3490
3491 void
3492 flush_inferior_icache (CORE_ADDR pc, int amount)
3493 {
3494   vm_machine_attribute_val_t flush = MATTR_VAL_ICACHE_FLUSH;
3495   error_t ret;
3496
3497   ret = vm_machine_attribute (gnu_current_inf->task->port,
3498                               pc,
3499                               amount,
3500                               MATTR_CACHE,
3501                               &flush);
3502   if (ret != KERN_SUCCESS)
3503     warning (_("Error flushing inferior's cache : %s"), safe_strerror (ret));
3504 }
3505 #endif /* FLUSH_INFERIOR_CACHE */