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