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