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