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