OSDN Git Service

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