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