1 /* Native support code for HPUX PA-RISC, for GDB the GNU debugger. 2 3 Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 4 1996, 1998, 1999, 2000, 2001, 2004 Free Software Foundation, Inc. 5 6 Contributed by the Center for Software Science at the 7 University of Utah (pa-gdb-bugs@cs.utah.edu). 8 9 This file is part of GDB. 10 11 This program is free software; you can redistribute it and/or modify 12 it under the terms of the GNU General Public License as published by 13 the Free Software Foundation; either version 2 of the License, or 14 (at your option) any later version. 15 16 This program is distributed in the hope that it will be useful, 17 but WITHOUT ANY WARRANTY; without even the implied warranty of 18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 GNU General Public License for more details. 20 21 You should have received a copy of the GNU General Public License 22 along with this program; if not, write to the Free Software 23 Foundation, Inc., 59 Temple Place - Suite 330, 24 Boston, MA 02111-1307, USA. */ 25 26 27 #include "defs.h" 28 #include "inferior.h" 29 #include "target.h" 30 #include <sys/ptrace.h> 31 #include "gdbcore.h" 32 #include "gdb_wait.h" 33 #include "regcache.h" 34 #include "gdb_string.h" 35 #include "infttrace.h" 36 #include <signal.h> 37 38 #include "hppa-tdep.h" 39 40 static CORE_ADDR text_end; 41 42 void 43 deprecated_hpux_text_end (struct target_ops *exec_ops) 44 { 45 struct section_table *p; 46 47 /* Set text_end to the highest address of the end of any readonly 48 code section. */ 49 /* FIXME: The comment above does not match the code. The code 50 checks for sections with are either code *or* readonly. */ 51 text_end = (CORE_ADDR) 0; 52 for (p = exec_ops->to_sections; p < exec_ops->to_sections_end; p++) 53 if (bfd_get_section_flags (p->bfd, p->the_bfd_section) 54 & (SEC_CODE | SEC_READONLY)) 55 { 56 if (text_end < p->endaddr) 57 text_end = p->endaddr; 58 } 59 } 60 61 62 static void fetch_register (int); 63 64 void 65 fetch_inferior_registers (int regno) 66 { 67 if (regno == -1) 68 for (regno = 0; regno < NUM_REGS; regno++) 69 fetch_register (regno); 70 else 71 fetch_register (regno); 72 } 73 74 /* Our own version of the offsetof macro, since we can't assume ANSI C. */ 75 #define HPPAH_OFFSETOF(type, member) ((int) (&((type *) 0)->member)) 76 77 /* Store our register values back into the inferior. 78 If REGNO is -1, do this for all registers. 79 Otherwise, REGNO specifies which register (so we can save time). */ 80 81 void 82 store_inferior_registers (int regno) 83 { 84 unsigned int regaddr; 85 char buf[80]; 86 int i; 87 unsigned int offset = U_REGS_OFFSET; 88 int scratch; 89 90 if (regno >= 0) 91 { 92 unsigned int addr, len, offset; 93 94 if (CANNOT_STORE_REGISTER (regno)) 95 return; 96 97 offset = 0; 98 len = register_size (current_gdbarch, regno); 99 100 /* Requests for register zero actually want the save_state's 101 ss_flags member. As RM says: "Oh, what a hack!" */ 102 if (regno == 0) 103 { 104 save_state_t ss; 105 addr = HPPAH_OFFSETOF (save_state_t, ss_flags); 106 len = sizeof (ss.ss_flags); 107 108 /* Note that ss_flags is always an int, no matter what 109 register_size (0) says. Assuming all HP-UX PA machines 110 are big-endian, put it at the least significant end of 111 the value, and zap the rest of the buffer. */ 112 offset = register_size (current_gdbarch, 0) - len; 113 } 114 115 /* Floating-point registers come from the ss_fpblock area. */ 116 else if (regno >= HPPA_FP0_REGNUM) 117 addr = (HPPAH_OFFSETOF (save_state_t, ss_fpblock) 118 + (DEPRECATED_REGISTER_BYTE (regno) - DEPRECATED_REGISTER_BYTE (HPPA_FP0_REGNUM))); 119 120 /* Wide registers come from the ss_wide area. 121 I think it's more PC to test (ss_flags & SS_WIDEREGS) to select 122 between ss_wide and ss_narrow than to use the raw register size. 123 But checking ss_flags would require an extra ptrace call for 124 every register reference. Bleah. */ 125 else if (len == 8) 126 addr = (HPPAH_OFFSETOF (save_state_t, ss_wide) 127 + DEPRECATED_REGISTER_BYTE (regno)); 128 129 /* Narrow registers come from the ss_narrow area. Note that 130 ss_narrow starts with gr1, not gr0. */ 131 else if (len == 4) 132 addr = (HPPAH_OFFSETOF (save_state_t, ss_narrow) 133 + (DEPRECATED_REGISTER_BYTE (regno) - DEPRECATED_REGISTER_BYTE (1))); 134 else 135 internal_error (__FILE__, __LINE__, 136 "hppah-nat.c (write_register): unexpected register size"); 137 138 #ifdef GDB_TARGET_IS_HPPA_20W 139 /* Unbelieveable. The PC head and tail must be written in 64bit hunks 140 or we will get an error. Worse yet, the oddball ptrace/ttrace 141 layering will not allow us to perform a 64bit register store. 142 143 What a crock. */ 144 if (regno == HPPA_PCOQ_HEAD_REGNUM || regno == HPPA_PCOQ_TAIL_REGNUM && len == 8) 145 { 146 CORE_ADDR temp; 147 148 temp = *(CORE_ADDR *)&deprecated_registers[DEPRECATED_REGISTER_BYTE (regno)]; 149 150 /* Set the priv level (stored in the low two bits of the PC. */ 151 temp |= 0x3; 152 153 ttrace_write_reg_64 (PIDGET (inferior_ptid), (CORE_ADDR)addr, 154 (CORE_ADDR)&temp); 155 156 /* If we fail to write the PC, give a true error instead of 157 just a warning. */ 158 if (errno != 0) 159 { 160 char *err = safe_strerror (errno); 161 char *msg = alloca (strlen (err) + 128); 162 sprintf (msg, "writing `%s' register: %s", 163 REGISTER_NAME (regno), err); 164 perror_with_name (msg); 165 } 166 return; 167 } 168 169 /* Another crock. HPUX complains if you write a nonzero value to 170 the high part of IPSW. What will it take for HP to catch a 171 clue about building sensible interfaces? */ 172 if (regno == HPPA_IPSW_REGNUM && len == 8) 173 *(int *)&deprecated_registers[DEPRECATED_REGISTER_BYTE (regno)] = 0; 174 #endif 175 176 for (i = 0; i < len; i += sizeof (int)) 177 { 178 errno = 0; 179 call_ptrace (PT_WUREGS, PIDGET (inferior_ptid), 180 (PTRACE_ARG3_TYPE) addr + i, 181 *(int *) &deprecated_registers[DEPRECATED_REGISTER_BYTE (regno) + i]); 182 if (errno != 0) 183 { 184 /* Warning, not error, in case we are attached; sometimes 185 the kernel doesn't let us at the registers. */ 186 char *err = safe_strerror (errno); 187 char *msg = alloca (strlen (err) + 128); 188 sprintf (msg, "writing `%s' register: %s", 189 REGISTER_NAME (regno), err); 190 /* If we fail to write the PC, give a true error instead of 191 just a warning. */ 192 if (regno == HPPA_PCOQ_HEAD_REGNUM || regno == HPPA_PCOQ_TAIL_REGNUM) 193 perror_with_name (msg); 194 else 195 warning (msg); 196 return; 197 } 198 } 199 } 200 else 201 for (regno = 0; regno < NUM_REGS; regno++) 202 store_inferior_registers (regno); 203 } 204 205 206 /* Fetch a register's value from the process's U area. */ 207 static void 208 fetch_register (int regno) 209 { 210 char buf[MAX_REGISTER_SIZE]; 211 unsigned int addr, len, offset; 212 int i; 213 214 offset = 0; 215 len = register_size (current_gdbarch, regno); 216 217 /* Requests for register zero actually want the save_state's 218 ss_flags member. As RM says: "Oh, what a hack!" */ 219 if (regno == 0) 220 { 221 save_state_t ss; 222 addr = HPPAH_OFFSETOF (save_state_t, ss_flags); 223 len = sizeof (ss.ss_flags); 224 225 /* Note that ss_flags is always an int, no matter what 226 register_size (0) says. Assuming all HP-UX PA machines are 227 big-endian, put it at the least significant end of the value, 228 and zap the rest of the buffer. */ 229 offset = register_size (current_gdbarch, 0) - len; 230 memset (buf, 0, sizeof (buf)); 231 } 232 233 /* Floating-point registers come from the ss_fpblock area. */ 234 else if (regno >= HPPA_FP0_REGNUM) 235 addr = (HPPAH_OFFSETOF (save_state_t, ss_fpblock) 236 + (DEPRECATED_REGISTER_BYTE (regno) - DEPRECATED_REGISTER_BYTE (HPPA_FP0_REGNUM))); 237 238 /* Wide registers come from the ss_wide area. 239 I think it's more PC to test (ss_flags & SS_WIDEREGS) to select 240 between ss_wide and ss_narrow than to use the raw register size. 241 But checking ss_flags would require an extra ptrace call for 242 every register reference. Bleah. */ 243 else if (len == 8) 244 addr = (HPPAH_OFFSETOF (save_state_t, ss_wide) 245 + DEPRECATED_REGISTER_BYTE (regno)); 246 247 /* Narrow registers come from the ss_narrow area. Note that 248 ss_narrow starts with gr1, not gr0. */ 249 else if (len == 4) 250 addr = (HPPAH_OFFSETOF (save_state_t, ss_narrow) 251 + (DEPRECATED_REGISTER_BYTE (regno) - DEPRECATED_REGISTER_BYTE (1))); 252 253 else 254 internal_error (__FILE__, __LINE__, 255 "hppa-nat.c (fetch_register): unexpected register size"); 256 257 for (i = 0; i < len; i += sizeof (int)) 258 { 259 errno = 0; 260 /* Copy an int from the U area to buf. Fill the least 261 significant end if len != raw_size. */ 262 * (int *) &buf[offset + i] = 263 call_ptrace (PT_RUREGS, PIDGET (inferior_ptid), 264 (PTRACE_ARG3_TYPE) addr + i, 0); 265 if (errno != 0) 266 { 267 /* Warning, not error, in case we are attached; sometimes 268 the kernel doesn't let us at the registers. */ 269 char *err = safe_strerror (errno); 270 char *msg = alloca (strlen (err) + 128); 271 sprintf (msg, "reading `%s' register: %s", 272 REGISTER_NAME (regno), err); 273 warning (msg); 274 return; 275 } 276 } 277 278 /* If we're reading an address from the instruction address queue, 279 mask out the bottom two bits --- they contain the privilege 280 level. */ 281 if (regno == HPPA_PCOQ_HEAD_REGNUM || regno == HPPA_PCOQ_TAIL_REGNUM) 282 buf[len - 1] &= ~0x3; 283 284 regcache_raw_supply (current_regcache, regno, buf); 285 } 286 287 288 /* Copy LEN bytes to or from inferior's memory starting at MEMADDR 289 to debugger memory starting at MYADDR. Copy to inferior if 290 WRITE is nonzero. 291 292 Returns the length copied, which is either the LEN argument or 293 zero. This xfer function does not do partial moves, since 294 deprecated_child_ops doesn't allow memory operations to cross below 295 us in the target stack anyway. TARGET is ignored. */ 296 297 int 298 child_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write, 299 struct mem_attrib *mem, 300 struct target_ops *target) 301 { 302 int i; 303 /* Round starting address down to longword boundary. */ 304 CORE_ADDR addr = memaddr & - (CORE_ADDR)(sizeof (int)); 305 /* Round ending address up; get number of longwords that makes. */ 306 int count 307 = (((memaddr + len) - addr) + sizeof (int) - 1) / sizeof (int); 308 309 /* Allocate buffer of that many longwords. 310 Note -- do not use alloca to allocate this buffer since there is no 311 guarantee of when the buffer will actually be deallocated. 312 313 This routine can be called over and over with the same call chain; 314 this (in effect) would pile up all those alloca requests until a call 315 to alloca was made from a point higher than this routine in the 316 call chain. */ 317 int *buffer = (int *) xmalloc (count * sizeof (int)); 318 319 if (write) 320 { 321 /* Fill start and end extra bytes of buffer with existing memory data. */ 322 if (addr != memaddr || len < (int) sizeof (int)) 323 { 324 /* Need part of initial word -- fetch it. */ 325 buffer[0] = call_ptrace (addr < text_end ? PT_RIUSER : PT_RDUSER, 326 PIDGET (inferior_ptid), 327 (PTRACE_ARG3_TYPE) addr, 0); 328 } 329 330 if (count > 1) /* FIXME, avoid if even boundary */ 331 { 332 buffer[count - 1] 333 = call_ptrace (addr < text_end ? PT_RIUSER : PT_RDUSER, 334 PIDGET (inferior_ptid), 335 (PTRACE_ARG3_TYPE) (addr 336 + (count - 1) * sizeof (int)), 337 0); 338 } 339 340 /* Copy data to be written over corresponding part of buffer */ 341 memcpy ((char *) buffer + (memaddr & (sizeof (int) - 1)), myaddr, len); 342 343 /* Write the entire buffer. */ 344 for (i = 0; i < count; i++, addr += sizeof (int)) 345 { 346 int pt_status; 347 int pt_request; 348 /* The HP-UX kernel crashes if you use PT_WDUSER to write into the 349 text segment. FIXME -- does it work to write into the data 350 segment using WIUSER, or do these idiots really expect us to 351 figure out which segment the address is in, so we can use a 352 separate system call for it??! */ 353 errno = 0; 354 pt_request = (addr < text_end) ? PT_WIUSER : PT_WDUSER; 355 pt_status = call_ptrace (pt_request, 356 PIDGET (inferior_ptid), 357 (PTRACE_ARG3_TYPE) addr, 358 buffer[i]); 359 360 /* Did we fail? Might we've guessed wrong about which 361 segment this address resides in? Try the other request, 362 and see if that works... */ 363 if ((pt_status == -1) && errno) 364 { 365 errno = 0; 366 pt_request = (pt_request == PT_WIUSER) ? PT_WDUSER : PT_WIUSER; 367 pt_status = call_ptrace (pt_request, 368 PIDGET (inferior_ptid), 369 (PTRACE_ARG3_TYPE) addr, 370 buffer[i]); 371 372 /* No, we still fail. Okay, time to punt. */ 373 if ((pt_status == -1) && errno) 374 { 375 xfree (buffer); 376 return 0; 377 } 378 } 379 } 380 } 381 else 382 { 383 /* Read all the longwords */ 384 for (i = 0; i < count; i++, addr += sizeof (int)) 385 { 386 errno = 0; 387 buffer[i] = call_ptrace (addr < text_end ? PT_RIUSER : PT_RDUSER, 388 PIDGET (inferior_ptid), 389 (PTRACE_ARG3_TYPE) addr, 0); 390 if (errno) 391 { 392 xfree (buffer); 393 return 0; 394 } 395 QUIT; 396 } 397 398 /* Copy appropriate bytes out of the buffer. */ 399 memcpy (myaddr, (char *) buffer + (memaddr & (sizeof (int) - 1)), len); 400 } 401 xfree (buffer); 402 return len; 403 } 404 405 char *saved_child_execd_pathname = NULL; 406 int saved_vfork_pid; 407 enum { 408 STATE_NONE, 409 STATE_GOT_CHILD, 410 STATE_GOT_EXEC, 411 STATE_GOT_PARENT, 412 STATE_FAKE_EXEC 413 } saved_vfork_state = STATE_NONE; 414 415 int 416 child_follow_fork (int follow_child) 417 { 418 ptid_t last_ptid; 419 struct target_waitstatus last_status; 420 int has_vforked; 421 int parent_pid, child_pid; 422 423 get_last_target_status (&last_ptid, &last_status); 424 has_vforked = (last_status.kind == TARGET_WAITKIND_VFORKED); 425 parent_pid = ptid_get_pid (last_ptid); 426 child_pid = last_status.value.related_pid; 427 428 /* At this point, if we are vforking, breakpoints were already 429 detached from the child in child_wait; and the child has already 430 called execve(). If we are forking, both the parent and child 431 have breakpoints inserted. */ 432 433 if (! follow_child) 434 { 435 if (! has_vforked) 436 { 437 detach_breakpoints (child_pid); 438 #ifdef SOLIB_REMOVE_INFERIOR_HOOK 439 SOLIB_REMOVE_INFERIOR_HOOK (child_pid); 440 #endif 441 } 442 443 /* Detach from the child. */ 444 printf_unfiltered ("Detaching after fork from %s\n", 445 target_pid_to_str (pid_to_ptid (child_pid))); 446 hppa_require_detach (child_pid, 0); 447 448 /* The parent and child of a vfork share the same address space. 449 Also, on some targets the order in which vfork and exec events 450 are received for parent in child requires some delicate handling 451 of the events. 452 453 For instance, on ptrace-based HPUX we receive the child's vfork 454 event first, at which time the parent has been suspended by the 455 OS and is essentially untouchable until the child's exit or second 456 exec event arrives. At that time, the parent's vfork event is 457 delivered to us, and that's when we see and decide how to follow 458 the vfork. But to get to that point, we must continue the child 459 until it execs or exits. To do that smoothly, all breakpoints 460 must be removed from the child, in case there are any set between 461 the vfork() and exec() calls. But removing them from the child 462 also removes them from the parent, due to the shared-address-space 463 nature of a vfork'd parent and child. On HPUX, therefore, we must 464 take care to restore the bp's to the parent before we continue it. 465 Else, it's likely that we may not stop in the expected place. (The 466 worst scenario is when the user tries to step over a vfork() call; 467 the step-resume bp must be restored for the step to properly stop 468 in the parent after the call completes!) 469 470 Sequence of events, as reported to gdb from HPUX: 471 472 Parent Child Action for gdb to take 473 ------------------------------------------------------- 474 1 VFORK Continue child 475 2 EXEC 476 3 EXEC or EXIT 477 4 VFORK 478 479 Now that the child has safely exec'd or exited, we must restore 480 the parent's breakpoints before we continue it. Else, we may 481 cause it run past expected stopping points. */ 482 483 if (has_vforked) 484 reattach_breakpoints (parent_pid); 485 } 486 else 487 { 488 /* Needed to keep the breakpoint lists in sync. */ 489 if (! has_vforked) 490 detach_breakpoints (child_pid); 491 492 /* Before detaching from the parent, remove all breakpoints from it. */ 493 remove_breakpoints (); 494 495 /* Also reset the solib inferior hook from the parent. */ 496 #ifdef SOLIB_REMOVE_INFERIOR_HOOK 497 SOLIB_REMOVE_INFERIOR_HOOK (PIDGET (inferior_ptid)); 498 #endif 499 500 /* Detach from the parent. */ 501 target_detach (NULL, 1); 502 503 /* Attach to the child. */ 504 printf_unfiltered ("Attaching after fork to %s\n", 505 target_pid_to_str (pid_to_ptid (child_pid))); 506 hppa_require_attach (child_pid); 507 inferior_ptid = pid_to_ptid (child_pid); 508 509 /* If we vforked, then we've also execed by now. The exec will be 510 reported momentarily. follow_exec () will handle breakpoints, so 511 we don't have to.. */ 512 if (!has_vforked) 513 follow_inferior_reset_breakpoints (); 514 } 515 516 if (has_vforked) 517 { 518 /* If we followed the parent, don't try to follow the child's exec. */ 519 if (saved_vfork_state != STATE_GOT_PARENT 520 && saved_vfork_state != STATE_FAKE_EXEC) 521 fprintf_unfiltered (gdb_stdout, 522 "hppa: post follow vfork: confused state\n"); 523 524 if (! follow_child || saved_vfork_state == STATE_GOT_PARENT) 525 saved_vfork_state = STATE_NONE; 526 else 527 return 1; 528 } 529 return 0; 530 } 531 532 /* Format a process id, given PID. Be sure to terminate 533 this with a null--it's going to be printed via a "%s". */ 534 char * 535 child_pid_to_str (ptid_t ptid) 536 { 537 /* Static because address returned */ 538 static char buf[30]; 539 pid_t pid = PIDGET (ptid); 540 541 /* Extra NUL for paranoia's sake */ 542 sprintf (buf, "process %d%c", pid, '\0'); 543 544 return buf; 545 } 546 547 /* Format a thread id, given TID. Be sure to terminate 548 this with a null--it's going to be printed via a "%s". 549 550 Note: This is a core-gdb tid, not the actual system tid. 551 See infttrace.c for details. */ 552 char * 553 hppa_tid_to_str (ptid_t ptid) 554 { 555 /* Static because address returned */ 556 static char buf[30]; 557 /* This seems strange, but when I did the ptid conversion, it looked 558 as though a pid was always being passed. - Kevin Buettner */ 559 pid_t tid = PIDGET (ptid); 560 561 /* Extra NULLs for paranoia's sake */ 562 sprintf (buf, "system thread %d%c", tid, '\0'); 563 564 return buf; 565 } 566 567 /*## */ 568 /* Enable HACK for ttrace work. In 569 * infttrace.c/require_notification_of_events, 570 * this is set to 0 so that the loop in child_wait 571 * won't loop. 572 */ 573 int not_same_real_pid = 1; 574 /*## */ 575 576 /* Wait for child to do something. Return pid of child, or -1 in case 577 of error; store status through argument pointer OURSTATUS. */ 578 579 ptid_t 580 child_wait (ptid_t ptid, struct target_waitstatus *ourstatus) 581 { 582 int save_errno; 583 int status; 584 char *execd_pathname = NULL; 585 int exit_status; 586 int related_pid; 587 int syscall_id; 588 enum target_waitkind kind; 589 int pid; 590 591 if (saved_vfork_state == STATE_FAKE_EXEC) 592 { 593 saved_vfork_state = STATE_NONE; 594 ourstatus->kind = TARGET_WAITKIND_EXECD; 595 ourstatus->value.execd_pathname = saved_child_execd_pathname; 596 return inferior_ptid; 597 } 598 599 do 600 { 601 set_sigint_trap (); /* Causes SIGINT to be passed on to the 602 attached process. */ 603 set_sigio_trap (); 604 605 pid = ptrace_wait (inferior_ptid, &status); 606 607 save_errno = errno; 608 609 clear_sigio_trap (); 610 611 clear_sigint_trap (); 612 613 if (pid == -1) 614 { 615 if (save_errno == EINTR) 616 continue; 617 618 fprintf_unfiltered (gdb_stderr, "Child process unexpectedly missing: %s.\n", 619 safe_strerror (save_errno)); 620 621 /* Claim it exited with unknown signal. */ 622 ourstatus->kind = TARGET_WAITKIND_SIGNALLED; 623 ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN; 624 return pid_to_ptid (-1); 625 } 626 627 /* Did it exit? 628 */ 629 if (target_has_exited (pid, status, &exit_status)) 630 { 631 /* ??rehrauer: For now, ignore this. */ 632 continue; 633 } 634 635 if (!target_thread_alive (pid_to_ptid (pid))) 636 { 637 ourstatus->kind = TARGET_WAITKIND_SPURIOUS; 638 return pid_to_ptid (pid); 639 } 640 641 if (hpux_has_forked (pid, &related_pid)) 642 { 643 /* Ignore the parent's fork event. */ 644 if (pid == PIDGET (inferior_ptid)) 645 { 646 ourstatus->kind = TARGET_WAITKIND_IGNORE; 647 return inferior_ptid; 648 } 649 650 /* If this is the child's fork event, report that the 651 process has forked. */ 652 if (related_pid == PIDGET (inferior_ptid)) 653 { 654 ourstatus->kind = TARGET_WAITKIND_FORKED; 655 ourstatus->value.related_pid = pid; 656 return inferior_ptid; 657 } 658 } 659 660 if (hpux_has_vforked (pid, &related_pid)) 661 { 662 if (pid == PIDGET (inferior_ptid)) 663 { 664 if (saved_vfork_state == STATE_GOT_CHILD) 665 saved_vfork_state = STATE_GOT_PARENT; 666 else if (saved_vfork_state == STATE_GOT_EXEC) 667 saved_vfork_state = STATE_FAKE_EXEC; 668 else 669 fprintf_unfiltered (gdb_stdout, 670 "hppah: parent vfork: confused\n"); 671 } 672 else if (related_pid == PIDGET (inferior_ptid)) 673 { 674 if (saved_vfork_state == STATE_NONE) 675 saved_vfork_state = STATE_GOT_CHILD; 676 else 677 fprintf_unfiltered (gdb_stdout, 678 "hppah: child vfork: confused\n"); 679 } 680 else 681 fprintf_unfiltered (gdb_stdout, 682 "hppah: unknown vfork: confused\n"); 683 684 if (saved_vfork_state == STATE_GOT_CHILD) 685 { 686 child_post_startup_inferior (pid_to_ptid (pid)); 687 detach_breakpoints (pid); 688 #ifdef SOLIB_REMOVE_INFERIOR_HOOK 689 SOLIB_REMOVE_INFERIOR_HOOK (pid); 690 #endif 691 child_resume (pid_to_ptid (pid), 0, TARGET_SIGNAL_0); 692 ourstatus->kind = TARGET_WAITKIND_IGNORE; 693 return pid_to_ptid (related_pid); 694 } 695 else if (saved_vfork_state == STATE_FAKE_EXEC) 696 { 697 ourstatus->kind = TARGET_WAITKIND_VFORKED; 698 ourstatus->value.related_pid = related_pid; 699 return pid_to_ptid (pid); 700 } 701 else 702 { 703 /* We saw the parent's vfork, but we haven't seen the exec yet. 704 Wait for it, for simplicity's sake. It should be pending. */ 705 saved_vfork_pid = related_pid; 706 ourstatus->kind = TARGET_WAITKIND_IGNORE; 707 return pid_to_ptid (pid); 708 } 709 } 710 711 if (hpux_has_execd (pid, &execd_pathname)) 712 { 713 /* On HP-UX, events associated with a vforking inferior come in 714 threes: a vfork event for the child (always first), followed 715 a vfork event for the parent and an exec event for the child. 716 The latter two can come in either order. Make sure we get 717 both. */ 718 if (saved_vfork_state != STATE_NONE) 719 { 720 if (saved_vfork_state == STATE_GOT_CHILD) 721 { 722 saved_vfork_state = STATE_GOT_EXEC; 723 /* On HP/UX with ptrace, the child must be resumed before 724 the parent vfork event is delivered. A single-step 725 suffices. */ 726 if (RESUME_EXECD_VFORKING_CHILD_TO_GET_PARENT_VFORK ()) 727 target_resume (pid_to_ptid (pid), 1, TARGET_SIGNAL_0); 728 ourstatus->kind = TARGET_WAITKIND_IGNORE; 729 } 730 else if (saved_vfork_state == STATE_GOT_PARENT) 731 { 732 saved_vfork_state = STATE_FAKE_EXEC; 733 ourstatus->kind = TARGET_WAITKIND_VFORKED; 734 ourstatus->value.related_pid = saved_vfork_pid; 735 } 736 else 737 fprintf_unfiltered (gdb_stdout, 738 "hppa: exec: unexpected state\n"); 739 740 saved_child_execd_pathname = execd_pathname; 741 742 return inferior_ptid; 743 } 744 745 /* Are we ignoring initial exec events? (This is likely because 746 we're in the process of starting up the inferior, and another 747 (older) mechanism handles those.) If so, we'll report this 748 as a regular stop, not an exec. 749 */ 750 if (inferior_ignoring_startup_exec_events) 751 { 752 inferior_ignoring_startup_exec_events--; 753 } 754 else 755 { 756 ourstatus->kind = TARGET_WAITKIND_EXECD; 757 ourstatus->value.execd_pathname = execd_pathname; 758 return pid_to_ptid (pid); 759 } 760 } 761 762 /* All we must do with these is communicate their occurrence 763 to wait_for_inferior... 764 */ 765 if (hpux_has_syscall_event (pid, &kind, &syscall_id)) 766 { 767 ourstatus->kind = kind; 768 ourstatus->value.syscall_id = syscall_id; 769 return pid_to_ptid (pid); 770 } 771 772 /*## } while (pid != PIDGET (inferior_ptid)); ## *//* Some other child died or stopped */ 773 /* hack for thread testing */ 774 } 775 while ((pid != PIDGET (inferior_ptid)) && not_same_real_pid); 776 /*## */ 777 778 store_waitstatus (ourstatus, status); 779 return pid_to_ptid (pid); 780 } 781 782 #if !defined (GDB_NATIVE_HPUX_11) 783 784 /* The following code is a substitute for the infttrace.c versions used 785 with ttrace() in HPUX 11. */ 786 787 /* This value is an arbitrary integer. */ 788 #define PT_VERSION 123456 789 790 /* This semaphore is used to coordinate the child and parent processes 791 after a fork(), and before an exec() by the child. See 792 parent_attach_all for details. */ 793 794 typedef struct 795 { 796 int parent_channel[2]; /* Parent "talks" to [1], child "listens" to [0] */ 797 int child_channel[2]; /* Child "talks" to [1], parent "listens" to [0] */ 798 } 799 startup_semaphore_t; 800 801 #define SEM_TALK (1) 802 #define SEM_LISTEN (0) 803 804 static startup_semaphore_t startup_semaphore; 805 806 #ifdef PT_SETTRC 807 /* This function causes the caller's process to be traced by its 808 parent. This is intended to be called after GDB forks itself, 809 and before the child execs the target. 810 811 Note that HP-UX ptrace is rather funky in how this is done. 812 If the parent wants to get the initial exec event of a child, 813 it must set the ptrace event mask of the child to include execs. 814 (The child cannot do this itself.) This must be done after the 815 child is forked, but before it execs. 816 817 To coordinate the parent and child, we implement a semaphore using 818 pipes. After SETTRC'ing itself, the child tells the parent that 819 it is now traceable by the parent, and waits for the parent's 820 acknowledgement. The parent can then set the child's event mask, 821 and notify the child that it can now exec. 822 823 (The acknowledgement by parent happens as a result of a call to 824 child_acknowledge_created_inferior.) */ 825 826 int 827 parent_attach_all (int pid, PTRACE_ARG3_TYPE addr, int data) 828 { 829 int pt_status = 0; 830 831 /* We need a memory home for a constant. */ 832 int tc_magic_child = PT_VERSION; 833 int tc_magic_parent = 0; 834 835 /* The remainder of this function is only useful for HPUX 10.0 and 836 later, as it depends upon the ability to request notification 837 of specific kinds of events by the kernel. */ 838 #if defined(PT_SET_EVENT_MASK) 839 840 /* Notify the parent that we're potentially ready to exec(). */ 841 write (startup_semaphore.child_channel[SEM_TALK], 842 &tc_magic_child, 843 sizeof (tc_magic_child)); 844 845 /* Wait for acknowledgement from the parent. */ 846 read (startup_semaphore.parent_channel[SEM_LISTEN], 847 &tc_magic_parent, 848 sizeof (tc_magic_parent)); 849 if (tc_magic_child != tc_magic_parent) 850 warning ("mismatched semaphore magic"); 851 852 /* Discard our copy of the semaphore. */ 853 (void) close (startup_semaphore.parent_channel[SEM_LISTEN]); 854 (void) close (startup_semaphore.parent_channel[SEM_TALK]); 855 (void) close (startup_semaphore.child_channel[SEM_LISTEN]); 856 (void) close (startup_semaphore.child_channel[SEM_TALK]); 857 #endif 858 859 return 0; 860 } 861 #endif 862 863 int 864 hppa_require_attach (int pid) 865 { 866 int pt_status; 867 CORE_ADDR pc; 868 CORE_ADDR pc_addr; 869 unsigned int regs_offset; 870 871 /* Are we already attached? There appears to be no explicit way to 872 answer this via ptrace, so we try something which should be 873 innocuous if we are attached. If that fails, then we assume 874 we're not attached, and so attempt to make it so. */ 875 876 errno = 0; 877 regs_offset = U_REGS_OFFSET; 878 pc_addr = register_addr (PC_REGNUM, regs_offset); 879 pc = call_ptrace (PT_READ_U, pid, (PTRACE_ARG3_TYPE) pc_addr, 0); 880 881 if (errno) 882 { 883 errno = 0; 884 pt_status = call_ptrace (PT_ATTACH, pid, (PTRACE_ARG3_TYPE) 0, 0); 885 886 if (errno) 887 return -1; 888 889 /* Now we really are attached. */ 890 errno = 0; 891 } 892 attach_flag = 1; 893 return pid; 894 } 895 896 int 897 hppa_require_detach (int pid, int signal) 898 { 899 errno = 0; 900 call_ptrace (PT_DETACH, pid, (PTRACE_ARG3_TYPE) 1, signal); 901 errno = 0; /* Ignore any errors. */ 902 return pid; 903 } 904 905 /* Since ptrace doesn't support memory page-protection events, which 906 are used to implement "hardware" watchpoints on HP-UX, these are 907 dummy versions, which perform no useful work. */ 908 909 void 910 hppa_enable_page_protection_events (int pid) 911 { 912 } 913 914 void 915 hppa_disable_page_protection_events (int pid) 916 { 917 } 918 919 int 920 hppa_insert_hw_watchpoint (int pid, CORE_ADDR start, LONGEST len, int type) 921 { 922 error ("Hardware watchpoints not implemented on this platform."); 923 } 924 925 int 926 hppa_remove_hw_watchpoint (int pid, CORE_ADDR start, LONGEST len, int type) 927 { 928 error ("Hardware watchpoints not implemented on this platform."); 929 } 930 931 int 932 hppa_can_use_hw_watchpoint (int type, int cnt, int ot) 933 { 934 return 0; 935 } 936 937 int 938 hppa_range_profitable_for_hw_watchpoint (int pid, CORE_ADDR start, LONGEST len) 939 { 940 error ("Hardware watchpoints not implemented on this platform."); 941 } 942 943 char * 944 hppa_pid_or_tid_to_str (ptid_t id) 945 { 946 /* In the ptrace world, there are only processes. */ 947 return child_pid_to_str (id); 948 } 949 950 void 951 hppa_ensure_vforking_parent_remains_stopped (int pid) 952 { 953 /* This assumes that the vforked parent is presently stopped, and 954 that the vforked child has just delivered its first exec event. 955 Calling kill() this way will cause the SIGTRAP to be delivered as 956 soon as the parent is resumed, which happens as soon as the 957 vforked child is resumed. See wait_for_inferior for the use of 958 this function. */ 959 kill (pid, SIGTRAP); 960 } 961 962 int 963 hppa_resume_execd_vforking_child_to_get_parent_vfork (void) 964 { 965 return 1; /* Yes, the child must be resumed. */ 966 } 967 968 void 969 require_notification_of_events (int pid) 970 { 971 #if defined(PT_SET_EVENT_MASK) 972 int pt_status; 973 ptrace_event_t ptrace_events; 974 int nsigs; 975 int signum; 976 977 /* Instruct the kernel as to the set of events we wish to be 978 informed of. (This support does not exist before HPUX 10.0. 979 We'll assume if PT_SET_EVENT_MASK has not been defined by 980 <sys/ptrace.h>, then we're being built on pre-10.0.) */ 981 memset (&ptrace_events, 0, sizeof (ptrace_events)); 982 983 /* Note: By default, all signals are visible to us. If we wish 984 the kernel to keep certain signals hidden from us, we do it 985 by calling sigdelset (ptrace_events.pe_signals, signal) for 986 each such signal here, before doing PT_SET_EVENT_MASK. */ 987 /* RM: The above comment is no longer true. We start with ignoring 988 all signals, and then add the ones we are interested in. We could 989 do it the other way: start by looking at all signals and then 990 deleting the ones that we aren't interested in, except that 991 multiple gdb signals may be mapped to the same host signal 992 (eg. TARGET_SIGNAL_IO and TARGET_SIGNAL_POLL both get mapped to 993 signal 22 on HPUX 10.20) We want to be notified if we are 994 interested in either signal. */ 995 sigfillset (&ptrace_events.pe_signals); 996 997 /* RM: Let's not bother with signals we don't care about */ 998 nsigs = (int) TARGET_SIGNAL_LAST; 999 for (signum = nsigs; signum > 0; signum--) 1000 { 1001 if ((signal_stop_state (signum)) || 1002 (signal_print_state (signum)) || 1003 (!signal_pass_state (signum))) 1004 { 1005 if (target_signal_to_host_p (signum)) 1006 sigdelset (&ptrace_events.pe_signals, 1007 target_signal_to_host (signum)); 1008 } 1009 } 1010 1011 ptrace_events.pe_set_event = 0; 1012 1013 ptrace_events.pe_set_event |= PTRACE_SIGNAL; 1014 ptrace_events.pe_set_event |= PTRACE_EXEC; 1015 ptrace_events.pe_set_event |= PTRACE_FORK; 1016 ptrace_events.pe_set_event |= PTRACE_VFORK; 1017 /* ??rehrauer: Add this one when we're prepared to catch it... 1018 ptrace_events.pe_set_event |= PTRACE_EXIT; 1019 */ 1020 1021 errno = 0; 1022 pt_status = call_ptrace (PT_SET_EVENT_MASK, 1023 pid, 1024 (PTRACE_ARG3_TYPE) & ptrace_events, 1025 sizeof (ptrace_events)); 1026 if (errno) 1027 perror_with_name ("ptrace"); 1028 if (pt_status < 0) 1029 return; 1030 #endif 1031 } 1032 1033 void 1034 require_notification_of_exec_events (int pid) 1035 { 1036 #if defined(PT_SET_EVENT_MASK) 1037 int pt_status; 1038 ptrace_event_t ptrace_events; 1039 1040 /* Instruct the kernel as to the set of events we wish to be 1041 informed of. (This support does not exist before HPUX 10.0. 1042 We'll assume if PT_SET_EVENT_MASK has not been defined by 1043 <sys/ptrace.h>, then we're being built on pre-10.0.) */ 1044 memset (&ptrace_events, 0, sizeof (ptrace_events)); 1045 1046 /* Note: By default, all signals are visible to us. If we wish 1047 the kernel to keep certain signals hidden from us, we do it 1048 by calling sigdelset (ptrace_events.pe_signals, signal) for 1049 each such signal here, before doing PT_SET_EVENT_MASK. */ 1050 sigemptyset (&ptrace_events.pe_signals); 1051 1052 ptrace_events.pe_set_event = 0; 1053 1054 ptrace_events.pe_set_event |= PTRACE_EXEC; 1055 /* ??rehrauer: Add this one when we're prepared to catch it... 1056 ptrace_events.pe_set_event |= PTRACE_EXIT; 1057 */ 1058 1059 errno = 0; 1060 pt_status = call_ptrace (PT_SET_EVENT_MASK, 1061 pid, 1062 (PTRACE_ARG3_TYPE) & ptrace_events, 1063 sizeof (ptrace_events)); 1064 if (errno) 1065 perror_with_name ("ptrace"); 1066 if (pt_status < 0) 1067 return; 1068 #endif 1069 } 1070 1071 /* This function is called by the parent process, with pid being the 1072 ID of the child process, after the debugger has forked. */ 1073 1074 void 1075 child_acknowledge_created_inferior (int pid) 1076 { 1077 /* We need a memory home for a constant. */ 1078 int tc_magic_parent = PT_VERSION; 1079 int tc_magic_child = 0; 1080 1081 /* The remainder of this function is only useful for HPUX 10.0 and 1082 later, as it depends upon the ability to request notification 1083 of specific kinds of events by the kernel. */ 1084 #if defined(PT_SET_EVENT_MASK) 1085 /* Wait for the child to tell us that it has forked. */ 1086 read (startup_semaphore.child_channel[SEM_LISTEN], 1087 &tc_magic_child, 1088 sizeof (tc_magic_child)); 1089 1090 /* Notify the child that it can exec. 1091 1092 In the infttrace.c variant of this function, we set the child's 1093 event mask after the fork but before the exec. In the ptrace 1094 world, it seems we can't set the event mask until after the exec. */ 1095 write (startup_semaphore.parent_channel[SEM_TALK], 1096 &tc_magic_parent, 1097 sizeof (tc_magic_parent)); 1098 1099 /* We'd better pause a bit before trying to set the event mask, 1100 though, to ensure that the exec has happened. We don't want to 1101 wait() on the child, because that'll screw up the upper layers 1102 of gdb's execution control that expect to see the exec event. 1103 1104 After an exec, the child is no longer executing gdb code. Hence, 1105 we can't have yet another synchronization via the pipes. We'll 1106 just sleep for a second, and hope that's enough delay... */ 1107 sleep (1); 1108 1109 /* Instruct the kernel as to the set of events we wish to be 1110 informed of. */ 1111 require_notification_of_exec_events (pid); 1112 1113 /* Discard our copy of the semaphore. */ 1114 (void) close (startup_semaphore.parent_channel[SEM_LISTEN]); 1115 (void) close (startup_semaphore.parent_channel[SEM_TALK]); 1116 (void) close (startup_semaphore.child_channel[SEM_LISTEN]); 1117 (void) close (startup_semaphore.child_channel[SEM_TALK]); 1118 #endif 1119 } 1120 1121 void 1122 child_post_startup_inferior (ptid_t ptid) 1123 { 1124 require_notification_of_events (PIDGET (ptid)); 1125 } 1126 1127 void 1128 child_post_attach (int pid) 1129 { 1130 require_notification_of_events (pid); 1131 } 1132 1133 int 1134 child_insert_fork_catchpoint (int pid) 1135 { 1136 /* This request is only available on HPUX 10.0 and later. */ 1137 #if !defined(PT_SET_EVENT_MASK) 1138 error ("Unable to catch forks prior to HPUX 10.0"); 1139 #else 1140 /* Enable reporting of fork events from the kernel. */ 1141 /* ??rehrauer: For the moment, we're always enabling these events, 1142 and just ignoring them if there's no catchpoint to catch them. */ 1143 return 0; 1144 #endif 1145 } 1146 1147 int 1148 child_remove_fork_catchpoint (int pid) 1149 { 1150 /* This request is only available on HPUX 10.0 and later. */ 1151 #if !defined(PT_SET_EVENT_MASK) 1152 error ("Unable to catch forks prior to HPUX 10.0"); 1153 #else 1154 /* Disable reporting of fork events from the kernel. */ 1155 /* ??rehrauer: For the moment, we're always enabling these events, 1156 and just ignoring them if there's no catchpoint to catch them. */ 1157 return 0; 1158 #endif 1159 } 1160 1161 int 1162 child_insert_vfork_catchpoint (int pid) 1163 { 1164 /* This request is only available on HPUX 10.0 and later. */ 1165 #if !defined(PT_SET_EVENT_MASK) 1166 error ("Unable to catch vforks prior to HPUX 10.0"); 1167 #else 1168 /* Enable reporting of vfork events from the kernel. */ 1169 /* ??rehrauer: For the moment, we're always enabling these events, 1170 and just ignoring them if there's no catchpoint to catch them. */ 1171 return 0; 1172 #endif 1173 } 1174 1175 int 1176 child_remove_vfork_catchpoint (int pid) 1177 { 1178 /* This request is only available on HPUX 10.0 and later. */ 1179 #if !defined(PT_SET_EVENT_MASK) 1180 error ("Unable to catch vforks prior to HPUX 10.0"); 1181 #else 1182 /* Disable reporting of vfork events from the kernel. */ 1183 /* ??rehrauer: For the moment, we're always enabling these events, 1184 and just ignoring them if there's no catchpoint to catch them. */ 1185 return 0; 1186 #endif 1187 } 1188 1189 int 1190 hpux_has_forked (int pid, int *childpid) 1191 { 1192 /* This request is only available on HPUX 10.0 and later. */ 1193 #if !defined(PT_GET_PROCESS_STATE) 1194 *childpid = 0; 1195 return 0; 1196 #else 1197 int pt_status; 1198 ptrace_state_t ptrace_state; 1199 1200 errno = 0; 1201 pt_status = call_ptrace (PT_GET_PROCESS_STATE, 1202 pid, 1203 (PTRACE_ARG3_TYPE) & ptrace_state, 1204 sizeof (ptrace_state)); 1205 if (errno) 1206 perror_with_name ("ptrace"); 1207 if (pt_status < 0) 1208 return 0; 1209 1210 if (ptrace_state.pe_report_event & PTRACE_FORK) 1211 { 1212 *childpid = ptrace_state.pe_other_pid; 1213 return 1; 1214 } 1215 1216 return 0; 1217 #endif 1218 } 1219 1220 int 1221 hpux_has_vforked (int pid, int *childpid) 1222 { 1223 /* This request is only available on HPUX 10.0 and later. */ 1224 #if !defined(PT_GET_PROCESS_STATE) 1225 *childpid = 0; 1226 return 0; 1227 1228 #else 1229 int pt_status; 1230 ptrace_state_t ptrace_state; 1231 1232 errno = 0; 1233 pt_status = call_ptrace (PT_GET_PROCESS_STATE, 1234 pid, 1235 (PTRACE_ARG3_TYPE) & ptrace_state, 1236 sizeof (ptrace_state)); 1237 if (errno) 1238 perror_with_name ("ptrace"); 1239 if (pt_status < 0) 1240 return 0; 1241 1242 if (ptrace_state.pe_report_event & PTRACE_VFORK) 1243 { 1244 *childpid = ptrace_state.pe_other_pid; 1245 return 1; 1246 } 1247 1248 return 0; 1249 #endif 1250 } 1251 1252 int 1253 child_insert_exec_catchpoint (int pid) 1254 { 1255 /* This request is only available on HPUX 10.0 and later. */ 1256 #if !defined(PT_SET_EVENT_MASK) 1257 error ("Unable to catch execs prior to HPUX 10.0"); 1258 1259 #else 1260 /* Enable reporting of exec events from the kernel. */ 1261 /* ??rehrauer: For the moment, we're always enabling these events, 1262 and just ignoring them if there's no catchpoint to catch them. */ 1263 return 0; 1264 #endif 1265 } 1266 1267 int 1268 child_remove_exec_catchpoint (int pid) 1269 { 1270 /* This request is only available on HPUX 10.0 and later. */ 1271 #if !defined(PT_SET_EVENT_MASK) 1272 error ("Unable to catch execs prior to HPUX 10.0"); 1273 1274 #else 1275 /* Disable reporting of exec events from the kernel. */ 1276 /* ??rehrauer: For the moment, we're always enabling these events, 1277 and just ignoring them if there's no catchpoint to catch them. */ 1278 return 0; 1279 #endif 1280 } 1281 1282 int 1283 hpux_has_execd (int pid, char **execd_pathname) 1284 { 1285 /* This request is only available on HPUX 10.0 and later. */ 1286 #if !defined(PT_GET_PROCESS_STATE) 1287 *execd_pathname = NULL; 1288 return 0; 1289 1290 #else 1291 int pt_status; 1292 ptrace_state_t ptrace_state; 1293 1294 errno = 0; 1295 pt_status = call_ptrace (PT_GET_PROCESS_STATE, 1296 pid, 1297 (PTRACE_ARG3_TYPE) & ptrace_state, 1298 sizeof (ptrace_state)); 1299 if (errno) 1300 perror_with_name ("ptrace"); 1301 if (pt_status < 0) 1302 return 0; 1303 1304 if (ptrace_state.pe_report_event & PTRACE_EXEC) 1305 { 1306 char *exec_file = target_pid_to_exec_file (pid); 1307 *execd_pathname = savestring (exec_file, strlen (exec_file)); 1308 return 1; 1309 } 1310 1311 return 0; 1312 #endif 1313 } 1314 1315 int 1316 child_reported_exec_events_per_exec_call (void) 1317 { 1318 return 2; /* ptrace reports the event twice per call. */ 1319 } 1320 1321 int 1322 hpux_has_syscall_event (int pid, enum target_waitkind *kind, int *syscall_id) 1323 { 1324 /* This request is only available on HPUX 10.30 and later, via 1325 the ttrace interface. */ 1326 1327 *kind = TARGET_WAITKIND_SPURIOUS; 1328 *syscall_id = -1; 1329 return 0; 1330 } 1331 1332 char * 1333 child_pid_to_exec_file (int pid) 1334 { 1335 static char exec_file_buffer[1024]; 1336 int pt_status; 1337 CORE_ADDR top_of_stack; 1338 char four_chars[4]; 1339 int name_index; 1340 int i; 1341 ptid_t saved_inferior_ptid; 1342 int done; 1343 1344 #ifdef PT_GET_PROCESS_PATHNAME 1345 /* As of 10.x HP-UX, there's an explicit request to get the pathname. */ 1346 pt_status = call_ptrace (PT_GET_PROCESS_PATHNAME, 1347 pid, 1348 (PTRACE_ARG3_TYPE) exec_file_buffer, 1349 sizeof (exec_file_buffer) - 1); 1350 if (pt_status == 0) 1351 return exec_file_buffer; 1352 #endif 1353 1354 /* It appears that this request is broken prior to 10.30. 1355 If it fails, try a really, truly amazingly gross hack 1356 that DDE uses, of pawing through the process' data 1357 segment to find the pathname. */ 1358 1359 top_of_stack = 0x7b03a000; 1360 name_index = 0; 1361 done = 0; 1362 1363 /* On the chance that pid != inferior_ptid, set inferior_ptid 1364 to pid, so that (grrrr!) implicit uses of inferior_ptid get 1365 the right id. */ 1366 1367 saved_inferior_ptid = inferior_ptid; 1368 inferior_ptid = pid_to_ptid (pid); 1369 1370 /* Try to grab a null-terminated string. */ 1371 while (!done) 1372 { 1373 if (target_read_memory (top_of_stack, four_chars, 4) != 0) 1374 { 1375 inferior_ptid = saved_inferior_ptid; 1376 return NULL; 1377 } 1378 for (i = 0; i < 4; i++) 1379 { 1380 exec_file_buffer[name_index++] = four_chars[i]; 1381 done = (four_chars[i] == '\0'); 1382 if (done) 1383 break; 1384 } 1385 top_of_stack += 4; 1386 } 1387 1388 if (exec_file_buffer[0] == '\0') 1389 { 1390 inferior_ptid = saved_inferior_ptid; 1391 return NULL; 1392 } 1393 1394 inferior_ptid = saved_inferior_ptid; 1395 return exec_file_buffer; 1396 } 1397 1398 void 1399 pre_fork_inferior (void) 1400 { 1401 int status; 1402 1403 status = pipe (startup_semaphore.parent_channel); 1404 if (status < 0) 1405 { 1406 warning ("error getting parent pipe for startup semaphore"); 1407 return; 1408 } 1409 1410 status = pipe (startup_semaphore.child_channel); 1411 if (status < 0) 1412 { 1413 warning ("error getting child pipe for startup semaphore"); 1414 return; 1415 } 1416 } 1417 1418 1419 /* Check to see if the given thread is alive. 1420 1421 This is a no-op, as ptrace doesn't support threads, so we just 1422 return "TRUE". */ 1423 1424 int 1425 child_thread_alive (ptid_t ptid) 1426 { 1427 return 1; 1428 } 1429 1430 #endif /* ! GDB_NATIVE_HPUX_11 */ 1431