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