Fix formating in copyright headers.
[external/binutils.git] / gdb / darwin-nat.c
1 /* Darwin support for GDB, the GNU debugger.
2    Copyright (C) 2008-2013 Free Software Foundation, Inc.
3
4    Contributed by AdaCore.
5
6    This file is part of GDB.
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20
21 #include "defs.h"
22 #include "top.h"
23 #include "inferior.h"
24 #include "target.h"
25 #include "symfile.h"
26 #include "symtab.h"
27 #include "objfiles.h"
28 #include "gdb.h"
29 #include "gdbcmd.h"
30 #include "gdbcore.h"
31 #include "gdbthread.h"
32 #include "regcache.h"
33 #include "event-top.h"
34 #include "inf-loop.h"
35 #include "gdb_stat.h"
36 #include "exceptions.h"
37 #include "inf-child.h"
38 #include "value.h"
39 #include "arch-utils.h"
40 #include "bfd.h"
41 #include "bfd/mach-o.h"
42
43 #include <sys/ptrace.h>
44 #include <sys/signal.h>
45 #include <machine/setjmp.h>
46 #include <sys/types.h>
47 #include <unistd.h>
48 #include <signal.h>
49 #include <string.h>
50 #include <ctype.h>
51 #include <sys/param.h>
52 #include <sys/sysctl.h>
53 #include <sys/proc.h>
54 #include <libproc.h>
55 #include <sys/syscall.h>
56 #include <spawn.h>
57
58 #include <mach/mach_error.h>
59 #include <mach/mach_vm.h>
60 #include <mach/mach_init.h>
61 #include <mach/vm_map.h>
62 #include <mach/task.h>
63 #include <mach/mach_port.h>
64 #include <mach/thread_act.h>
65 #include <mach/port.h>
66
67 #include "darwin-nat.h"
68 #include "common/filestuff.h"
69
70 /* Quick overview.
71    Darwin kernel is Mach + BSD derived kernel.  Note that they share the
72    same memory space and are linked together (ie there is no micro-kernel).
73
74    Although ptrace(2) is available on Darwin, it is not complete.  We have
75    to use Mach calls to read and write memory and to modify registers.  We
76    also use Mach to get inferior faults.  As we cannot use select(2) or
77    signals with Mach port (the Mach communication channel), signals are
78    reported to gdb as an exception.  Furthermore we detect death of the
79    inferior through a Mach notification message.  This way we only wait
80    on Mach ports.
81
82    Some Mach documentation is available for Apple xnu source package or
83    from the web.  */
84
85
86 #define PTRACE(CMD, PID, ADDR, SIG) \
87  darwin_ptrace(#CMD, CMD, (PID), (ADDR), (SIG))
88
89 extern boolean_t exc_server (mach_msg_header_t *in, mach_msg_header_t *out);
90
91 static void darwin_stop (ptid_t);
92
93 static void darwin_resume_to (struct target_ops *ops, ptid_t ptid, int step,
94                               enum gdb_signal signal);
95 static void darwin_resume (ptid_t ptid, int step,
96                            enum gdb_signal signal);
97
98 static ptid_t darwin_wait_to (struct target_ops *ops, ptid_t ptid,
99                               struct target_waitstatus *status, int options);
100 static ptid_t darwin_wait (ptid_t ptid, struct target_waitstatus *status);
101
102 static void darwin_mourn_inferior (struct target_ops *ops);
103
104 static void darwin_kill_inferior (struct target_ops *ops);
105
106 static void darwin_ptrace_me (void);
107
108 static void darwin_ptrace_him (int pid);
109
110 static void darwin_create_inferior (struct target_ops *ops, char *exec_file,
111                                     char *allargs, char **env, int from_tty);
112
113 static void darwin_files_info (struct target_ops *ops);
114
115 static char *darwin_pid_to_str (struct target_ops *ops, ptid_t tpid);
116
117 static int darwin_thread_alive (struct target_ops *ops, ptid_t tpid);
118
119 /* Target operations for Darwin.  */
120 static struct target_ops *darwin_ops;
121
122 /* Task identifier of gdb.  */
123 static task_t gdb_task;
124
125 /* A copy of mach_host_self ().  */
126 mach_port_t darwin_host_self;
127
128 /* Exception port.  */
129 mach_port_t darwin_ex_port;
130
131 /* Port set.  */
132 mach_port_t darwin_port_set;
133
134 /* Page size.  */
135 static vm_size_t mach_page_size;
136
137 /* If Set, catch all mach exceptions (before they are converted to signals
138    by the kernel).  */
139 static int enable_mach_exceptions;
140
141 /* Inferior that should report a fake stop event.  */
142 static struct inferior *darwin_inf_fake_stop;
143
144 #define PAGE_TRUNC(x) ((x) & ~(mach_page_size - 1))
145 #define PAGE_ROUND(x) PAGE_TRUNC((x) + mach_page_size - 1)
146
147 /* This controls output of inferior debugging.  */
148 static unsigned int darwin_debug_flag = 0;
149
150 /* Create a __TEXT __info_plist section in the executable so that gdb could
151    be signed.  This is required to get an authorization for task_for_pid.
152
153    Once gdb is built, you can either:
154    * make it setgid procmod
155    * or codesign it with any system-trusted signing authority.
156    See taskgated(8) for details.  */
157 static const unsigned char info_plist[]
158 __attribute__ ((section ("__TEXT,__info_plist"),used)) =
159   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
160   "<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\""
161   " \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
162   "<plist version=\"1.0\">\n"
163   "<dict>\n"
164   "  <key>CFBundleIdentifier</key>\n"
165   "  <string>org.gnu.gdb</string>\n"
166   "  <key>CFBundleName</key>\n"
167   "  <string>gdb</string>\n"
168   "  <key>CFBundleVersion</key>\n"
169   "  <string>1.0</string>\n"
170   "  <key>SecTaskAccess</key>\n"
171   "  <array>\n"
172   "    <string>allowed</string>\n"
173   "    <string>debug</string>\n"
174   "  </array>\n"
175   "</dict>\n"
176   "</plist>\n";
177
178 static void
179 inferior_debug (int level, const char *fmt, ...)
180 {
181   va_list ap;
182
183   if (darwin_debug_flag < level)
184     return;
185
186   va_start (ap, fmt);
187   printf_unfiltered (_("[%d inferior]: "), getpid ());
188   vprintf_unfiltered (fmt, ap);
189   va_end (ap);
190 }
191
192 void
193 mach_check_error (kern_return_t ret, const char *file,
194                   unsigned int line, const char *func)
195 {
196   if (ret == KERN_SUCCESS)
197     return;
198   if (func == NULL)
199     func = _("[UNKNOWN]");
200
201   warning (_("Mach error at \"%s:%u\" in function \"%s\": %s (0x%lx)"),
202            file, line, func, mach_error_string (ret), (unsigned long) ret);
203 }
204
205 static const char *
206 unparse_exception_type (unsigned int i)
207 {
208   static char unknown_exception_buf[32];
209
210   switch (i)
211     {
212     case EXC_BAD_ACCESS:
213       return "EXC_BAD_ACCESS";
214     case EXC_BAD_INSTRUCTION:
215       return "EXC_BAD_INSTRUCTION";
216     case EXC_ARITHMETIC:
217       return "EXC_ARITHMETIC";
218     case EXC_EMULATION:
219       return "EXC_EMULATION";
220     case EXC_SOFTWARE:
221       return "EXC_SOFTWARE";
222     case EXC_BREAKPOINT:
223       return "EXC_BREAKPOINT";
224     case EXC_SYSCALL:
225       return "EXC_SYSCALL";
226     case EXC_MACH_SYSCALL:
227       return "EXC_MACH_SYSCALL";
228     case EXC_RPC_ALERT:
229       return "EXC_RPC_ALERT";
230     case EXC_CRASH:
231       return "EXC_CRASH";
232     default:
233       snprintf (unknown_exception_buf, 32, _("unknown (%d)"), i);
234       return unknown_exception_buf;
235     }
236 }
237
238 /* Set errno to zero, and then call ptrace with the given arguments.
239    If inferior debugging traces are on, then also print a debug
240    trace.
241
242    The returned value is the same as the value returned by ptrace,
243    except in the case where that value is -1 but errno is zero.
244    This case is documented to be a non-error situation, so we
245    return zero in that case. */
246
247 static int
248 darwin_ptrace (const char *name,
249                int request, int pid, PTRACE_TYPE_ARG3 arg3, int arg4)
250 {
251   int ret;
252
253   errno = 0;
254   ret = ptrace (request, pid, (caddr_t) arg3, arg4);
255   if (ret == -1 && errno == 0)
256     ret = 0;
257
258   inferior_debug (4, _("ptrace (%s, %d, 0x%x, %d): %d (%s)\n"),
259                   name, pid, arg3, arg4, ret,
260                   (ret != 0) ? safe_strerror (errno) : _("no error"));
261   return ret;
262 }
263
264 static int
265 cmp_thread_t (const void *l, const void *r)
266 {
267   thread_t tl = *(const thread_t *)l;
268   thread_t tr = *(const thread_t *)r;
269   return (int)(tl - tr);
270 }
271
272 static void
273 darwin_check_new_threads (struct inferior *inf)
274 {
275   kern_return_t kret;
276   unsigned int i;
277   thread_array_t thread_list;
278   unsigned int new_nbr;
279   unsigned int old_nbr;
280   unsigned int new_ix, old_ix;
281   darwin_inferior *darwin_inf = inf->private;
282   VEC (darwin_thread_t) *thread_vec;
283
284   /* Get list of threads.  */
285   kret = task_threads (darwin_inf->task, &thread_list, &new_nbr);
286   MACH_CHECK_ERROR (kret);
287   if (kret != KERN_SUCCESS)
288     return;
289
290   /* Sort the list.  */
291   if (new_nbr > 1)
292     qsort (thread_list, new_nbr, sizeof (thread_t), cmp_thread_t);
293
294   if (darwin_inf->threads)
295     old_nbr = VEC_length (darwin_thread_t, darwin_inf->threads);
296   else
297     old_nbr = 0;
298
299   /* Quick check for no changes.  */
300   if (old_nbr == new_nbr)
301     {
302       for (i = 0; i < new_nbr; i++)
303         if (thread_list[i]
304             != VEC_index (darwin_thread_t, darwin_inf->threads, i)->gdb_port)
305           break;
306       if (i == new_nbr)
307         {
308           kret = vm_deallocate (gdb_task, (vm_address_t) thread_list,
309                                 new_nbr * sizeof (int));
310           MACH_CHECK_ERROR (kret);
311           return;
312         }
313     }
314
315   thread_vec = VEC_alloc (darwin_thread_t, new_nbr);
316
317   for (new_ix = 0, old_ix = 0; new_ix < new_nbr || old_ix < old_nbr;)
318     {
319       thread_t new_id = (new_ix < new_nbr) ?
320         thread_list[new_ix] : THREAD_NULL;
321       darwin_thread_t *old = (old_ix < old_nbr) ?
322         VEC_index (darwin_thread_t, darwin_inf->threads, old_ix) : NULL;
323       thread_t old_id = old ? old->gdb_port : THREAD_NULL;
324
325       inferior_debug
326         (12, _(" new_ix:%d/%d, old_ix:%d/%d, new_id:0x%x old_id:0x%x\n"),
327          new_ix, new_nbr, old_ix, old_nbr, new_id, old_id);
328
329       if (old_id == new_id)
330         {
331           /* Thread still exist.  */
332           VEC_safe_push (darwin_thread_t, thread_vec, old);
333           new_ix++;
334           old_ix++;
335
336           kret = mach_port_deallocate (gdb_task, old_id);
337           MACH_CHECK_ERROR (kret);
338           continue;
339         }
340       if (new_ix < new_nbr && new_id == MACH_PORT_DEAD)
341         {
342           /* Ignore dead ports.
343              In some weird cases, we might get dead ports.  They should
344              correspond to dead thread so they could safely be ignored.  */
345           new_ix++;
346           continue;
347         }
348       if (new_ix < new_nbr && (old_ix == old_nbr || new_id < old_id))
349         {
350           /* A thread was created.  */
351           struct thread_info *tp;
352           struct private_thread_info *pti;
353
354           pti = XZALLOC (struct private_thread_info);
355           pti->gdb_port = new_id;
356           pti->msg_state = DARWIN_RUNNING;
357
358           /* Add a new thread unless this is the first one ever met.  */
359           if (!(old_nbr == 0 && new_ix == 0))
360             tp = add_thread_with_info (ptid_build (inf->pid, 0, new_id), pti);
361           else
362             {
363               tp = find_thread_ptid (ptid_build (inf->pid, 0, 0));
364               gdb_assert (tp);
365               tp->private = pti;
366             }
367           VEC_safe_push (darwin_thread_t, thread_vec, pti);
368           new_ix++;
369           continue;
370         }
371       if (old_ix < old_nbr && (new_ix == new_nbr || new_id > old_id))
372         {
373           /* A thread was removed.  */
374           delete_thread (ptid_build (inf->pid, 0, old_id));
375           kret = mach_port_deallocate (gdb_task, old_id);
376           MACH_CHECK_ERROR (kret);
377           old_ix++;
378           continue;
379         }
380       gdb_assert_not_reached ("unexpected thread case");
381     }
382
383   if (darwin_inf->threads)
384     VEC_free (darwin_thread_t, darwin_inf->threads);
385   darwin_inf->threads = thread_vec;
386
387   kret = vm_deallocate (gdb_task, (vm_address_t) thread_list,
388                         new_nbr * sizeof (int));
389   MACH_CHECK_ERROR (kret);
390 }
391
392 static int
393 find_inferior_task_it (struct inferior *inf, void *port_ptr)
394 {
395   return inf->private->task == *(task_t*)port_ptr;
396 }
397
398 static int
399 find_inferior_notify_it (struct inferior *inf, void *port_ptr)
400 {
401   return inf->private->notify_port == *(task_t*)port_ptr;
402 }
403
404 /* Return an inferior by task port.  */
405 static struct inferior *
406 darwin_find_inferior_by_task (task_t port)
407 {
408   return iterate_over_inferiors (&find_inferior_task_it, &port);
409 }
410
411 /* Return an inferior by notification port.  */
412 static struct inferior *
413 darwin_find_inferior_by_notify (mach_port_t port)
414 {
415   return iterate_over_inferiors (&find_inferior_notify_it, &port);
416 }
417
418 /* Return a thread by port.  */
419 static darwin_thread_t *
420 darwin_find_thread (struct inferior *inf, thread_t thread)
421 {
422   darwin_thread_t *t;
423   int k;
424
425   for (k = 0;
426        VEC_iterate (darwin_thread_t, inf->private->threads, k, t);
427        k++)
428     if (t->gdb_port == thread)
429       return t;
430   return NULL;
431 }
432
433 /* Suspend (ie stop) an inferior at Mach level.  */
434
435 static void
436 darwin_suspend_inferior (struct inferior *inf)
437 {
438   if (!inf->private->suspended)
439     {
440       kern_return_t kret;
441
442       kret = task_suspend (inf->private->task);
443       MACH_CHECK_ERROR (kret);
444
445       inf->private->suspended = 1;
446     }
447 }
448
449 /* Resume an inferior at Mach level.  */
450
451 static void
452 darwin_resume_inferior (struct inferior *inf)
453 {
454   if (inf->private->suspended)
455     {
456       kern_return_t kret;
457
458       kret = task_resume (inf->private->task);
459       MACH_CHECK_ERROR (kret);
460
461       inf->private->suspended = 0;
462     }
463 }
464
465 /* Iterator functions.  */
466
467 static int
468 darwin_suspend_inferior_it (struct inferior *inf, void *arg)
469 {
470   darwin_suspend_inferior (inf);
471   darwin_check_new_threads (inf);
472   return 0;
473 }
474
475 static int
476 darwin_resume_inferior_it (struct inferior *inf, void *arg)
477 {
478   darwin_resume_inferior (inf);
479   return 0;
480 }
481
482 static void
483 darwin_dump_message (mach_msg_header_t *hdr, int disp_body)
484 {
485   printf_unfiltered (_("message header:\n"));
486   printf_unfiltered (_(" bits: 0x%x\n"), hdr->msgh_bits);
487   printf_unfiltered (_(" size: 0x%x\n"), hdr->msgh_size);
488   printf_unfiltered (_(" remote-port: 0x%x\n"), hdr->msgh_remote_port);
489   printf_unfiltered (_(" local-port: 0x%x\n"), hdr->msgh_local_port);
490   printf_unfiltered (_(" reserved: 0x%x\n"), hdr->msgh_reserved);
491   printf_unfiltered (_(" id: 0x%x\n"), hdr->msgh_id);
492
493   if (disp_body)
494     {
495       const unsigned char *data;
496       const unsigned long *ldata;
497       int size;
498       int i;
499
500       data = (unsigned char *)(hdr + 1);
501       size = hdr->msgh_size - sizeof (mach_msg_header_t);
502
503       if (hdr->msgh_bits & MACH_MSGH_BITS_COMPLEX)
504         {
505           mach_msg_body_t *bod = (mach_msg_body_t*)data;
506           mach_msg_port_descriptor_t *desc =
507             (mach_msg_port_descriptor_t *)(bod + 1);
508           int k;
509           NDR_record_t *ndr;
510           printf_unfiltered (_("body: descriptor_count=%u\n"),
511                              bod->msgh_descriptor_count);
512           data += sizeof (mach_msg_body_t);
513           size -= sizeof (mach_msg_body_t);
514           for (k = 0; k < bod->msgh_descriptor_count; k++)
515             switch (desc[k].type)
516               {
517               case MACH_MSG_PORT_DESCRIPTOR:
518                 printf_unfiltered
519                   (_(" descr %d: type=%u (port) name=0x%x, dispo=%d\n"),
520                    k, desc[k].type, desc[k].name, desc[k].disposition);
521                 break;
522               default:
523                 printf_unfiltered (_(" descr %d: type=%u\n"),
524                                    k, desc[k].type);
525                 break;
526               }
527           data += bod->msgh_descriptor_count
528             * sizeof (mach_msg_port_descriptor_t);
529           size -= bod->msgh_descriptor_count
530             * sizeof (mach_msg_port_descriptor_t);
531           ndr = (NDR_record_t *)(desc + bod->msgh_descriptor_count);
532           printf_unfiltered
533             (_("NDR: mig=%02x if=%02x encod=%02x "
534                "int=%02x char=%02x float=%02x\n"),
535              ndr->mig_vers, ndr->if_vers, ndr->mig_encoding,
536              ndr->int_rep, ndr->char_rep, ndr->float_rep);
537           data += sizeof (NDR_record_t);
538           size -= sizeof (NDR_record_t);
539         }
540
541       printf_unfiltered (_("  data:"));
542       ldata = (const unsigned long *)data;
543       for (i = 0; i < size / sizeof (unsigned long); i++)
544         printf_unfiltered (" %08lx", ldata[i]);
545       printf_unfiltered (_("\n"));
546     }
547 }
548
549 static int
550 darwin_decode_exception_message (mach_msg_header_t *hdr,
551                                  struct inferior **pinf,
552                                  darwin_thread_t **pthread)
553 {
554   mach_msg_body_t *bod = (mach_msg_body_t*)(hdr + 1);
555   mach_msg_port_descriptor_t *desc = (mach_msg_port_descriptor_t *)(bod + 1);
556   NDR_record_t *ndr;
557   integer_t *data;
558   struct inferior *inf;
559   darwin_thread_t *thread;
560   task_t task_port;
561   thread_t thread_port;
562   kern_return_t kret;
563   int i;
564
565   /* Check message identifier.  2401 is exc.  */
566   if (hdr->msgh_id != 2401)
567     return -1;
568
569   /* Check message header.  */
570   if (!(hdr->msgh_bits & MACH_MSGH_BITS_COMPLEX))
571     return -1;
572
573   /* Check descriptors.  */
574   if (hdr->msgh_size < (sizeof (*hdr) + sizeof (*bod) + 2 * sizeof (*desc)
575                         + sizeof (*ndr) + 2 * sizeof (integer_t))
576       || bod->msgh_descriptor_count != 2
577       || desc[0].type != MACH_MSG_PORT_DESCRIPTOR
578       || desc[0].disposition != MACH_MSG_TYPE_MOVE_SEND
579       || desc[1].type != MACH_MSG_PORT_DESCRIPTOR
580       || desc[1].disposition != MACH_MSG_TYPE_MOVE_SEND)
581     return -1;
582
583   /* Check data representation.  */
584   ndr = (NDR_record_t *)(desc + 2);
585   if (ndr->mig_vers != NDR_PROTOCOL_2_0
586       || ndr->if_vers != NDR_PROTOCOL_2_0
587       || ndr->mig_encoding != NDR_record.mig_encoding
588       || ndr->int_rep != NDR_record.int_rep
589       || ndr->char_rep != NDR_record.char_rep
590       || ndr->float_rep != NDR_record.float_rep)
591     return -1;
592
593   /* Ok, the hard work.  */
594   data = (integer_t *)(ndr + 1);
595
596   /* Find process by port.  */
597   task_port = desc[1].name;
598   thread_port = desc[0].name;
599   inf = darwin_find_inferior_by_task (task_port);
600   if (inf == NULL)
601     return -1;
602   *pinf = inf;
603
604   /* Find thread by port.  */
605   /* Check for new threads.  Do it early so that the port in the exception
606      message can be deallocated.  */
607   darwin_check_new_threads (inf);
608
609   /* We got new rights to the task and the thread.  Get rid of them.  */
610   kret = mach_port_deallocate (mach_task_self (), task_port);
611   MACH_CHECK_ERROR (kret);
612   kret = mach_port_deallocate (mach_task_self (), thread_port);
613   MACH_CHECK_ERROR (kret);
614
615   thread = darwin_find_thread (inf, thread_port);
616   if (thread == NULL)
617     return -1;
618   *pthread = thread;
619
620   /* The thread should be running.  However we have observed cases where a thread
621      got a SIGTTIN message after being stopped.  */
622   gdb_assert (thread->msg_state != DARWIN_MESSAGE);
623
624   /* Finish decoding.  */
625   thread->event.header = *hdr;
626   thread->event.thread_port = thread_port;
627   thread->event.task_port = task_port;
628   thread->event.ex_type = data[0];
629   thread->event.data_count = data[1];
630
631   if (hdr->msgh_size < (sizeof (*hdr) + sizeof (*bod) + 2 * sizeof (*desc)
632                         + sizeof (*ndr) + 2 * sizeof (integer_t)
633                         + data[1] * sizeof (integer_t)))
634       return -1;
635   for (i = 0; i < data[1]; i++)
636     thread->event.ex_data[i] = data[2 + i];
637
638   thread->msg_state = DARWIN_MESSAGE;
639
640   return 0;
641 }
642
643 static void
644 darwin_encode_reply (mig_reply_error_t *reply, mach_msg_header_t *hdr,
645                      integer_t code)
646 {
647   mach_msg_header_t *rh = &reply->Head;
648   rh->msgh_bits = MACH_MSGH_BITS(MACH_MSGH_BITS_REMOTE(hdr->msgh_bits), 0);
649   rh->msgh_remote_port = hdr->msgh_remote_port;
650   rh->msgh_size = (mach_msg_size_t)sizeof(mig_reply_error_t);
651   rh->msgh_local_port = MACH_PORT_NULL;
652   rh->msgh_id = hdr->msgh_id + 100;
653
654   reply->NDR = NDR_record;
655   reply->RetCode = code;
656 }
657
658 static void
659 darwin_send_reply (struct inferior *inf, darwin_thread_t *thread)
660 {
661   kern_return_t kret;
662   mig_reply_error_t reply;
663
664   darwin_encode_reply (&reply, &thread->event.header, KERN_SUCCESS);
665
666   kret = mach_msg (&reply.Head, MACH_SEND_MSG | MACH_SEND_INTERRUPT,
667                    reply.Head.msgh_size, 0,
668                    MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE,
669                    MACH_PORT_NULL);
670   MACH_CHECK_ERROR (kret);
671
672   inf->private->pending_messages--;
673 }
674
675 static void
676 darwin_resume_thread (struct inferior *inf, darwin_thread_t *thread,
677                       int step, int nsignal)
678 {
679   kern_return_t kret;
680   int res;
681
682   inferior_debug
683     (3, _("darwin_resume_thread: state=%d, thread=0x%x, step=%d nsignal=%d\n"),
684      thread->msg_state, thread->gdb_port, step, nsignal);
685
686   switch (thread->msg_state)
687     {
688     case DARWIN_MESSAGE:
689       if (thread->event.ex_type == EXC_SOFTWARE
690           && thread->event.ex_data[0] == EXC_SOFT_SIGNAL)
691         {
692           /* Either deliver a new signal or cancel the signal received.  */
693           res = PTRACE (PT_THUPDATE, inf->pid,
694                         (void *)(uintptr_t)thread->gdb_port, nsignal);
695           if (res < 0)
696             inferior_debug (1, _("ptrace THUP: res=%d\n"), res);
697         }
698       else if (nsignal)
699         {
700           /* Note: ptrace is allowed only if the process is stopped.
701              Directly send the signal to the thread.  */
702           res = syscall (SYS___pthread_kill, thread->gdb_port, nsignal);
703           inferior_debug (4, _("darwin_resume_thread: kill 0x%x %d: %d\n"),
704                           thread->gdb_port, nsignal, res);
705           thread->signaled = 1;
706         }
707
708       /* Set or reset single step.  */
709       if (step != thread->single_step)
710         {
711           inferior_debug (4, _("darwin_set_sstep (thread=0x%x, enable=%d)\n"),
712                           thread->gdb_port, step);
713           darwin_set_sstep (thread->gdb_port, step);
714           thread->single_step = step;
715         }
716
717       darwin_send_reply (inf, thread);
718       thread->msg_state = DARWIN_RUNNING;
719       break;
720
721     case DARWIN_RUNNING:
722       break;
723
724     case DARWIN_STOPPED:
725       kret = thread_resume (thread->gdb_port);
726       MACH_CHECK_ERROR (kret);
727
728       thread->msg_state = DARWIN_RUNNING;
729       break;
730     }
731 }
732
733 /* Resume all threads of the inferior.  */
734
735 static void
736 darwin_resume_inferior_threads (struct inferior *inf, int step, int nsignal)
737 {
738   darwin_thread_t *thread;
739   int k;
740
741   for (k = 0;
742        VEC_iterate (darwin_thread_t, inf->private->threads, k, thread);
743        k++)
744     darwin_resume_thread (inf, thread, step, nsignal);
745 }
746
747 struct resume_inferior_threads_param
748 {
749   int step;
750   int nsignal;
751 };
752
753 static int
754 darwin_resume_inferior_threads_it (struct inferior *inf, void *param)
755 {
756   int step = ((struct resume_inferior_threads_param *)param)->step;
757   int nsignal = ((struct resume_inferior_threads_param *)param)->nsignal;
758
759   darwin_resume_inferior_threads (inf, step, nsignal);
760
761   return 0;
762 }
763
764 /* Suspend all threads of INF.  */
765
766 static void
767 darwin_suspend_inferior_threads (struct inferior *inf)
768 {
769   darwin_thread_t *thread;
770   kern_return_t kret;
771   int k;
772
773   for (k = 0;
774        VEC_iterate (darwin_thread_t, inf->private->threads, k, thread);
775        k++)
776     switch (thread->msg_state)
777       {
778       case DARWIN_STOPPED:
779       case DARWIN_MESSAGE:
780         break;
781       case DARWIN_RUNNING:
782         kret = thread_suspend (thread->gdb_port);
783         MACH_CHECK_ERROR (kret);
784         thread->msg_state = DARWIN_STOPPED;
785         break;
786       }
787 }
788
789 static void
790 darwin_resume (ptid_t ptid, int step, enum gdb_signal signal)
791 {
792   struct target_waitstatus status;
793   int pid;
794
795   kern_return_t kret;
796   int res;
797   int nsignal;
798   struct inferior *inf;
799
800   inferior_debug
801     (2, _("darwin_resume: pid=%d, tid=0x%x, step=%d, signal=%d\n"),
802      ptid_get_pid (ptid), ptid_get_tid (ptid), step, signal);
803
804   if (signal == GDB_SIGNAL_0)
805     nsignal = 0;
806   else
807     nsignal = gdb_signal_to_host (signal);
808
809   /* Don't try to single step all threads.  */
810   if (step)
811     ptid = inferior_ptid;
812
813   /* minus_one_ptid is RESUME_ALL.  */
814   if (ptid_equal (ptid, minus_one_ptid))
815     {
816       struct resume_inferior_threads_param param;
817
818       param.nsignal = nsignal;
819       param.step = step;
820
821       /* Resume threads.  */
822       iterate_over_inferiors (darwin_resume_inferior_threads_it, &param);
823       /* Resume tasks.  */
824       iterate_over_inferiors (darwin_resume_inferior_it, NULL);
825     }
826   else
827     {
828       struct inferior *inf = find_inferior_pid (ptid_get_pid (ptid));
829       long tid = ptid_get_tid (ptid);
830
831       /* Stop the inferior (should be useless).  */
832       darwin_suspend_inferior (inf);
833
834       if (tid == 0)
835         darwin_resume_inferior_threads (inf, step, nsignal);
836       else
837         {
838           darwin_thread_t *thread;
839
840           /* Suspend threads of the task.  */
841           darwin_suspend_inferior_threads (inf);
842
843           /* Resume the selected thread.  */
844           thread = darwin_find_thread (inf, tid);
845           gdb_assert (thread);
846           darwin_resume_thread (inf, thread, step, nsignal);
847         }
848
849       /* Resume the task.  */
850       darwin_resume_inferior (inf);
851     }
852 }
853
854 static void
855 darwin_resume_to (struct target_ops *ops, ptid_t ptid, int step,
856                   enum gdb_signal signal)
857 {
858   return darwin_resume (ptid, step, signal);
859 }
860
861 static ptid_t
862 darwin_decode_message (mach_msg_header_t *hdr,
863                        darwin_thread_t **pthread,
864                        struct inferior **pinf,
865                        struct target_waitstatus *status)
866 {
867   darwin_thread_t *thread;
868   struct inferior *inf;
869
870   /* Exception message.  */
871   if (hdr->msgh_local_port == darwin_ex_port)
872     {
873       int res;
874
875       /* Decode message.  */
876       res = darwin_decode_exception_message (hdr, &inf, &thread);
877
878       if (res < 0)
879         {
880           /* Should not happen...  */
881           printf_unfiltered
882             (_("darwin_wait: ill-formatted message (id=0x%x)\n"), hdr->msgh_id);
883           /* FIXME: send a failure reply?  */
884           status->kind = TARGET_WAITKIND_SPURIOUS;
885           return minus_one_ptid;
886         }
887       *pinf = inf;
888       *pthread = thread;
889       inf->private->pending_messages++;
890
891       status->kind = TARGET_WAITKIND_STOPPED;
892       thread->msg_state = DARWIN_MESSAGE;
893
894       inferior_debug (4, _("darwin_wait: thread=0x%x, got %s\n"),
895                       thread->gdb_port,
896                       unparse_exception_type (thread->event.ex_type));
897
898       switch (thread->event.ex_type)
899         {
900         case EXC_BAD_ACCESS:
901           status->value.sig = TARGET_EXC_BAD_ACCESS;
902           break;
903         case EXC_BAD_INSTRUCTION:
904           status->value.sig = TARGET_EXC_BAD_INSTRUCTION;
905           break;
906         case EXC_ARITHMETIC:
907           status->value.sig = TARGET_EXC_ARITHMETIC;
908           break;
909         case EXC_EMULATION:
910           status->value.sig = TARGET_EXC_EMULATION;
911           break;
912         case EXC_SOFTWARE:
913           if (thread->event.ex_data[0] == EXC_SOFT_SIGNAL)
914             {
915               status->value.sig =
916                 gdb_signal_from_host (thread->event.ex_data[1]);
917               inferior_debug (5, _("  (signal %d: %s)\n"),
918                               thread->event.ex_data[1],
919                               gdb_signal_to_name (status->value.sig));
920
921               /* If the thread is stopped because it has received a signal
922                  that gdb has just sent, continue.  */
923               if (thread->signaled)
924                 {
925                   thread->signaled = 0;
926                   darwin_send_reply (inf, thread);
927                   thread->msg_state = DARWIN_RUNNING;
928                   status->kind = TARGET_WAITKIND_IGNORE;
929                 }
930             }
931           else
932             status->value.sig = TARGET_EXC_SOFTWARE;
933           break;
934         case EXC_BREAKPOINT:
935           /* Many internal GDB routines expect breakpoints to be reported
936              as GDB_SIGNAL_TRAP, and will report TARGET_EXC_BREAKPOINT
937              as a spurious signal.  */
938           status->value.sig = GDB_SIGNAL_TRAP;
939           break;
940         default:
941           status->value.sig = GDB_SIGNAL_UNKNOWN;
942           break;
943         }
944
945       return ptid_build (inf->pid, 0, thread->gdb_port);
946     }
947
948   *pinf = NULL;
949   *pthread = NULL;
950
951   inf = darwin_find_inferior_by_notify (hdr->msgh_local_port);
952   if (inf != NULL)
953     {
954       if (!inf->private->no_ptrace)
955         {
956           pid_t res;
957           int wstatus;
958
959           res = wait4 (inf->pid, &wstatus, 0, NULL);
960           if (res < 0 || res != inf->pid)
961             {
962               printf_unfiltered (_("wait4: res=%d: %s\n"),
963                                  res, safe_strerror (errno));
964               status->kind = TARGET_WAITKIND_SPURIOUS;
965               return minus_one_ptid;
966             }
967           if (WIFEXITED (wstatus))
968             {
969               status->kind = TARGET_WAITKIND_EXITED;
970               status->value.integer = WEXITSTATUS (wstatus);
971             }
972           else
973             {
974               status->kind = TARGET_WAITKIND_SIGNALLED;
975               status->value.sig = WTERMSIG (wstatus);
976             }
977
978           inferior_debug (4, _("darwin_wait: pid=%d exit, status=0x%x\n"),
979                           res, wstatus);
980
981           /* Looks necessary on Leopard and harmless...  */
982           wait4 (inf->pid, &wstatus, 0, NULL);
983
984           return ptid_build (inf->pid, 0, 0);
985         }
986       else
987         {
988           inferior_debug (4, _("darwin_wait: pid=%d\n"), inf->pid);
989           status->kind = TARGET_WAITKIND_EXITED;
990           status->value.integer = 0; /* Don't know.  */
991           return ptid_build (inf->pid, 0, 0);
992         }
993     }
994
995   printf_unfiltered (_("Bad local-port: 0x%x\n"), hdr->msgh_local_port);
996   status->kind = TARGET_WAITKIND_SPURIOUS;
997   return minus_one_ptid;
998 }
999
1000 static int
1001 cancel_breakpoint (ptid_t ptid)
1002 {
1003   /* Arrange for a breakpoint to be hit again later.  We will handle
1004      the current event, eventually we will resume this thread, and this
1005      breakpoint will trap again.
1006
1007      If we do not do this, then we run the risk that the user will
1008      delete or disable the breakpoint, but the thread will have already
1009      tripped on it.  */
1010
1011   struct regcache *regcache = get_thread_regcache (ptid);
1012   struct gdbarch *gdbarch = get_regcache_arch (regcache);
1013   CORE_ADDR pc;
1014
1015   pc = regcache_read_pc (regcache) - gdbarch_decr_pc_after_break (gdbarch);
1016   if (breakpoint_inserted_here_p (get_regcache_aspace (regcache), pc))
1017     {
1018       inferior_debug (4, "cancel_breakpoint for thread 0x%x\n",
1019                       ptid_get_tid (ptid));
1020
1021       /* Back up the PC if necessary.  */
1022       if (gdbarch_decr_pc_after_break (gdbarch))
1023         regcache_write_pc (regcache, pc);
1024
1025       return 1;
1026     }
1027   return 0;
1028 }
1029
1030 static ptid_t
1031 darwin_wait (ptid_t ptid, struct target_waitstatus *status)
1032 {
1033   kern_return_t kret;
1034   union
1035   {
1036     mach_msg_header_t hdr;
1037     char data[0x100];
1038   } msgin;
1039   mach_msg_header_t *hdr = &msgin.hdr;
1040   ptid_t res;
1041   darwin_thread_t *thread;
1042   struct inferior *inf;
1043
1044   inferior_debug
1045     (2, _("darwin_wait: waiting for a message pid=%d thread=%lx\n"),
1046      ptid_get_pid (ptid), ptid_get_tid (ptid));
1047
1048   /* Handle fake stop events at first.  */
1049   if (darwin_inf_fake_stop != NULL)
1050     {
1051       inf = darwin_inf_fake_stop;
1052       darwin_inf_fake_stop = NULL;
1053
1054       status->kind = TARGET_WAITKIND_STOPPED;
1055       status->value.sig = GDB_SIGNAL_TRAP;
1056       thread = VEC_index (darwin_thread_t, inf->private->threads, 0);
1057       thread->msg_state = DARWIN_STOPPED;
1058       return ptid_build (inf->pid, 0, thread->gdb_port);
1059     }
1060
1061   do
1062     {
1063       /* set_sigint_trap (); */
1064
1065       /* Wait for a message.  */
1066       kret = mach_msg (&msgin.hdr, MACH_RCV_MSG | MACH_RCV_INTERRUPT, 0,
1067                        sizeof (msgin.data), darwin_port_set, 0, MACH_PORT_NULL);
1068
1069       /* clear_sigint_trap (); */
1070
1071       if (kret == MACH_RCV_INTERRUPTED)
1072         {
1073           status->kind = TARGET_WAITKIND_IGNORE;
1074           return minus_one_ptid;
1075         }
1076
1077       if (kret != MACH_MSG_SUCCESS)
1078         {
1079           inferior_debug (5, _("mach_msg: ret=0x%x\n"), kret);
1080           status->kind = TARGET_WAITKIND_SPURIOUS;
1081           return minus_one_ptid;
1082         }
1083
1084       /* Debug: display message.  */
1085       if (darwin_debug_flag > 10)
1086         darwin_dump_message (hdr, darwin_debug_flag > 11);
1087
1088       res = darwin_decode_message (hdr, &thread, &inf, status);
1089
1090       if (inf == NULL)
1091         return res;
1092     }
1093   while (status->kind == TARGET_WAITKIND_IGNORE);
1094
1095   /* Stop all tasks.  */
1096   iterate_over_inferiors (darwin_suspend_inferior_it, NULL);
1097
1098   /* Read pending messages.  */
1099   while (1)
1100     {
1101       struct target_waitstatus status2;
1102       ptid_t ptid2;
1103
1104       kret = mach_msg (&msgin.hdr,
1105                        MACH_RCV_MSG | MACH_RCV_TIMEOUT, 0,
1106                        sizeof (msgin.data), darwin_port_set, 1, MACH_PORT_NULL);
1107
1108       if (kret == MACH_RCV_TIMED_OUT)
1109         break;
1110       if (kret != MACH_MSG_SUCCESS)
1111         {
1112           inferior_debug
1113             (5, _("darwin_wait: mach_msg(pending) ret=0x%x\n"), kret);
1114           break;
1115         }
1116
1117       ptid2 = darwin_decode_message (hdr, &thread, &inf, &status2);
1118
1119       if (inf != NULL && thread != NULL
1120           && thread->event.ex_type == EXC_BREAKPOINT)
1121         {
1122           if (thread->single_step
1123               || cancel_breakpoint (ptid_build (inf->pid, 0, thread->gdb_port)))
1124             {
1125               gdb_assert (thread->msg_state == DARWIN_MESSAGE);
1126               darwin_send_reply (inf, thread);
1127               thread->msg_state = DARWIN_RUNNING;
1128             }
1129           else
1130             inferior_debug
1131               (3, _("darwin_wait: thread 0x%x hit a non-gdb breakpoint\n"),
1132                thread->gdb_port);
1133         }
1134       else
1135         inferior_debug (3, _("darwin_wait: unhandled pending message\n"));
1136     }
1137   return res;
1138 }
1139
1140 static ptid_t
1141 darwin_wait_to (struct target_ops *ops, 
1142                 ptid_t ptid, struct target_waitstatus *status, int options)
1143 {
1144   return darwin_wait (ptid, status);
1145 }
1146
1147 static void
1148 darwin_stop (ptid_t t)
1149 {
1150   struct inferior *inf = current_inferior ();
1151
1152   /* FIXME: handle in no_ptrace mode.  */
1153   gdb_assert (!inf->private->no_ptrace);
1154   kill (inf->pid, SIGINT);
1155 }
1156
1157 static void
1158 darwin_mourn_inferior (struct target_ops *ops)
1159 {
1160   struct inferior *inf = current_inferior ();
1161   kern_return_t kret;
1162   mach_port_t prev;
1163   int i;
1164
1165   unpush_target (darwin_ops);
1166
1167   /* Deallocate threads.  */
1168   if (inf->private->threads)
1169     {
1170       int k;
1171       darwin_thread_t *t;
1172       for (k = 0;
1173            VEC_iterate (darwin_thread_t, inf->private->threads, k, t);
1174            k++)
1175         {
1176           kret = mach_port_deallocate (gdb_task, t->gdb_port);
1177           MACH_CHECK_ERROR (kret);
1178         }
1179       VEC_free (darwin_thread_t, inf->private->threads);
1180       inf->private->threads = NULL;
1181     }
1182
1183   kret = mach_port_move_member (gdb_task,
1184                                 inf->private->notify_port, MACH_PORT_NULL);
1185   MACH_CHECK_ERROR (kret);
1186
1187   kret = mach_port_request_notification (gdb_task, inf->private->task,
1188                                          MACH_NOTIFY_DEAD_NAME, 0,
1189                                          MACH_PORT_NULL,
1190                                          MACH_MSG_TYPE_MAKE_SEND_ONCE,
1191                                          &prev);
1192   /* This can fail if the task is dead.  */
1193   inferior_debug (4, "task=0x%x, prev=0x%x, notify_port=0x%x\n",
1194                   inf->private->task, prev, inf->private->notify_port);
1195
1196   if (kret == KERN_SUCCESS)
1197     {
1198       kret = mach_port_deallocate (gdb_task, prev);
1199       MACH_CHECK_ERROR (kret);
1200     }
1201
1202   kret = mach_port_destroy (gdb_task, inf->private->notify_port);
1203   MACH_CHECK_ERROR (kret);
1204
1205
1206   /* Deallocate saved exception ports.  */
1207   for (i = 0; i < inf->private->exception_info.count; i++)
1208     {
1209       kret = mach_port_deallocate
1210         (gdb_task, inf->private->exception_info.ports[i]);
1211       MACH_CHECK_ERROR (kret);
1212     }
1213   inf->private->exception_info.count = 0;
1214
1215   kret = mach_port_deallocate (gdb_task, inf->private->task);
1216   MACH_CHECK_ERROR (kret);
1217
1218   xfree (inf->private);
1219   inf->private = NULL;
1220
1221   generic_mourn_inferior ();
1222 }
1223
1224 static void
1225 darwin_reply_to_all_pending_messages (struct inferior *inf)
1226 {
1227   int k;
1228   darwin_thread_t *t;
1229
1230   for (k = 0;
1231        VEC_iterate (darwin_thread_t, inf->private->threads, k, t);
1232        k++)
1233     {
1234       if (t->msg_state == DARWIN_MESSAGE)
1235         darwin_resume_thread (inf, t, 0, 0);
1236     }
1237 }
1238
1239 static void
1240 darwin_stop_inferior (struct inferior *inf)
1241 {
1242   struct target_waitstatus wstatus;
1243   ptid_t ptid;
1244   kern_return_t kret;
1245   int status;
1246   int res;
1247
1248   gdb_assert (inf != NULL);
1249
1250   darwin_suspend_inferior (inf);
1251
1252   darwin_reply_to_all_pending_messages (inf);
1253
1254   if (inf->private->no_ptrace)
1255     return;
1256
1257   res = kill (inf->pid, SIGSTOP);
1258   if (res != 0)
1259     warning (_("cannot kill: %s"), safe_strerror (errno));
1260
1261   /* Wait until the process is really stopped.  */
1262   while (1)
1263     {
1264       ptid = darwin_wait (inferior_ptid, &wstatus);
1265       if (wstatus.kind == TARGET_WAITKIND_STOPPED
1266           && wstatus.value.sig == GDB_SIGNAL_STOP)
1267         break;
1268     }
1269 }
1270
1271 static kern_return_t
1272 darwin_save_exception_ports (darwin_inferior *inf)
1273 {
1274   kern_return_t kret;
1275
1276   inf->exception_info.count =
1277     sizeof (inf->exception_info.ports) / sizeof (inf->exception_info.ports[0]);
1278
1279   kret = task_get_exception_ports
1280     (inf->task, EXC_MASK_ALL, inf->exception_info.masks,
1281      &inf->exception_info.count, inf->exception_info.ports,
1282      inf->exception_info.behaviors, inf->exception_info.flavors);
1283   return kret;
1284 }
1285
1286 static kern_return_t
1287 darwin_restore_exception_ports (darwin_inferior *inf)
1288 {
1289   int i;
1290   kern_return_t kret;
1291
1292   for (i = 0; i < inf->exception_info.count; i++)
1293     {
1294       kret = task_set_exception_ports
1295         (inf->task, inf->exception_info.masks[i], inf->exception_info.ports[i],
1296          inf->exception_info.behaviors[i], inf->exception_info.flavors[i]);
1297       if (kret != KERN_SUCCESS)
1298         return kret;
1299     }
1300
1301   return KERN_SUCCESS;
1302 }
1303
1304 static void
1305 darwin_kill_inferior (struct target_ops *ops)
1306 {
1307   struct inferior *inf = current_inferior ();
1308   struct target_waitstatus wstatus;
1309   ptid_t ptid;
1310   kern_return_t kret;
1311   int status;
1312   int res;
1313
1314   if (ptid_equal (inferior_ptid, null_ptid))
1315     return;
1316
1317   gdb_assert (inf != NULL);
1318
1319   kret = darwin_restore_exception_ports (inf->private);
1320   MACH_CHECK_ERROR (kret);
1321
1322   darwin_reply_to_all_pending_messages (inf);
1323
1324   res = kill (inf->pid, 9);
1325
1326   if (res == 0)
1327     {
1328       darwin_resume_inferior (inf);
1329           
1330       ptid = darwin_wait (inferior_ptid, &wstatus);
1331     }
1332   else if (errno != ESRCH)
1333     warning (_("Failed to kill inferior: kill (%d, 9) returned [%s]"),
1334              inf->pid, safe_strerror (errno));
1335
1336   target_mourn_inferior ();
1337 }
1338
1339 static void
1340 darwin_attach_pid (struct inferior *inf)
1341 {
1342   kern_return_t kret;
1343   mach_port_t prev_port;
1344   int traps_expected;
1345   mach_port_t prev_not;
1346   exception_mask_t mask;
1347
1348   inf->private = XZALLOC (darwin_inferior);
1349
1350   kret = task_for_pid (gdb_task, inf->pid, &inf->private->task);
1351   if (kret != KERN_SUCCESS)
1352     {
1353       int status;
1354
1355       if (!inf->attach_flag)
1356         {
1357           kill (inf->pid, 9);
1358           waitpid (inf->pid, &status, 0);
1359         }
1360
1361       error (_("Unable to find Mach task port for process-id %d: %s (0x%lx).\n"
1362                " (please check gdb is codesigned - see taskgated(8))"),
1363              inf->pid, mach_error_string (kret), (unsigned long) kret);
1364     }
1365
1366   inferior_debug (2, _("inferior task: 0x%x, pid: %d\n"),
1367                   inf->private->task, inf->pid);
1368
1369   if (darwin_ex_port == MACH_PORT_NULL)
1370     {
1371       /* Create a port to get exceptions.  */
1372       kret = mach_port_allocate (gdb_task, MACH_PORT_RIGHT_RECEIVE,
1373                                  &darwin_ex_port);
1374       if (kret != KERN_SUCCESS)
1375         error (_("Unable to create exception port, mach_port_allocate "
1376                  "returned: %d"),
1377                kret);
1378
1379       kret = mach_port_insert_right (gdb_task, darwin_ex_port, darwin_ex_port,
1380                                      MACH_MSG_TYPE_MAKE_SEND);
1381       if (kret != KERN_SUCCESS)
1382         error (_("Unable to create exception port, mach_port_insert_right "
1383                  "returned: %d"),
1384                kret);
1385
1386       /* Create a port set and put ex_port in it.  */
1387       kret = mach_port_allocate (gdb_task, MACH_PORT_RIGHT_PORT_SET,
1388                                  &darwin_port_set);
1389       if (kret != KERN_SUCCESS)
1390         error (_("Unable to create port set, mach_port_allocate "
1391                  "returned: %d"),
1392                kret);
1393
1394       kret = mach_port_move_member (gdb_task, darwin_ex_port, darwin_port_set);
1395       if (kret != KERN_SUCCESS)
1396         error (_("Unable to move exception port into new port set, "
1397                  "mach_port_move_member\n"
1398                  "returned: %d"),
1399                kret);
1400     }
1401
1402   /* Create a port to be notified when the child task terminates.  */
1403   kret = mach_port_allocate (gdb_task, MACH_PORT_RIGHT_RECEIVE,
1404                              &inf->private->notify_port);
1405   if (kret != KERN_SUCCESS)
1406     error (_("Unable to create notification port, mach_port_allocate "
1407              "returned: %d"),
1408            kret);
1409
1410   kret = mach_port_move_member (gdb_task,
1411                                 inf->private->notify_port, darwin_port_set);
1412   if (kret != KERN_SUCCESS)
1413     error (_("Unable to move notification port into new port set, "
1414              "mach_port_move_member\n"
1415              "returned: %d"),
1416            kret);
1417
1418   kret = mach_port_request_notification (gdb_task, inf->private->task,
1419                                          MACH_NOTIFY_DEAD_NAME, 0,
1420                                          inf->private->notify_port,
1421                                          MACH_MSG_TYPE_MAKE_SEND_ONCE,
1422                                          &prev_not);
1423   if (kret != KERN_SUCCESS)
1424     error (_("Termination notification request failed, "
1425              "mach_port_request_notification\n"
1426              "returned: %d"),
1427            kret);
1428   if (prev_not != MACH_PORT_NULL)
1429     {
1430       /* This is unexpected, as there should not be any previously
1431          registered notification request.  But this is not a fatal
1432          issue, so just emit a warning.  */
1433       warning (_("\
1434 A task termination request was registered before the debugger registered\n\
1435 its own.  This is unexpected, but should otherwise not have any actual\n\
1436 impact on the debugging session."));
1437     }
1438
1439   kret = darwin_save_exception_ports (inf->private);
1440   if (kret != KERN_SUCCESS)
1441     error (_("Unable to save exception ports, task_get_exception_ports"
1442              "returned: %d"),
1443            kret);
1444
1445   /* Set exception port.  */
1446   if (enable_mach_exceptions)
1447     mask = EXC_MASK_ALL;
1448   else
1449     mask = EXC_MASK_SOFTWARE | EXC_MASK_BREAKPOINT;
1450   kret = task_set_exception_ports (inf->private->task, mask, darwin_ex_port,
1451                                    EXCEPTION_DEFAULT, THREAD_STATE_NONE);
1452   if (kret != KERN_SUCCESS)
1453     error (_("Unable to set exception ports, task_set_exception_ports"
1454              "returned: %d"),
1455            kret);
1456
1457   push_target (darwin_ops);
1458 }
1459
1460 static void
1461 darwin_init_thread_list (struct inferior *inf)
1462 {
1463   darwin_thread_t *thread;
1464   ptid_t new_ptid;
1465
1466   darwin_check_new_threads (inf);
1467
1468   gdb_assert (inf->private->threads
1469               && VEC_length (darwin_thread_t, inf->private->threads) > 0);
1470   thread = VEC_index (darwin_thread_t, inf->private->threads, 0);
1471
1472   /* Note: fork_inferior automatically add a thead but it uses a wrong ptid.
1473      Fix up.  */
1474   new_ptid = ptid_build (inf->pid, 0, thread->gdb_port);
1475   thread_change_ptid (inferior_ptid, new_ptid);
1476   inferior_ptid = new_ptid;
1477 }
1478
1479 /* The child must synchronize with gdb: gdb must set the exception port
1480    before the child call PTRACE_SIGEXC.  We use a pipe to achieve this.
1481    FIXME: is there a lighter way ?  */
1482 static int ptrace_fds[2];
1483
1484 static void
1485 darwin_ptrace_me (void)
1486 {
1487   int res;
1488   char c;
1489
1490   /* Close write end point.  */
1491   close (ptrace_fds[1]);
1492
1493   /* Wait until gdb is ready.  */
1494   res = read (ptrace_fds[0], &c, 1);
1495   if (res != 0)
1496     error (_("unable to read from pipe, read returned: %d"), res);
1497   close (ptrace_fds[0]);
1498
1499   /* Get rid of privileges.  */
1500   setegid (getgid ());
1501
1502   /* Set TRACEME.  */
1503   PTRACE (PT_TRACE_ME, 0, 0, 0);
1504
1505   /* Redirect signals to exception port.  */
1506   PTRACE (PT_SIGEXC, 0, 0, 0);
1507 }
1508
1509 /* Dummy function to be sure fork_inferior uses fork(2) and not vfork(2).  */
1510 static void
1511 darwin_pre_ptrace (void)
1512 {
1513   if (pipe (ptrace_fds) != 0)
1514     {
1515       ptrace_fds[0] = -1;
1516       ptrace_fds[1] = -1;
1517       error (_("unable to create a pipe: %s"), safe_strerror (errno));
1518     }
1519
1520   mark_fd_no_cloexec (ptrace_fds[0]);
1521   mark_fd_no_cloexec (ptrace_fds[1]);
1522 }
1523
1524 static void
1525 darwin_ptrace_him (int pid)
1526 {
1527   task_t itask;
1528   kern_return_t kret;
1529   mach_port_t prev_port;
1530   int traps_expected;
1531   struct inferior *inf = current_inferior ();
1532
1533   darwin_attach_pid (inf);
1534
1535   /* Let's the child run.  */
1536   close (ptrace_fds[0]);
1537   close (ptrace_fds[1]);
1538
1539   unmark_fd_no_cloexec (ptrace_fds[0]);
1540   unmark_fd_no_cloexec (ptrace_fds[1]);
1541
1542   darwin_init_thread_list (inf);
1543
1544   startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
1545 }
1546
1547 static void
1548 darwin_execvp (const char *file, char * const argv[], char * const env[])
1549 {
1550   posix_spawnattr_t attr;
1551   short ps_flags = 0;
1552   int res;
1553
1554   res = posix_spawnattr_init (&attr);
1555   if (res != 0)
1556     {
1557       fprintf_unfiltered
1558         (gdb_stderr, "Cannot initialize attribute for posix_spawn\n");
1559       return;
1560     }
1561
1562   /* Do like execve: replace the image.  */
1563   ps_flags = POSIX_SPAWN_SETEXEC;
1564
1565   /* Disable ASLR.  The constant doesn't look to be available outside the
1566      kernel include files.  */
1567 #ifndef _POSIX_SPAWN_DISABLE_ASLR
1568 #define _POSIX_SPAWN_DISABLE_ASLR 0x0100
1569 #endif
1570   ps_flags |= _POSIX_SPAWN_DISABLE_ASLR;
1571   res = posix_spawnattr_setflags (&attr, ps_flags);
1572   if (res != 0)
1573     {
1574       fprintf_unfiltered (gdb_stderr, "Cannot set posix_spawn flags\n");
1575       return;
1576     }
1577
1578   posix_spawnp (NULL, argv[0], NULL, &attr, argv, env);
1579 }
1580
1581 static void
1582 darwin_create_inferior (struct target_ops *ops, char *exec_file,
1583                         char *allargs, char **env, int from_tty)
1584 {
1585   /* Do the hard work.  */
1586   fork_inferior (exec_file, allargs, env, darwin_ptrace_me, darwin_ptrace_him,
1587                  darwin_pre_ptrace, NULL, darwin_execvp);
1588
1589   /* Return now in case of error.  */
1590   if (ptid_equal (inferior_ptid, null_ptid))
1591     return;
1592 }
1593 \f
1594
1595 /* Set things up such that the next call to darwin_wait will immediately
1596    return a fake stop event for inferior INF.
1597
1598    This assumes that the inferior's thread list has been initialized,
1599    as it will suspend the inferior's first thread.  */
1600
1601 static void
1602 darwin_setup_fake_stop_event (struct inferior *inf)
1603 {
1604   darwin_thread_t *thread;
1605   kern_return_t kret;
1606
1607   gdb_assert (darwin_inf_fake_stop == NULL);
1608   darwin_inf_fake_stop = inf;
1609
1610   /* When detecting a fake pending stop event, darwin_wait returns
1611      an event saying that the first thread is in a DARWIN_STOPPED
1612      state.  To make that accurate, we need to suspend that thread
1613      as well.  Otherwise, we'll try resuming it when resuming the
1614      inferior, and get a warning because the thread's suspend count
1615      is already zero, making the resume request useless.  */
1616   thread = VEC_index (darwin_thread_t, inf->private->threads, 0);
1617   kret = thread_suspend (thread->gdb_port);
1618   MACH_CHECK_ERROR (kret);
1619 }
1620
1621 /* Attach to process PID, then initialize for debugging it
1622    and wait for the trace-trap that results from attaching.  */
1623 static void
1624 darwin_attach (struct target_ops *ops, char *args, int from_tty)
1625 {
1626   pid_t pid;
1627   pid_t pid2;
1628   int wstatus;
1629   int res;
1630   struct inferior *inf;
1631   kern_return_t kret;
1632
1633   pid = parse_pid_to_attach (args);
1634
1635   if (pid == getpid ())         /* Trying to masturbate?  */
1636     error (_("I refuse to debug myself!"));
1637
1638   if (from_tty)
1639     {
1640       char *exec_file = get_exec_file (0);
1641
1642       if (exec_file)
1643         printf_unfiltered (_("Attaching to program: %s, %s\n"), exec_file,
1644                            target_pid_to_str (pid_to_ptid (pid)));
1645       else
1646         printf_unfiltered (_("Attaching to %s\n"),
1647                            target_pid_to_str (pid_to_ptid (pid)));
1648
1649       gdb_flush (gdb_stdout);
1650     }
1651
1652   if (pid == 0 || kill (pid, 0) < 0)
1653     error (_("Can't attach to process %d: %s (%d)"),
1654            pid, safe_strerror (errno), errno);
1655
1656   inferior_ptid = pid_to_ptid (pid);
1657   inf = current_inferior ();
1658   inferior_appeared (inf, pid);
1659   inf->attach_flag = 1;
1660
1661   /* Always add a main thread.  */
1662   add_thread_silent (inferior_ptid);
1663
1664   darwin_attach_pid (inf);
1665
1666   darwin_suspend_inferior (inf);
1667
1668   darwin_init_thread_list (inf);
1669
1670   darwin_check_osabi (inf->private, ptid_get_tid (inferior_ptid));
1671
1672   darwin_setup_fake_stop_event (inf);
1673
1674   inf->private->no_ptrace = 1;
1675 }
1676
1677 /* Take a program previously attached to and detaches it.
1678    The program resumes execution and will no longer stop
1679    on signals, etc.  We'd better not have left any breakpoints
1680    in the program or it'll die when it hits one.  For this
1681    to work, it may be necessary for the process to have been
1682    previously attached.  It *might* work if the program was
1683    started via fork.  */
1684 static void
1685 darwin_detach (struct target_ops *ops, char *args, int from_tty)
1686 {
1687   pid_t pid = ptid_get_pid (inferior_ptid);
1688   struct inferior *inf = current_inferior ();
1689   kern_return_t kret;
1690   int res;
1691
1692   /* Display message.  */
1693   if (from_tty)
1694     {
1695       char *exec_file = get_exec_file (0);
1696       if (exec_file == 0)
1697         exec_file = "";
1698       printf_unfiltered (_("Detaching from program: %s, %s\n"), exec_file,
1699                          target_pid_to_str (pid_to_ptid (pid)));
1700       gdb_flush (gdb_stdout);
1701     }
1702
1703   /* If ptrace() is in use, stop the process.  */
1704   if (!inf->private->no_ptrace)
1705     darwin_stop_inferior (inf);
1706
1707   kret = darwin_restore_exception_ports (inf->private);
1708   MACH_CHECK_ERROR (kret);
1709
1710   if (!inf->private->no_ptrace)
1711     {
1712       res = PTRACE (PT_DETACH, inf->pid, 0, 0);
1713       if (res != 0)
1714         printf_unfiltered (_("Unable to detach from process-id %d: %s (%d)"),
1715                            inf->pid, safe_strerror (errno), errno);
1716     }
1717
1718   darwin_reply_to_all_pending_messages (inf);
1719
1720   /* When using ptrace, we have just performed a PT_DETACH, which
1721      resumes the inferior.  On the other hand, when we are not using
1722      ptrace, we need to resume its execution ourselves.  */
1723   if (inf->private->no_ptrace)
1724     darwin_resume_inferior (inf);
1725
1726   darwin_mourn_inferior (ops);
1727 }
1728
1729 static void
1730 darwin_files_info (struct target_ops *ops)
1731 {
1732 }
1733
1734 static char *
1735 darwin_pid_to_str (struct target_ops *ops, ptid_t ptid)
1736 {
1737   static char buf[80];
1738   long tid = ptid_get_tid (ptid);
1739
1740   if (tid != 0)
1741     {
1742       snprintf (buf, sizeof (buf), _("Thread 0x%lx of process %u"),
1743                 tid, ptid_get_pid (ptid));
1744       return buf;
1745     }
1746
1747   return normal_pid_to_str (ptid);
1748 }
1749
1750 static int
1751 darwin_thread_alive (struct target_ops *ops, ptid_t ptid)
1752 {
1753   return 1;
1754 }
1755
1756 /* If RDADDR is not NULL, read inferior task's LEN bytes from ADDR and
1757    copy it to RDADDR in gdb's address space.
1758    If WRADDR is not NULL, write gdb's LEN bytes from WRADDR and copy it
1759    to ADDR in inferior task's address space.
1760    Return 0 on failure; number of bytes read / writen otherwise.  */
1761 static int
1762 darwin_read_write_inferior (task_t task, CORE_ADDR addr,
1763                             gdb_byte *rdaddr, const gdb_byte *wraddr,
1764                             int length)
1765 {
1766   kern_return_t kret;
1767   mach_vm_address_t offset = addr & (mach_page_size - 1);
1768   mach_vm_address_t low_address = (mach_vm_address_t) (addr - offset);
1769   mach_vm_size_t aligned_length = (mach_vm_size_t) PAGE_ROUND (offset + length);
1770   pointer_t copied;
1771   mach_msg_type_number_t copy_count;
1772   mach_vm_size_t remaining_length;
1773   mach_vm_address_t region_address;
1774   mach_vm_size_t region_length;
1775
1776   inferior_debug (8, _("darwin_read_write_inferior(task=0x%x, %s, len=%d)\n"),
1777                   task, core_addr_to_string (addr), length);
1778
1779   /* Get memory from inferior with page aligned addresses.  */
1780   kret = mach_vm_read (task, low_address, aligned_length,
1781                       &copied, &copy_count);
1782   if (kret != KERN_SUCCESS)
1783     {
1784       inferior_debug
1785         (1, _("darwin_read_write_inferior: mach_vm_read failed at %s: %s"),
1786          core_addr_to_string (addr), mach_error_string (kret));
1787       return 0;
1788     }
1789
1790   if (rdaddr != NULL)
1791     memcpy (rdaddr, (char *)copied + offset, length);
1792
1793   if (wraddr == NULL)
1794     goto out;
1795
1796   memcpy ((char *)copied + offset, wraddr, length);
1797
1798   /* Do writes atomically.
1799      First check for holes and unwritable memory.  */
1800   for (region_address = low_address, remaining_length = aligned_length;
1801        region_address < low_address + aligned_length;
1802        region_address += region_length, remaining_length -= region_length)
1803     {
1804       vm_region_submap_short_info_data_64_t info;
1805       mach_vm_address_t region_start = region_address;
1806       mach_msg_type_number_t count;
1807       natural_t region_depth;
1808
1809       region_depth = 100000;
1810       count = VM_REGION_SUBMAP_SHORT_INFO_COUNT_64;
1811       kret = mach_vm_region_recurse
1812         (task, &region_start, &region_length, &region_depth,
1813          (vm_region_recurse_info_t) &info, &count);
1814
1815       if (kret != KERN_SUCCESS)
1816         {
1817           inferior_debug (1, _("darwin_read_write_inferior: "
1818                                "mach_vm_region_recurse failed at %s: %s\n"),
1819                           core_addr_to_string (region_address),
1820                           mach_error_string (kret));
1821           goto out;
1822         }
1823
1824       inferior_debug
1825         (9, _("darwin_read_write_inferior: "
1826               "mach_vm_region_recurse addr=%s, start=%s, len=%s\n"),
1827          core_addr_to_string (region_address),
1828          core_addr_to_string (region_start),
1829          core_addr_to_string (region_length));
1830
1831       /* Check for holes in memory.  */
1832       if (region_start > region_address)
1833         {
1834           warning (_("No memory at %s (vs %s+0x%x).  Nothing written"),
1835                    core_addr_to_string (region_address),
1836                    core_addr_to_string (region_start),
1837                    (unsigned)region_length);
1838           length = 0;
1839           goto out;
1840         }
1841
1842       /* Adjust the length.  */
1843       region_length -= (region_address - region_start);
1844
1845       if (!(info.max_protection & VM_PROT_WRITE))
1846         {
1847           kret = mach_vm_protect
1848             (task, region_address, region_length,
1849              TRUE, info.max_protection | VM_PROT_WRITE | VM_PROT_COPY);
1850           if (kret != KERN_SUCCESS)
1851             {
1852               warning (_("darwin_read_write_inf: "
1853                          "mach_vm_protect max failed at %s: %s"),
1854                        core_addr_to_string (region_address),
1855                        mach_error_string (kret));
1856               length = 0;
1857               goto out;
1858             }
1859         }
1860
1861       if (!(info.protection & VM_PROT_WRITE))
1862         {
1863           kret = mach_vm_protect (task, region_address, region_length,
1864                                  FALSE, info.protection | VM_PROT_WRITE);
1865           if (kret != KERN_SUCCESS)
1866             {
1867               warning (_("darwin_read_write_inf: "
1868                          "mach_vm_protect failed at %s (len=0x%lx): %s"),
1869                        core_addr_to_string (region_address),
1870                        (unsigned long)region_length, mach_error_string (kret));
1871               length = 0;
1872               goto out;
1873             }
1874         }
1875     }
1876
1877   kret = mach_vm_write (task, low_address, copied, aligned_length);
1878
1879   if (kret != KERN_SUCCESS)
1880     {
1881       warning (_("darwin_read_write_inferior: mach_vm_write failed: %s"),
1882                mach_error_string (kret));
1883       length = 0;
1884     }
1885 out:
1886   mach_vm_deallocate (mach_task_self (), copied, copy_count);
1887   return length;
1888 }
1889
1890 /* Read LENGTH bytes at offset ADDR of task_dyld_info for TASK, and copy them
1891    to RDADDR.
1892    Return 0 on failure; number of bytes read / written otherwise.  */
1893
1894 #ifdef TASK_DYLD_INFO_COUNT
1895 /* This is not available in Darwin 9.  */
1896 static int
1897 darwin_read_dyld_info (task_t task, CORE_ADDR addr, gdb_byte *rdaddr,
1898                        int length)
1899 {
1900   struct task_dyld_info task_dyld_info;
1901   mach_msg_type_number_t count = TASK_DYLD_INFO_COUNT;
1902   int sz = TASK_DYLD_INFO_COUNT * sizeof (natural_t);
1903   kern_return_t kret;
1904
1905   if (addr >= sz)
1906     return 0;
1907
1908   kret = task_info (task, TASK_DYLD_INFO, (task_info_t) &task_dyld_info, &count);
1909   MACH_CHECK_ERROR (kret);
1910   if (kret != KERN_SUCCESS)
1911     return -1;
1912   /* Truncate.  */
1913   if (addr + length > sz)
1914     length = sz - addr;
1915   memcpy (rdaddr, (char *)&task_dyld_info + addr, length);
1916   return length;
1917 }
1918 #endif
1919
1920 \f
1921 /* Return 0 on failure, number of bytes handled otherwise.  TARGET
1922    is ignored.  */
1923 static int
1924 darwin_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write,
1925                     struct mem_attrib *attrib, struct target_ops *target)
1926 {
1927   struct inferior *inf = current_inferior ();
1928   task_t task = inf->private->task;
1929
1930   if (task == MACH_PORT_NULL)
1931     return 0;
1932
1933   inferior_debug (8, _("darwin_xfer_memory(%s, %d, %c)\n"),
1934                   core_addr_to_string (memaddr), len, write ? 'w' : 'r');
1935
1936   if (write)
1937     return darwin_read_write_inferior (task, memaddr, NULL, myaddr, len);
1938   else
1939     return darwin_read_write_inferior (task, memaddr, myaddr, NULL, len);
1940 }
1941
1942 static LONGEST
1943 darwin_xfer_partial (struct target_ops *ops,
1944                      enum target_object object, const char *annex,
1945                      gdb_byte *readbuf, const gdb_byte *writebuf,
1946                      ULONGEST offset, LONGEST len)
1947 {
1948   struct inferior *inf = current_inferior ();
1949
1950   inferior_debug
1951     (8, _("darwin_xfer_partial(%s, %d, rbuf=%s, wbuf=%s) pid=%u\n"),
1952      core_addr_to_string (offset), (int)len,
1953      host_address_to_string (readbuf), host_address_to_string (writebuf),
1954      inf->pid);
1955
1956   switch (object)
1957     {
1958     case TARGET_OBJECT_MEMORY:
1959       return darwin_read_write_inferior (inf->private->task, offset,
1960                                          readbuf, writebuf, len);
1961 #ifdef TASK_DYLD_INFO_COUNT
1962     case TARGET_OBJECT_DARWIN_DYLD_INFO:
1963       if (writebuf != NULL || readbuf == NULL)
1964         {
1965           /* Support only read.  */
1966           return -1;
1967         }
1968       return darwin_read_dyld_info (inf->private->task, offset, readbuf, len);
1969 #endif
1970     default:
1971       return -1;
1972     }
1973
1974 }
1975
1976 static void
1977 set_enable_mach_exceptions (char *args, int from_tty,
1978                             struct cmd_list_element *c)
1979 {
1980   if (!ptid_equal (inferior_ptid, null_ptid))
1981     {
1982       struct inferior *inf = current_inferior ();
1983       exception_mask_t mask;
1984       kern_return_t kret;
1985
1986       if (enable_mach_exceptions)
1987         mask = EXC_MASK_ALL;
1988       else
1989         {
1990           darwin_restore_exception_ports (inf->private);
1991           mask = EXC_MASK_SOFTWARE | EXC_MASK_BREAKPOINT;
1992         }
1993       kret = task_set_exception_ports (inf->private->task, mask, darwin_ex_port,
1994                                        EXCEPTION_DEFAULT, THREAD_STATE_NONE);
1995       MACH_CHECK_ERROR (kret);
1996     }
1997 }
1998
1999 static char *
2000 darwin_pid_to_exec_file (int pid)
2001 {
2002   char *path;
2003   int res;
2004
2005   path = xmalloc (MAXPATHLEN);
2006   make_cleanup (xfree, path);
2007
2008   res = proc_pidinfo (pid, PROC_PIDPATHINFO, 0, path, MAXPATHLEN);
2009   if (res >= 0)
2010     return path;
2011   else
2012     return NULL;
2013 }
2014
2015 static ptid_t
2016 darwin_get_ada_task_ptid (long lwp, long thread)
2017 {
2018   int i;
2019   darwin_thread_t *t;
2020   int k;
2021   struct inferior *inf = current_inferior ();
2022   kern_return_t kret;
2023   mach_port_name_array_t names;
2024   mach_msg_type_number_t names_count;
2025   mach_port_type_array_t types;
2026   mach_msg_type_number_t types_count;
2027   long res = 0;
2028
2029   /* First linear search.  */
2030   for (k = 0;
2031        VEC_iterate (darwin_thread_t, inf->private->threads, k, t);
2032        k++)
2033     if (t->inf_port == lwp)
2034       return ptid_build (ptid_get_pid (inferior_ptid), 0, t->gdb_port);
2035
2036   /* Maybe the port was never extract.  Do it now.  */
2037
2038   /* First get inferior port names.  */
2039   kret = mach_port_names (inf->private->task, &names, &names_count, &types,
2040                           &types_count);
2041   MACH_CHECK_ERROR (kret);
2042   if (kret != KERN_SUCCESS)
2043     return null_ptid;
2044
2045   /* For each name, copy the right in the gdb space and then compare with
2046      our view of the inferior threads.  We don't forget to deallocate the
2047      right.  */
2048   for (i = 0; i < names_count; i++)
2049     {
2050       mach_port_t local_name;
2051       mach_msg_type_name_t local_type;
2052
2053       /* We just need to know the corresponding name in gdb name space.
2054          So extract and deallocate the right.  */
2055       kret = mach_port_extract_right (inf->private->task, names[i],
2056                                       MACH_MSG_TYPE_COPY_SEND,
2057                                       &local_name, &local_type);
2058       if (kret != KERN_SUCCESS)
2059         continue;
2060       mach_port_deallocate (gdb_task, local_name);
2061
2062       for (k = 0;
2063            VEC_iterate (darwin_thread_t, inf->private->threads, k, t);
2064            k++)
2065         if (t->gdb_port == local_name)
2066           {
2067             t->inf_port = names[i];
2068             if (names[i] == lwp)
2069               res = t->gdb_port;
2070           }
2071     }
2072
2073   vm_deallocate (gdb_task, (vm_address_t) names,
2074                  names_count * sizeof (mach_port_t));
2075
2076   if (res)
2077     return ptid_build (ptid_get_pid (inferior_ptid), 0, res);
2078   else
2079     return null_ptid;
2080 }
2081
2082 static int
2083 darwin_supports_multi_process (void)
2084 {
2085   return 1;
2086 }
2087
2088 /* -Wmissing-prototypes */
2089 extern initialize_file_ftype _initialize_darwin_inferior;
2090
2091 void
2092 _initialize_darwin_inferior (void)
2093 {
2094   kern_return_t kret;
2095
2096   gdb_task = mach_task_self ();
2097   darwin_host_self = mach_host_self ();
2098
2099   /* Read page size.  */
2100   kret = host_page_size (darwin_host_self, &mach_page_size);
2101   if (kret != KERN_SUCCESS)
2102     {
2103       mach_page_size = 0x1000;
2104       MACH_CHECK_ERROR (kret);
2105     }
2106
2107   darwin_ops = inf_child_target ();
2108
2109   darwin_ops->to_shortname = "darwin-child";
2110   darwin_ops->to_longname = _("Darwin child process");
2111   darwin_ops->to_doc =
2112     _("Darwin child process (started by the \"run\" command).");
2113   darwin_ops->to_create_inferior = darwin_create_inferior;
2114   darwin_ops->to_attach = darwin_attach;
2115   darwin_ops->to_attach_no_wait = 0;
2116   darwin_ops->to_detach = darwin_detach;
2117   darwin_ops->to_files_info = darwin_files_info;
2118   darwin_ops->to_wait = darwin_wait_to;
2119   darwin_ops->to_mourn_inferior = darwin_mourn_inferior;
2120   darwin_ops->to_kill = darwin_kill_inferior;
2121   darwin_ops->to_stop = darwin_stop;
2122   darwin_ops->to_resume = darwin_resume_to;
2123   darwin_ops->to_thread_alive = darwin_thread_alive;
2124   darwin_ops->to_pid_to_str = darwin_pid_to_str;
2125   darwin_ops->to_pid_to_exec_file = darwin_pid_to_exec_file;
2126   darwin_ops->to_load = NULL;
2127   darwin_ops->deprecated_xfer_memory = darwin_xfer_memory;
2128   darwin_ops->to_xfer_partial = darwin_xfer_partial;
2129   darwin_ops->to_supports_multi_process = darwin_supports_multi_process;
2130   darwin_ops->to_get_ada_task_ptid = darwin_get_ada_task_ptid;
2131
2132   darwin_complete_target (darwin_ops);
2133
2134   add_target (darwin_ops);
2135
2136   inferior_debug (2, _("GDB task: 0x%lx, pid: %d\n"), mach_task_self (),
2137                   getpid ());
2138
2139   add_setshow_zuinteger_cmd ("darwin", class_obscure,
2140                              &darwin_debug_flag, _("\
2141 Set if printing inferior communication debugging statements."), _("\
2142 Show if printing inferior communication debugging statements."), NULL,
2143                              NULL, NULL,
2144                              &setdebuglist, &showdebuglist);
2145
2146   add_setshow_boolean_cmd ("mach-exceptions", class_support,
2147                            &enable_mach_exceptions, _("\
2148 Set if mach exceptions are caught."), _("\
2149 Show if mach exceptions are caught."), _("\
2150 When this mode is on, all low level exceptions are reported before being\n\
2151 reported by the kernel."),
2152                            &set_enable_mach_exceptions, NULL,
2153                            &setlist, &showlist);
2154 }