Remove fake operand handling for extended mnemonics.
[binutils-gdb.git] / gdb / darwin-nat.c
blob0b1a4910a3097f448a6e60b5b7f092be30e9f2cc
1 /* Darwin support for GDB, the GNU debugger.
2 Copyright (C) 2008-2018 Free Software Foundation, Inc.
4 Contributed by AdaCore.
6 This file is part of GDB.
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.
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.
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/>. */
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"
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>
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>
63 #include "darwin-nat.h"
64 #include "common/filestuff.h"
65 #include "nat/fork-inferior.h"
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).
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.
79 Some Mach documentation is available for Apple xnu source package or
80 from the web. */
83 #define PTRACE(CMD, PID, ADDR, SIG) \
84 darwin_ptrace(#CMD, CMD, (PID), (ADDR), (SIG))
86 static ptid_t darwin_wait (ptid_t ptid, struct target_waitstatus *status);
88 static void darwin_ptrace_me (void);
90 static void darwin_ptrace_him (int pid);
92 static void darwin_encode_reply (mig_reply_error_t *reply,
93 mach_msg_header_t *hdr, integer_t code);
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);
100 /* Target operations for Darwin. */
101 static struct target_ops *darwin_ops;
103 /* Task identifier of gdb. */
104 static task_t gdb_task;
106 /* A copy of mach_host_self (). */
107 mach_port_t darwin_host_self;
109 /* Exception port. */
110 mach_port_t darwin_ex_port;
112 /* Port set, to wait for answer on all ports. */
113 mach_port_t darwin_port_set;
115 /* Page size. */
116 static vm_size_t mach_page_size;
118 /* If Set, catch all mach exceptions (before they are converted to signals
119 by the kernel). */
120 static int enable_mach_exceptions;
122 /* Inferior that should report a fake stop event. */
123 static struct inferior *darwin_inf_fake_stop;
125 #define PAGE_TRUNC(x) ((x) & ~(mach_page_size - 1))
126 #define PAGE_ROUND(x) PAGE_TRUNC((x) + mach_page_size - 1)
128 /* This controls output of inferior debugging. */
129 static unsigned int darwin_debug_flag = 0;
131 /* Create a __TEXT __info_plist section in the executable so that gdb could
132 be signed. This is required to get an authorization for task_for_pid.
134 Once gdb is built, you must codesign it with any system-trusted signing
135 authority. See taskgated(8) for details. */
136 static const unsigned char info_plist[]
137 __attribute__ ((section ("__TEXT,__info_plist"),used)) =
138 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
139 "<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\""
140 " \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
141 "<plist version=\"1.0\">\n"
142 "<dict>\n"
143 " <key>CFBundleIdentifier</key>\n"
144 " <string>org.gnu.gdb</string>\n"
145 " <key>CFBundleName</key>\n"
146 " <string>gdb</string>\n"
147 " <key>CFBundleVersion</key>\n"
148 " <string>1.0</string>\n"
149 " <key>SecTaskAccess</key>\n"
150 " <array>\n"
151 " <string>allowed</string>\n"
152 " <string>debug</string>\n"
153 " </array>\n"
154 "</dict>\n"
155 "</plist>\n";
157 static void inferior_debug (int level, const char *fmt, ...)
158 ATTRIBUTE_PRINTF (2, 3);
160 static void
161 inferior_debug (int level, const char *fmt, ...)
163 va_list ap;
165 if (darwin_debug_flag < level)
166 return;
168 va_start (ap, fmt);
169 printf_unfiltered (_("[%d inferior]: "), getpid ());
170 vprintf_unfiltered (fmt, ap);
171 va_end (ap);
174 void
175 mach_check_error (kern_return_t ret, const char *file,
176 unsigned int line, const char *func)
178 if (ret == KERN_SUCCESS)
179 return;
180 if (func == NULL)
181 func = _("[UNKNOWN]");
183 warning (_("Mach error at \"%s:%u\" in function \"%s\": %s (0x%lx)"),
184 file, line, func, mach_error_string (ret), (unsigned long) ret);
187 static const char *
188 unparse_exception_type (unsigned int i)
190 static char unknown_exception_buf[32];
192 switch (i)
194 case EXC_BAD_ACCESS:
195 return "EXC_BAD_ACCESS";
196 case EXC_BAD_INSTRUCTION:
197 return "EXC_BAD_INSTRUCTION";
198 case EXC_ARITHMETIC:
199 return "EXC_ARITHMETIC";
200 case EXC_EMULATION:
201 return "EXC_EMULATION";
202 case EXC_SOFTWARE:
203 return "EXC_SOFTWARE";
204 case EXC_BREAKPOINT:
205 return "EXC_BREAKPOINT";
206 case EXC_SYSCALL:
207 return "EXC_SYSCALL";
208 case EXC_MACH_SYSCALL:
209 return "EXC_MACH_SYSCALL";
210 case EXC_RPC_ALERT:
211 return "EXC_RPC_ALERT";
212 case EXC_CRASH:
213 return "EXC_CRASH";
214 default:
215 snprintf (unknown_exception_buf, 32, _("unknown (%d)"), i);
216 return unknown_exception_buf;
220 /* Set errno to zero, and then call ptrace with the given arguments.
221 If inferior debugging traces are on, then also print a debug
222 trace.
224 The returned value is the same as the value returned by ptrace,
225 except in the case where that value is -1 but errno is zero.
226 This case is documented to be a non-error situation, so we
227 return zero in that case. */
229 static int
230 darwin_ptrace (const char *name,
231 int request, int pid, caddr_t arg3, int arg4)
233 int ret;
235 errno = 0;
236 ret = ptrace (request, pid, arg3, arg4);
237 if (ret == -1 && errno == 0)
238 ret = 0;
240 inferior_debug (4, _("ptrace (%s, %d, 0x%lx, %d): %d (%s)\n"),
241 name, pid, (unsigned long) arg3, arg4, ret,
242 (ret != 0) ? safe_strerror (errno) : _("no error"));
243 return ret;
246 static int
247 cmp_thread_t (const void *l, const void *r)
249 thread_t tl = *(const thread_t *)l;
250 thread_t tr = *(const thread_t *)r;
251 return (int)(tl - tr);
254 static void
255 darwin_check_new_threads (struct inferior *inf)
257 kern_return_t kret;
258 thread_array_t thread_list;
259 unsigned int new_nbr;
260 unsigned int old_nbr;
261 unsigned int new_ix, old_ix;
262 darwin_inferior *darwin_inf = get_darwin_inferior (inf);
263 std::vector<darwin_thread_t *> new_thread_vec;
265 /* Get list of threads. */
266 kret = task_threads (darwin_inf->task, &thread_list, &new_nbr);
267 MACH_CHECK_ERROR (kret);
268 if (kret != KERN_SUCCESS)
269 return;
271 /* Sort the list. */
272 if (new_nbr > 1)
273 qsort (thread_list, new_nbr, sizeof (thread_t), cmp_thread_t);
275 old_nbr = darwin_inf->threads.size ();
277 /* Quick check for no changes. */
278 if (old_nbr == new_nbr)
280 size_t i;
282 for (i = 0; i < new_nbr; i++)
283 if (thread_list[i] != darwin_inf->threads[i]->gdb_port)
284 break;
285 if (i == new_nbr)
287 /* Deallocate ports. */
288 for (i = 0; i < new_nbr; i++)
290 kret = mach_port_deallocate (mach_task_self (), thread_list[i]);
291 MACH_CHECK_ERROR (kret);
294 /* Deallocate the buffer. */
295 kret = vm_deallocate (gdb_task, (vm_address_t) thread_list,
296 new_nbr * sizeof (int));
297 MACH_CHECK_ERROR (kret);
299 return;
303 /* Full handling: detect new threads, remove dead threads. */
305 new_thread_vec.reserve (new_nbr);
307 for (new_ix = 0, old_ix = 0; new_ix < new_nbr || old_ix < old_nbr;)
309 thread_t new_id = (new_ix < new_nbr) ? thread_list[new_ix] : THREAD_NULL;
310 darwin_thread_t *old
311 = (old_ix < old_nbr) ? darwin_inf->threads[old_ix] : NULL;
312 thread_t old_id = old != NULL ? old->gdb_port : THREAD_NULL;
314 inferior_debug
315 (12, _(" new_ix:%d/%d, old_ix:%d/%d, new_id:0x%x old_id:0x%x\n"),
316 new_ix, new_nbr, old_ix, old_nbr, new_id, old_id);
318 if (old_id == new_id)
320 /* Thread still exist. */
321 new_thread_vec.push_back (old);
322 new_ix++;
323 old_ix++;
325 /* Deallocate the port. */
326 kret = mach_port_deallocate (gdb_task, new_id);
327 MACH_CHECK_ERROR (kret);
329 continue;
331 if (new_ix < new_nbr && new_id == MACH_PORT_DEAD)
333 /* Ignore dead ports.
334 In some weird cases, we might get dead ports. They should
335 correspond to dead thread so they could safely be ignored. */
336 new_ix++;
337 continue;
339 if (new_ix < new_nbr && (old_ix == old_nbr || new_id < old_id))
341 /* A thread was created. */
342 darwin_thread_info *pti = new darwin_thread_info;
344 pti->gdb_port = new_id;
345 pti->msg_state = DARWIN_RUNNING;
347 /* Add the new thread. */
348 add_thread_with_info (ptid_build (inf->pid, 0, new_id), pti);
349 new_thread_vec.push_back (pti);
350 new_ix++;
351 continue;
353 if (old_ix < old_nbr && (new_ix == new_nbr || new_id > old_id))
355 /* A thread was removed. */
356 delete_thread (ptid_build (inf->pid, 0, old_id));
357 kret = mach_port_deallocate (gdb_task, old_id);
358 MACH_CHECK_ERROR (kret);
359 old_ix++;
360 continue;
362 gdb_assert_not_reached ("unexpected thread case");
365 darwin_inf->threads = std::move (new_thread_vec);
367 /* Deallocate the buffer. */
368 kret = vm_deallocate (gdb_task, (vm_address_t) thread_list,
369 new_nbr * sizeof (int));
370 MACH_CHECK_ERROR (kret);
373 static int
374 find_inferior_task_it (struct inferior *inf, void *port_ptr)
376 darwin_inferior *priv = get_darwin_inferior (inf);
378 return priv->task == *(task_t *)port_ptr;
381 static int
382 find_inferior_pid_it (struct inferior *inf, void *pid_ptr)
384 return inf->pid == *(int *)pid_ptr;
387 /* Return an inferior by task port. */
388 static struct inferior *
389 darwin_find_inferior_by_task (task_t port)
391 return iterate_over_inferiors (&find_inferior_task_it, &port);
394 /* Return an inferior by pid port. */
395 static struct inferior *
396 darwin_find_inferior_by_pid (int pid)
398 return iterate_over_inferiors (&find_inferior_pid_it, &pid);
401 /* Return a thread by port. */
402 static darwin_thread_t *
403 darwin_find_thread (struct inferior *inf, thread_t thread)
405 darwin_inferior *priv = get_darwin_inferior (inf);
407 for (darwin_thread_t *t : priv->threads)
409 if (t->gdb_port == thread)
410 return t;
413 return NULL;
416 /* Suspend (ie stop) an inferior at Mach level. */
418 static void
419 darwin_suspend_inferior (struct inferior *inf)
421 darwin_inferior *priv = get_darwin_inferior (inf);
423 if (!priv->suspended)
425 kern_return_t kret;
427 kret = task_suspend (priv->task);
428 MACH_CHECK_ERROR (kret);
430 priv->suspended = 1;
434 /* Resume an inferior at Mach level. */
436 static void
437 darwin_resume_inferior (struct inferior *inf)
439 darwin_inferior *priv = get_darwin_inferior (inf);
441 if (priv->suspended)
443 kern_return_t kret;
445 kret = task_resume (priv->task);
446 MACH_CHECK_ERROR (kret);
448 priv->suspended = 0;
452 /* Iterator functions. */
454 static int
455 darwin_suspend_inferior_it (struct inferior *inf, void *arg)
457 darwin_suspend_inferior (inf);
458 darwin_check_new_threads (inf);
459 return 0;
462 static int
463 darwin_resume_inferior_it (struct inferior *inf, void *arg)
465 darwin_resume_inferior (inf);
466 return 0;
469 static void
470 darwin_dump_message (mach_msg_header_t *hdr, int disp_body)
472 printf_unfiltered (_("message header:\n"));
473 printf_unfiltered (_(" bits: 0x%x\n"), hdr->msgh_bits);
474 printf_unfiltered (_(" size: 0x%x\n"), hdr->msgh_size);
475 printf_unfiltered (_(" remote-port: 0x%x\n"), hdr->msgh_remote_port);
476 printf_unfiltered (_(" local-port: 0x%x\n"), hdr->msgh_local_port);
477 printf_unfiltered (_(" reserved: 0x%x\n"), hdr->msgh_reserved);
478 printf_unfiltered (_(" id: 0x%x\n"), hdr->msgh_id);
480 if (disp_body)
482 const unsigned char *data;
483 const unsigned int *ldata;
484 int size;
485 int i;
487 data = (unsigned char *)(hdr + 1);
488 size = hdr->msgh_size - sizeof (mach_msg_header_t);
490 if (hdr->msgh_bits & MACH_MSGH_BITS_COMPLEX)
492 mach_msg_body_t *bod = (mach_msg_body_t*)data;
493 mach_msg_port_descriptor_t *desc =
494 (mach_msg_port_descriptor_t *)(bod + 1);
495 int k;
496 NDR_record_t *ndr;
497 printf_unfiltered (_("body: descriptor_count=%u\n"),
498 bod->msgh_descriptor_count);
499 data += sizeof (mach_msg_body_t);
500 size -= sizeof (mach_msg_body_t);
501 for (k = 0; k < bod->msgh_descriptor_count; k++)
502 switch (desc[k].type)
504 case MACH_MSG_PORT_DESCRIPTOR:
505 printf_unfiltered
506 (_(" descr %d: type=%u (port) name=0x%x, dispo=%d\n"),
507 k, desc[k].type, desc[k].name, desc[k].disposition);
508 break;
509 default:
510 printf_unfiltered (_(" descr %d: type=%u\n"),
511 k, desc[k].type);
512 break;
514 data += bod->msgh_descriptor_count
515 * sizeof (mach_msg_port_descriptor_t);
516 size -= bod->msgh_descriptor_count
517 * sizeof (mach_msg_port_descriptor_t);
518 ndr = (NDR_record_t *)(desc + bod->msgh_descriptor_count);
519 printf_unfiltered
520 (_("NDR: mig=%02x if=%02x encod=%02x "
521 "int=%02x char=%02x float=%02x\n"),
522 ndr->mig_vers, ndr->if_vers, ndr->mig_encoding,
523 ndr->int_rep, ndr->char_rep, ndr->float_rep);
524 data += sizeof (NDR_record_t);
525 size -= sizeof (NDR_record_t);
528 printf_unfiltered (_(" data:"));
529 ldata = (const unsigned int *)data;
530 for (i = 0; i < size / sizeof (unsigned int); i++)
531 printf_unfiltered (" %08x", ldata[i]);
532 printf_unfiltered (_("\n"));
536 /* Adjust inferior data when a new task was created. */
538 static struct inferior *
539 darwin_find_new_inferior (task_t task_port, thread_t thread_port)
541 int task_pid;
542 struct inferior *inf;
543 kern_return_t kret;
544 mach_port_t prev;
546 /* Find the corresponding pid. */
547 kret = pid_for_task (task_port, &task_pid);
548 if (kret != KERN_SUCCESS)
550 MACH_CHECK_ERROR (kret);
551 return NULL;
554 /* Find the inferior for this pid. */
555 inf = darwin_find_inferior_by_pid (task_pid);
556 if (inf == NULL)
557 return NULL;
559 darwin_inferior *priv = get_darwin_inferior (inf);
561 /* Deallocate saved exception ports. */
562 darwin_deallocate_exception_ports (priv);
564 /* No need to remove dead_name notification, but still... */
565 kret = mach_port_request_notification (gdb_task, priv->task,
566 MACH_NOTIFY_DEAD_NAME, 0,
567 MACH_PORT_NULL,
568 MACH_MSG_TYPE_MAKE_SEND_ONCE,
569 &prev);
570 if (kret != KERN_INVALID_ARGUMENT)
571 MACH_CHECK_ERROR (kret);
573 /* Replace old task port. */
574 kret = mach_port_deallocate (gdb_task, priv->task);
575 MACH_CHECK_ERROR (kret);
576 priv->task = task_port;
578 darwin_setup_request_notification (inf);
579 darwin_setup_exceptions (inf);
581 return inf;
584 /* Check data representation. */
586 static int
587 darwin_check_message_ndr (NDR_record_t *ndr)
589 if (ndr->mig_vers != NDR_PROTOCOL_2_0
590 || ndr->if_vers != NDR_PROTOCOL_2_0
591 || ndr->mig_encoding != NDR_record.mig_encoding
592 || ndr->int_rep != NDR_record.int_rep
593 || ndr->char_rep != NDR_record.char_rep
594 || ndr->float_rep != NDR_record.float_rep)
595 return -1;
596 return 0;
599 /* Decode an exception message. */
601 static int
602 darwin_decode_exception_message (mach_msg_header_t *hdr,
603 struct inferior **pinf,
604 darwin_thread_t **pthread)
606 mach_msg_body_t *bod = (mach_msg_body_t*)(hdr + 1);
607 mach_msg_port_descriptor_t *desc = (mach_msg_port_descriptor_t *)(bod + 1);
608 NDR_record_t *ndr;
609 integer_t *data;
610 struct inferior *inf;
611 darwin_thread_t *thread;
612 task_t task_port;
613 thread_t thread_port;
614 kern_return_t kret;
615 int i;
617 /* Check message destination. */
618 if (hdr->msgh_local_port != darwin_ex_port)
619 return -1;
621 /* Check message header. */
622 if (!(hdr->msgh_bits & MACH_MSGH_BITS_COMPLEX))
623 return -1;
625 /* Check descriptors. */
626 if (hdr->msgh_size < (sizeof (*hdr) + sizeof (*bod) + 2 * sizeof (*desc)
627 + sizeof (*ndr) + 2 * sizeof (integer_t))
628 || bod->msgh_descriptor_count != 2
629 || desc[0].type != MACH_MSG_PORT_DESCRIPTOR
630 || desc[0].disposition != MACH_MSG_TYPE_MOVE_SEND
631 || desc[1].type != MACH_MSG_PORT_DESCRIPTOR
632 || desc[1].disposition != MACH_MSG_TYPE_MOVE_SEND)
633 return -1;
635 /* Check data representation. */
636 ndr = (NDR_record_t *)(desc + 2);
637 if (darwin_check_message_ndr (ndr) != 0)
638 return -1;
640 /* Ok, the hard work. */
641 data = (integer_t *)(ndr + 1);
643 task_port = desc[1].name;
644 thread_port = desc[0].name;
646 /* Find process by port. */
647 inf = darwin_find_inferior_by_task (task_port);
648 *pinf = inf;
650 if (inf == NULL && data[0] == EXC_SOFTWARE && data[1] == 2
651 && data[2] == EXC_SOFT_SIGNAL && data[3] == SIGTRAP)
653 /* Not a known inferior, but a sigtrap. This happens on darwin 16.1.0,
654 as a new Mach task is created when a process exec. */
655 inf = darwin_find_new_inferior (task_port, thread_port);
656 *pinf = inf;
658 if (inf == NULL)
660 /* Deallocate task_port, unless it was saved. */
661 kret = mach_port_deallocate (mach_task_self (), task_port);
662 MACH_CHECK_ERROR (kret);
665 else
667 /* We got new rights to the task, get rid of it. Do not get rid of
668 thread right, as we will need it to find the thread. */
669 kret = mach_port_deallocate (mach_task_self (), task_port);
670 MACH_CHECK_ERROR (kret);
673 if (inf == NULL)
675 /* Not a known inferior. This could happen if the child fork, as
676 the created process will inherit its exception port.
677 FIXME: should the exception port be restored ? */
678 kern_return_t kret;
679 mig_reply_error_t reply;
681 inferior_debug
682 (4, _("darwin_decode_exception_message: unknown task 0x%x\n"),
683 task_port);
685 /* Free thread port (we don't know it). */
686 kret = mach_port_deallocate (mach_task_self (), thread_port);
687 MACH_CHECK_ERROR (kret);
689 darwin_encode_reply (&reply, hdr, KERN_SUCCESS);
691 kret = mach_msg (&reply.Head, MACH_SEND_MSG | MACH_SEND_INTERRUPT,
692 reply.Head.msgh_size, 0,
693 MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE,
694 MACH_PORT_NULL);
695 MACH_CHECK_ERROR (kret);
697 return 0;
700 /* Find thread by port. */
701 /* Check for new threads. Do it early so that the port in the exception
702 message can be deallocated. */
703 darwin_check_new_threads (inf);
705 /* Free the thread port (as gdb knows the thread, it has already has a right
706 for it, so this just decrement a reference counter). */
707 kret = mach_port_deallocate (mach_task_self (), thread_port);
708 MACH_CHECK_ERROR (kret);
710 thread = darwin_find_thread (inf, thread_port);
711 if (thread == NULL)
712 return -1;
713 *pthread = thread;
715 /* The thread should be running. However we have observed cases where a
716 thread got a SIGTTIN message after being stopped. */
717 gdb_assert (thread->msg_state != DARWIN_MESSAGE);
719 /* Finish decoding. */
720 thread->event.header = *hdr;
721 thread->event.thread_port = thread_port;
722 thread->event.task_port = task_port;
723 thread->event.ex_type = data[0];
724 thread->event.data_count = data[1];
726 if (hdr->msgh_size < (sizeof (*hdr) + sizeof (*bod) + 2 * sizeof (*desc)
727 + sizeof (*ndr) + 2 * sizeof (integer_t)
728 + data[1] * sizeof (integer_t)))
729 return -1;
730 for (i = 0; i < data[1]; i++)
731 thread->event.ex_data[i] = data[2 + i];
733 thread->msg_state = DARWIN_MESSAGE;
735 return 0;
738 /* Decode dead_name notify message. */
740 static int
741 darwin_decode_notify_message (mach_msg_header_t *hdr, struct inferior **pinf)
743 NDR_record_t *ndr = (NDR_record_t *)(hdr + 1);
744 integer_t *data = (integer_t *)(ndr + 1);
745 struct inferior *inf;
746 darwin_thread_t *thread;
747 task_t task_port;
748 thread_t thread_port;
749 kern_return_t kret;
750 int i;
752 /* Check message header. */
753 if (hdr->msgh_bits & MACH_MSGH_BITS_COMPLEX)
754 return -1;
756 /* Check descriptors. */
757 if (hdr->msgh_size < (sizeof (*hdr) + sizeof (*ndr) + sizeof (integer_t)))
758 return -2;
760 /* Check data representation. */
761 if (darwin_check_message_ndr (ndr) != 0)
762 return -3;
764 task_port = data[0];
766 /* Find process by port. */
767 inf = darwin_find_inferior_by_task (task_port);
768 *pinf = inf;
770 darwin_inferior *priv = get_darwin_inferior (inf);
772 /* Check message destination. */
773 if (inf != NULL && hdr->msgh_local_port != priv->notify_port)
774 return -4;
776 return 0;
779 static void
780 darwin_encode_reply (mig_reply_error_t *reply, mach_msg_header_t *hdr,
781 integer_t code)
783 mach_msg_header_t *rh = &reply->Head;
785 rh->msgh_bits = MACH_MSGH_BITS (MACH_MSGH_BITS_REMOTE (hdr->msgh_bits), 0);
786 rh->msgh_remote_port = hdr->msgh_remote_port;
787 rh->msgh_size = (mach_msg_size_t) sizeof (mig_reply_error_t);
788 rh->msgh_local_port = MACH_PORT_NULL;
789 rh->msgh_id = hdr->msgh_id + 100;
791 reply->NDR = NDR_record;
792 reply->RetCode = code;
795 static void
796 darwin_send_reply (struct inferior *inf, darwin_thread_t *thread)
798 kern_return_t kret;
799 mig_reply_error_t reply;
800 darwin_inferior *priv = get_darwin_inferior (inf);
802 darwin_encode_reply (&reply, &thread->event.header, KERN_SUCCESS);
804 kret = mach_msg (&reply.Head, MACH_SEND_MSG | MACH_SEND_INTERRUPT,
805 reply.Head.msgh_size, 0,
806 MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE,
807 MACH_PORT_NULL);
808 MACH_CHECK_ERROR (kret);
810 priv->pending_messages--;
813 static void
814 darwin_resume_thread (struct inferior *inf, darwin_thread_t *thread,
815 int step, int nsignal)
817 kern_return_t kret;
818 int res;
820 inferior_debug
821 (3, _("darwin_resume_thread: state=%d, thread=0x%x, step=%d nsignal=%d\n"),
822 thread->msg_state, thread->gdb_port, step, nsignal);
824 switch (thread->msg_state)
826 case DARWIN_MESSAGE:
827 if (thread->event.ex_type == EXC_SOFTWARE
828 && thread->event.ex_data[0] == EXC_SOFT_SIGNAL)
830 /* Either deliver a new signal or cancel the signal received. */
831 res = PTRACE (PT_THUPDATE, inf->pid,
832 (caddr_t) (uintptr_t) thread->gdb_port, nsignal);
833 if (res < 0)
834 inferior_debug (1, _("ptrace THUP: res=%d\n"), res);
836 else if (nsignal)
838 /* Note: ptrace is allowed only if the process is stopped.
839 Directly send the signal to the thread. */
840 res = syscall (SYS___pthread_kill, thread->gdb_port, nsignal);
841 inferior_debug (4, _("darwin_resume_thread: kill 0x%x %d: %d\n"),
842 thread->gdb_port, nsignal, res);
843 thread->signaled = 1;
846 /* Set or reset single step. */
847 inferior_debug (4, _("darwin_set_sstep (thread=0x%x, enable=%d)\n"),
848 thread->gdb_port, step);
849 darwin_set_sstep (thread->gdb_port, step);
850 thread->single_step = step;
852 darwin_send_reply (inf, thread);
853 thread->msg_state = DARWIN_RUNNING;
854 break;
856 case DARWIN_RUNNING:
857 break;
859 case DARWIN_STOPPED:
860 kret = thread_resume (thread->gdb_port);
861 MACH_CHECK_ERROR (kret);
863 thread->msg_state = DARWIN_RUNNING;
864 break;
868 /* Resume all threads of the inferior. */
870 static void
871 darwin_resume_inferior_threads (struct inferior *inf, int step, int nsignal)
873 darwin_inferior *priv = get_darwin_inferior (inf);
875 for (darwin_thread_t *thread : priv->threads)
876 darwin_resume_thread (inf, thread, step, nsignal);
879 struct resume_inferior_threads_param
881 int step;
882 int nsignal;
885 static int
886 darwin_resume_inferior_threads_it (struct inferior *inf, void *param)
888 int step = ((struct resume_inferior_threads_param *)param)->step;
889 int nsignal = ((struct resume_inferior_threads_param *)param)->nsignal;
891 darwin_resume_inferior_threads (inf, step, nsignal);
893 return 0;
896 /* Suspend all threads of INF. */
898 static void
899 darwin_suspend_inferior_threads (struct inferior *inf)
901 darwin_inferior *priv = get_darwin_inferior (inf);
903 for (darwin_thread_t *thread : priv->threads)
905 switch (thread->msg_state)
907 case DARWIN_STOPPED:
908 case DARWIN_MESSAGE:
909 break;
910 case DARWIN_RUNNING:
912 kern_return_t kret = thread_suspend (thread->gdb_port);
913 MACH_CHECK_ERROR (kret);
914 thread->msg_state = DARWIN_STOPPED;
915 break;
921 void
922 darwin_nat_target::resume (ptid_t ptid, int step, enum gdb_signal signal)
924 struct target_waitstatus status;
925 int pid;
927 kern_return_t kret;
928 int res;
929 int nsignal;
930 struct inferior *inf;
932 inferior_debug
933 (2, _("darwin_resume: pid=%d, tid=0x%lx, step=%d, signal=%d\n"),
934 ptid_get_pid (ptid), ptid_get_tid (ptid), step, signal);
936 if (signal == GDB_SIGNAL_0)
937 nsignal = 0;
938 else
939 nsignal = gdb_signal_to_host (signal);
941 /* Don't try to single step all threads. */
942 if (step)
943 ptid = inferior_ptid;
945 /* minus_one_ptid is RESUME_ALL. */
946 if (ptid_equal (ptid, minus_one_ptid))
948 struct resume_inferior_threads_param param;
950 param.nsignal = nsignal;
951 param.step = step;
953 /* Resume threads. */
954 iterate_over_inferiors (darwin_resume_inferior_threads_it, &param);
955 /* Resume tasks. */
956 iterate_over_inferiors (darwin_resume_inferior_it, NULL);
958 else
960 struct inferior *inf = find_inferior_ptid (ptid);
961 long tid = ptid_get_tid (ptid);
963 /* Stop the inferior (should be useless). */
964 darwin_suspend_inferior (inf);
966 if (tid == 0)
967 darwin_resume_inferior_threads (inf, step, nsignal);
968 else
970 darwin_thread_t *thread;
972 /* Suspend threads of the task. */
973 darwin_suspend_inferior_threads (inf);
975 /* Resume the selected thread. */
976 thread = darwin_find_thread (inf, tid);
977 gdb_assert (thread);
978 darwin_resume_thread (inf, thread, step, nsignal);
981 /* Resume the task. */
982 darwin_resume_inferior (inf);
986 static ptid_t
987 darwin_decode_message (mach_msg_header_t *hdr,
988 darwin_thread_t **pthread,
989 struct inferior **pinf,
990 struct target_waitstatus *status)
992 darwin_thread_t *thread;
993 struct inferior *inf;
995 /* Exception message. 2401 == 0x961 is exc. */
996 if (hdr->msgh_id == 2401)
998 int res;
1000 /* Decode message. */
1001 res = darwin_decode_exception_message (hdr, &inf, &thread);
1003 if (res < 0)
1005 /* Should not happen... */
1006 printf_unfiltered
1007 (_("darwin_wait: ill-formatted message (id=0x%x)\n"), hdr->msgh_id);
1008 /* FIXME: send a failure reply? */
1009 status->kind = TARGET_WAITKIND_IGNORE;
1010 return minus_one_ptid;
1012 if (inf == NULL)
1014 status->kind = TARGET_WAITKIND_IGNORE;
1015 return minus_one_ptid;
1017 *pinf = inf;
1018 *pthread = thread;
1020 darwin_inferior *priv = get_darwin_inferior (inf);
1022 priv->pending_messages++;
1024 status->kind = TARGET_WAITKIND_STOPPED;
1025 thread->msg_state = DARWIN_MESSAGE;
1027 inferior_debug (4, _("darwin_wait: thread=0x%x, got %s\n"),
1028 thread->gdb_port,
1029 unparse_exception_type (thread->event.ex_type));
1031 switch (thread->event.ex_type)
1033 case EXC_BAD_ACCESS:
1034 status->value.sig = GDB_EXC_BAD_ACCESS;
1035 break;
1036 case EXC_BAD_INSTRUCTION:
1037 status->value.sig = GDB_EXC_BAD_INSTRUCTION;
1038 break;
1039 case EXC_ARITHMETIC:
1040 status->value.sig = GDB_EXC_ARITHMETIC;
1041 break;
1042 case EXC_EMULATION:
1043 status->value.sig = GDB_EXC_EMULATION;
1044 break;
1045 case EXC_SOFTWARE:
1046 if (thread->event.ex_data[0] == EXC_SOFT_SIGNAL)
1048 status->value.sig =
1049 gdb_signal_from_host (thread->event.ex_data[1]);
1050 inferior_debug (5, _(" (signal %d: %s)\n"),
1051 thread->event.ex_data[1],
1052 gdb_signal_to_name (status->value.sig));
1054 /* If the thread is stopped because it has received a signal
1055 that gdb has just sent, continue. */
1056 if (thread->signaled)
1058 thread->signaled = 0;
1059 darwin_send_reply (inf, thread);
1060 thread->msg_state = DARWIN_RUNNING;
1061 status->kind = TARGET_WAITKIND_IGNORE;
1064 else
1065 status->value.sig = GDB_EXC_SOFTWARE;
1066 break;
1067 case EXC_BREAKPOINT:
1068 /* Many internal GDB routines expect breakpoints to be reported
1069 as GDB_SIGNAL_TRAP, and will report GDB_EXC_BREAKPOINT
1070 as a spurious signal. */
1071 status->value.sig = GDB_SIGNAL_TRAP;
1072 break;
1073 default:
1074 status->value.sig = GDB_SIGNAL_UNKNOWN;
1075 break;
1078 return ptid_build (inf->pid, 0, thread->gdb_port);
1080 else if (hdr->msgh_id == 0x48)
1082 /* MACH_NOTIFY_DEAD_NAME: notification for exit. */
1083 int res;
1085 res = darwin_decode_notify_message (hdr, &inf);
1087 if (res < 0)
1089 /* Should not happen... */
1090 printf_unfiltered
1091 (_("darwin_wait: ill-formatted message (id=0x%x, res=%d)\n"),
1092 hdr->msgh_id, res);
1095 *pinf = NULL;
1096 *pthread = NULL;
1098 if (res < 0 || inf == NULL)
1100 status->kind = TARGET_WAITKIND_IGNORE;
1101 return minus_one_ptid;
1104 if (inf != NULL)
1106 darwin_inferior *priv = get_darwin_inferior (inf);
1108 if (!priv->no_ptrace)
1110 pid_t res;
1111 int wstatus;
1113 res = wait4 (inf->pid, &wstatus, 0, NULL);
1114 if (res < 0 || res != inf->pid)
1116 printf_unfiltered (_("wait4: res=%d: %s\n"),
1117 res, safe_strerror (errno));
1118 status->kind = TARGET_WAITKIND_IGNORE;
1119 return minus_one_ptid;
1121 if (WIFEXITED (wstatus))
1123 status->kind = TARGET_WAITKIND_EXITED;
1124 status->value.integer = WEXITSTATUS (wstatus);
1126 else
1128 status->kind = TARGET_WAITKIND_SIGNALLED;
1129 status->value.sig = gdb_signal_from_host (WTERMSIG (wstatus));
1132 inferior_debug (4, _("darwin_wait: pid=%d exit, status=0x%x\n"),
1133 res, wstatus);
1135 /* Looks necessary on Leopard and harmless... */
1136 wait4 (inf->pid, &wstatus, 0, NULL);
1138 inferior_ptid = ptid_build (inf->pid, 0, 0);
1139 return inferior_ptid;
1141 else
1143 inferior_debug (4, _("darwin_wait: pid=%d\n"), inf->pid);
1144 status->kind = TARGET_WAITKIND_EXITED;
1145 status->value.integer = 0; /* Don't know. */
1146 return ptid_build (inf->pid, 0, 0);
1151 /* Unknown message. */
1152 warning (_("darwin: got unknown message, id: 0x%x"), hdr->msgh_id);
1153 status->kind = TARGET_WAITKIND_IGNORE;
1154 return minus_one_ptid;
1157 static int
1158 cancel_breakpoint (ptid_t ptid)
1160 /* Arrange for a breakpoint to be hit again later. We will handle
1161 the current event, eventually we will resume this thread, and this
1162 breakpoint will trap again.
1164 If we do not do this, then we run the risk that the user will
1165 delete or disable the breakpoint, but the thread will have already
1166 tripped on it. */
1168 struct regcache *regcache = get_thread_regcache (ptid);
1169 struct gdbarch *gdbarch = regcache->arch ();
1170 CORE_ADDR pc;
1172 pc = regcache_read_pc (regcache) - gdbarch_decr_pc_after_break (gdbarch);
1173 if (breakpoint_inserted_here_p (regcache->aspace (), pc))
1175 inferior_debug (4, "cancel_breakpoint for thread 0x%lx\n",
1176 (unsigned long) ptid_get_tid (ptid));
1178 /* Back up the PC if necessary. */
1179 if (gdbarch_decr_pc_after_break (gdbarch))
1180 regcache_write_pc (regcache, pc);
1182 return 1;
1184 return 0;
1187 static ptid_t
1188 darwin_wait (ptid_t ptid, struct target_waitstatus *status)
1190 kern_return_t kret;
1191 union
1193 mach_msg_header_t hdr;
1194 char data[0x100];
1195 } msgin;
1196 mach_msg_header_t *hdr = &msgin.hdr;
1197 ptid_t res;
1198 darwin_thread_t *thread;
1199 struct inferior *inf;
1201 inferior_debug
1202 (2, _("darwin_wait: waiting for a message pid=%d thread=%lx\n"),
1203 ptid_get_pid (ptid), ptid_get_tid (ptid));
1205 /* Handle fake stop events at first. */
1206 if (darwin_inf_fake_stop != NULL)
1208 inf = darwin_inf_fake_stop;
1209 darwin_inf_fake_stop = NULL;
1211 darwin_inferior *priv = get_darwin_inferior (inf);
1213 status->kind = TARGET_WAITKIND_STOPPED;
1214 status->value.sig = GDB_SIGNAL_TRAP;
1215 thread = priv->threads[0];
1216 thread->msg_state = DARWIN_STOPPED;
1217 return ptid_build (inf->pid, 0, thread->gdb_port);
1222 /* set_sigint_trap (); */
1224 /* Wait for a message. */
1225 kret = mach_msg (&msgin.hdr, MACH_RCV_MSG | MACH_RCV_INTERRUPT, 0,
1226 sizeof (msgin.data), darwin_port_set, 0, MACH_PORT_NULL);
1228 /* clear_sigint_trap (); */
1230 if (kret == MACH_RCV_INTERRUPTED)
1232 status->kind = TARGET_WAITKIND_IGNORE;
1233 return minus_one_ptid;
1236 if (kret != MACH_MSG_SUCCESS)
1238 inferior_debug (5, _("mach_msg: ret=0x%x\n"), kret);
1239 status->kind = TARGET_WAITKIND_SPURIOUS;
1240 return minus_one_ptid;
1243 /* Debug: display message. */
1244 if (darwin_debug_flag > 10)
1245 darwin_dump_message (hdr, darwin_debug_flag > 11);
1247 res = darwin_decode_message (hdr, &thread, &inf, status);
1248 if (ptid_equal (res, minus_one_ptid))
1249 continue;
1251 /* Early return in case an inferior has exited. */
1252 if (inf == NULL)
1253 return res;
1255 while (status->kind == TARGET_WAITKIND_IGNORE);
1257 /* Stop all tasks. */
1258 iterate_over_inferiors (darwin_suspend_inferior_it, NULL);
1260 /* Read pending messages. */
1261 while (1)
1263 struct target_waitstatus status2;
1264 ptid_t ptid2;
1266 kret = mach_msg (&msgin.hdr,
1267 MACH_RCV_MSG | MACH_RCV_TIMEOUT, 0,
1268 sizeof (msgin.data), darwin_port_set, 1, MACH_PORT_NULL);
1270 if (kret == MACH_RCV_TIMED_OUT)
1271 break;
1272 if (kret != MACH_MSG_SUCCESS)
1274 inferior_debug
1275 (5, _("darwin_wait: mach_msg(pending) ret=0x%x\n"), kret);
1276 break;
1279 /* Debug: display message. */
1280 if (darwin_debug_flag > 10)
1281 darwin_dump_message (hdr, darwin_debug_flag > 11);
1283 ptid2 = darwin_decode_message (hdr, &thread, &inf, &status2);
1285 if (inf != NULL && thread != NULL
1286 && thread->event.ex_type == EXC_BREAKPOINT)
1288 if (thread->single_step
1289 || cancel_breakpoint (ptid_build (inf->pid, 0, thread->gdb_port)))
1291 gdb_assert (thread->msg_state == DARWIN_MESSAGE);
1292 darwin_send_reply (inf, thread);
1293 thread->msg_state = DARWIN_RUNNING;
1295 else
1296 inferior_debug
1297 (3, _("darwin_wait: thread 0x%x hit a non-gdb breakpoint\n"),
1298 thread->gdb_port);
1300 else
1301 inferior_debug (3, _("darwin_wait: unhandled pending message\n"));
1303 return res;
1306 ptid_t
1307 darwin_nat_target::wait (ptid_t ptid, struct target_waitstatus *status,
1308 int options)
1310 return darwin_wait (ptid, status);
1313 void
1314 darwin_nat_target::interrupt ()
1316 struct inferior *inf = current_inferior ();
1317 darwin_inferior *priv = get_darwin_inferior (inf);
1319 /* FIXME: handle in no_ptrace mode. */
1320 gdb_assert (!priv->no_ptrace);
1321 ::kill (inf->pid, SIGINT);
1324 /* Deallocate threads port and vector. */
1326 static void
1327 darwin_deallocate_threads (struct inferior *inf)
1329 darwin_inferior *priv = get_darwin_inferior (inf);
1331 for (darwin_thread_t *t : priv->threads)
1333 kern_return_t kret = mach_port_deallocate (gdb_task, t->gdb_port);
1334 MACH_CHECK_ERROR (kret);
1337 priv->threads.clear ();
1340 void
1341 darwin_nat_target::mourn_inferior ()
1343 struct inferior *inf = current_inferior ();
1344 darwin_inferior *priv = get_darwin_inferior (inf);
1345 kern_return_t kret;
1346 mach_port_t prev;
1347 int i;
1349 /* Deallocate threads. */
1350 darwin_deallocate_threads (inf);
1352 /* Remove notify_port from darwin_port_set. */
1353 kret = mach_port_move_member (gdb_task,
1354 priv->notify_port, MACH_PORT_NULL);
1355 MACH_CHECK_ERROR (kret);
1357 /* Remove task port dead_name notification. */
1358 kret = mach_port_request_notification (gdb_task, priv->task,
1359 MACH_NOTIFY_DEAD_NAME, 0,
1360 MACH_PORT_NULL,
1361 MACH_MSG_TYPE_MAKE_SEND_ONCE,
1362 &prev);
1363 /* This can fail if the task is dead. */
1364 inferior_debug (4, "task=0x%x, prev=0x%x, notify_port=0x%x\n",
1365 priv->task, prev, priv->notify_port);
1367 if (kret == KERN_SUCCESS)
1369 kret = mach_port_deallocate (gdb_task, prev);
1370 MACH_CHECK_ERROR (kret);
1373 /* Destroy notify_port. */
1374 kret = mach_port_destroy (gdb_task, priv->notify_port);
1375 MACH_CHECK_ERROR (kret);
1377 /* Deallocate saved exception ports. */
1378 darwin_deallocate_exception_ports (priv);
1380 /* Deallocate task port. */
1381 kret = mach_port_deallocate (gdb_task, priv->task);
1382 MACH_CHECK_ERROR (kret);
1384 inf->priv = NULL;
1386 inf_child_target::mourn_inferior ();
1389 static void
1390 darwin_reply_to_all_pending_messages (struct inferior *inf)
1392 darwin_inferior *priv = get_darwin_inferior (inf);
1394 for (darwin_thread_t *t : priv->threads)
1396 if (t->msg_state == DARWIN_MESSAGE)
1397 darwin_resume_thread (inf, t, 0, 0);
1401 static void
1402 darwin_stop_inferior (struct inferior *inf)
1404 struct target_waitstatus wstatus;
1405 ptid_t ptid;
1406 kern_return_t kret;
1407 int status;
1408 int res;
1409 darwin_inferior *priv = get_darwin_inferior (inf);
1411 gdb_assert (inf != NULL);
1413 darwin_suspend_inferior (inf);
1415 darwin_reply_to_all_pending_messages (inf);
1417 if (priv->no_ptrace)
1418 return;
1420 res = kill (inf->pid, SIGSTOP);
1421 if (res != 0)
1422 warning (_("cannot kill: %s"), safe_strerror (errno));
1424 /* Wait until the process is really stopped. */
1425 while (1)
1427 ptid = darwin_wait (inferior_ptid, &wstatus);
1428 if (wstatus.kind == TARGET_WAITKIND_STOPPED
1429 && wstatus.value.sig == GDB_SIGNAL_STOP)
1430 break;
1434 static kern_return_t
1435 darwin_save_exception_ports (darwin_inferior *inf)
1437 kern_return_t kret;
1439 inf->exception_info.count =
1440 sizeof (inf->exception_info.ports) / sizeof (inf->exception_info.ports[0]);
1442 kret = task_get_exception_ports
1443 (inf->task, EXC_MASK_ALL, inf->exception_info.masks,
1444 &inf->exception_info.count, inf->exception_info.ports,
1445 inf->exception_info.behaviors, inf->exception_info.flavors);
1446 return kret;
1449 static kern_return_t
1450 darwin_restore_exception_ports (darwin_inferior *inf)
1452 int i;
1453 kern_return_t kret;
1455 for (i = 0; i < inf->exception_info.count; i++)
1457 kret = task_set_exception_ports
1458 (inf->task, inf->exception_info.masks[i], inf->exception_info.ports[i],
1459 inf->exception_info.behaviors[i], inf->exception_info.flavors[i]);
1460 if (kret != KERN_SUCCESS)
1461 return kret;
1464 return KERN_SUCCESS;
1467 /* Deallocate saved exception ports. */
1469 static void
1470 darwin_deallocate_exception_ports (darwin_inferior *inf)
1472 int i;
1473 kern_return_t kret;
1475 for (i = 0; i < inf->exception_info.count; i++)
1477 kret = mach_port_deallocate (gdb_task, inf->exception_info.ports[i]);
1478 MACH_CHECK_ERROR (kret);
1480 inf->exception_info.count = 0;
1483 static void
1484 darwin_setup_exceptions (struct inferior *inf)
1486 darwin_inferior *priv = get_darwin_inferior (inf);
1487 kern_return_t kret;
1488 int traps_expected;
1489 exception_mask_t mask;
1491 kret = darwin_save_exception_ports (priv);
1492 if (kret != KERN_SUCCESS)
1493 error (_("Unable to save exception ports, task_get_exception_ports"
1494 "returned: %d"),
1495 kret);
1497 /* Set exception port. */
1498 if (enable_mach_exceptions)
1499 mask = EXC_MASK_ALL;
1500 else
1501 mask = EXC_MASK_SOFTWARE | EXC_MASK_BREAKPOINT;
1502 kret = task_set_exception_ports (priv->task, mask, darwin_ex_port,
1503 EXCEPTION_DEFAULT, THREAD_STATE_NONE);
1504 if (kret != KERN_SUCCESS)
1505 error (_("Unable to set exception ports, task_set_exception_ports"
1506 "returned: %d"),
1507 kret);
1510 void
1511 darwin_nat_target::kill ()
1513 struct inferior *inf = current_inferior ();
1514 darwin_inferior *priv = get_darwin_inferior (inf);
1515 struct target_waitstatus wstatus;
1516 ptid_t ptid;
1517 kern_return_t kret;
1518 int status;
1519 int res;
1521 if (ptid_equal (inferior_ptid, null_ptid))
1522 return;
1524 gdb_assert (inf != NULL);
1526 kret = darwin_restore_exception_ports (priv);
1527 MACH_CHECK_ERROR (kret);
1529 darwin_reply_to_all_pending_messages (inf);
1531 res = ::kill (inf->pid, 9);
1533 if (res == 0)
1535 darwin_resume_inferior (inf);
1537 ptid = darwin_wait (inferior_ptid, &wstatus);
1539 else if (errno != ESRCH)
1540 warning (_("Failed to kill inferior: kill (%d, 9) returned [%s]"),
1541 inf->pid, safe_strerror (errno));
1543 target_mourn_inferior (inferior_ptid);
1546 static void
1547 darwin_setup_request_notification (struct inferior *inf)
1549 darwin_inferior *priv = get_darwin_inferior (inf);
1550 kern_return_t kret;
1551 mach_port_t prev_not;
1553 kret = mach_port_request_notification (gdb_task, priv->task,
1554 MACH_NOTIFY_DEAD_NAME, 0,
1555 priv->notify_port,
1556 MACH_MSG_TYPE_MAKE_SEND_ONCE,
1557 &prev_not);
1558 if (kret != KERN_SUCCESS)
1559 error (_("Termination notification request failed, "
1560 "mach_port_request_notification\n"
1561 "returned: %d"),
1562 kret);
1563 if (prev_not != MACH_PORT_NULL)
1565 /* This is unexpected, as there should not be any previously
1566 registered notification request. But this is not a fatal
1567 issue, so just emit a warning. */
1568 warning (_("\
1569 A task termination request was registered before the debugger registered\n\
1570 its own. This is unexpected, but should otherwise not have any actual\n\
1571 impact on the debugging session."));
1575 static void
1576 darwin_attach_pid (struct inferior *inf)
1578 kern_return_t kret;
1579 mach_port_t prev_port;
1580 int traps_expected;
1581 mach_port_t prev_not;
1582 exception_mask_t mask;
1584 darwin_inferior *priv = new darwin_inferior;
1585 inf->priv.reset (priv);
1587 kret = task_for_pid (gdb_task, inf->pid, &priv->task);
1588 if (kret != KERN_SUCCESS)
1590 int status;
1592 if (!inf->attach_flag)
1594 kill (inf->pid, 9);
1595 waitpid (inf->pid, &status, 0);
1598 error (_("Unable to find Mach task port for process-id %d: %s (0x%lx).\n"
1599 " (please check gdb is codesigned - see taskgated(8))"),
1600 inf->pid, mach_error_string (kret), (unsigned long) kret);
1603 inferior_debug (2, _("inferior task: 0x%x, pid: %d\n"),
1604 priv->task, inf->pid);
1606 if (darwin_ex_port == MACH_PORT_NULL)
1608 /* Create a port to get exceptions. */
1609 kret = mach_port_allocate (gdb_task, MACH_PORT_RIGHT_RECEIVE,
1610 &darwin_ex_port);
1611 if (kret != KERN_SUCCESS)
1612 error (_("Unable to create exception port, mach_port_allocate "
1613 "returned: %d"),
1614 kret);
1616 kret = mach_port_insert_right (gdb_task, darwin_ex_port, darwin_ex_port,
1617 MACH_MSG_TYPE_MAKE_SEND);
1618 if (kret != KERN_SUCCESS)
1619 error (_("Unable to create exception port, mach_port_insert_right "
1620 "returned: %d"),
1621 kret);
1623 /* Create a port set and put ex_port in it. */
1624 kret = mach_port_allocate (gdb_task, MACH_PORT_RIGHT_PORT_SET,
1625 &darwin_port_set);
1626 if (kret != KERN_SUCCESS)
1627 error (_("Unable to create port set, mach_port_allocate "
1628 "returned: %d"),
1629 kret);
1631 kret = mach_port_move_member (gdb_task, darwin_ex_port, darwin_port_set);
1632 if (kret != KERN_SUCCESS)
1633 error (_("Unable to move exception port into new port set, "
1634 "mach_port_move_member\n"
1635 "returned: %d"),
1636 kret);
1639 /* Create a port to be notified when the child task terminates. */
1640 kret = mach_port_allocate (gdb_task, MACH_PORT_RIGHT_RECEIVE,
1641 &priv->notify_port);
1642 if (kret != KERN_SUCCESS)
1643 error (_("Unable to create notification port, mach_port_allocate "
1644 "returned: %d"),
1645 kret);
1647 kret = mach_port_move_member (gdb_task,
1648 priv->notify_port, darwin_port_set);
1649 if (kret != KERN_SUCCESS)
1650 error (_("Unable to move notification port into new port set, "
1651 "mach_port_move_member\n"
1652 "returned: %d"),
1653 kret);
1655 darwin_setup_request_notification (inf);
1657 darwin_setup_exceptions (inf);
1659 if (!target_is_pushed (darwin_ops))
1660 push_target (darwin_ops);
1663 /* Get the thread_info object corresponding to this darwin_thread_info. */
1665 static struct thread_info *
1666 thread_info_from_private_thread_info (darwin_thread_info *pti)
1668 struct thread_info *it;
1670 ALL_THREADS (it)
1672 darwin_thread_info *iter_pti = get_darwin_thread_info (it);
1674 if (iter_pti->gdb_port == pti->gdb_port)
1675 break;
1678 gdb_assert (it != NULL);
1680 return it;
1683 static void
1684 darwin_init_thread_list (struct inferior *inf)
1686 darwin_check_new_threads (inf);
1688 darwin_inferior *priv = get_darwin_inferior (inf);
1690 gdb_assert (!priv->threads.empty ());
1692 darwin_thread_info *first_pti = priv->threads.front ();
1693 struct thread_info *first_thread
1694 = thread_info_from_private_thread_info (first_pti);
1696 inferior_ptid = first_thread->ptid;
1699 /* The child must synchronize with gdb: gdb must set the exception port
1700 before the child call PTRACE_SIGEXC. We use a pipe to achieve this.
1701 FIXME: is there a lighter way ? */
1702 static int ptrace_fds[2];
1704 static void
1705 darwin_ptrace_me (void)
1707 int res;
1708 char c;
1710 /* Close write end point. */
1711 if (close (ptrace_fds[1]) < 0)
1712 trace_start_error_with_name ("close");
1714 /* Wait until gdb is ready. */
1715 res = read (ptrace_fds[0], &c, 1);
1716 if (res != 0)
1717 trace_start_error (_("unable to read from pipe, read returned: %d"), res);
1719 if (close (ptrace_fds[0]) < 0)
1720 trace_start_error_with_name ("close");
1722 /* Get rid of privileges. */
1723 if (setegid (getgid ()) < 0)
1724 trace_start_error_with_name ("setegid");
1726 /* Set TRACEME. */
1727 if (PTRACE (PT_TRACE_ME, 0, 0, 0) < 0)
1728 trace_start_error_with_name ("PTRACE");
1730 /* Redirect signals to exception port. */
1731 if (PTRACE (PT_SIGEXC, 0, 0, 0) < 0)
1732 trace_start_error_with_name ("PTRACE");
1735 /* Dummy function to be sure fork_inferior uses fork(2) and not vfork(2). */
1736 static void
1737 darwin_pre_ptrace (void)
1739 if (pipe (ptrace_fds) != 0)
1741 ptrace_fds[0] = -1;
1742 ptrace_fds[1] = -1;
1743 error (_("unable to create a pipe: %s"), safe_strerror (errno));
1746 mark_fd_no_cloexec (ptrace_fds[0]);
1747 mark_fd_no_cloexec (ptrace_fds[1]);
1750 static void
1751 darwin_ptrace_him (int pid)
1753 task_t itask;
1754 kern_return_t kret;
1755 mach_port_t prev_port;
1756 int traps_expected;
1757 struct inferior *inf = current_inferior ();
1759 darwin_attach_pid (inf);
1761 /* Let's the child run. */
1762 close (ptrace_fds[0]);
1763 close (ptrace_fds[1]);
1765 unmark_fd_no_cloexec (ptrace_fds[0]);
1766 unmark_fd_no_cloexec (ptrace_fds[1]);
1768 darwin_init_thread_list (inf);
1770 gdb_startup_inferior (pid, START_INFERIOR_TRAPS_EXPECTED);
1773 static void
1774 darwin_execvp (const char *file, char * const argv[], char * const env[])
1776 posix_spawnattr_t attr;
1777 short ps_flags = 0;
1778 int res;
1780 res = posix_spawnattr_init (&attr);
1781 if (res != 0)
1783 fprintf_unfiltered
1784 (gdb_stderr, "Cannot initialize attribute for posix_spawn\n");
1785 return;
1788 /* Do like execve: replace the image. */
1789 ps_flags = POSIX_SPAWN_SETEXEC;
1791 /* Disable ASLR. The constant doesn't look to be available outside the
1792 kernel include files. */
1793 #ifndef _POSIX_SPAWN_DISABLE_ASLR
1794 #define _POSIX_SPAWN_DISABLE_ASLR 0x0100
1795 #endif
1796 ps_flags |= _POSIX_SPAWN_DISABLE_ASLR;
1797 res = posix_spawnattr_setflags (&attr, ps_flags);
1798 if (res != 0)
1800 fprintf_unfiltered (gdb_stderr, "Cannot set posix_spawn flags\n");
1801 return;
1804 posix_spawnp (NULL, argv[0], NULL, &attr, argv, env);
1807 void
1808 darwin_nat_target::create_inferior (const char *exec_file,
1809 const std::string &allargs,
1810 char **env, int from_tty)
1812 /* Do the hard work. */
1813 fork_inferior (exec_file, allargs, env, darwin_ptrace_me,
1814 darwin_ptrace_him, darwin_pre_ptrace, NULL,
1815 darwin_execvp);
1819 /* Set things up such that the next call to darwin_wait will immediately
1820 return a fake stop event for inferior INF.
1822 This assumes that the inferior's thread list has been initialized,
1823 as it will suspend the inferior's first thread. */
1825 static void
1826 darwin_setup_fake_stop_event (struct inferior *inf)
1828 darwin_inferior *priv = get_darwin_inferior (inf);
1829 darwin_thread_t *thread;
1830 kern_return_t kret;
1832 gdb_assert (darwin_inf_fake_stop == NULL);
1833 darwin_inf_fake_stop = inf;
1835 /* When detecting a fake pending stop event, darwin_wait returns
1836 an event saying that the first thread is in a DARWIN_STOPPED
1837 state. To make that accurate, we need to suspend that thread
1838 as well. Otherwise, we'll try resuming it when resuming the
1839 inferior, and get a warning because the thread's suspend count
1840 is already zero, making the resume request useless. */
1841 thread = priv->threads[0];
1842 kret = thread_suspend (thread->gdb_port);
1843 MACH_CHECK_ERROR (kret);
1846 /* Attach to process PID, then initialize for debugging it
1847 and wait for the trace-trap that results from attaching. */
1848 void
1849 darwin_nat_target::attach (const char *args, int from_tty)
1851 pid_t pid;
1852 pid_t pid2;
1853 int wstatus;
1854 int res;
1855 struct inferior *inf;
1856 kern_return_t kret;
1858 pid = parse_pid_to_attach (args);
1860 if (pid == getpid ()) /* Trying to masturbate? */
1861 error (_("I refuse to debug myself!"));
1863 if (from_tty)
1865 char *exec_file = get_exec_file (0);
1867 if (exec_file)
1868 printf_unfiltered (_("Attaching to program: %s, %s\n"), exec_file,
1869 target_pid_to_str (pid_to_ptid (pid)));
1870 else
1871 printf_unfiltered (_("Attaching to %s\n"),
1872 target_pid_to_str (pid_to_ptid (pid)));
1874 gdb_flush (gdb_stdout);
1877 if (pid == 0 || ::kill (pid, 0) < 0)
1878 error (_("Can't attach to process %d: %s (%d)"),
1879 pid, safe_strerror (errno), errno);
1881 inferior_ptid = pid_to_ptid (pid);
1882 inf = current_inferior ();
1883 inferior_appeared (inf, pid);
1884 inf->attach_flag = 1;
1886 darwin_attach_pid (inf);
1888 darwin_suspend_inferior (inf);
1890 darwin_init_thread_list (inf);
1892 darwin_inferior *priv = get_darwin_inferior (inf);
1894 darwin_check_osabi (priv, ptid_get_tid (inferior_ptid));
1896 darwin_setup_fake_stop_event (inf);
1898 priv->no_ptrace = 1;
1901 /* Take a program previously attached to and detaches it.
1902 The program resumes execution and will no longer stop
1903 on signals, etc. We'd better not have left any breakpoints
1904 in the program or it'll die when it hits one. For this
1905 to work, it may be necessary for the process to have been
1906 previously attached. It *might* work if the program was
1907 started via fork. */
1909 void
1910 darwin_nat_target::detach (inferior *inf, int from_tty)
1912 pid_t pid = ptid_get_pid (inferior_ptid);
1913 darwin_inferior *priv = get_darwin_inferior (inf);
1914 kern_return_t kret;
1915 int res;
1917 /* Display message. */
1918 target_announce_detach (from_tty);
1920 /* If ptrace() is in use, stop the process. */
1921 if (!priv->no_ptrace)
1922 darwin_stop_inferior (inf);
1924 kret = darwin_restore_exception_ports (priv);
1925 MACH_CHECK_ERROR (kret);
1927 if (!priv->no_ptrace)
1929 res = PTRACE (PT_DETACH, inf->pid, 0, 0);
1930 if (res != 0)
1931 printf_unfiltered (_("Unable to detach from process-id %d: %s (%d)"),
1932 inf->pid, safe_strerror (errno), errno);
1935 darwin_reply_to_all_pending_messages (inf);
1937 /* When using ptrace, we have just performed a PT_DETACH, which
1938 resumes the inferior. On the other hand, when we are not using
1939 ptrace, we need to resume its execution ourselves. */
1940 if (priv->no_ptrace)
1941 darwin_resume_inferior (inf);
1943 mourn_inferior ();
1946 const char *
1947 darwin_nat_target::pid_to_str (ptid_t ptid)
1949 static char buf[80];
1950 long tid = ptid_get_tid (ptid);
1952 if (tid != 0)
1954 snprintf (buf, sizeof (buf), _("Thread 0x%lx of process %u"),
1955 tid, ptid_get_pid (ptid));
1956 return buf;
1959 return normal_pid_to_str (ptid);
1962 bool
1963 darwin_nat_target::thread_alive (ptid_t ptid)
1965 return true;
1968 /* If RDADDR is not NULL, read inferior task's LEN bytes from ADDR and
1969 copy it to RDADDR in gdb's address space.
1970 If WRADDR is not NULL, write gdb's LEN bytes from WRADDR and copy it
1971 to ADDR in inferior task's address space.
1972 Return 0 on failure; number of bytes read / writen otherwise. */
1974 static int
1975 darwin_read_write_inferior (task_t task, CORE_ADDR addr,
1976 gdb_byte *rdaddr, const gdb_byte *wraddr,
1977 ULONGEST length)
1979 kern_return_t kret;
1980 mach_vm_size_t res_length = 0;
1981 pointer_t copied;
1982 mach_msg_type_number_t copy_count;
1983 mach_vm_size_t remaining_length;
1984 mach_vm_address_t region_address;
1985 mach_vm_size_t region_length;
1987 inferior_debug (8, _("darwin_read_write_inferior(task=0x%x, %s, len=%s)\n"),
1988 task, core_addr_to_string (addr), pulongest (length));
1990 /* First read. */
1991 if (rdaddr != NULL)
1993 mach_vm_size_t count;
1995 /* According to target.h(to_xfer_partial), one and only one may be
1996 non-null. */
1997 gdb_assert (wraddr == NULL);
1999 kret = mach_vm_read_overwrite (task, addr, length,
2000 (mach_vm_address_t) rdaddr, &count);
2001 if (kret != KERN_SUCCESS)
2003 inferior_debug
2004 (1, _("darwin_read_write_inferior: mach_vm_read failed at %s: %s"),
2005 core_addr_to_string (addr), mach_error_string (kret));
2006 return 0;
2008 return count;
2011 /* See above. */
2012 gdb_assert (wraddr != NULL);
2014 while (length != 0)
2016 mach_vm_address_t offset = addr & (mach_page_size - 1);
2017 mach_vm_address_t region_address = (mach_vm_address_t) (addr - offset);
2018 mach_vm_size_t aligned_length =
2019 (mach_vm_size_t) PAGE_ROUND (offset + length);
2020 vm_region_submap_short_info_data_64_t info;
2021 mach_msg_type_number_t count = VM_REGION_SUBMAP_SHORT_INFO_COUNT_64;
2022 natural_t region_depth = 1000;
2023 mach_vm_address_t region_start = region_address;
2024 mach_vm_size_t region_length;
2025 mach_vm_size_t write_length;
2027 /* Read page protection. */
2028 kret = mach_vm_region_recurse
2029 (task, &region_start, &region_length, &region_depth,
2030 (vm_region_recurse_info_t) &info, &count);
2032 if (kret != KERN_SUCCESS)
2034 inferior_debug (1, _("darwin_read_write_inferior: "
2035 "mach_vm_region_recurse failed at %s: %s\n"),
2036 core_addr_to_string (region_address),
2037 mach_error_string (kret));
2038 return res_length;
2041 inferior_debug
2042 (9, _("darwin_read_write_inferior: "
2043 "mach_vm_region_recurse addr=%s, start=%s, len=%s\n"),
2044 core_addr_to_string (region_address),
2045 core_addr_to_string (region_start),
2046 core_addr_to_string (region_length));
2048 /* Check for holes in memory. */
2049 if (region_start > region_address)
2051 warning (_("No memory at %s (vs %s+0x%x). Nothing written"),
2052 core_addr_to_string (region_address),
2053 core_addr_to_string (region_start),
2054 (unsigned)region_length);
2055 return res_length;
2058 /* Adjust the length. */
2059 region_length -= (region_address - region_start);
2060 if (region_length > aligned_length)
2061 region_length = aligned_length;
2063 /* Make the pages RW. */
2064 if (!(info.protection & VM_PROT_WRITE))
2066 vm_prot_t prot = VM_PROT_READ | VM_PROT_WRITE;
2068 kret = mach_vm_protect (task, region_address, region_length,
2069 FALSE, prot);
2070 if (kret != KERN_SUCCESS)
2072 prot |= VM_PROT_COPY;
2073 kret = mach_vm_protect (task, region_address, region_length,
2074 FALSE, prot);
2076 if (kret != KERN_SUCCESS)
2078 warning (_("darwin_read_write_inferior: "
2079 "mach_vm_protect failed at %s "
2080 "(len=0x%lx, prot=0x%x): %s"),
2081 core_addr_to_string (region_address),
2082 (unsigned long) region_length, (unsigned) prot,
2083 mach_error_string (kret));
2084 return res_length;
2088 if (offset + length > region_length)
2089 write_length = region_length - offset;
2090 else
2091 write_length = length;
2093 /* Write. */
2094 kret = mach_vm_write (task, addr, (vm_offset_t) wraddr, write_length);
2095 if (kret != KERN_SUCCESS)
2097 warning (_("darwin_read_write_inferior: mach_vm_write failed: %s"),
2098 mach_error_string (kret));
2099 return res_length;
2102 /* Restore page rights. */
2103 if (!(info.protection & VM_PROT_WRITE))
2105 kret = mach_vm_protect (task, region_address, region_length,
2106 FALSE, info.protection);
2107 if (kret != KERN_SUCCESS)
2109 warning (_("darwin_read_write_inferior: "
2110 "mach_vm_protect restore failed at %s "
2111 "(len=0x%lx): %s"),
2112 core_addr_to_string (region_address),
2113 (unsigned long) region_length,
2114 mach_error_string (kret));
2118 addr += write_length;
2119 wraddr += write_length;
2120 res_length += write_length;
2121 length -= write_length;
2124 return res_length;
2127 /* Read LENGTH bytes at offset ADDR of task_dyld_info for TASK, and copy them
2128 to RDADDR (in big endian).
2129 Return 0 on failure; number of bytes read / written otherwise. */
2131 #ifdef TASK_DYLD_INFO_COUNT
2132 /* This is not available in Darwin 9. */
2133 static enum target_xfer_status
2134 darwin_read_dyld_info (task_t task, CORE_ADDR addr, gdb_byte *rdaddr,
2135 ULONGEST length, ULONGEST *xfered_len)
2137 struct task_dyld_info task_dyld_info;
2138 mach_msg_type_number_t count = TASK_DYLD_INFO_COUNT;
2139 int sz = TASK_DYLD_INFO_COUNT * sizeof (natural_t);
2140 kern_return_t kret;
2142 if (addr != 0 || length > sizeof (mach_vm_address_t))
2143 return TARGET_XFER_EOF;
2145 kret = task_info (task, TASK_DYLD_INFO,
2146 (task_info_t) &task_dyld_info, &count);
2147 MACH_CHECK_ERROR (kret);
2148 if (kret != KERN_SUCCESS)
2149 return TARGET_XFER_E_IO;
2151 store_unsigned_integer (rdaddr, length, BFD_ENDIAN_BIG,
2152 task_dyld_info.all_image_info_addr);
2153 *xfered_len = (ULONGEST) length;
2154 return TARGET_XFER_OK;
2156 #endif
2160 enum target_xfer_status
2161 darwin_nat_target::xfer_partial (enum target_object object, const char *annex,
2162 gdb_byte *readbuf, const gdb_byte *writebuf,
2163 ULONGEST offset, ULONGEST len,
2164 ULONGEST *xfered_len)
2166 struct inferior *inf = current_inferior ();
2167 darwin_inferior *priv = get_darwin_inferior (inf);
2169 inferior_debug
2170 (8, _("darwin_xfer_partial(%s, %s, rbuf=%s, wbuf=%s) pid=%u\n"),
2171 core_addr_to_string (offset), pulongest (len),
2172 host_address_to_string (readbuf), host_address_to_string (writebuf),
2173 inf->pid);
2175 switch (object)
2177 case TARGET_OBJECT_MEMORY:
2179 int l = darwin_read_write_inferior (priv->task, offset,
2180 readbuf, writebuf, len);
2182 if (l == 0)
2183 return TARGET_XFER_EOF;
2184 else
2186 gdb_assert (l > 0);
2187 *xfered_len = (ULONGEST) l;
2188 return TARGET_XFER_OK;
2191 #ifdef TASK_DYLD_INFO_COUNT
2192 case TARGET_OBJECT_DARWIN_DYLD_INFO:
2193 if (writebuf != NULL || readbuf == NULL)
2195 /* Support only read. */
2196 return TARGET_XFER_E_IO;
2198 return darwin_read_dyld_info (priv->task, offset, readbuf, len,
2199 xfered_len);
2200 #endif
2201 default:
2202 return TARGET_XFER_E_IO;
2207 static void
2208 set_enable_mach_exceptions (const char *args, int from_tty,
2209 struct cmd_list_element *c)
2211 if (!ptid_equal (inferior_ptid, null_ptid))
2213 struct inferior *inf = current_inferior ();
2214 darwin_inferior *priv = get_darwin_inferior (inf);
2215 exception_mask_t mask;
2216 kern_return_t kret;
2218 if (enable_mach_exceptions)
2219 mask = EXC_MASK_ALL;
2220 else
2222 darwin_restore_exception_ports (priv);
2223 mask = EXC_MASK_SOFTWARE | EXC_MASK_BREAKPOINT;
2225 kret = task_set_exception_ports (priv->task, mask, darwin_ex_port,
2226 EXCEPTION_DEFAULT, THREAD_STATE_NONE);
2227 MACH_CHECK_ERROR (kret);
2231 char *
2232 darwin_nat_target::pid_to_exec_file (int pid)
2234 static char path[PATH_MAX];
2235 int res;
2237 res = proc_pidinfo (pid, PROC_PIDPATHINFO, 0, path, PATH_MAX);
2238 if (res >= 0)
2239 return path;
2240 else
2241 return NULL;
2244 ptid_t
2245 darwin_nat_target::get_ada_task_ptid (long lwp, long thread)
2247 struct inferior *inf = current_inferior ();
2248 darwin_inferior *priv = get_darwin_inferior (inf);
2249 kern_return_t kret;
2250 mach_port_name_array_t names;
2251 mach_msg_type_number_t names_count;
2252 mach_port_type_array_t types;
2253 mach_msg_type_number_t types_count;
2254 long res = 0;
2256 /* First linear search. */
2257 for (darwin_thread_t *t : priv->threads)
2259 if (t->inf_port == lwp)
2260 return ptid_build (ptid_get_pid (inferior_ptid), 0, t->gdb_port);
2263 /* Maybe the port was never extract. Do it now. */
2265 /* First get inferior port names. */
2266 kret = mach_port_names (priv->task, &names, &names_count, &types,
2267 &types_count);
2268 MACH_CHECK_ERROR (kret);
2269 if (kret != KERN_SUCCESS)
2270 return null_ptid;
2272 /* For each name, copy the right in the gdb space and then compare with
2273 our view of the inferior threads. We don't forget to deallocate the
2274 right. */
2275 for (int i = 0; i < names_count; i++)
2277 mach_port_t local_name;
2278 mach_msg_type_name_t local_type;
2280 /* We just need to know the corresponding name in gdb name space.
2281 So extract and deallocate the right. */
2282 kret = mach_port_extract_right (priv->task, names[i],
2283 MACH_MSG_TYPE_COPY_SEND,
2284 &local_name, &local_type);
2285 if (kret != KERN_SUCCESS)
2286 continue;
2287 mach_port_deallocate (gdb_task, local_name);
2289 for (darwin_thread_t *t : priv->threads)
2291 if (t->gdb_port == local_name)
2293 t->inf_port = names[i];
2294 if (names[i] == lwp)
2295 res = t->gdb_port;
2300 vm_deallocate (gdb_task, (vm_address_t) names,
2301 names_count * sizeof (mach_port_t));
2303 if (res)
2304 return ptid_build (ptid_get_pid (inferior_ptid), 0, res);
2305 else
2306 return null_ptid;
2309 bool
2310 darwin_nat_target::supports_multi_process ()
2312 return true;
2315 void
2316 _initialize_darwin_nat ()
2318 kern_return_t kret;
2320 gdb_task = mach_task_self ();
2321 darwin_host_self = mach_host_self ();
2323 /* Read page size. */
2324 kret = host_page_size (darwin_host_self, &mach_page_size);
2325 if (kret != KERN_SUCCESS)
2327 mach_page_size = 0x1000;
2328 MACH_CHECK_ERROR (kret);
2331 inferior_debug (2, _("GDB task: 0x%lx, pid: %d\n"),
2332 (unsigned long) mach_task_self (), getpid ());
2334 add_setshow_zuinteger_cmd ("darwin", class_obscure,
2335 &darwin_debug_flag, _("\
2336 Set if printing inferior communication debugging statements."), _("\
2337 Show if printing inferior communication debugging statements."), NULL,
2338 NULL, NULL,
2339 &setdebuglist, &showdebuglist);
2341 add_setshow_boolean_cmd ("mach-exceptions", class_support,
2342 &enable_mach_exceptions, _("\
2343 Set if mach exceptions are caught."), _("\
2344 Show if mach exceptions are caught."), _("\
2345 When this mode is on, all low level exceptions are reported before being\n\
2346 reported by the kernel."),
2347 &set_enable_mach_exceptions, NULL,
2348 &setlist, &showlist);