gdb: Fix build on several hosts/ports
[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_build (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_build (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_get_pid (ptid), ptid_get_tid (ptid), 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_equal (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_get_tid (ptid);
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_build (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_build (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_build (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_get_tid (ptid));
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_get_pid (ptid), ptid_get_tid (ptid));
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_build (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 (ptid_equal (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_build (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 (ptid_equal (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   kret = task_for_pid (gdb_task, inf->pid, &priv->task);
1587   if (kret != KERN_SUCCESS)
1588     {
1589       int status;
1590
1591       if (!inf->attach_flag)
1592         {
1593           kill (inf->pid, 9);
1594           waitpid (inf->pid, &status, 0);
1595         }
1596
1597       error (_("Unable to find Mach task port for process-id %d: %s (0x%lx).\n"
1598                " (please check gdb is codesigned - see taskgated(8))"),
1599              inf->pid, mach_error_string (kret), (unsigned long) kret);
1600     }
1601
1602   inferior_debug (2, _("inferior task: 0x%x, pid: %d\n"),
1603                   priv->task, inf->pid);
1604
1605   if (darwin_ex_port == MACH_PORT_NULL)
1606     {
1607       /* Create a port to get exceptions.  */
1608       kret = mach_port_allocate (gdb_task, MACH_PORT_RIGHT_RECEIVE,
1609                                  &darwin_ex_port);
1610       if (kret != KERN_SUCCESS)
1611         error (_("Unable to create exception port, mach_port_allocate "
1612                  "returned: %d"),
1613                kret);
1614
1615       kret = mach_port_insert_right (gdb_task, darwin_ex_port, darwin_ex_port,
1616                                      MACH_MSG_TYPE_MAKE_SEND);
1617       if (kret != KERN_SUCCESS)
1618         error (_("Unable to create exception port, mach_port_insert_right "
1619                  "returned: %d"),
1620                kret);
1621
1622       /* Create a port set and put ex_port in it.  */
1623       kret = mach_port_allocate (gdb_task, MACH_PORT_RIGHT_PORT_SET,
1624                                  &darwin_port_set);
1625       if (kret != KERN_SUCCESS)
1626         error (_("Unable to create port set, mach_port_allocate "
1627                  "returned: %d"),
1628                kret);
1629
1630       kret = mach_port_move_member (gdb_task, darwin_ex_port, darwin_port_set);
1631       if (kret != KERN_SUCCESS)
1632         error (_("Unable to move exception port into new port set, "
1633                  "mach_port_move_member\n"
1634                  "returned: %d"),
1635                kret);
1636     }
1637
1638   /* Create a port to be notified when the child task terminates.  */
1639   kret = mach_port_allocate (gdb_task, MACH_PORT_RIGHT_RECEIVE,
1640                              &priv->notify_port);
1641   if (kret != KERN_SUCCESS)
1642     error (_("Unable to create notification port, mach_port_allocate "
1643              "returned: %d"),
1644            kret);
1645
1646   kret = mach_port_move_member (gdb_task,
1647                                 priv->notify_port, darwin_port_set);
1648   if (kret != KERN_SUCCESS)
1649     error (_("Unable to move notification port into new port set, "
1650              "mach_port_move_member\n"
1651              "returned: %d"),
1652            kret);
1653
1654   darwin_setup_request_notification (inf);
1655
1656   darwin_setup_exceptions (inf);
1657
1658   target_ops *darwin_ops = get_native_target ();
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 }