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