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