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