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