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