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