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