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