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