1 /* Darwin support for GDB, the GNU debugger.
2 Copyright (C) 2008-2013 Free Software Foundation, Inc.
4 Contributed by AdaCore.
6 This file is part of GDB.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
31 #include "gdbthread.h"
33 #include "event-top.h"
36 #include "exceptions.h"
37 #include "inf-child.h"
39 #include "arch-utils.h"
41 #include "bfd/mach-o.h"
43 #include <sys/ptrace.h>
44 #include <sys/signal.h>
45 #include <machine/setjmp.h>
46 #include <sys/types.h>
51 #include <sys/sysctl.h>
54 #include <sys/syscall.h>
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>
66 #include "darwin-nat.h"
67 #include "common/filestuff.h"
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).
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
81 Some Mach documentation is available for Apple xnu source package or
85 #define PTRACE(CMD, PID, ADDR, SIG) \
86 darwin_ptrace(#CMD, CMD, (PID), (ADDR), (SIG))
88 extern boolean_t
exc_server (mach_msg_header_t
*in
, mach_msg_header_t
*out
);
90 static void darwin_stop (ptid_t
);
92 static void darwin_resume_to (struct target_ops
*ops
, ptid_t ptid
, int step
,
93 enum gdb_signal signal
);
94 static void darwin_resume (ptid_t ptid
, int step
,
95 enum gdb_signal signal
);
97 static ptid_t
darwin_wait_to (struct target_ops
*ops
, ptid_t ptid
,
98 struct target_waitstatus
*status
, int options
);
99 static ptid_t
darwin_wait (ptid_t ptid
, struct target_waitstatus
*status
);
101 static void darwin_mourn_inferior (struct target_ops
*ops
);
103 static void darwin_kill_inferior (struct target_ops
*ops
);
105 static void darwin_ptrace_me (void);
107 static void darwin_ptrace_him (int pid
);
109 static void darwin_create_inferior (struct target_ops
*ops
, char *exec_file
,
110 char *allargs
, char **env
, int from_tty
);
112 static void darwin_files_info (struct target_ops
*ops
);
114 static char *darwin_pid_to_str (struct target_ops
*ops
, ptid_t tpid
);
116 static int darwin_thread_alive (struct target_ops
*ops
, ptid_t tpid
);
118 /* Target operations for Darwin. */
119 static struct target_ops
*darwin_ops
;
121 /* Task identifier of gdb. */
122 static task_t gdb_task
;
124 /* A copy of mach_host_self (). */
125 mach_port_t darwin_host_self
;
127 /* Exception port. */
128 mach_port_t darwin_ex_port
;
131 mach_port_t darwin_port_set
;
134 static vm_size_t mach_page_size
;
136 /* If Set, catch all mach exceptions (before they are converted to signals
138 static int enable_mach_exceptions
;
140 /* Inferior that should report a fake stop event. */
141 static struct inferior
*darwin_inf_fake_stop
;
143 #define PAGE_TRUNC(x) ((x) & ~(mach_page_size - 1))
144 #define PAGE_ROUND(x) PAGE_TRUNC((x) + mach_page_size - 1)
146 /* This controls output of inferior debugging. */
147 static unsigned int darwin_debug_flag
= 0;
149 /* Create a __TEXT __info_plist section in the executable so that gdb could
150 be signed. This is required to get an authorization for task_for_pid.
152 Once gdb is built, you can either:
153 * make it setgid procmod
154 * or codesign it with any system-trusted signing authority.
155 See taskgated(8) for details. */
156 static const unsigned char info_plist
[]
157 __attribute__ ((section ("__TEXT,__info_plist"),used
)) =
158 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
159 "<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\""
160 " \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
161 "<plist version=\"1.0\">\n"
163 " <key>CFBundleIdentifier</key>\n"
164 " <string>org.gnu.gdb</string>\n"
165 " <key>CFBundleName</key>\n"
166 " <string>gdb</string>\n"
167 " <key>CFBundleVersion</key>\n"
168 " <string>1.0</string>\n"
169 " <key>SecTaskAccess</key>\n"
171 " <string>allowed</string>\n"
172 " <string>debug</string>\n"
178 inferior_debug (int level
, const char *fmt
, ...)
182 if (darwin_debug_flag
< level
)
186 printf_unfiltered (_("[%d inferior]: "), getpid ());
187 vprintf_unfiltered (fmt
, ap
);
192 mach_check_error (kern_return_t ret
, const char *file
,
193 unsigned int line
, const char *func
)
195 if (ret
== KERN_SUCCESS
)
198 func
= _("[UNKNOWN]");
200 warning (_("Mach error at \"%s:%u\" in function \"%s\": %s (0x%lx)"),
201 file
, line
, func
, mach_error_string (ret
), (unsigned long) ret
);
205 unparse_exception_type (unsigned int i
)
207 static char unknown_exception_buf
[32];
212 return "EXC_BAD_ACCESS";
213 case EXC_BAD_INSTRUCTION
:
214 return "EXC_BAD_INSTRUCTION";
216 return "EXC_ARITHMETIC";
218 return "EXC_EMULATION";
220 return "EXC_SOFTWARE";
222 return "EXC_BREAKPOINT";
224 return "EXC_SYSCALL";
225 case EXC_MACH_SYSCALL
:
226 return "EXC_MACH_SYSCALL";
228 return "EXC_RPC_ALERT";
232 snprintf (unknown_exception_buf
, 32, _("unknown (%d)"), i
);
233 return unknown_exception_buf
;
237 /* Set errno to zero, and then call ptrace with the given arguments.
238 If inferior debugging traces are on, then also print a debug
241 The returned value is the same as the value returned by ptrace,
242 except in the case where that value is -1 but errno is zero.
243 This case is documented to be a non-error situation, so we
244 return zero in that case. */
247 darwin_ptrace (const char *name
,
248 int request
, int pid
, PTRACE_TYPE_ARG3 arg3
, int arg4
)
253 ret
= ptrace (request
, pid
, (caddr_t
) arg3
, arg4
);
254 if (ret
== -1 && errno
== 0)
257 inferior_debug (4, _("ptrace (%s, %d, 0x%x, %d): %d (%s)\n"),
258 name
, pid
, arg3
, arg4
, ret
,
259 (ret
!= 0) ? safe_strerror (errno
) : _("no error"));
264 cmp_thread_t (const void *l
, const void *r
)
266 thread_t tl
= *(const thread_t
*)l
;
267 thread_t tr
= *(const thread_t
*)r
;
268 return (int)(tl
- tr
);
272 darwin_check_new_threads (struct inferior
*inf
)
276 thread_array_t thread_list
;
277 unsigned int new_nbr
;
278 unsigned int old_nbr
;
279 unsigned int new_ix
, old_ix
;
280 darwin_inferior
*darwin_inf
= inf
->private;
281 VEC (darwin_thread_t
) *thread_vec
;
283 /* Get list of threads. */
284 kret
= task_threads (darwin_inf
->task
, &thread_list
, &new_nbr
);
285 MACH_CHECK_ERROR (kret
);
286 if (kret
!= KERN_SUCCESS
)
291 qsort (thread_list
, new_nbr
, sizeof (thread_t
), cmp_thread_t
);
293 if (darwin_inf
->threads
)
294 old_nbr
= VEC_length (darwin_thread_t
, darwin_inf
->threads
);
298 /* Quick check for no changes. */
299 if (old_nbr
== new_nbr
)
301 for (i
= 0; i
< new_nbr
; i
++)
303 != VEC_index (darwin_thread_t
, darwin_inf
->threads
, i
)->gdb_port
)
307 kret
= vm_deallocate (gdb_task
, (vm_address_t
) thread_list
,
308 new_nbr
* sizeof (int));
309 MACH_CHECK_ERROR (kret
);
314 thread_vec
= VEC_alloc (darwin_thread_t
, new_nbr
);
316 for (new_ix
= 0, old_ix
= 0; new_ix
< new_nbr
|| old_ix
< old_nbr
;)
318 thread_t new_id
= (new_ix
< new_nbr
) ?
319 thread_list
[new_ix
] : THREAD_NULL
;
320 darwin_thread_t
*old
= (old_ix
< old_nbr
) ?
321 VEC_index (darwin_thread_t
, darwin_inf
->threads
, old_ix
) : NULL
;
322 thread_t old_id
= old
? old
->gdb_port
: THREAD_NULL
;
325 (12, _(" new_ix:%d/%d, old_ix:%d/%d, new_id:0x%x old_id:0x%x\n"),
326 new_ix
, new_nbr
, old_ix
, old_nbr
, new_id
, old_id
);
328 if (old_id
== new_id
)
330 /* Thread still exist. */
331 VEC_safe_push (darwin_thread_t
, thread_vec
, old
);
335 kret
= mach_port_deallocate (gdb_task
, old_id
);
336 MACH_CHECK_ERROR (kret
);
339 if (new_ix
< new_nbr
&& new_id
== MACH_PORT_DEAD
)
341 /* Ignore dead ports.
342 In some weird cases, we might get dead ports. They should
343 correspond to dead thread so they could safely be ignored. */
347 if (new_ix
< new_nbr
&& (old_ix
== old_nbr
|| new_id
< old_id
))
349 /* A thread was created. */
350 struct thread_info
*tp
;
351 struct private_thread_info
*pti
;
353 pti
= XZALLOC (struct private_thread_info
);
354 pti
->gdb_port
= new_id
;
355 pti
->msg_state
= DARWIN_RUNNING
;
357 /* Add a new thread unless this is the first one ever met. */
358 if (!(old_nbr
== 0 && new_ix
== 0))
359 tp
= add_thread_with_info (ptid_build (inf
->pid
, 0, new_id
), pti
);
362 tp
= find_thread_ptid (ptid_build (inf
->pid
, 0, 0));
366 VEC_safe_push (darwin_thread_t
, thread_vec
, pti
);
370 if (old_ix
< old_nbr
&& (new_ix
== new_nbr
|| new_id
> old_id
))
372 /* A thread was removed. */
373 delete_thread (ptid_build (inf
->pid
, 0, old_id
));
374 kret
= mach_port_deallocate (gdb_task
, old_id
);
375 MACH_CHECK_ERROR (kret
);
379 gdb_assert_not_reached ("unexpected thread case");
382 if (darwin_inf
->threads
)
383 VEC_free (darwin_thread_t
, darwin_inf
->threads
);
384 darwin_inf
->threads
= thread_vec
;
386 kret
= vm_deallocate (gdb_task
, (vm_address_t
) thread_list
,
387 new_nbr
* sizeof (int));
388 MACH_CHECK_ERROR (kret
);
392 find_inferior_task_it (struct inferior
*inf
, void *port_ptr
)
394 return inf
->private->task
== *(task_t
*)port_ptr
;
398 find_inferior_notify_it (struct inferior
*inf
, void *port_ptr
)
400 return inf
->private->notify_port
== *(task_t
*)port_ptr
;
403 /* Return an inferior by task port. */
404 static struct inferior
*
405 darwin_find_inferior_by_task (task_t port
)
407 return iterate_over_inferiors (&find_inferior_task_it
, &port
);
410 /* Return an inferior by notification port. */
411 static struct inferior
*
412 darwin_find_inferior_by_notify (mach_port_t port
)
414 return iterate_over_inferiors (&find_inferior_notify_it
, &port
);
417 /* Return a thread by port. */
418 static darwin_thread_t
*
419 darwin_find_thread (struct inferior
*inf
, thread_t thread
)
425 VEC_iterate (darwin_thread_t
, inf
->private->threads
, k
, t
);
427 if (t
->gdb_port
== thread
)
432 /* Suspend (ie stop) an inferior at Mach level. */
435 darwin_suspend_inferior (struct inferior
*inf
)
437 if (!inf
->private->suspended
)
441 kret
= task_suspend (inf
->private->task
);
442 MACH_CHECK_ERROR (kret
);
444 inf
->private->suspended
= 1;
448 /* Resume an inferior at Mach level. */
451 darwin_resume_inferior (struct inferior
*inf
)
453 if (inf
->private->suspended
)
457 kret
= task_resume (inf
->private->task
);
458 MACH_CHECK_ERROR (kret
);
460 inf
->private->suspended
= 0;
464 /* Iterator functions. */
467 darwin_suspend_inferior_it (struct inferior
*inf
, void *arg
)
469 darwin_suspend_inferior (inf
);
470 darwin_check_new_threads (inf
);
475 darwin_resume_inferior_it (struct inferior
*inf
, void *arg
)
477 darwin_resume_inferior (inf
);
482 darwin_dump_message (mach_msg_header_t
*hdr
, int disp_body
)
484 printf_unfiltered (_("message header:\n"));
485 printf_unfiltered (_(" bits: 0x%x\n"), hdr
->msgh_bits
);
486 printf_unfiltered (_(" size: 0x%x\n"), hdr
->msgh_size
);
487 printf_unfiltered (_(" remote-port: 0x%x\n"), hdr
->msgh_remote_port
);
488 printf_unfiltered (_(" local-port: 0x%x\n"), hdr
->msgh_local_port
);
489 printf_unfiltered (_(" reserved: 0x%x\n"), hdr
->msgh_reserved
);
490 printf_unfiltered (_(" id: 0x%x\n"), hdr
->msgh_id
);
494 const unsigned char *data
;
495 const unsigned long *ldata
;
499 data
= (unsigned char *)(hdr
+ 1);
500 size
= hdr
->msgh_size
- sizeof (mach_msg_header_t
);
502 if (hdr
->msgh_bits
& MACH_MSGH_BITS_COMPLEX
)
504 mach_msg_body_t
*bod
= (mach_msg_body_t
*)data
;
505 mach_msg_port_descriptor_t
*desc
=
506 (mach_msg_port_descriptor_t
*)(bod
+ 1);
509 printf_unfiltered (_("body: descriptor_count=%u\n"),
510 bod
->msgh_descriptor_count
);
511 data
+= sizeof (mach_msg_body_t
);
512 size
-= sizeof (mach_msg_body_t
);
513 for (k
= 0; k
< bod
->msgh_descriptor_count
; k
++)
514 switch (desc
[k
].type
)
516 case MACH_MSG_PORT_DESCRIPTOR
:
518 (_(" descr %d: type=%u (port) name=0x%x, dispo=%d\n"),
519 k
, desc
[k
].type
, desc
[k
].name
, desc
[k
].disposition
);
522 printf_unfiltered (_(" descr %d: type=%u\n"),
526 data
+= bod
->msgh_descriptor_count
527 * sizeof (mach_msg_port_descriptor_t
);
528 size
-= bod
->msgh_descriptor_count
529 * sizeof (mach_msg_port_descriptor_t
);
530 ndr
= (NDR_record_t
*)(desc
+ bod
->msgh_descriptor_count
);
532 (_("NDR: mig=%02x if=%02x encod=%02x "
533 "int=%02x char=%02x float=%02x\n"),
534 ndr
->mig_vers
, ndr
->if_vers
, ndr
->mig_encoding
,
535 ndr
->int_rep
, ndr
->char_rep
, ndr
->float_rep
);
536 data
+= sizeof (NDR_record_t
);
537 size
-= sizeof (NDR_record_t
);
540 printf_unfiltered (_(" data:"));
541 ldata
= (const unsigned long *)data
;
542 for (i
= 0; i
< size
/ sizeof (unsigned long); i
++)
543 printf_unfiltered (" %08lx", ldata
[i
]);
544 printf_unfiltered (_("\n"));
549 darwin_decode_exception_message (mach_msg_header_t
*hdr
,
550 struct inferior
**pinf
,
551 darwin_thread_t
**pthread
)
553 mach_msg_body_t
*bod
= (mach_msg_body_t
*)(hdr
+ 1);
554 mach_msg_port_descriptor_t
*desc
= (mach_msg_port_descriptor_t
*)(bod
+ 1);
557 struct inferior
*inf
;
558 darwin_thread_t
*thread
;
560 thread_t thread_port
;
564 /* Check message identifier. 2401 is exc. */
565 if (hdr
->msgh_id
!= 2401)
568 /* Check message header. */
569 if (!(hdr
->msgh_bits
& MACH_MSGH_BITS_COMPLEX
))
572 /* Check descriptors. */
573 if (hdr
->msgh_size
< (sizeof (*hdr
) + sizeof (*bod
) + 2 * sizeof (*desc
)
574 + sizeof (*ndr
) + 2 * sizeof (integer_t
))
575 || bod
->msgh_descriptor_count
!= 2
576 || desc
[0].type
!= MACH_MSG_PORT_DESCRIPTOR
577 || desc
[0].disposition
!= MACH_MSG_TYPE_MOVE_SEND
578 || desc
[1].type
!= MACH_MSG_PORT_DESCRIPTOR
579 || desc
[1].disposition
!= MACH_MSG_TYPE_MOVE_SEND
)
582 /* Check data representation. */
583 ndr
= (NDR_record_t
*)(desc
+ 2);
584 if (ndr
->mig_vers
!= NDR_PROTOCOL_2_0
585 || ndr
->if_vers
!= NDR_PROTOCOL_2_0
586 || ndr
->mig_encoding
!= NDR_record
.mig_encoding
587 || ndr
->int_rep
!= NDR_record
.int_rep
588 || ndr
->char_rep
!= NDR_record
.char_rep
589 || ndr
->float_rep
!= NDR_record
.float_rep
)
592 /* Ok, the hard work. */
593 data
= (integer_t
*)(ndr
+ 1);
595 /* Find process by port. */
596 task_port
= desc
[1].name
;
597 thread_port
= desc
[0].name
;
598 inf
= darwin_find_inferior_by_task (task_port
);
603 /* Find thread by port. */
604 /* Check for new threads. Do it early so that the port in the exception
605 message can be deallocated. */
606 darwin_check_new_threads (inf
);
608 /* We got new rights to the task and the thread. Get rid of them. */
609 kret
= mach_port_deallocate (mach_task_self (), task_port
);
610 MACH_CHECK_ERROR (kret
);
611 kret
= mach_port_deallocate (mach_task_self (), thread_port
);
612 MACH_CHECK_ERROR (kret
);
614 thread
= darwin_find_thread (inf
, thread_port
);
619 /* The thread should be running. However we have observed cases where a thread
620 got a SIGTTIN message after being stopped. */
621 gdb_assert (thread
->msg_state
!= DARWIN_MESSAGE
);
623 /* Finish decoding. */
624 thread
->event
.header
= *hdr
;
625 thread
->event
.thread_port
= thread_port
;
626 thread
->event
.task_port
= task_port
;
627 thread
->event
.ex_type
= data
[0];
628 thread
->event
.data_count
= data
[1];
630 if (hdr
->msgh_size
< (sizeof (*hdr
) + sizeof (*bod
) + 2 * sizeof (*desc
)
631 + sizeof (*ndr
) + 2 * sizeof (integer_t
)
632 + data
[1] * sizeof (integer_t
)))
634 for (i
= 0; i
< data
[1]; i
++)
635 thread
->event
.ex_data
[i
] = data
[2 + i
];
637 thread
->msg_state
= DARWIN_MESSAGE
;
643 darwin_encode_reply (mig_reply_error_t
*reply
, mach_msg_header_t
*hdr
,
646 mach_msg_header_t
*rh
= &reply
->Head
;
647 rh
->msgh_bits
= MACH_MSGH_BITS(MACH_MSGH_BITS_REMOTE(hdr
->msgh_bits
), 0);
648 rh
->msgh_remote_port
= hdr
->msgh_remote_port
;
649 rh
->msgh_size
= (mach_msg_size_t
)sizeof(mig_reply_error_t
);
650 rh
->msgh_local_port
= MACH_PORT_NULL
;
651 rh
->msgh_id
= hdr
->msgh_id
+ 100;
653 reply
->NDR
= NDR_record
;
654 reply
->RetCode
= code
;
658 darwin_send_reply (struct inferior
*inf
, darwin_thread_t
*thread
)
661 mig_reply_error_t reply
;
663 darwin_encode_reply (&reply
, &thread
->event
.header
, KERN_SUCCESS
);
665 kret
= mach_msg (&reply
.Head
, MACH_SEND_MSG
| MACH_SEND_INTERRUPT
,
666 reply
.Head
.msgh_size
, 0,
667 MACH_PORT_NULL
, MACH_MSG_TIMEOUT_NONE
,
669 MACH_CHECK_ERROR (kret
);
671 inf
->private->pending_messages
--;
675 darwin_resume_thread (struct inferior
*inf
, darwin_thread_t
*thread
,
676 int step
, int nsignal
)
682 (3, _("darwin_resume_thread: state=%d, thread=0x%x, step=%d nsignal=%d\n"),
683 thread
->msg_state
, thread
->gdb_port
, step
, nsignal
);
685 switch (thread
->msg_state
)
688 if (thread
->event
.ex_type
== EXC_SOFTWARE
689 && thread
->event
.ex_data
[0] == EXC_SOFT_SIGNAL
)
691 /* Either deliver a new signal or cancel the signal received. */
692 res
= PTRACE (PT_THUPDATE
, inf
->pid
,
693 (void *)(uintptr_t)thread
->gdb_port
, nsignal
);
695 inferior_debug (1, _("ptrace THUP: res=%d\n"), res
);
699 /* Note: ptrace is allowed only if the process is stopped.
700 Directly send the signal to the thread. */
701 res
= syscall (SYS___pthread_kill
, thread
->gdb_port
, nsignal
);
702 inferior_debug (4, _("darwin_resume_thread: kill 0x%x %d: %d\n"),
703 thread
->gdb_port
, nsignal
, res
);
704 thread
->signaled
= 1;
707 /* Set or reset single step. */
708 if (step
!= thread
->single_step
)
710 inferior_debug (4, _("darwin_set_sstep (thread=0x%x, enable=%d)\n"),
711 thread
->gdb_port
, step
);
712 darwin_set_sstep (thread
->gdb_port
, step
);
713 thread
->single_step
= step
;
716 darwin_send_reply (inf
, thread
);
717 thread
->msg_state
= DARWIN_RUNNING
;
724 kret
= thread_resume (thread
->gdb_port
);
725 MACH_CHECK_ERROR (kret
);
727 thread
->msg_state
= DARWIN_RUNNING
;
732 /* Resume all threads of the inferior. */
735 darwin_resume_inferior_threads (struct inferior
*inf
, int step
, int nsignal
)
737 darwin_thread_t
*thread
;
741 VEC_iterate (darwin_thread_t
, inf
->private->threads
, k
, thread
);
743 darwin_resume_thread (inf
, thread
, step
, nsignal
);
746 struct resume_inferior_threads_param
753 darwin_resume_inferior_threads_it (struct inferior
*inf
, void *param
)
755 int step
= ((struct resume_inferior_threads_param
*)param
)->step
;
756 int nsignal
= ((struct resume_inferior_threads_param
*)param
)->nsignal
;
758 darwin_resume_inferior_threads (inf
, step
, nsignal
);
763 /* Suspend all threads of INF. */
766 darwin_suspend_inferior_threads (struct inferior
*inf
)
768 darwin_thread_t
*thread
;
773 VEC_iterate (darwin_thread_t
, inf
->private->threads
, k
, thread
);
775 switch (thread
->msg_state
)
781 kret
= thread_suspend (thread
->gdb_port
);
782 MACH_CHECK_ERROR (kret
);
783 thread
->msg_state
= DARWIN_STOPPED
;
789 darwin_resume (ptid_t ptid
, int step
, enum gdb_signal signal
)
791 struct target_waitstatus status
;
797 struct inferior
*inf
;
800 (2, _("darwin_resume: pid=%d, tid=0x%x, step=%d, signal=%d\n"),
801 ptid_get_pid (ptid
), ptid_get_tid (ptid
), step
, signal
);
803 if (signal
== GDB_SIGNAL_0
)
806 nsignal
= gdb_signal_to_host (signal
);
808 /* Don't try to single step all threads. */
810 ptid
= inferior_ptid
;
812 /* minus_one_ptid is RESUME_ALL. */
813 if (ptid_equal (ptid
, minus_one_ptid
))
815 struct resume_inferior_threads_param param
;
817 param
.nsignal
= nsignal
;
820 /* Resume threads. */
821 iterate_over_inferiors (darwin_resume_inferior_threads_it
, ¶m
);
823 iterate_over_inferiors (darwin_resume_inferior_it
, NULL
);
827 struct inferior
*inf
= find_inferior_pid (ptid_get_pid (ptid
));
828 long tid
= ptid_get_tid (ptid
);
830 /* Stop the inferior (should be useless). */
831 darwin_suspend_inferior (inf
);
834 darwin_resume_inferior_threads (inf
, step
, nsignal
);
837 darwin_thread_t
*thread
;
839 /* Suspend threads of the task. */
840 darwin_suspend_inferior_threads (inf
);
842 /* Resume the selected thread. */
843 thread
= darwin_find_thread (inf
, tid
);
845 darwin_resume_thread (inf
, thread
, step
, nsignal
);
848 /* Resume the task. */
849 darwin_resume_inferior (inf
);
854 darwin_resume_to (struct target_ops
*ops
, ptid_t ptid
, int step
,
855 enum gdb_signal signal
)
857 return darwin_resume (ptid
, step
, signal
);
861 darwin_decode_message (mach_msg_header_t
*hdr
,
862 darwin_thread_t
**pthread
,
863 struct inferior
**pinf
,
864 struct target_waitstatus
*status
)
866 darwin_thread_t
*thread
;
867 struct inferior
*inf
;
869 /* Exception message. */
870 if (hdr
->msgh_local_port
== darwin_ex_port
)
874 /* Decode message. */
875 res
= darwin_decode_exception_message (hdr
, &inf
, &thread
);
879 /* Should not happen... */
881 (_("darwin_wait: ill-formatted message (id=0x%x)\n"), hdr
->msgh_id
);
882 /* FIXME: send a failure reply? */
883 status
->kind
= TARGET_WAITKIND_SPURIOUS
;
884 return minus_one_ptid
;
888 inf
->private->pending_messages
++;
890 status
->kind
= TARGET_WAITKIND_STOPPED
;
891 thread
->msg_state
= DARWIN_MESSAGE
;
893 inferior_debug (4, _("darwin_wait: thread=0x%x, got %s\n"),
895 unparse_exception_type (thread
->event
.ex_type
));
897 switch (thread
->event
.ex_type
)
900 status
->value
.sig
= TARGET_EXC_BAD_ACCESS
;
902 case EXC_BAD_INSTRUCTION
:
903 status
->value
.sig
= TARGET_EXC_BAD_INSTRUCTION
;
906 status
->value
.sig
= TARGET_EXC_ARITHMETIC
;
909 status
->value
.sig
= TARGET_EXC_EMULATION
;
912 if (thread
->event
.ex_data
[0] == EXC_SOFT_SIGNAL
)
915 gdb_signal_from_host (thread
->event
.ex_data
[1]);
916 inferior_debug (5, _(" (signal %d: %s)\n"),
917 thread
->event
.ex_data
[1],
918 gdb_signal_to_name (status
->value
.sig
));
920 /* If the thread is stopped because it has received a signal
921 that gdb has just sent, continue. */
922 if (thread
->signaled
)
924 thread
->signaled
= 0;
925 darwin_send_reply (inf
, thread
);
926 thread
->msg_state
= DARWIN_RUNNING
;
927 status
->kind
= TARGET_WAITKIND_IGNORE
;
931 status
->value
.sig
= TARGET_EXC_SOFTWARE
;
934 /* Many internal GDB routines expect breakpoints to be reported
935 as GDB_SIGNAL_TRAP, and will report TARGET_EXC_BREAKPOINT
936 as a spurious signal. */
937 status
->value
.sig
= GDB_SIGNAL_TRAP
;
940 status
->value
.sig
= GDB_SIGNAL_UNKNOWN
;
944 return ptid_build (inf
->pid
, 0, thread
->gdb_port
);
950 inf
= darwin_find_inferior_by_notify (hdr
->msgh_local_port
);
953 if (!inf
->private->no_ptrace
)
958 res
= wait4 (inf
->pid
, &wstatus
, 0, NULL
);
959 if (res
< 0 || res
!= inf
->pid
)
961 printf_unfiltered (_("wait4: res=%d: %s\n"),
962 res
, safe_strerror (errno
));
963 status
->kind
= TARGET_WAITKIND_SPURIOUS
;
964 return minus_one_ptid
;
966 if (WIFEXITED (wstatus
))
968 status
->kind
= TARGET_WAITKIND_EXITED
;
969 status
->value
.integer
= WEXITSTATUS (wstatus
);
973 status
->kind
= TARGET_WAITKIND_SIGNALLED
;
974 status
->value
.sig
= WTERMSIG (wstatus
);
977 inferior_debug (4, _("darwin_wait: pid=%d exit, status=0x%x\n"),
980 /* Looks necessary on Leopard and harmless... */
981 wait4 (inf
->pid
, &wstatus
, 0, NULL
);
983 return ptid_build (inf
->pid
, 0, 0);
987 inferior_debug (4, _("darwin_wait: pid=%d\n"), inf
->pid
);
988 status
->kind
= TARGET_WAITKIND_EXITED
;
989 status
->value
.integer
= 0; /* Don't know. */
990 return ptid_build (inf
->pid
, 0, 0);
994 printf_unfiltered (_("Bad local-port: 0x%x\n"), hdr
->msgh_local_port
);
995 status
->kind
= TARGET_WAITKIND_SPURIOUS
;
996 return minus_one_ptid
;
1000 cancel_breakpoint (ptid_t ptid
)
1002 /* Arrange for a breakpoint to be hit again later. We will handle
1003 the current event, eventually we will resume this thread, and this
1004 breakpoint will trap again.
1006 If we do not do this, then we run the risk that the user will
1007 delete or disable the breakpoint, but the thread will have already
1010 struct regcache
*regcache
= get_thread_regcache (ptid
);
1011 struct gdbarch
*gdbarch
= get_regcache_arch (regcache
);
1014 pc
= regcache_read_pc (regcache
) - gdbarch_decr_pc_after_break (gdbarch
);
1015 if (breakpoint_inserted_here_p (get_regcache_aspace (regcache
), pc
))
1017 inferior_debug (4, "cancel_breakpoint for thread 0x%x\n",
1018 ptid_get_tid (ptid
));
1020 /* Back up the PC if necessary. */
1021 if (gdbarch_decr_pc_after_break (gdbarch
))
1022 regcache_write_pc (regcache
, pc
);
1030 darwin_wait (ptid_t ptid
, struct target_waitstatus
*status
)
1035 mach_msg_header_t hdr
;
1038 mach_msg_header_t
*hdr
= &msgin
.hdr
;
1040 darwin_thread_t
*thread
;
1041 struct inferior
*inf
;
1044 (2, _("darwin_wait: waiting for a message pid=%d thread=%lx\n"),
1045 ptid_get_pid (ptid
), ptid_get_tid (ptid
));
1047 /* Handle fake stop events at first. */
1048 if (darwin_inf_fake_stop
!= NULL
)
1050 inf
= darwin_inf_fake_stop
;
1051 darwin_inf_fake_stop
= NULL
;
1053 status
->kind
= TARGET_WAITKIND_STOPPED
;
1054 status
->value
.sig
= GDB_SIGNAL_TRAP
;
1055 thread
= VEC_index (darwin_thread_t
, inf
->private->threads
, 0);
1056 thread
->msg_state
= DARWIN_STOPPED
;
1057 return ptid_build (inf
->pid
, 0, thread
->gdb_port
);
1062 /* set_sigint_trap (); */
1064 /* Wait for a message. */
1065 kret
= mach_msg (&msgin
.hdr
, MACH_RCV_MSG
| MACH_RCV_INTERRUPT
, 0,
1066 sizeof (msgin
.data
), darwin_port_set
, 0, MACH_PORT_NULL
);
1068 /* clear_sigint_trap (); */
1070 if (kret
== MACH_RCV_INTERRUPTED
)
1072 status
->kind
= TARGET_WAITKIND_IGNORE
;
1073 return minus_one_ptid
;
1076 if (kret
!= MACH_MSG_SUCCESS
)
1078 inferior_debug (5, _("mach_msg: ret=0x%x\n"), kret
);
1079 status
->kind
= TARGET_WAITKIND_SPURIOUS
;
1080 return minus_one_ptid
;
1083 /* Debug: display message. */
1084 if (darwin_debug_flag
> 10)
1085 darwin_dump_message (hdr
, darwin_debug_flag
> 11);
1087 res
= darwin_decode_message (hdr
, &thread
, &inf
, status
);
1092 while (status
->kind
== TARGET_WAITKIND_IGNORE
);
1094 /* Stop all tasks. */
1095 iterate_over_inferiors (darwin_suspend_inferior_it
, NULL
);
1097 /* Read pending messages. */
1100 struct target_waitstatus status2
;
1103 kret
= mach_msg (&msgin
.hdr
,
1104 MACH_RCV_MSG
| MACH_RCV_TIMEOUT
, 0,
1105 sizeof (msgin
.data
), darwin_port_set
, 1, MACH_PORT_NULL
);
1107 if (kret
== MACH_RCV_TIMED_OUT
)
1109 if (kret
!= MACH_MSG_SUCCESS
)
1112 (5, _("darwin_wait: mach_msg(pending) ret=0x%x\n"), kret
);
1116 ptid2
= darwin_decode_message (hdr
, &thread
, &inf
, &status2
);
1118 if (inf
!= NULL
&& thread
!= NULL
1119 && thread
->event
.ex_type
== EXC_BREAKPOINT
)
1121 if (thread
->single_step
1122 || cancel_breakpoint (ptid_build (inf
->pid
, 0, thread
->gdb_port
)))
1124 gdb_assert (thread
->msg_state
== DARWIN_MESSAGE
);
1125 darwin_send_reply (inf
, thread
);
1126 thread
->msg_state
= DARWIN_RUNNING
;
1130 (3, _("darwin_wait: thread 0x%x hit a non-gdb breakpoint\n"),
1134 inferior_debug (3, _("darwin_wait: unhandled pending message\n"));
1140 darwin_wait_to (struct target_ops
*ops
,
1141 ptid_t ptid
, struct target_waitstatus
*status
, int options
)
1143 return darwin_wait (ptid
, status
);
1147 darwin_stop (ptid_t t
)
1149 struct inferior
*inf
= current_inferior ();
1151 /* FIXME: handle in no_ptrace mode. */
1152 gdb_assert (!inf
->private->no_ptrace
);
1153 kill (inf
->pid
, SIGINT
);
1157 darwin_mourn_inferior (struct target_ops
*ops
)
1159 struct inferior
*inf
= current_inferior ();
1164 unpush_target (darwin_ops
);
1166 /* Deallocate threads. */
1167 if (inf
->private->threads
)
1172 VEC_iterate (darwin_thread_t
, inf
->private->threads
, k
, t
);
1175 kret
= mach_port_deallocate (gdb_task
, t
->gdb_port
);
1176 MACH_CHECK_ERROR (kret
);
1178 VEC_free (darwin_thread_t
, inf
->private->threads
);
1179 inf
->private->threads
= NULL
;
1182 kret
= mach_port_move_member (gdb_task
,
1183 inf
->private->notify_port
, MACH_PORT_NULL
);
1184 MACH_CHECK_ERROR (kret
);
1186 kret
= mach_port_request_notification (gdb_task
, inf
->private->task
,
1187 MACH_NOTIFY_DEAD_NAME
, 0,
1189 MACH_MSG_TYPE_MAKE_SEND_ONCE
,
1191 /* This can fail if the task is dead. */
1192 inferior_debug (4, "task=0x%x, prev=0x%x, notify_port=0x%x\n",
1193 inf
->private->task
, prev
, inf
->private->notify_port
);
1195 if (kret
== KERN_SUCCESS
)
1197 kret
= mach_port_deallocate (gdb_task
, prev
);
1198 MACH_CHECK_ERROR (kret
);
1201 kret
= mach_port_destroy (gdb_task
, inf
->private->notify_port
);
1202 MACH_CHECK_ERROR (kret
);
1205 /* Deallocate saved exception ports. */
1206 for (i
= 0; i
< inf
->private->exception_info
.count
; i
++)
1208 kret
= mach_port_deallocate
1209 (gdb_task
, inf
->private->exception_info
.ports
[i
]);
1210 MACH_CHECK_ERROR (kret
);
1212 inf
->private->exception_info
.count
= 0;
1214 kret
= mach_port_deallocate (gdb_task
, inf
->private->task
);
1215 MACH_CHECK_ERROR (kret
);
1217 xfree (inf
->private);
1218 inf
->private = NULL
;
1220 generic_mourn_inferior ();
1224 darwin_reply_to_all_pending_messages (struct inferior
*inf
)
1230 VEC_iterate (darwin_thread_t
, inf
->private->threads
, k
, t
);
1233 if (t
->msg_state
== DARWIN_MESSAGE
)
1234 darwin_resume_thread (inf
, t
, 0, 0);
1239 darwin_stop_inferior (struct inferior
*inf
)
1241 struct target_waitstatus wstatus
;
1247 gdb_assert (inf
!= NULL
);
1249 darwin_suspend_inferior (inf
);
1251 darwin_reply_to_all_pending_messages (inf
);
1253 if (inf
->private->no_ptrace
)
1256 res
= kill (inf
->pid
, SIGSTOP
);
1258 warning (_("cannot kill: %s"), safe_strerror (errno
));
1260 /* Wait until the process is really stopped. */
1263 ptid
= darwin_wait (inferior_ptid
, &wstatus
);
1264 if (wstatus
.kind
== TARGET_WAITKIND_STOPPED
1265 && wstatus
.value
.sig
== GDB_SIGNAL_STOP
)
1270 static kern_return_t
1271 darwin_save_exception_ports (darwin_inferior
*inf
)
1275 inf
->exception_info
.count
=
1276 sizeof (inf
->exception_info
.ports
) / sizeof (inf
->exception_info
.ports
[0]);
1278 kret
= task_get_exception_ports
1279 (inf
->task
, EXC_MASK_ALL
, inf
->exception_info
.masks
,
1280 &inf
->exception_info
.count
, inf
->exception_info
.ports
,
1281 inf
->exception_info
.behaviors
, inf
->exception_info
.flavors
);
1285 static kern_return_t
1286 darwin_restore_exception_ports (darwin_inferior
*inf
)
1291 for (i
= 0; i
< inf
->exception_info
.count
; i
++)
1293 kret
= task_set_exception_ports
1294 (inf
->task
, inf
->exception_info
.masks
[i
], inf
->exception_info
.ports
[i
],
1295 inf
->exception_info
.behaviors
[i
], inf
->exception_info
.flavors
[i
]);
1296 if (kret
!= KERN_SUCCESS
)
1300 return KERN_SUCCESS
;
1304 darwin_kill_inferior (struct target_ops
*ops
)
1306 struct inferior
*inf
= current_inferior ();
1307 struct target_waitstatus wstatus
;
1313 if (ptid_equal (inferior_ptid
, null_ptid
))
1316 gdb_assert (inf
!= NULL
);
1318 kret
= darwin_restore_exception_ports (inf
->private);
1319 MACH_CHECK_ERROR (kret
);
1321 darwin_reply_to_all_pending_messages (inf
);
1323 res
= kill (inf
->pid
, 9);
1327 darwin_resume_inferior (inf
);
1329 ptid
= darwin_wait (inferior_ptid
, &wstatus
);
1331 else if (errno
!= ESRCH
)
1332 warning (_("Failed to kill inferior: kill (%d, 9) returned [%s]"),
1333 inf
->pid
, safe_strerror (errno
));
1335 target_mourn_inferior ();
1339 darwin_attach_pid (struct inferior
*inf
)
1342 mach_port_t prev_port
;
1344 mach_port_t prev_not
;
1345 exception_mask_t mask
;
1347 inf
->private = XZALLOC (darwin_inferior
);
1349 kret
= task_for_pid (gdb_task
, inf
->pid
, &inf
->private->task
);
1350 if (kret
!= KERN_SUCCESS
)
1354 if (!inf
->attach_flag
)
1357 waitpid (inf
->pid
, &status
, 0);
1360 error (_("Unable to find Mach task port for process-id %d: %s (0x%lx).\n"
1361 " (please check gdb is codesigned - see taskgated(8))"),
1362 inf
->pid
, mach_error_string (kret
), (unsigned long) kret
);
1365 inferior_debug (2, _("inferior task: 0x%x, pid: %d\n"),
1366 inf
->private->task
, inf
->pid
);
1368 if (darwin_ex_port
== MACH_PORT_NULL
)
1370 /* Create a port to get exceptions. */
1371 kret
= mach_port_allocate (gdb_task
, MACH_PORT_RIGHT_RECEIVE
,
1373 if (kret
!= KERN_SUCCESS
)
1374 error (_("Unable to create exception port, mach_port_allocate "
1378 kret
= mach_port_insert_right (gdb_task
, darwin_ex_port
, darwin_ex_port
,
1379 MACH_MSG_TYPE_MAKE_SEND
);
1380 if (kret
!= KERN_SUCCESS
)
1381 error (_("Unable to create exception port, mach_port_insert_right "
1385 /* Create a port set and put ex_port in it. */
1386 kret
= mach_port_allocate (gdb_task
, MACH_PORT_RIGHT_PORT_SET
,
1388 if (kret
!= KERN_SUCCESS
)
1389 error (_("Unable to create port set, mach_port_allocate "
1393 kret
= mach_port_move_member (gdb_task
, darwin_ex_port
, darwin_port_set
);
1394 if (kret
!= KERN_SUCCESS
)
1395 error (_("Unable to move exception port into new port set, "
1396 "mach_port_move_member\n"
1401 /* Create a port to be notified when the child task terminates. */
1402 kret
= mach_port_allocate (gdb_task
, MACH_PORT_RIGHT_RECEIVE
,
1403 &inf
->private->notify_port
);
1404 if (kret
!= KERN_SUCCESS
)
1405 error (_("Unable to create notification port, mach_port_allocate "
1409 kret
= mach_port_move_member (gdb_task
,
1410 inf
->private->notify_port
, darwin_port_set
);
1411 if (kret
!= KERN_SUCCESS
)
1412 error (_("Unable to move notification port into new port set, "
1413 "mach_port_move_member\n"
1417 kret
= mach_port_request_notification (gdb_task
, inf
->private->task
,
1418 MACH_NOTIFY_DEAD_NAME
, 0,
1419 inf
->private->notify_port
,
1420 MACH_MSG_TYPE_MAKE_SEND_ONCE
,
1422 if (kret
!= KERN_SUCCESS
)
1423 error (_("Termination notification request failed, "
1424 "mach_port_request_notification\n"
1427 if (prev_not
!= MACH_PORT_NULL
)
1429 /* This is unexpected, as there should not be any previously
1430 registered notification request. But this is not a fatal
1431 issue, so just emit a warning. */
1433 A task termination request was registered before the debugger registered\n\
1434 its own. This is unexpected, but should otherwise not have any actual\n\
1435 impact on the debugging session."));
1438 kret
= darwin_save_exception_ports (inf
->private);
1439 if (kret
!= KERN_SUCCESS
)
1440 error (_("Unable to save exception ports, task_get_exception_ports"
1444 /* Set exception port. */
1445 if (enable_mach_exceptions
)
1446 mask
= EXC_MASK_ALL
;
1448 mask
= EXC_MASK_SOFTWARE
| EXC_MASK_BREAKPOINT
;
1449 kret
= task_set_exception_ports (inf
->private->task
, mask
, darwin_ex_port
,
1450 EXCEPTION_DEFAULT
, THREAD_STATE_NONE
);
1451 if (kret
!= KERN_SUCCESS
)
1452 error (_("Unable to set exception ports, task_set_exception_ports"
1456 push_target (darwin_ops
);
1460 darwin_init_thread_list (struct inferior
*inf
)
1462 darwin_thread_t
*thread
;
1465 darwin_check_new_threads (inf
);
1467 gdb_assert (inf
->private->threads
1468 && VEC_length (darwin_thread_t
, inf
->private->threads
) > 0);
1469 thread
= VEC_index (darwin_thread_t
, inf
->private->threads
, 0);
1471 /* Note: fork_inferior automatically add a thead but it uses a wrong ptid.
1473 new_ptid
= ptid_build (inf
->pid
, 0, thread
->gdb_port
);
1474 thread_change_ptid (inferior_ptid
, new_ptid
);
1475 inferior_ptid
= new_ptid
;
1478 /* The child must synchronize with gdb: gdb must set the exception port
1479 before the child call PTRACE_SIGEXC. We use a pipe to achieve this.
1480 FIXME: is there a lighter way ? */
1481 static int ptrace_fds
[2];
1484 darwin_ptrace_me (void)
1489 /* Close write end point. */
1490 close (ptrace_fds
[1]);
1492 /* Wait until gdb is ready. */
1493 res
= read (ptrace_fds
[0], &c
, 1);
1495 error (_("unable to read from pipe, read returned: %d"), res
);
1496 close (ptrace_fds
[0]);
1498 /* Get rid of privileges. */
1499 setegid (getgid ());
1502 PTRACE (PT_TRACE_ME
, 0, 0, 0);
1504 /* Redirect signals to exception port. */
1505 PTRACE (PT_SIGEXC
, 0, 0, 0);
1508 /* Dummy function to be sure fork_inferior uses fork(2) and not vfork(2). */
1510 darwin_pre_ptrace (void)
1512 if (pipe (ptrace_fds
) != 0)
1516 error (_("unable to create a pipe: %s"), safe_strerror (errno
));
1519 mark_fd_no_cloexec (ptrace_fds
[0]);
1520 mark_fd_no_cloexec (ptrace_fds
[1]);
1524 darwin_ptrace_him (int pid
)
1528 mach_port_t prev_port
;
1530 struct inferior
*inf
= current_inferior ();
1532 darwin_attach_pid (inf
);
1534 /* Let's the child run. */
1535 close (ptrace_fds
[0]);
1536 close (ptrace_fds
[1]);
1538 unmark_fd_no_cloexec (ptrace_fds
[0]);
1539 unmark_fd_no_cloexec (ptrace_fds
[1]);
1541 darwin_init_thread_list (inf
);
1543 startup_inferior (START_INFERIOR_TRAPS_EXPECTED
);
1547 darwin_execvp (const char *file
, char * const argv
[], char * const env
[])
1549 posix_spawnattr_t attr
;
1553 res
= posix_spawnattr_init (&attr
);
1557 (gdb_stderr
, "Cannot initialize attribute for posix_spawn\n");
1561 /* Do like execve: replace the image. */
1562 ps_flags
= POSIX_SPAWN_SETEXEC
;
1564 /* Disable ASLR. The constant doesn't look to be available outside the
1565 kernel include files. */
1566 #ifndef _POSIX_SPAWN_DISABLE_ASLR
1567 #define _POSIX_SPAWN_DISABLE_ASLR 0x0100
1569 ps_flags
|= _POSIX_SPAWN_DISABLE_ASLR
;
1570 res
= posix_spawnattr_setflags (&attr
, ps_flags
);
1573 fprintf_unfiltered (gdb_stderr
, "Cannot set posix_spawn flags\n");
1577 posix_spawnp (NULL
, argv
[0], NULL
, &attr
, argv
, env
);
1581 darwin_create_inferior (struct target_ops
*ops
, char *exec_file
,
1582 char *allargs
, char **env
, int from_tty
)
1584 /* Do the hard work. */
1585 fork_inferior (exec_file
, allargs
, env
, darwin_ptrace_me
, darwin_ptrace_him
,
1586 darwin_pre_ptrace
, NULL
, darwin_execvp
);
1588 /* Return now in case of error. */
1589 if (ptid_equal (inferior_ptid
, null_ptid
))
1594 /* Set things up such that the next call to darwin_wait will immediately
1595 return a fake stop event for inferior INF.
1597 This assumes that the inferior's thread list has been initialized,
1598 as it will suspend the inferior's first thread. */
1601 darwin_setup_fake_stop_event (struct inferior
*inf
)
1603 darwin_thread_t
*thread
;
1606 gdb_assert (darwin_inf_fake_stop
== NULL
);
1607 darwin_inf_fake_stop
= inf
;
1609 /* When detecting a fake pending stop event, darwin_wait returns
1610 an event saying that the first thread is in a DARWIN_STOPPED
1611 state. To make that accurate, we need to suspend that thread
1612 as well. Otherwise, we'll try resuming it when resuming the
1613 inferior, and get a warning because the thread's suspend count
1614 is already zero, making the resume request useless. */
1615 thread
= VEC_index (darwin_thread_t
, inf
->private->threads
, 0);
1616 kret
= thread_suspend (thread
->gdb_port
);
1617 MACH_CHECK_ERROR (kret
);
1620 /* Attach to process PID, then initialize for debugging it
1621 and wait for the trace-trap that results from attaching. */
1623 darwin_attach (struct target_ops
*ops
, char *args
, int from_tty
)
1629 struct inferior
*inf
;
1632 pid
= parse_pid_to_attach (args
);
1634 if (pid
== getpid ()) /* Trying to masturbate? */
1635 error (_("I refuse to debug myself!"));
1639 char *exec_file
= get_exec_file (0);
1642 printf_unfiltered (_("Attaching to program: %s, %s\n"), exec_file
,
1643 target_pid_to_str (pid_to_ptid (pid
)));
1645 printf_unfiltered (_("Attaching to %s\n"),
1646 target_pid_to_str (pid_to_ptid (pid
)));
1648 gdb_flush (gdb_stdout
);
1651 if (pid
== 0 || kill (pid
, 0) < 0)
1652 error (_("Can't attach to process %d: %s (%d)"),
1653 pid
, safe_strerror (errno
), errno
);
1655 inferior_ptid
= pid_to_ptid (pid
);
1656 inf
= current_inferior ();
1657 inferior_appeared (inf
, pid
);
1658 inf
->attach_flag
= 1;
1660 /* Always add a main thread. */
1661 add_thread_silent (inferior_ptid
);
1663 darwin_attach_pid (inf
);
1665 darwin_suspend_inferior (inf
);
1667 darwin_init_thread_list (inf
);
1669 darwin_check_osabi (inf
->private, ptid_get_tid (inferior_ptid
));
1671 darwin_setup_fake_stop_event (inf
);
1673 inf
->private->no_ptrace
= 1;
1676 /* Take a program previously attached to and detaches it.
1677 The program resumes execution and will no longer stop
1678 on signals, etc. We'd better not have left any breakpoints
1679 in the program or it'll die when it hits one. For this
1680 to work, it may be necessary for the process to have been
1681 previously attached. It *might* work if the program was
1682 started via fork. */
1684 darwin_detach (struct target_ops
*ops
, char *args
, int from_tty
)
1686 pid_t pid
= ptid_get_pid (inferior_ptid
);
1687 struct inferior
*inf
= current_inferior ();
1691 /* Display message. */
1694 char *exec_file
= get_exec_file (0);
1697 printf_unfiltered (_("Detaching from program: %s, %s\n"), exec_file
,
1698 target_pid_to_str (pid_to_ptid (pid
)));
1699 gdb_flush (gdb_stdout
);
1702 /* If ptrace() is in use, stop the process. */
1703 if (!inf
->private->no_ptrace
)
1704 darwin_stop_inferior (inf
);
1706 kret
= darwin_restore_exception_ports (inf
->private);
1707 MACH_CHECK_ERROR (kret
);
1709 if (!inf
->private->no_ptrace
)
1711 res
= PTRACE (PT_DETACH
, inf
->pid
, 0, 0);
1713 printf_unfiltered (_("Unable to detach from process-id %d: %s (%d)"),
1714 inf
->pid
, safe_strerror (errno
), errno
);
1717 darwin_reply_to_all_pending_messages (inf
);
1719 /* When using ptrace, we have just performed a PT_DETACH, which
1720 resumes the inferior. On the other hand, when we are not using
1721 ptrace, we need to resume its execution ourselves. */
1722 if (inf
->private->no_ptrace
)
1723 darwin_resume_inferior (inf
);
1725 darwin_mourn_inferior (ops
);
1729 darwin_files_info (struct target_ops
*ops
)
1734 darwin_pid_to_str (struct target_ops
*ops
, ptid_t ptid
)
1736 static char buf
[80];
1737 long tid
= ptid_get_tid (ptid
);
1741 snprintf (buf
, sizeof (buf
), _("Thread 0x%lx of process %u"),
1742 tid
, ptid_get_pid (ptid
));
1746 return normal_pid_to_str (ptid
);
1750 darwin_thread_alive (struct target_ops
*ops
, ptid_t ptid
)
1755 /* If RDADDR is not NULL, read inferior task's LEN bytes from ADDR and
1756 copy it to RDADDR in gdb's address space.
1757 If WRADDR is not NULL, write gdb's LEN bytes from WRADDR and copy it
1758 to ADDR in inferior task's address space.
1759 Return 0 on failure; number of bytes read / writen otherwise. */
1761 darwin_read_write_inferior (task_t task
, CORE_ADDR addr
,
1762 gdb_byte
*rdaddr
, const gdb_byte
*wraddr
,
1766 mach_vm_address_t offset
= addr
& (mach_page_size
- 1);
1767 mach_vm_address_t low_address
= (mach_vm_address_t
) (addr
- offset
);
1768 mach_vm_size_t aligned_length
= (mach_vm_size_t
) PAGE_ROUND (offset
+ length
);
1770 mach_msg_type_number_t copy_count
;
1771 mach_vm_size_t remaining_length
;
1772 mach_vm_address_t region_address
;
1773 mach_vm_size_t region_length
;
1775 inferior_debug (8, _("darwin_read_write_inferior(task=0x%x, %s, len=%d)\n"),
1776 task
, core_addr_to_string (addr
), length
);
1778 /* Get memory from inferior with page aligned addresses. */
1779 kret
= mach_vm_read (task
, low_address
, aligned_length
,
1780 &copied
, ©_count
);
1781 if (kret
!= KERN_SUCCESS
)
1784 (1, _("darwin_read_write_inferior: mach_vm_read failed at %s: %s"),
1785 core_addr_to_string (addr
), mach_error_string (kret
));
1790 memcpy (rdaddr
, (char *)copied
+ offset
, length
);
1795 memcpy ((char *)copied
+ offset
, wraddr
, length
);
1797 /* Do writes atomically.
1798 First check for holes and unwritable memory. */
1799 for (region_address
= low_address
, remaining_length
= aligned_length
;
1800 region_address
< low_address
+ aligned_length
;
1801 region_address
+= region_length
, remaining_length
-= region_length
)
1803 vm_region_submap_short_info_data_64_t info
;
1804 mach_vm_address_t region_start
= region_address
;
1805 mach_msg_type_number_t count
;
1806 natural_t region_depth
;
1808 region_depth
= 100000;
1809 count
= VM_REGION_SUBMAP_SHORT_INFO_COUNT_64
;
1810 kret
= mach_vm_region_recurse
1811 (task
, ®ion_start
, ®ion_length
, ®ion_depth
,
1812 (vm_region_recurse_info_t
) &info
, &count
);
1814 if (kret
!= KERN_SUCCESS
)
1816 inferior_debug (1, _("darwin_read_write_inferior: "
1817 "mach_vm_region_recurse failed at %s: %s\n"),
1818 core_addr_to_string (region_address
),
1819 mach_error_string (kret
));
1824 (9, _("darwin_read_write_inferior: "
1825 "mach_vm_region_recurse addr=%s, start=%s, len=%s\n"),
1826 core_addr_to_string (region_address
),
1827 core_addr_to_string (region_start
),
1828 core_addr_to_string (region_length
));
1830 /* Check for holes in memory. */
1831 if (region_start
> region_address
)
1833 warning (_("No memory at %s (vs %s+0x%x). Nothing written"),
1834 core_addr_to_string (region_address
),
1835 core_addr_to_string (region_start
),
1836 (unsigned)region_length
);
1841 /* Adjust the length. */
1842 region_length
-= (region_address
- region_start
);
1844 if (!(info
.max_protection
& VM_PROT_WRITE
))
1846 kret
= mach_vm_protect
1847 (task
, region_address
, region_length
,
1848 TRUE
, info
.max_protection
| VM_PROT_WRITE
| VM_PROT_COPY
);
1849 if (kret
!= KERN_SUCCESS
)
1851 warning (_("darwin_read_write_inf: "
1852 "mach_vm_protect max failed at %s: %s"),
1853 core_addr_to_string (region_address
),
1854 mach_error_string (kret
));
1860 if (!(info
.protection
& VM_PROT_WRITE
))
1862 kret
= mach_vm_protect (task
, region_address
, region_length
,
1863 FALSE
, info
.protection
| VM_PROT_WRITE
);
1864 if (kret
!= KERN_SUCCESS
)
1866 warning (_("darwin_read_write_inf: "
1867 "mach_vm_protect failed at %s (len=0x%lx): %s"),
1868 core_addr_to_string (region_address
),
1869 (unsigned long)region_length
, mach_error_string (kret
));
1876 kret
= mach_vm_write (task
, low_address
, copied
, aligned_length
);
1878 if (kret
!= KERN_SUCCESS
)
1880 warning (_("darwin_read_write_inferior: mach_vm_write failed: %s"),
1881 mach_error_string (kret
));
1885 mach_vm_deallocate (mach_task_self (), copied
, copy_count
);
1889 /* Read LENGTH bytes at offset ADDR of task_dyld_info for TASK, and copy them
1891 Return 0 on failure; number of bytes read / written otherwise. */
1893 #ifdef TASK_DYLD_INFO_COUNT
1894 /* This is not available in Darwin 9. */
1896 darwin_read_dyld_info (task_t task
, CORE_ADDR addr
, gdb_byte
*rdaddr
,
1899 struct task_dyld_info task_dyld_info
;
1900 mach_msg_type_number_t count
= TASK_DYLD_INFO_COUNT
;
1901 int sz
= TASK_DYLD_INFO_COUNT
* sizeof (natural_t
);
1907 kret
= task_info (task
, TASK_DYLD_INFO
, (task_info_t
) &task_dyld_info
, &count
);
1908 MACH_CHECK_ERROR (kret
);
1909 if (kret
!= KERN_SUCCESS
)
1912 if (addr
+ length
> sz
)
1914 memcpy (rdaddr
, (char *)&task_dyld_info
+ addr
, length
);
1920 /* Return 0 on failure, number of bytes handled otherwise. TARGET
1923 darwin_xfer_memory (CORE_ADDR memaddr
, gdb_byte
*myaddr
, int len
, int write
,
1924 struct mem_attrib
*attrib
, struct target_ops
*target
)
1926 struct inferior
*inf
= current_inferior ();
1927 task_t task
= inf
->private->task
;
1929 if (task
== MACH_PORT_NULL
)
1932 inferior_debug (8, _("darwin_xfer_memory(%s, %d, %c)\n"),
1933 core_addr_to_string (memaddr
), len
, write
? 'w' : 'r');
1936 return darwin_read_write_inferior (task
, memaddr
, NULL
, myaddr
, len
);
1938 return darwin_read_write_inferior (task
, memaddr
, myaddr
, NULL
, len
);
1942 darwin_xfer_partial (struct target_ops
*ops
,
1943 enum target_object object
, const char *annex
,
1944 gdb_byte
*readbuf
, const gdb_byte
*writebuf
,
1945 ULONGEST offset
, LONGEST len
)
1947 struct inferior
*inf
= current_inferior ();
1950 (8, _("darwin_xfer_partial(%s, %d, rbuf=%s, wbuf=%s) pid=%u\n"),
1951 core_addr_to_string (offset
), (int)len
,
1952 host_address_to_string (readbuf
), host_address_to_string (writebuf
),
1957 case TARGET_OBJECT_MEMORY
:
1958 return darwin_read_write_inferior (inf
->private->task
, offset
,
1959 readbuf
, writebuf
, len
);
1960 #ifdef TASK_DYLD_INFO_COUNT
1961 case TARGET_OBJECT_DARWIN_DYLD_INFO
:
1962 if (writebuf
!= NULL
|| readbuf
== NULL
)
1964 /* Support only read. */
1967 return darwin_read_dyld_info (inf
->private->task
, offset
, readbuf
, len
);
1976 set_enable_mach_exceptions (char *args
, int from_tty
,
1977 struct cmd_list_element
*c
)
1979 if (!ptid_equal (inferior_ptid
, null_ptid
))
1981 struct inferior
*inf
= current_inferior ();
1982 exception_mask_t mask
;
1985 if (enable_mach_exceptions
)
1986 mask
= EXC_MASK_ALL
;
1989 darwin_restore_exception_ports (inf
->private);
1990 mask
= EXC_MASK_SOFTWARE
| EXC_MASK_BREAKPOINT
;
1992 kret
= task_set_exception_ports (inf
->private->task
, mask
, darwin_ex_port
,
1993 EXCEPTION_DEFAULT
, THREAD_STATE_NONE
);
1994 MACH_CHECK_ERROR (kret
);
1999 darwin_pid_to_exec_file (int pid
)
2004 path
= xmalloc (PATH_MAX
);
2005 make_cleanup (xfree
, path
);
2007 res
= proc_pidinfo (pid
, PROC_PIDPATHINFO
, 0, path
, PATH_MAX
);
2015 darwin_get_ada_task_ptid (long lwp
, long thread
)
2020 struct inferior
*inf
= current_inferior ();
2022 mach_port_name_array_t names
;
2023 mach_msg_type_number_t names_count
;
2024 mach_port_type_array_t types
;
2025 mach_msg_type_number_t types_count
;
2028 /* First linear search. */
2030 VEC_iterate (darwin_thread_t
, inf
->private->threads
, k
, t
);
2032 if (t
->inf_port
== lwp
)
2033 return ptid_build (ptid_get_pid (inferior_ptid
), 0, t
->gdb_port
);
2035 /* Maybe the port was never extract. Do it now. */
2037 /* First get inferior port names. */
2038 kret
= mach_port_names (inf
->private->task
, &names
, &names_count
, &types
,
2040 MACH_CHECK_ERROR (kret
);
2041 if (kret
!= KERN_SUCCESS
)
2044 /* For each name, copy the right in the gdb space and then compare with
2045 our view of the inferior threads. We don't forget to deallocate the
2047 for (i
= 0; i
< names_count
; i
++)
2049 mach_port_t local_name
;
2050 mach_msg_type_name_t local_type
;
2052 /* We just need to know the corresponding name in gdb name space.
2053 So extract and deallocate the right. */
2054 kret
= mach_port_extract_right (inf
->private->task
, names
[i
],
2055 MACH_MSG_TYPE_COPY_SEND
,
2056 &local_name
, &local_type
);
2057 if (kret
!= KERN_SUCCESS
)
2059 mach_port_deallocate (gdb_task
, local_name
);
2062 VEC_iterate (darwin_thread_t
, inf
->private->threads
, k
, t
);
2064 if (t
->gdb_port
== local_name
)
2066 t
->inf_port
= names
[i
];
2067 if (names
[i
] == lwp
)
2072 vm_deallocate (gdb_task
, (vm_address_t
) names
,
2073 names_count
* sizeof (mach_port_t
));
2076 return ptid_build (ptid_get_pid (inferior_ptid
), 0, res
);
2082 darwin_supports_multi_process (void)
2087 /* -Wmissing-prototypes */
2088 extern initialize_file_ftype _initialize_darwin_inferior
;
2091 _initialize_darwin_inferior (void)
2095 gdb_task
= mach_task_self ();
2096 darwin_host_self
= mach_host_self ();
2098 /* Read page size. */
2099 kret
= host_page_size (darwin_host_self
, &mach_page_size
);
2100 if (kret
!= KERN_SUCCESS
)
2102 mach_page_size
= 0x1000;
2103 MACH_CHECK_ERROR (kret
);
2106 darwin_ops
= inf_child_target ();
2108 darwin_ops
->to_shortname
= "darwin-child";
2109 darwin_ops
->to_longname
= _("Darwin child process");
2110 darwin_ops
->to_doc
=
2111 _("Darwin child process (started by the \"run\" command).");
2112 darwin_ops
->to_create_inferior
= darwin_create_inferior
;
2113 darwin_ops
->to_attach
= darwin_attach
;
2114 darwin_ops
->to_attach_no_wait
= 0;
2115 darwin_ops
->to_detach
= darwin_detach
;
2116 darwin_ops
->to_files_info
= darwin_files_info
;
2117 darwin_ops
->to_wait
= darwin_wait_to
;
2118 darwin_ops
->to_mourn_inferior
= darwin_mourn_inferior
;
2119 darwin_ops
->to_kill
= darwin_kill_inferior
;
2120 darwin_ops
->to_stop
= darwin_stop
;
2121 darwin_ops
->to_resume
= darwin_resume_to
;
2122 darwin_ops
->to_thread_alive
= darwin_thread_alive
;
2123 darwin_ops
->to_pid_to_str
= darwin_pid_to_str
;
2124 darwin_ops
->to_pid_to_exec_file
= darwin_pid_to_exec_file
;
2125 darwin_ops
->to_load
= NULL
;
2126 darwin_ops
->deprecated_xfer_memory
= darwin_xfer_memory
;
2127 darwin_ops
->to_xfer_partial
= darwin_xfer_partial
;
2128 darwin_ops
->to_supports_multi_process
= darwin_supports_multi_process
;
2129 darwin_ops
->to_get_ada_task_ptid
= darwin_get_ada_task_ptid
;
2131 darwin_complete_target (darwin_ops
);
2133 add_target (darwin_ops
);
2135 inferior_debug (2, _("GDB task: 0x%lx, pid: %d\n"), mach_task_self (),
2138 add_setshow_zuinteger_cmd ("darwin", class_obscure
,
2139 &darwin_debug_flag
, _("\
2140 Set if printing inferior communication debugging statements."), _("\
2141 Show if printing inferior communication debugging statements."), NULL
,
2143 &setdebuglist
, &showdebuglist
);
2145 add_setshow_boolean_cmd ("mach-exceptions", class_support
,
2146 &enable_mach_exceptions
, _("\
2147 Set if mach exceptions are caught."), _("\
2148 Show if mach exceptions are caught."), _("\
2149 When this mode is on, all low level exceptions are reported before being\n\
2150 reported by the kernel."),
2151 &set_enable_mach_exceptions
, NULL
,
2152 &setlist
, &showlist
);