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