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