1 /* Low level Unix child interface to ttrace, for GDB when running under HP-UX. 2 3 Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 4 1998, 1999, 2000, 2001, 2003, 2004 Free Software Foundation, Inc. 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 2 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, write to the Free Software 20 Foundation, Inc., 59 Temple Place - Suite 330, 21 Boston, MA 02111-1307, USA. */ 22 23 #include "defs.h" 24 #include "frame.h" 25 #include "inferior.h" 26 #include "target.h" 27 #include "gdb_string.h" 28 #include "gdb_wait.h" 29 #include "command.h" 30 #include "gdbthread.h" 31 #include "infttrace.h" 32 33 /* We need pstat functionality so that we can get the exec file 34 for a process we attach to. 35 36 According to HP, we should use the 64bit interfaces, so we 37 define _PSTAT64 to achieve this. */ 38 #define _PSTAT64 39 #include <sys/pstat.h> 40 41 /* Some hackery to work around a use of the #define name NO_FLAGS 42 * in both gdb and HPUX (bfd.h and /usr/include/machine/vmparam.h). 43 */ 44 #ifdef NO_FLAGS 45 #define INFTTRACE_TEMP_HACK NO_FLAGS 46 #undef NO_FLAGS 47 #endif 48 49 #include <sys/param.h> 50 #include <sys/dir.h> 51 #include <signal.h> 52 #include <sys/ioctl.h> 53 54 #include <sys/ttrace.h> 55 #include <sys/mman.h> 56 57 #ifndef NO_PTRACE_H 58 #ifdef PTRACE_IN_WRONG_PLACE 59 #include <ptrace.h> 60 #else 61 #include <sys/ptrace.h> 62 #endif 63 #endif /* NO_PTRACE_H */ 64 65 /* Second half of the hackery above. Non-ANSI C, so 66 * we can't use "#error", alas. 67 */ 68 #ifdef NO_FLAGS 69 #if (NO_FLAGS != INFTTRACE_TEMP_HACK ) 70 /* #error "Hackery to remove warning didn't work right" */ 71 #else 72 /* Ok, new def'n of NO_FLAGS is same as old one; no action needed. */ 73 #endif 74 #else 75 /* #error "Didn't get expected re-definition of NO_FLAGS" */ 76 #define NO_FLAGS INFTTRACE_TEMP_HACK 77 #endif 78 79 #if !defined (PT_SETTRC) 80 #define PT_SETTRC 0 /* Make process traceable by parent */ 81 #endif 82 #if !defined (PT_READ_I) 83 #define PT_READ_I 1 /* Read word from text space */ 84 #endif 85 #if !defined (PT_READ_D) 86 #define PT_READ_D 2 /* Read word from data space */ 87 #endif 88 #if !defined (PT_READ_U) 89 #define PT_READ_U 3 /* Read word from kernel user struct */ 90 #endif 91 #if !defined (PT_WRITE_I) 92 #define PT_WRITE_I 4 /* Write word to text space */ 93 #endif 94 #if !defined (PT_WRITE_D) 95 #define PT_WRITE_D 5 /* Write word to data space */ 96 #endif 97 #if !defined (PT_WRITE_U) 98 #define PT_WRITE_U 6 /* Write word to kernel user struct */ 99 #endif 100 #if !defined (PT_CONTINUE) 101 #define PT_CONTINUE 7 /* Continue after signal */ 102 #endif 103 #if !defined (PT_STEP) 104 #define PT_STEP 9 /* Set flag for single stepping */ 105 #endif 106 #if !defined (PT_KILL) 107 #define PT_KILL 8 /* Send child a SIGKILL signal */ 108 #endif 109 110 #ifndef PT_ATTACH 111 #define PT_ATTACH PTRACE_ATTACH 112 #endif 113 #ifndef PT_DETACH 114 #define PT_DETACH PTRACE_DETACH 115 #endif 116 117 #include "gdbcore.h" 118 #ifdef HAVE_SYS_FILE_H 119 #include <sys/file.h> 120 #endif 121 122 /* This semaphore is used to coordinate the child and parent processes 123 after a fork(), and before an exec() by the child. See parent_attach_all 124 for details. 125 */ 126 typedef struct 127 { 128 int parent_channel[2]; /* Parent "talks" to [1], child "listens" to [0] */ 129 int child_channel[2]; /* Child "talks" to [1], parent "listens" to [0] */ 130 } 131 startup_semaphore_t; 132 133 #define SEM_TALK (1) 134 #define SEM_LISTEN (0) 135 136 static startup_semaphore_t startup_semaphore; 137 138 /* See can_touch_threads_of_process for details. */ 139 static int vforking_child_pid = 0; 140 static int vfork_in_flight = 0; 141 142 /* 1 if ok as results of a ttrace or ttrace_wait call, 0 otherwise. 143 */ 144 #define TT_OK( _status, _errno ) \ 145 (((_status) == 1) && ((_errno) == 0)) 146 147 #define TTRACE_ARG_TYPE uint64_t 148 149 /* When supplied as the "addr" operand, ttrace interprets this 150 to mean, "from the current address". 151 */ 152 #define TT_USE_CURRENT_PC ((TTRACE_ARG_TYPE) TT_NOPC) 153 154 /* When supplied as the "addr", "data" or "addr2" operand for most 155 requests, ttrace interprets this to mean, "pay no heed to this 156 argument". 157 */ 158 #define TT_NIL ((TTRACE_ARG_TYPE) TT_NULLARG) 159 160 /* This is capable of holding the value of a 32-bit register. The 161 value is always left-aligned in the buffer; i.e., [0] contains 162 the most-significant byte of the register's value, and [sizeof(reg)] 163 contains the least-significant value. 164 165 ??rehrauer: Yes, this assumes that an int is 32-bits on HP-UX, and 166 that registers are 32-bits on HP-UX. The latter assumption changes 167 with PA2.0. 168 */ 169 typedef int register_value_t; 170 171 /******************************************************************** 172 173 How this works: 174 175 1. Thread numbers 176 177 The rest of GDB sees threads as being things with different 178 "pid" (process id) values. See "thread.c" for details. The 179 separate threads will be seen and reacted to if infttrace passes 180 back different pid values (for _events_). See wait_for_inferior 181 in inftarg.c. 182 183 So infttrace is going to use thread ids externally, pretending 184 they are process ids, and keep track internally so that it can 185 use the real process id (and thread id) when calling ttrace. 186 187 The data structure that supports this is a linked list of the 188 current threads. Since at some date infttrace will have to 189 deal with multiple processes, each list element records its 190 corresponding pid, rather than having a single global. 191 192 Note that the list is only approximately current; that's ok, as 193 it's up to date when we need it (we hope!). Also, it can contain 194 dead threads, as there's no harm if it does. 195 196 The approach taken here is to bury the translation from external 197 to internal inside "call_ttrace" and a few other places. 198 199 There are some wrinkles: 200 201 o When GDB forks itself to create the debug target process, 202 there's only a pid of 0 around in the child, so the 203 TT_PROC_SETTRC operation uses a more direct call to ttrace; 204 Similiarly, the initial setting of the event mask happens 205 early as well, and so is also special-cased, and an attach 206 uses a real pid; 207 208 o We define an unthreaded application as having a "pseudo" 209 thread; 210 211 o To keep from confusing the rest of GDB, we don't switch 212 the PID for the pseudo thread to a TID. A table will help: 213 214 Rest of GDB sees these PIDs: pid tid1 tid2 tid3 ... 215 216 Our thread list stores: pid pid pid pid ... 217 tid0 tid1 tid2 tid3 218 219 Ttrace sees these TIDS: tid0 tid1 tid2 tid3 ... 220 221 Both pid and tid0 will map to tid0, as there are infttrace.c-internal 222 calls to ttrace using tid0. 223 224 2. Step and Continue 225 226 Since we're implementing the "stop the world" model, sub-model 227 "other threads run during step", we have some stuff to do: 228 229 o User steps require continuing all threads other than the 230 one the user is stepping; 231 232 o Internal debugger steps (such as over a breakpoint or watchpoint, 233 but not out of a library load thunk) require stepping only 234 the selected thread; this means that we have to report the 235 step finish on that thread, which can lead to complications; 236 237 o When a thread is created, it is created running, rather 238 than stopped--so we have to stop it. 239 240 The OS doesn't guarantee the stopped thread list will be stable, 241 no does it guarantee where on the stopped thread list a thread 242 that is single-stepped will wind up: it's possible that it will 243 be off the list for a while, it's possible the step will complete 244 and it will be re-posted to the end... 245 246 This means we have to scan the stopped thread list, build up 247 a work-list, and then run down the work list; we can't do the 248 step/continue during the scan. 249 250 3. Buffering events 251 252 Then there's the issue of waiting for an event. We do this by 253 noticing how many events are reported at the end of each wait. 254 From then on, we "fake" all resumes and steps, returning instantly, 255 and don't do another wait. Once all pending events are reported, 256 we can really resume again. 257 258 To keep this hidden, all the routines which know about tids and 259 pids or real events and simulated ones are static (file-local). 260 261 This code can make lots of calls to ttrace, in particular it 262 can spin down the list of thread states more than once. If this 263 becomes a performance hit, the spin could be done once and the 264 various "tsp" blocks saved, keeping all later spins in this 265 process. 266 267 The O/S doesn't promise to keep the list straight, and so we must 268 re-scan a lot. By observation, it looks like a single-step/wait 269 puts the stepped thread at the end of the list but doesn't change 270 it otherwise. 271 272 **************************************************************** 273 */ 274 275 /* Uncomment these to turn on various debugging output */ 276 /* #define THREAD_DEBUG */ 277 /* #define WAIT_BUFFER_DEBUG */ 278 /* #define PARANOIA */ 279 280 281 #define INFTTRACE_ALL_THREADS (-1) 282 #define INFTTRACE_STEP (1) 283 #define INFTTRACE_CONTINUE (0) 284 285 /* FIX: this is used in inftarg.c/child_wait, in a hack. 286 */ 287 extern int not_same_real_pid; 288 289 /* This is used to count buffered events. 290 */ 291 static unsigned int more_events_left = 0; 292 293 /* Process state. 294 */ 295 typedef enum process_state_enum 296 { 297 STOPPED, 298 FAKE_STEPPING, 299 FAKE_CONTINUE, /* For later use */ 300 RUNNING, 301 FORKING, 302 VFORKING 303 } 304 process_state_t; 305 306 static process_state_t process_state = STOPPED; 307 308 /* User-specified stepping modality. 309 */ 310 typedef enum stepping_mode_enum 311 { 312 DO_DEFAULT, /* ...which is a continue! */ 313 DO_STEP, 314 DO_CONTINUE 315 } 316 stepping_mode_t; 317 318 /* Action to take on an attach, depends on 319 * what kind (user command, fork, vfork). 320 * 321 * At the moment, this is either: 322 * 323 * o continue with a SIGTRAP signal, or 324 * 325 * o leave stopped. 326 */ 327 typedef enum attach_continue_enum 328 { 329 DO_ATTACH_CONTINUE, 330 DONT_ATTACH_CONTINUE 331 } 332 attach_continue_t; 333 334 /* This flag is true if we are doing a step-over-bpt 335 * with buffered events. We will have to be sure to 336 * report the right thread, as otherwise the spaghetti 337 * code in "infrun.c/wait_for_inferior" will get 338 * confused. 339 */ 340 static int doing_fake_step = 0; 341 static lwpid_t fake_step_tid = 0; 342 343 344 /**************************************************** 345 * Thread information structure routines and types. * 346 **************************************************** 347 */ 348 typedef 349 struct thread_info_struct 350 { 351 int am_pseudo; /* This is a pseudo-thread for the process. */ 352 int pid; /* Process ID */ 353 lwpid_t tid; /* Thread ID */ 354 int handled; /* 1 if a buffered event was handled. */ 355 int seen; /* 1 if this thread was seen on a traverse. */ 356 int terminated; /* 1 if thread has terminated. */ 357 int have_signal; /* 1 if signal to be sent */ 358 enum target_signal signal_value; /* Signal to send */ 359 int have_start; /* 1 if alternate starting address */ 360 stepping_mode_t stepping_mode; /* Whether to step or continue */ 361 CORE_ADDR start; /* Where to start */ 362 int have_state; /* 1 if the event state has been set */ 363 ttstate_t last_stop_state; /* The most recently-waited event for this thread. */ 364 struct thread_info_struct 365 *next; /* All threads are linked via this field. */ 366 struct thread_info_struct 367 *next_pseudo; /* All pseudo-threads are linked via this field. */ 368 } 369 thread_info; 370 371 typedef 372 struct thread_info_header_struct 373 { 374 int count; 375 thread_info *head; 376 thread_info *head_pseudo; 377 378 } 379 thread_info_header; 380 381 static thread_info_header thread_head = 382 {0, NULL, NULL}; 383 static thread_info_header deleted_threads = 384 {0, NULL, NULL}; 385 386 static ptid_t saved_real_ptid; 387 388 389 /************************************************* 390 * Debugging support functions * 391 ************************************************* 392 */ 393 CORE_ADDR 394 get_raw_pc (lwpid_t ttid) 395 { 396 unsigned long pc_val; 397 int offset; 398 int res; 399 400 offset = register_addr (PC_REGNUM, U_REGS_OFFSET); 401 res = read_from_register_save_state ( 402 ttid, 403 (TTRACE_ARG_TYPE) offset, 404 (char *) &pc_val, 405 sizeof (pc_val)); 406 if (res <= 0) 407 { 408 return (CORE_ADDR) pc_val; 409 } 410 else 411 { 412 return (CORE_ADDR) 0; 413 } 414 } 415 416 static char * 417 get_printable_name_of_stepping_mode (stepping_mode_t mode) 418 { 419 switch (mode) 420 { 421 case DO_DEFAULT: 422 return "DO_DEFAULT"; 423 case DO_STEP: 424 return "DO_STEP"; 425 case DO_CONTINUE: 426 return "DO_CONTINUE"; 427 default: 428 return "?unknown mode?"; 429 } 430 } 431 432 /* This function returns a pointer to a string describing the 433 * ttrace event being reported. 434 */ 435 char * 436 get_printable_name_of_ttrace_event (ttevents_t event) 437 { 438 /* This enumeration is "gappy", so don't use a table. */ 439 switch (event) 440 { 441 442 case TTEVT_NONE: 443 return "TTEVT_NONE"; 444 case TTEVT_SIGNAL: 445 return "TTEVT_SIGNAL"; 446 case TTEVT_FORK: 447 return "TTEVT_FORK"; 448 case TTEVT_EXEC: 449 return "TTEVT_EXEC"; 450 case TTEVT_EXIT: 451 return "TTEVT_EXIT"; 452 case TTEVT_VFORK: 453 return "TTEVT_VFORK"; 454 case TTEVT_SYSCALL_RETURN: 455 return "TTEVT_SYSCALL_RETURN"; 456 case TTEVT_LWP_CREATE: 457 return "TTEVT_LWP_CREATE"; 458 case TTEVT_LWP_TERMINATE: 459 return "TTEVT_LWP_TERMINATE"; 460 case TTEVT_LWP_EXIT: 461 return "TTEVT_LWP_EXIT"; 462 case TTEVT_LWP_ABORT_SYSCALL: 463 return "TTEVT_LWP_ABORT_SYSCALL"; 464 case TTEVT_SYSCALL_ENTRY: 465 return "TTEVT_SYSCALL_ENTRY"; 466 case TTEVT_SYSCALL_RESTART: 467 return "TTEVT_SYSCALL_RESTART"; 468 default: 469 return "?new event?"; 470 } 471 } 472 473 474 /* This function translates the ttrace request enumeration into 475 * a character string that is its printable (aka "human readable") 476 * name. 477 */ 478 char * 479 get_printable_name_of_ttrace_request (ttreq_t request) 480 { 481 if (!IS_TTRACE_REQ (request)) 482 return "?bad req?"; 483 484 /* This enumeration is "gappy", so don't use a table. */ 485 switch (request) 486 { 487 case TT_PROC_SETTRC: 488 return "TT_PROC_SETTRC"; 489 case TT_PROC_ATTACH: 490 return "TT_PROC_ATTACH"; 491 case TT_PROC_DETACH: 492 return "TT_PROC_DETACH"; 493 case TT_PROC_RDTEXT: 494 return "TT_PROC_RDTEXT"; 495 case TT_PROC_WRTEXT: 496 return "TT_PROC_WRTEXT"; 497 case TT_PROC_RDDATA: 498 return "TT_PROC_RDDATA"; 499 case TT_PROC_WRDATA: 500 return "TT_PROC_WRDATA"; 501 case TT_PROC_STOP: 502 return "TT_PROC_STOP"; 503 case TT_PROC_CONTINUE: 504 return "TT_PROC_CONTINUE"; 505 case TT_PROC_GET_PATHNAME: 506 return "TT_PROC_GET_PATHNAME"; 507 case TT_PROC_GET_EVENT_MASK: 508 return "TT_PROC_GET_EVENT_MASK"; 509 case TT_PROC_SET_EVENT_MASK: 510 return "TT_PROC_SET_EVENT_MASK"; 511 case TT_PROC_GET_FIRST_LWP_STATE: 512 return "TT_PROC_GET_FIRST_LWP_STATE"; 513 case TT_PROC_GET_NEXT_LWP_STATE: 514 return "TT_PROC_GET_NEXT_LWP_STATE"; 515 case TT_PROC_EXIT: 516 return "TT_PROC_EXIT"; 517 case TT_PROC_GET_MPROTECT: 518 return "TT_PROC_GET_MPROTECT"; 519 case TT_PROC_SET_MPROTECT: 520 return "TT_PROC_SET_MPROTECT"; 521 case TT_PROC_SET_SCBM: 522 return "TT_PROC_SET_SCBM"; 523 case TT_LWP_STOP: 524 return "TT_LWP_STOP"; 525 case TT_LWP_CONTINUE: 526 return "TT_LWP_CONTINUE"; 527 case TT_LWP_SINGLE: 528 return "TT_LWP_SINGLE"; 529 case TT_LWP_RUREGS: 530 return "TT_LWP_RUREGS"; 531 case TT_LWP_WUREGS: 532 return "TT_LWP_WUREGS"; 533 case TT_LWP_GET_EVENT_MASK: 534 return "TT_LWP_GET_EVENT_MASK"; 535 case TT_LWP_SET_EVENT_MASK: 536 return "TT_LWP_SET_EVENT_MASK"; 537 case TT_LWP_GET_STATE: 538 return "TT_LWP_GET_STATE"; 539 default: 540 return "?new req?"; 541 } 542 } 543 544 545 /* This function translates the process state enumeration into 546 * a character string that is its printable (aka "human readable") 547 * name. 548 */ 549 static char * 550 get_printable_name_of_process_state (process_state_t process_state) 551 { 552 switch (process_state) 553 { 554 case STOPPED: 555 return "STOPPED"; 556 case FAKE_STEPPING: 557 return "FAKE_STEPPING"; 558 case RUNNING: 559 return "RUNNING"; 560 case FORKING: 561 return "FORKING"; 562 case VFORKING: 563 return "VFORKING"; 564 default: 565 return "?some unknown state?"; 566 } 567 } 568 569 /* Set a ttrace thread state to a safe, initial state. 570 */ 571 static void 572 clear_ttstate_t (ttstate_t *tts) 573 { 574 tts->tts_pid = 0; 575 tts->tts_lwpid = 0; 576 tts->tts_user_tid = 0; 577 tts->tts_event = TTEVT_NONE; 578 } 579 580 /* Copy ttrace thread state TTS_FROM into TTS_TO. 581 */ 582 static void 583 copy_ttstate_t (ttstate_t *tts_to, ttstate_t *tts_from) 584 { 585 memcpy ((char *) tts_to, (char *) tts_from, sizeof (*tts_to)); 586 } 587 588 /* Are there any live threads we know about? 589 */ 590 static int 591 any_thread_records (void) 592 { 593 return (thread_head.count > 0); 594 } 595 596 /* Create, fill in and link in a thread descriptor. 597 */ 598 static thread_info * 599 create_thread_info (int pid, lwpid_t tid) 600 { 601 thread_info *new_p; 602 thread_info *p; 603 int thread_count_of_pid; 604 605 new_p = xmalloc (sizeof (thread_info)); 606 new_p->pid = pid; 607 new_p->tid = tid; 608 new_p->have_signal = 0; 609 new_p->have_start = 0; 610 new_p->have_state = 0; 611 clear_ttstate_t (&new_p->last_stop_state); 612 new_p->am_pseudo = 0; 613 new_p->handled = 0; 614 new_p->seen = 0; 615 new_p->terminated = 0; 616 new_p->next = NULL; 617 new_p->next_pseudo = NULL; 618 new_p->stepping_mode = DO_DEFAULT; 619 620 if (0 == thread_head.count) 621 { 622 #ifdef THREAD_DEBUG 623 if (debug_on) 624 printf ("First thread, pid %d tid %d!\n", pid, tid); 625 #endif 626 saved_real_ptid = inferior_ptid; 627 } 628 else 629 { 630 #ifdef THREAD_DEBUG 631 if (debug_on) 632 printf ("Subsequent thread, pid %d tid %d\n", pid, tid); 633 #endif 634 } 635 636 /* Another day, another thread... 637 */ 638 thread_head.count++; 639 640 /* The new thread always goes at the head of the list. 641 */ 642 new_p->next = thread_head.head; 643 thread_head.head = new_p; 644 645 /* Is this the "pseudo" thread of a process? It is if there's 646 * no other thread for this process on the list. (Note that this 647 * accomodates multiple processes, such as we see even for simple 648 * cases like forking "non-threaded" programs.) 649 */ 650 p = thread_head.head; 651 thread_count_of_pid = 0; 652 while (p) 653 { 654 if (p->pid == new_p->pid) 655 thread_count_of_pid++; 656 p = p->next; 657 } 658 659 /* Did we see any other threads for this pid? (Recall that we just 660 * added this thread to the list...) 661 */ 662 if (thread_count_of_pid == 1) 663 { 664 new_p->am_pseudo = 1; 665 new_p->next_pseudo = thread_head.head_pseudo; 666 thread_head.head_pseudo = new_p; 667 } 668 669 return new_p; 670 } 671 672 /* Get rid of our thread info. 673 */ 674 static void 675 clear_thread_info (void) 676 { 677 thread_info *p; 678 thread_info *q; 679 680 #ifdef THREAD_DEBUG 681 if (debug_on) 682 printf ("Clearing all thread info\n"); 683 #endif 684 685 p = thread_head.head; 686 while (p) 687 { 688 q = p; 689 p = p->next; 690 xfree (q); 691 } 692 693 thread_head.head = NULL; 694 thread_head.head_pseudo = NULL; 695 thread_head.count = 0; 696 697 p = deleted_threads.head; 698 while (p) 699 { 700 q = p; 701 p = p->next; 702 xfree (q); 703 } 704 705 deleted_threads.head = NULL; 706 deleted_threads.head_pseudo = NULL; 707 deleted_threads.count = 0; 708 709 /* No threads, so can't have pending events. 710 */ 711 more_events_left = 0; 712 } 713 714 /* Given a tid, find the thread block for it. 715 */ 716 static thread_info * 717 find_thread_info (lwpid_t tid) 718 { 719 thread_info *p; 720 721 for (p = thread_head.head; p; p = p->next) 722 { 723 if (p->tid == tid) 724 { 725 return p; 726 } 727 } 728 729 for (p = deleted_threads.head; p; p = p->next) 730 { 731 if (p->tid == tid) 732 { 733 return p; 734 } 735 } 736 737 return NULL; 738 } 739 740 /* For any but the pseudo thread, this maps to the 741 * thread ID. For the pseudo thread, if you pass either 742 * the thread id or the PID, you get the pseudo thread ID. 743 * 744 * We have to be prepared for core gdb to ask about 745 * deleted threads. We do the map, but we don't like it. 746 */ 747 static lwpid_t 748 map_from_gdb_tid (lwpid_t gdb_tid) 749 { 750 thread_info *p; 751 752 /* First assume gdb_tid really is a tid, and try to find a 753 * matching entry on the threads list. 754 */ 755 for (p = thread_head.head; p; p = p->next) 756 { 757 if (p->tid == gdb_tid) 758 return gdb_tid; 759 } 760 761 /* It doesn't appear to be a tid; perhaps it's really a pid? 762 * Try to find a "pseudo" thread entry on the threads list. 763 */ 764 for (p = thread_head.head_pseudo; p != NULL; p = p->next_pseudo) 765 { 766 if (p->pid == gdb_tid) 767 return p->tid; 768 } 769 770 /* Perhaps it's the tid of a deleted thread we may still 771 * have some knowledge of? 772 */ 773 for (p = deleted_threads.head; p; p = p->next) 774 { 775 if (p->tid == gdb_tid) 776 return gdb_tid; 777 } 778 779 /* Or perhaps it's the pid of a deleted process we may still 780 * have knowledge of? 781 */ 782 for (p = deleted_threads.head_pseudo; p != NULL; p = p->next_pseudo) 783 { 784 if (p->pid == gdb_tid) 785 return p->tid; 786 } 787 788 return 0; /* Error? */ 789 } 790 791 /* Map the other way: from a real tid to the 792 * "pid" known by core gdb. This tid may be 793 * for a thread that just got deleted, so we 794 * also need to consider deleted threads. 795 */ 796 static lwpid_t 797 map_to_gdb_tid (lwpid_t real_tid) 798 { 799 thread_info *p; 800 801 for (p = thread_head.head; p; p = p->next) 802 { 803 if (p->tid == real_tid) 804 { 805 if (p->am_pseudo) 806 return p->pid; 807 else 808 return real_tid; 809 } 810 } 811 812 for (p = deleted_threads.head; p; p = p->next) 813 { 814 if (p->tid == real_tid) 815 if (p->am_pseudo) 816 return p->pid; /* Error? */ 817 else 818 return real_tid; 819 } 820 821 return 0; /* Error? Never heard of this thread! */ 822 } 823 824 /* Do any threads have saved signals? 825 */ 826 static int 827 saved_signals_exist (void) 828 { 829 thread_info *p; 830 831 for (p = thread_head.head; p; p = p->next) 832 { 833 if (p->have_signal) 834 { 835 return 1; 836 } 837 } 838 839 return 0; 840 } 841 842 /* Is this the tid for the zero-th thread? 843 */ 844 static int 845 is_pseudo_thread (lwpid_t tid) 846 { 847 thread_info *p = find_thread_info (tid); 848 if (NULL == p || p->terminated) 849 return 0; 850 else 851 return p->am_pseudo; 852 } 853 854 /* Is this thread terminated? 855 */ 856 static int 857 is_terminated (lwpid_t tid) 858 { 859 thread_info *p = find_thread_info (tid); 860 861 if (NULL != p) 862 return p->terminated; 863 864 return 0; 865 } 866 867 /* Is this pid a real PID or a TID? 868 */ 869 static int 870 is_process_id (int pid) 871 { 872 lwpid_t tid; 873 thread_info *tinfo; 874 pid_t this_pid; 875 int this_pid_count; 876 877 /* What does PID really represent? 878 */ 879 tid = map_from_gdb_tid (pid); 880 if (tid <= 0) 881 return 0; /* Actually, is probably an error... */ 882 883 tinfo = find_thread_info (tid); 884 885 /* Does it appear to be a true thread? 886 */ 887 if (!tinfo->am_pseudo) 888 return 0; 889 890 /* Else, it looks like it may be a process. See if there's any other 891 * threads with the same process ID, though. If there are, then TID 892 * just happens to be the first thread of several for this process. 893 */ 894 this_pid = tinfo->pid; 895 this_pid_count = 0; 896 for (tinfo = thread_head.head; tinfo; tinfo = tinfo->next) 897 { 898 if (tinfo->pid == this_pid) 899 this_pid_count++; 900 } 901 902 return (this_pid_count == 1); 903 } 904 905 906 /* Add a thread to our info. Prevent duplicate entries. 907 */ 908 static thread_info * 909 add_tthread (int pid, lwpid_t tid) 910 { 911 thread_info *p; 912 913 p = find_thread_info (tid); 914 if (NULL == p) 915 p = create_thread_info (pid, tid); 916 917 return p; 918 } 919 920 /* Notice that a thread was deleted. 921 */ 922 static void 923 del_tthread (lwpid_t tid) 924 { 925 thread_info *p; 926 thread_info *chase; 927 928 if (thread_head.count <= 0) 929 { 930 error ("Internal error in thread database."); 931 return; 932 } 933 934 chase = NULL; 935 for (p = thread_head.head; p; p = p->next) 936 { 937 if (p->tid == tid) 938 { 939 940 #ifdef THREAD_DEBUG 941 if (debug_on) 942 printf ("Delete here: %d \n", tid); 943 #endif 944 945 if (p->am_pseudo) 946 { 947 /* 948 * Deleting a main thread is ok if we're doing 949 * a parent-follow on a child; this is odd but 950 * not wrong. It apparently _doesn't_ happen 951 * on the child-follow, as we don't just delete 952 * the pseudo while keeping the rest of the 953 * threads around--instead, we clear out the whole 954 * thread list at once. 955 */ 956 thread_info *q; 957 thread_info *q_chase; 958 959 q_chase = NULL; 960 for (q = thread_head.head_pseudo; q; q = q->next) 961 { 962 if (q == p) 963 { 964 /* Remove from pseudo list. 965 */ 966 if (q_chase == NULL) 967 thread_head.head_pseudo = p->next_pseudo; 968 else 969 q_chase->next = p->next_pseudo; 970 } 971 else 972 q_chase = q; 973 } 974 } 975 976 /* Remove from live list. 977 */ 978 thread_head.count--; 979 980 if (NULL == chase) 981 thread_head.head = p->next; 982 else 983 chase->next = p->next; 984 985 /* Add to deleted thread list. 986 */ 987 p->next = deleted_threads.head; 988 deleted_threads.head = p; 989 deleted_threads.count++; 990 if (p->am_pseudo) 991 { 992 p->next_pseudo = deleted_threads.head_pseudo; 993 deleted_threads.head_pseudo = p; 994 } 995 p->terminated = 1; 996 997 return; 998 } 999 1000 else 1001 chase = p; 1002 } 1003 } 1004 1005 /* Get the pid for this tid. (Has to be a real TID!). 1006 */ 1007 static int 1008 get_pid_for (lwpid_t tid) 1009 { 1010 thread_info *p; 1011 1012 for (p = thread_head.head; p; p = p->next) 1013 { 1014 if (p->tid == tid) 1015 { 1016 return p->pid; 1017 } 1018 } 1019 1020 for (p = deleted_threads.head; p; p = p->next) 1021 { 1022 if (p->tid == tid) 1023 { 1024 return p->pid; 1025 } 1026 } 1027 1028 return 0; 1029 } 1030 1031 /* Note that this thread's current event has been handled. 1032 */ 1033 static void 1034 set_handled (int pid, lwpid_t tid) 1035 { 1036 thread_info *p; 1037 1038 p = find_thread_info (tid); 1039 if (NULL == p) 1040 p = add_tthread (pid, tid); 1041 1042 p->handled = 1; 1043 } 1044 1045 /* Was this thread's current event handled? 1046 */ 1047 static int 1048 was_handled (lwpid_t tid) 1049 { 1050 thread_info *p; 1051 1052 p = find_thread_info (tid); 1053 if (NULL != p) 1054 return p->handled; 1055 1056 return 0; /* New threads have not been handled */ 1057 } 1058 1059 /* Set this thread to unhandled. 1060 */ 1061 static void 1062 clear_handled (lwpid_t tid) 1063 { 1064 thread_info *p; 1065 1066 #ifdef WAIT_BUFFER_DEBUG 1067 if (debug_on) 1068 printf ("clear_handled %d\n", (int) tid); 1069 #endif 1070 1071 p = find_thread_info (tid); 1072 if (p == NULL) 1073 error ("Internal error: No thread state to clear?"); 1074 1075 p->handled = 0; 1076 } 1077 1078 /* Set all threads to unhandled. 1079 */ 1080 static void 1081 clear_all_handled (void) 1082 { 1083 thread_info *p; 1084 1085 #ifdef WAIT_BUFFER_DEBUG 1086 if (debug_on) 1087 printf ("clear_all_handled\n"); 1088 #endif 1089 1090 for (p = thread_head.head; p; p = p->next) 1091 { 1092 p->handled = 0; 1093 } 1094 1095 for (p = deleted_threads.head; p; p = p->next) 1096 { 1097 p->handled = 0; 1098 } 1099 } 1100 1101 /* Set this thread to default stepping mode. 1102 */ 1103 static void 1104 clear_stepping_mode (lwpid_t tid) 1105 { 1106 thread_info *p; 1107 1108 #ifdef WAIT_BUFFER_DEBUG 1109 if (debug_on) 1110 printf ("clear_stepping_mode %d\n", (int) tid); 1111 #endif 1112 1113 p = find_thread_info (tid); 1114 if (p == NULL) 1115 error ("Internal error: No thread state to clear?"); 1116 1117 p->stepping_mode = DO_DEFAULT; 1118 } 1119 1120 /* Set all threads to do default continue on resume. 1121 */ 1122 static void 1123 clear_all_stepping_mode (void) 1124 { 1125 thread_info *p; 1126 1127 #ifdef WAIT_BUFFER_DEBUG 1128 if (debug_on) 1129 printf ("clear_all_stepping_mode\n"); 1130 #endif 1131 1132 for (p = thread_head.head; p; p = p->next) 1133 { 1134 p->stepping_mode = DO_DEFAULT; 1135 } 1136 1137 for (p = deleted_threads.head; p; p = p->next) 1138 { 1139 p->stepping_mode = DO_DEFAULT; 1140 } 1141 } 1142 1143 /* Set all threads to unseen on this pass. 1144 */ 1145 static void 1146 set_all_unseen (void) 1147 { 1148 thread_info *p; 1149 1150 for (p = thread_head.head; p; p = p->next) 1151 { 1152 p->seen = 0; 1153 } 1154 } 1155 1156 #if (defined( THREAD_DEBUG ) || defined( PARANOIA )) 1157 /* debugging routine. 1158 */ 1159 static void 1160 print_tthread (thread_info *p) 1161 { 1162 printf (" Thread pid %d, tid %d", p->pid, p->tid); 1163 if (p->have_state) 1164 printf (", event is %s", 1165 get_printable_name_of_ttrace_event (p->last_stop_state.tts_event)); 1166 1167 if (p->am_pseudo) 1168 printf (", pseudo thread"); 1169 1170 if (p->have_signal) 1171 printf (", have signal 0x%x", p->signal_value); 1172 1173 if (p->have_start) 1174 printf (", have start at 0x%x", p->start); 1175 1176 printf (", step is %s", get_printable_name_of_stepping_mode (p->stepping_mode)); 1177 1178 if (p->handled) 1179 printf (", handled"); 1180 else 1181 printf (", not handled"); 1182 1183 if (p->seen) 1184 printf (", seen"); 1185 else 1186 printf (", not seen"); 1187 1188 printf ("\n"); 1189 } 1190 1191 static void 1192 print_tthreads (void) 1193 { 1194 thread_info *p; 1195 1196 if (thread_head.count == 0) 1197 printf ("Thread list is empty\n"); 1198 else 1199 { 1200 printf ("Thread list has "); 1201 if (thread_head.count == 1) 1202 printf ("1 entry:\n"); 1203 else 1204 printf ("%d entries:\n", thread_head.count); 1205 for (p = thread_head.head; p; p = p->next) 1206 { 1207 print_tthread (p); 1208 } 1209 } 1210 1211 if (deleted_threads.count == 0) 1212 printf ("Deleted thread list is empty\n"); 1213 else 1214 { 1215 printf ("Deleted thread list has "); 1216 if (deleted_threads.count == 1) 1217 printf ("1 entry:\n"); 1218 else 1219 printf ("%d entries:\n", deleted_threads.count); 1220 1221 for (p = deleted_threads.head; p; p = p->next) 1222 { 1223 print_tthread (p); 1224 } 1225 } 1226 } 1227 #endif 1228 1229 /* Update the thread list based on the "seen" bits. 1230 */ 1231 static void 1232 update_thread_list (void) 1233 { 1234 thread_info *p; 1235 thread_info *chase; 1236 1237 chase = NULL; 1238 for (p = thread_head.head; p; p = p->next) 1239 { 1240 /* Is this an "unseen" thread which really happens to be a process? 1241 If so, is it inferior_ptid and is a vfork in flight? If yes to 1242 all, then DON'T REMOVE IT! We're in the midst of moving a vfork 1243 operation, which is a multiple step thing, to the point where we 1244 can touch the parent again. We've most likely stopped to examine 1245 the child at a late stage in the vfork, and if we're not following 1246 the child, we'd best not treat the parent as a dead "thread"... 1247 */ 1248 if ((!p->seen) && p->am_pseudo && vfork_in_flight 1249 && (p->pid != vforking_child_pid)) 1250 p->seen = 1; 1251 1252 if (!p->seen) 1253 { 1254 /* Remove this one 1255 */ 1256 1257 #ifdef THREAD_DEBUG 1258 if (debug_on) 1259 printf ("Delete unseen thread: %d \n", p->tid); 1260 #endif 1261 del_tthread (p->tid); 1262 } 1263 } 1264 } 1265 1266 1267 1268 /************************************************ 1269 * O/S call wrappers * 1270 ************************************************ 1271 */ 1272 1273 /* This function simply calls ttrace with the given arguments. 1274 * It exists so that all calls to ttrace are isolated. All 1275 * parameters should be as specified by "man 2 ttrace". 1276 * 1277 * No other "raw" calls to ttrace should exist in this module. 1278 */ 1279 static int 1280 call_real_ttrace (ttreq_t request, pid_t pid, lwpid_t tid, TTRACE_ARG_TYPE addr, 1281 TTRACE_ARG_TYPE data, TTRACE_ARG_TYPE addr2) 1282 { 1283 int tt_status; 1284 1285 errno = 0; 1286 tt_status = ttrace (request, pid, tid, addr, data, addr2); 1287 1288 #ifdef THREAD_DEBUG 1289 if (errno) 1290 { 1291 /* Don't bother for a known benign error: if you ask for the 1292 * first thread state, but there is only one thread and it's 1293 * not stopped, ttrace complains. 1294 * 1295 * We have this inside the #ifdef because our caller will do 1296 * this check for real. 1297 */ 1298 if (request != TT_PROC_GET_FIRST_LWP_STATE 1299 || errno != EPROTO) 1300 { 1301 if (debug_on) 1302 printf ("TT fail for %s, with pid %d, tid %d, status %d \n", 1303 get_printable_name_of_ttrace_request (request), 1304 pid, tid, tt_status); 1305 } 1306 } 1307 #endif 1308 1309 #if 0 1310 /* ??rehrauer: It would probably be most robust to catch and report 1311 * failed requests here. However, some clients of this interface 1312 * seem to expect to catch & deal with them, so we'd best not. 1313 */ 1314 if (errno) 1315 { 1316 strcpy (reason_for_failure, "ttrace ("); 1317 strcat (reason_for_failure, get_printable_name_of_ttrace_request (request)); 1318 strcat (reason_for_failure, ")"); 1319 printf ("ttrace error, errno = %d\n", errno); 1320 perror_with_name (reason_for_failure); 1321 } 1322 #endif 1323 1324 return tt_status; 1325 } 1326 1327 1328 /* This function simply calls ttrace_wait with the given arguments. 1329 * It exists so that all calls to ttrace_wait are isolated. 1330 * 1331 * No "raw" calls to ttrace_wait should exist elsewhere. 1332 */ 1333 static int 1334 call_real_ttrace_wait (int pid, lwpid_t tid, ttwopt_t option, ttstate_t *tsp, 1335 size_t tsp_size) 1336 { 1337 int ttw_status; 1338 thread_info *tinfo = NULL; 1339 1340 errno = 0; 1341 ttw_status = ttrace_wait (pid, tid, option, tsp, tsp_size); 1342 1343 if (errno) 1344 { 1345 #ifdef THREAD_DEBUG 1346 if (debug_on) 1347 printf ("TW fail with pid %d, tid %d \n", pid, tid); 1348 #endif 1349 1350 perror_with_name ("ttrace wait"); 1351 } 1352 1353 return ttw_status; 1354 } 1355 1356 1357 /* A process may have one or more kernel threads, of which all or 1358 none may be stopped. This function returns the ID of the first 1359 kernel thread in a stopped state, or 0 if none are stopped. 1360 1361 This function can be used with get_process_next_stopped_thread_id 1362 to iterate over the IDs of all stopped threads of this process. 1363 */ 1364 static lwpid_t 1365 get_process_first_stopped_thread_id (int pid, ttstate_t *thread_state) 1366 { 1367 int tt_status; 1368 1369 tt_status = call_real_ttrace (TT_PROC_GET_FIRST_LWP_STATE, 1370 (pid_t) pid, 1371 (lwpid_t) TT_NIL, 1372 (TTRACE_ARG_TYPE) thread_state, 1373 (TTRACE_ARG_TYPE) sizeof (*thread_state), 1374 TT_NIL); 1375 1376 if (errno) 1377 { 1378 if (errno == EPROTO) 1379 { 1380 /* This is an error we can handle: there isn't any stopped 1381 * thread. This happens when we're re-starting the application 1382 * and it has only one thread. GET_NEXT handles the case of 1383 * no more stopped threads well; GET_FIRST doesn't. (A ttrace 1384 * "feature".) 1385 */ 1386 tt_status = 1; 1387 errno = 0; 1388 return 0; 1389 } 1390 else 1391 perror_with_name ("ttrace"); 1392 } 1393 1394 if (tt_status < 0) 1395 /* Failed somehow. 1396 */ 1397 return 0; 1398 1399 return thread_state->tts_lwpid; 1400 } 1401 1402 1403 /* This function returns the ID of the "next" kernel thread in a 1404 stopped state, or 0 if there are none. "Next" refers to the 1405 thread following that of the last successful call to this 1406 function or to get_process_first_stopped_thread_id, using 1407 the value of thread_state returned by that call. 1408 1409 This function can be used with get_process_first_stopped_thread_id 1410 to iterate over the IDs of all stopped threads of this process. 1411 */ 1412 static lwpid_t 1413 get_process_next_stopped_thread_id (int pid, ttstate_t *thread_state) 1414 { 1415 int tt_status; 1416 1417 tt_status = call_real_ttrace ( 1418 TT_PROC_GET_NEXT_LWP_STATE, 1419 (pid_t) pid, 1420 (lwpid_t) TT_NIL, 1421 (TTRACE_ARG_TYPE) thread_state, 1422 (TTRACE_ARG_TYPE) sizeof (*thread_state), 1423 TT_NIL); 1424 if (errno) 1425 perror_with_name ("ttrace"); 1426 1427 if (tt_status < 0) 1428 /* Failed 1429 */ 1430 return 0; 1431 1432 else if (tt_status == 0) 1433 { 1434 /* End of list, no next state. Don't return the 1435 * tts_lwpid, as it's a meaningless "240". 1436 * 1437 * This is an HPUX "feature". 1438 */ 1439 return 0; 1440 } 1441 1442 return thread_state->tts_lwpid; 1443 } 1444 1445 /* ??rehrauer: Eventually this function perhaps should be calling 1446 pid_to_thread_id. However, that function currently does nothing 1447 for HP-UX. Even then, I'm not clear whether that function 1448 will return a "kernel" thread ID, or a "user" thread ID. If 1449 the former, we can just call it here. If the latter, we must 1450 map from the "user" tid to a "kernel" tid. 1451 1452 NOTE: currently not called. 1453 */ 1454 static lwpid_t 1455 get_active_tid_of_pid (int pid) 1456 { 1457 ttstate_t thread_state; 1458 1459 return get_process_first_stopped_thread_id (pid, &thread_state); 1460 } 1461 1462 /* This function returns 1 if tt_request is a ttrace request that 1463 * operates upon all threads of a (i.e., the entire) process. 1464 */ 1465 int 1466 is_process_ttrace_request (ttreq_t tt_request) 1467 { 1468 return IS_TTRACE_PROCREQ (tt_request); 1469 } 1470 1471 1472 /* This function translates a thread ttrace request into 1473 * the equivalent process request for a one-thread process. 1474 */ 1475 static ttreq_t 1476 make_process_version (ttreq_t request) 1477 { 1478 if (!IS_TTRACE_REQ (request)) 1479 { 1480 error ("Internal error, bad ttrace request made\n"); 1481 return -1; 1482 } 1483 1484 switch (request) 1485 { 1486 case TT_LWP_STOP: 1487 return TT_PROC_STOP; 1488 1489 case TT_LWP_CONTINUE: 1490 return TT_PROC_CONTINUE; 1491 1492 case TT_LWP_GET_EVENT_MASK: 1493 return TT_PROC_GET_EVENT_MASK; 1494 1495 case TT_LWP_SET_EVENT_MASK: 1496 return TT_PROC_SET_EVENT_MASK; 1497 1498 case TT_LWP_SINGLE: 1499 case TT_LWP_RUREGS: 1500 case TT_LWP_WUREGS: 1501 case TT_LWP_GET_STATE: 1502 return -1; /* No equivalent */ 1503 1504 default: 1505 return request; 1506 } 1507 } 1508 1509 1510 /* This function translates the "pid" used by the rest of 1511 * gdb to a real pid and a tid. It then calls "call_real_ttrace" 1512 * with the given arguments. 1513 * 1514 * In general, other parts of this module should call this 1515 * function when they are dealing with external users, who only 1516 * have tids to pass (but they call it "pid" for historical 1517 * reasons). 1518 */ 1519 static int 1520 call_ttrace (ttreq_t request, int gdb_tid, TTRACE_ARG_TYPE addr, 1521 TTRACE_ARG_TYPE data, TTRACE_ARG_TYPE addr2) 1522 { 1523 lwpid_t real_tid; 1524 int real_pid; 1525 ttreq_t new_request; 1526 int tt_status; 1527 char reason_for_failure[100]; /* Arbitrary size, should be big enough. */ 1528 1529 #ifdef THREAD_DEBUG 1530 int is_interesting = 0; 1531 1532 if (TT_LWP_RUREGS == request) 1533 { 1534 is_interesting = 1; /* Adjust code here as desired */ 1535 } 1536 1537 if (is_interesting && 0 && debug_on) 1538 { 1539 if (!is_process_ttrace_request (request)) 1540 { 1541 printf ("TT: Thread request, tid is %d", gdb_tid); 1542 printf ("== SINGLE at %x", addr); 1543 } 1544 else 1545 { 1546 printf ("TT: Process request, tid is %d\n", gdb_tid); 1547 printf ("==! SINGLE at %x", addr); 1548 } 1549 } 1550 #endif 1551 1552 /* The initial SETTRC and SET_EVENT_MASK calls (and all others 1553 * which happen before any threads get set up) should go 1554 * directly to "call_real_ttrace", so they don't happen here. 1555 * 1556 * But hardware watchpoints do a SET_EVENT_MASK, so we can't 1557 * rule them out.... 1558 */ 1559 #ifdef THREAD_DEBUG 1560 if (request == TT_PROC_SETTRC && debug_on) 1561 printf ("Unexpected call for TT_PROC_SETTRC\n"); 1562 #endif 1563 1564 /* Sometimes we get called with a bogus tid (e.g., if a 1565 * thread has terminated, we return 0; inftarg later asks 1566 * whether the thread has exited/forked/vforked). 1567 */ 1568 if (gdb_tid == 0) 1569 { 1570 errno = ESRCH; /* ttrace's response would probably be "No such process". */ 1571 return -1; 1572 } 1573 1574 /* All other cases should be able to expect that there are 1575 * thread records. 1576 */ 1577 if (!any_thread_records ()) 1578 { 1579 #ifdef THREAD_DEBUG 1580 if (debug_on) 1581 warning ("No thread records for ttrace call"); 1582 #endif 1583 errno = ESRCH; /* ttrace's response would be "No such process". */ 1584 return -1; 1585 } 1586 1587 /* OK, now the task is to translate the incoming tid into 1588 * a pid/tid pair. 1589 */ 1590 real_tid = map_from_gdb_tid (gdb_tid); 1591 real_pid = get_pid_for (real_tid); 1592 1593 /* Now check the result. "Real_pid" is NULL if our list 1594 * didn't find it. We have some tricks we can play to fix 1595 * this, however. 1596 */ 1597 if (0 == real_pid) 1598 { 1599 ttstate_t thread_state; 1600 1601 #ifdef THREAD_DEBUG 1602 if (debug_on) 1603 printf ("No saved pid for tid %d\n", gdb_tid); 1604 #endif 1605 1606 if (is_process_ttrace_request (request)) 1607 { 1608 1609 /* Ok, we couldn't get a tid. Try to translate to 1610 * the equivalent process operation. We expect this 1611 * NOT to happen, so this is a desparation-type 1612 * move. It can happen if there is an internal 1613 * error and so no "wait()" call is ever done. 1614 */ 1615 new_request = make_process_version (request); 1616 if (new_request == -1) 1617 { 1618 1619 #ifdef THREAD_DEBUG 1620 if (debug_on) 1621 printf ("...and couldn't make process version of thread operation\n"); 1622 #endif 1623 1624 /* Use hacky saved pid, which won't always be correct 1625 * in the multi-process future. Use tid as thread, 1626 * probably dooming this to failure. FIX! 1627 */ 1628 if (! ptid_equal (saved_real_ptid, null_ptid)) 1629 { 1630 #ifdef THREAD_DEBUG 1631 if (debug_on) 1632 printf ("...using saved pid %d\n", 1633 PIDGET (saved_real_ptid)); 1634 #endif 1635 1636 real_pid = PIDGET (saved_real_ptid); 1637 real_tid = gdb_tid; 1638 } 1639 1640 else 1641 error ("Unable to perform thread operation"); 1642 } 1643 1644 else 1645 { 1646 /* Sucessfully translated this to a process request, 1647 * which needs no thread value. 1648 */ 1649 real_pid = gdb_tid; 1650 real_tid = 0; 1651 request = new_request; 1652 1653 #ifdef THREAD_DEBUG 1654 if (debug_on) 1655 { 1656 printf ("Translated thread request to process request\n"); 1657 if (ptid_equal (saved_real_ptid, null_ptid)) 1658 printf ("...but there's no saved pid\n"); 1659 1660 else 1661 { 1662 if (gdb_tid != PIDGET (saved_real_ptid)) 1663 printf ("...but have the wrong pid (%d rather than %d)\n", 1664 gdb_tid, PIDGET (saved_real_ptid)); 1665 } 1666 } 1667 #endif 1668 } /* Translated to a process request */ 1669 } /* Is a process request */ 1670 1671 else 1672 { 1673 /* We have to have a thread. Ooops. 1674 */ 1675 error ("Thread request with no threads (%s)", 1676 get_printable_name_of_ttrace_request (request)); 1677 } 1678 } 1679 1680 /* Ttrace doesn't like to see tid values on process requests, 1681 * even if we have the right one. 1682 */ 1683 if (is_process_ttrace_request (request)) 1684 { 1685 real_tid = 0; 1686 } 1687 1688 #ifdef THREAD_DEBUG 1689 if (is_interesting && 0 && debug_on) 1690 { 1691 printf (" now tid %d, pid %d\n", real_tid, real_pid); 1692 printf (" request is %s\n", get_printable_name_of_ttrace_request (request)); 1693 } 1694 #endif 1695 1696 /* Finally, the (almost) real call. 1697 */ 1698 tt_status = call_real_ttrace (request, real_pid, real_tid, addr, data, addr2); 1699 1700 #ifdef THREAD_DEBUG 1701 if (is_interesting && debug_on) 1702 { 1703 if (!TT_OK (tt_status, errno) 1704 && !(tt_status == 0 & errno == 0)) 1705 printf (" got error (errno==%d, status==%d)\n", errno, tt_status); 1706 } 1707 #endif 1708 1709 return tt_status; 1710 } 1711 1712 1713 /* Stop all the threads of a process. 1714 1715 * NOTE: use of TT_PROC_STOP can cause a thread with a real event 1716 * to get a TTEVT_NONE event, discarding the old event. Be 1717 * very careful, and only call TT_PROC_STOP when you mean it! 1718 */ 1719 static void 1720 stop_all_threads_of_process (pid_t real_pid) 1721 { 1722 int ttw_status; 1723 1724 ttw_status = call_real_ttrace (TT_PROC_STOP, 1725 (pid_t) real_pid, 1726 (lwpid_t) TT_NIL, 1727 (TTRACE_ARG_TYPE) TT_NIL, 1728 (TTRACE_ARG_TYPE) TT_NIL, 1729 TT_NIL); 1730 if (errno) 1731 perror_with_name ("ttrace stop of other threads"); 1732 } 1733 1734 1735 /* Under some circumstances, it's unsafe to attempt to stop, or even 1736 query the state of, a process' threads. 1737 1738 In ttrace-based HP-UX, an example is a vforking child process. The 1739 vforking parent and child are somewhat fragile, w/r/t what we can do 1740 what we can do to them with ttrace, until after the child exits or 1741 execs, or until the parent's vfork event is delivered. Until that 1742 time, we must not try to stop the process' threads, or inquire how 1743 many there are, or even alter its data segments, or it typically dies 1744 with a SIGILL. Sigh. 1745 1746 This function returns 1 if this stopped process, and the event that 1747 we're told was responsible for its current stopped state, cannot safely 1748 have its threads examined. 1749 */ 1750 #define CHILD_VFORKED(evt,pid) \ 1751 (((evt) == TTEVT_VFORK) && ((pid) != PIDGET (inferior_ptid))) 1752 #define CHILD_URPED(evt,pid) \ 1753 ((((evt) == TTEVT_EXEC) || ((evt) == TTEVT_EXIT)) && ((pid) != vforking_child_pid)) 1754 #define PARENT_VFORKED(evt,pid) \ 1755 (((evt) == TTEVT_VFORK) && ((pid) == PIDGET (inferior_ptid))) 1756 1757 static int 1758 can_touch_threads_of_process (int pid, ttevents_t stopping_event) 1759 { 1760 if (CHILD_VFORKED (stopping_event, pid)) 1761 { 1762 vforking_child_pid = pid; 1763 vfork_in_flight = 1; 1764 } 1765 1766 else if (vfork_in_flight && 1767 (PARENT_VFORKED (stopping_event, pid) || 1768 CHILD_URPED (stopping_event, pid))) 1769 { 1770 vfork_in_flight = 0; 1771 vforking_child_pid = 0; 1772 } 1773 1774 return !vfork_in_flight; 1775 } 1776 1777 1778 /* If we can find an as-yet-unhandled thread state of a 1779 * stopped thread of this process return 1 and set "tsp". 1780 * Return 0 if we can't. 1781 * 1782 * If this function is used when the threads of PIS haven't 1783 * been stopped, undefined behaviour is guaranteed! 1784 */ 1785 static int 1786 select_stopped_thread_of_process (int pid, ttstate_t *tsp) 1787 { 1788 lwpid_t candidate_tid, tid; 1789 ttstate_t candidate_tstate, tstate; 1790 1791 /* If we're not allowed to touch the process now, then just 1792 * return the current value of *TSP. 1793 * 1794 * This supports "vfork". It's ok, really, to double the 1795 * current event (the child EXEC, we hope!). 1796 */ 1797 if (!can_touch_threads_of_process (pid, tsp->tts_event)) 1798 return 1; 1799 1800 /* Decide which of (possibly more than one) events to 1801 * return as the first one. We scan them all so that 1802 * we always return the result of a fake-step first. 1803 */ 1804 candidate_tid = 0; 1805 for (tid = get_process_first_stopped_thread_id (pid, &tstate); 1806 tid != 0; 1807 tid = get_process_next_stopped_thread_id (pid, &tstate)) 1808 { 1809 /* TTEVT_NONE events are uninteresting to our clients. They're 1810 * an artifact of our "stop the world" model--the thread is 1811 * stopped because we stopped it. 1812 */ 1813 if (tstate.tts_event == TTEVT_NONE) 1814 { 1815 set_handled (pid, tstate.tts_lwpid); 1816 } 1817 1818 /* Did we just single-step a single thread, without letting any 1819 * of the others run? Is this an event for that thread? 1820 * 1821 * If so, we believe our client would prefer to see this event 1822 * over any others. (Typically the client wants to just push 1823 * one thread a little farther forward, and then go around 1824 * checking for what all threads are doing.) 1825 */ 1826 else if (doing_fake_step && (tstate.tts_lwpid == fake_step_tid)) 1827 { 1828 #ifdef WAIT_BUFFER_DEBUG 1829 /* It's possible here to see either a SIGTRAP (due to 1830 * successful completion of a step) or a SYSCALL_ENTRY 1831 * (due to a step completion with active hardware 1832 * watchpoints). 1833 */ 1834 if (debug_on) 1835 printf ("Ending fake step with tid %d, state %s\n", 1836 tstate.tts_lwpid, 1837 get_printable_name_of_ttrace_event (tstate.tts_event)); 1838 #endif 1839 1840 /* Remember this one, and throw away any previous 1841 * candidate. 1842 */ 1843 candidate_tid = tstate.tts_lwpid; 1844 candidate_tstate = tstate; 1845 } 1846 1847 #ifdef FORGET_DELETED_BPTS 1848 1849 /* We can't just do this, as if we do, and then wind 1850 * up the loop with no unhandled events, we need to 1851 * handle that case--the appropriate reaction is to 1852 * just continue, but there's no easy way to do that. 1853 * 1854 * Better to put this in the ttrace_wait call--if, when 1855 * we fake a wait, we update our events based on the 1856 * breakpoint_here_pc call and find there are no more events, 1857 * then we better continue and so on. 1858 * 1859 * Or we could put it in the next/continue fake. 1860 * But it has to go in the buffering code, not in the 1861 * real go/wait code. 1862 */ 1863 else if ((TTEVT_SIGNAL == tstate.tts_event) 1864 && (5 == tstate.tts_u.tts_signal.tts_signo) 1865 && (0 != get_raw_pc (tstate.tts_lwpid)) 1866 && !breakpoint_here_p (get_raw_pc (tstate.tts_lwpid))) 1867 { 1868 /* 1869 * If the user deleted a breakpoint while this 1870 * breakpoint-hit event was buffered, we can forget 1871 * it now. 1872 */ 1873 #ifdef WAIT_BUFFER_DEBUG 1874 if (debug_on) 1875 printf ("Forgetting deleted bp hit for thread %d\n", 1876 tstate.tts_lwpid); 1877 #endif 1878 1879 set_handled (pid, tstate.tts_lwpid); 1880 } 1881 #endif 1882 1883 /* Else, is this the first "unhandled" event? If so, 1884 * we believe our client wants to see it (if we don't 1885 * see a fake-step later on in the scan). 1886 */ 1887 else if (!was_handled (tstate.tts_lwpid) && candidate_tid == 0) 1888 { 1889 candidate_tid = tstate.tts_lwpid; 1890 candidate_tstate = tstate; 1891 } 1892 1893 /* This is either an event that has already been "handled", 1894 * and thus we believe is uninteresting to our client, or we 1895 * already have a candidate event. Ignore it... 1896 */ 1897 } 1898 1899 /* What do we report? 1900 */ 1901 if (doing_fake_step) 1902 { 1903 if (candidate_tid == fake_step_tid) 1904 { 1905 /* Fake step. 1906 */ 1907 tstate = candidate_tstate; 1908 } 1909 else 1910 { 1911 warning ("Internal error: fake-step failed to complete."); 1912 return 0; 1913 } 1914 } 1915 else if (candidate_tid != 0) 1916 { 1917 /* Found a candidate unhandled event. 1918 */ 1919 tstate = candidate_tstate; 1920 } 1921 else if (tid != 0) 1922 { 1923 warning ("Internal error in call of ttrace_wait."); 1924 return 0; 1925 } 1926 else 1927 { 1928 warning ("Internal error: no unhandled thread event to select"); 1929 return 0; 1930 } 1931 1932 copy_ttstate_t (tsp, &tstate); 1933 return 1; 1934 } /* End of select_stopped_thread_of_process */ 1935 1936 #ifdef PARANOIA 1937 /* Check our internal thread data against the real thing. 1938 */ 1939 static void 1940 check_thread_consistency (pid_t real_pid) 1941 { 1942 int tid; /* really lwpid_t */ 1943 ttstate_t tstate; 1944 thread_info *p; 1945 1946 /* Spin down the O/S list of threads, checking that they 1947 * match what we've got. 1948 */ 1949 for (tid = get_process_first_stopped_thread_id (real_pid, &tstate); 1950 tid != 0; 1951 tid = get_process_next_stopped_thread_id (real_pid, &tstate)) 1952 { 1953 1954 p = find_thread_info (tid); 1955 1956 if (NULL == p) 1957 { 1958 warning ("No internal thread data for thread %d.", tid); 1959 continue; 1960 } 1961 1962 if (!p->seen) 1963 { 1964 warning ("Inconsistent internal thread data for thread %d.", tid); 1965 } 1966 1967 if (p->terminated) 1968 { 1969 warning ("Thread %d is not terminated, internal error.", tid); 1970 continue; 1971 } 1972 1973 1974 #define TT_COMPARE( fld ) \ 1975 tstate.fld != p->last_stop_state.fld 1976 1977 if (p->have_state) 1978 { 1979 if (TT_COMPARE (tts_pid) 1980 || TT_COMPARE (tts_lwpid) 1981 || TT_COMPARE (tts_user_tid) 1982 || TT_COMPARE (tts_event) 1983 || TT_COMPARE (tts_flags) 1984 || TT_COMPARE (tts_scno) 1985 || TT_COMPARE (tts_scnargs)) 1986 { 1987 warning ("Internal thread data for thread %d is wrong.", tid); 1988 continue; 1989 } 1990 } 1991 } 1992 } 1993 #endif /* PARANOIA */ 1994 1995 1996 /* This function wraps calls to "call_real_ttrace_wait" so 1997 * that a actual wait is only done when all pending events 1998 * have been reported. 1999 * 2000 * Note that typically it is called with a pid of "0", i.e. 2001 * the "don't care" value. 2002 * 2003 * Return value is the status of the pseudo wait. 2004 */ 2005 static int 2006 call_ttrace_wait (int pid, ttwopt_t option, ttstate_t *tsp, size_t tsp_size) 2007 { 2008 /* This holds the actual, for-real, true process ID. 2009 */ 2010 static int real_pid; 2011 2012 /* As an argument to ttrace_wait, zero pid 2013 * means "Any process", and zero tid means 2014 * "Any thread of the specified process". 2015 */ 2016 int wait_pid = 0; 2017 lwpid_t wait_tid = 0; 2018 lwpid_t real_tid; 2019 2020 int ttw_status = 0; /* To be returned */ 2021 2022 thread_info *tinfo = NULL; 2023 2024 if (pid != 0) 2025 { 2026 /* Unexpected case. 2027 */ 2028 #ifdef THREAD_DEBUG 2029 if (debug_on) 2030 printf ("TW: Pid to wait on is %d\n", pid); 2031 #endif 2032 2033 if (!any_thread_records ()) 2034 error ("No thread records for ttrace call w. specific pid"); 2035 2036 /* OK, now the task is to translate the incoming tid into 2037 * a pid/tid pair. 2038 */ 2039 real_tid = map_from_gdb_tid (pid); 2040 real_pid = get_pid_for (real_tid); 2041 #ifdef THREAD_DEBUG 2042 if (debug_on) 2043 printf ("==TW: real pid %d, real tid %d\n", real_pid, real_tid); 2044 #endif 2045 } 2046 2047 2048 /* Sanity checks and set-up. 2049 * Process State 2050 * 2051 * Stopped Running Fake-step (v)Fork 2052 * \________________________________________ 2053 * | 2054 * No buffered events | error wait wait wait 2055 * | 2056 * Buffered events | debuffer error wait debuffer (?) 2057 * 2058 */ 2059 if (more_events_left == 0) 2060 { 2061 2062 if (process_state == RUNNING) 2063 { 2064 /* OK--normal call of ttrace_wait with no buffered events. 2065 */ 2066 ; 2067 } 2068 else if (process_state == FAKE_STEPPING) 2069 { 2070 /* Ok--call of ttrace_wait to support 2071 * fake stepping with no buffered events. 2072 * 2073 * But we better be fake-stepping! 2074 */ 2075 if (!doing_fake_step) 2076 { 2077 warning ("Inconsistent thread state."); 2078 } 2079 } 2080 else if ((process_state == FORKING) 2081 || (process_state == VFORKING)) 2082 { 2083 /* Ok--there are two processes, so waiting 2084 * for the second while the first is stopped 2085 * is ok. Handled bits stay as they were. 2086 */ 2087 ; 2088 } 2089 else if (process_state == STOPPED) 2090 { 2091 warning ("Process not running at wait call."); 2092 } 2093 else 2094 /* No known state. 2095 */ 2096 warning ("Inconsistent process state."); 2097 } 2098 2099 else 2100 { 2101 /* More events left 2102 */ 2103 if (process_state == STOPPED) 2104 { 2105 /* OK--buffered events being unbuffered. 2106 */ 2107 ; 2108 } 2109 else if (process_state == RUNNING) 2110 { 2111 /* An error--shouldn't have buffered events 2112 * when running. 2113 */ 2114 warning ("Trying to continue with buffered events:"); 2115 } 2116 else if (process_state == FAKE_STEPPING) 2117 { 2118 /* 2119 * Better be fake-stepping! 2120 */ 2121 if (!doing_fake_step) 2122 { 2123 warning ("Losing buffered thread events!\n"); 2124 } 2125 } 2126 else if ((process_state == FORKING) 2127 || (process_state == VFORKING)) 2128 { 2129 /* Ok--there are two processes, so waiting 2130 * for the second while the first is stopped 2131 * is ok. Handled bits stay as they were. 2132 */ 2133 ; 2134 } 2135 else 2136 warning ("Process in unknown state with buffered events."); 2137 } 2138 2139 /* Sometimes we have to wait for a particular thread 2140 * (if we're stepping over a bpt). In that case, we 2141 * _know_ it's going to complete the single-step we 2142 * asked for (because we're only doing the step under 2143 * certain very well-understood circumstances), so it 2144 * can't block. 2145 */ 2146 if (doing_fake_step) 2147 { 2148 wait_tid = fake_step_tid; 2149 wait_pid = get_pid_for (fake_step_tid); 2150 2151 #ifdef WAIT_BUFFER_DEBUG 2152 if (debug_on) 2153 printf ("Doing a wait after a fake-step for %d, pid %d\n", 2154 wait_tid, wait_pid); 2155 #endif 2156 } 2157 2158 if (more_events_left == 0 /* No buffered events, need real ones. */ 2159 || process_state != STOPPED) 2160 { 2161 /* If there are no buffered events, and so we need 2162 * real ones, or if we are FORKING, VFORKING, 2163 * FAKE_STEPPING or RUNNING, and thus have to do 2164 * a real wait, then do a real wait. 2165 */ 2166 2167 #ifdef WAIT_BUFFER_DEBUG 2168 /* Normal case... */ 2169 if (debug_on) 2170 printf ("TW: do it for real; pid %d, tid %d\n", wait_pid, wait_tid); 2171 #endif 2172 2173 /* The actual wait call. 2174 */ 2175 ttw_status = call_real_ttrace_wait (wait_pid, wait_tid, option, tsp, tsp_size); 2176 2177 /* Note that the routines we'll call will be using "call_real_ttrace", 2178 * not "call_ttrace", and thus need the real pid rather than the pseudo-tid 2179 * the rest of the world uses (which is actually the tid). 2180 */ 2181 real_pid = tsp->tts_pid; 2182 2183 /* For most events: Stop the world! 2184 2185 * It's sometimes not safe to stop all threads of a process. 2186 * Sometimes it's not even safe to ask for the thread state 2187 * of a process! 2188 */ 2189 if (can_touch_threads_of_process (real_pid, tsp->tts_event)) 2190 { 2191 /* If we're really only stepping a single thread, then don't 2192 * try to stop all the others -- we only do this single-stepping 2193 * business when all others were already stopped...and the stop 2194 * would mess up other threads' events. 2195 * 2196 * Similiarly, if there are other threads with events, 2197 * don't do the stop. 2198 */ 2199 if (!doing_fake_step) 2200 { 2201 if (more_events_left > 0) 2202 warning ("Internal error in stopping process"); 2203 2204 stop_all_threads_of_process (real_pid); 2205 2206 /* At this point, we could scan and update_thread_list(), 2207 * and only use the local list for the rest of the 2208 * module! We'd get rid of the scans in the various 2209 * continue routines (adding one in attach). It'd 2210 * be great--UPGRADE ME! 2211 */ 2212 } 2213 } 2214 2215 #ifdef PARANOIA 2216 else if (debug_on) 2217 { 2218 if (more_events_left > 0) 2219 printf ("== Can't stop process; more events!\n"); 2220 else 2221 printf ("== Can't stop process!\n"); 2222 } 2223 #endif 2224 2225 process_state = STOPPED; 2226 2227 #ifdef WAIT_BUFFER_DEBUG 2228 if (debug_on) 2229 printf ("Process set to STOPPED\n"); 2230 #endif 2231 } 2232 2233 else 2234 { 2235 /* Fake a call to ttrace_wait. The process must be 2236 * STOPPED, as we aren't going to do any wait. 2237 */ 2238 #ifdef WAIT_BUFFER_DEBUG 2239 if (debug_on) 2240 printf ("TW: fake it\n"); 2241 #endif 2242 2243 if (process_state != STOPPED) 2244 { 2245 warning ("Process not stopped at wait call, in state '%s'.\n", 2246 get_printable_name_of_process_state (process_state)); 2247 } 2248 2249 if (doing_fake_step) 2250 error ("Internal error in stepping over breakpoint"); 2251 2252 ttw_status = 0; /* Faking it is always successful! */ 2253 } /* End of fake or not? if */ 2254 2255 /* Pick an event to pass to our caller. Be paranoid. 2256 */ 2257 if (!select_stopped_thread_of_process (real_pid, tsp)) 2258 warning ("Can't find event, using previous event."); 2259 2260 else if (tsp->tts_event == TTEVT_NONE) 2261 warning ("Internal error: no thread has a real event."); 2262 2263 else if (doing_fake_step) 2264 { 2265 if (fake_step_tid != tsp->tts_lwpid) 2266 warning ("Internal error in stepping over breakpoint."); 2267 2268 /* This wait clears the (current) fake-step if there was one. 2269 */ 2270 doing_fake_step = 0; 2271 fake_step_tid = 0; 2272 } 2273 2274 /* We now have a correct tsp and ttw_status for the thread 2275 * which we want to report. So it's "handled"! This call 2276 * will add it to our list if it's not there already. 2277 */ 2278 set_handled (real_pid, tsp->tts_lwpid); 2279 2280 /* Save a copy of the ttrace state of this thread, in our local 2281 thread descriptor. 2282 2283 This caches the state. The implementation of queries like 2284 hpux_has_execd can then use this cached state, rather than 2285 be forced to make an explicit ttrace call to get it. 2286 2287 (Guard against the condition that this is the first time we've 2288 waited on, i.e., seen this thread, and so haven't yet entered 2289 it into our list of threads.) 2290 */ 2291 tinfo = find_thread_info (tsp->tts_lwpid); 2292 if (tinfo != NULL) 2293 { 2294 copy_ttstate_t (&tinfo->last_stop_state, tsp); 2295 tinfo->have_state = 1; 2296 } 2297 2298 return ttw_status; 2299 } /* call_ttrace_wait */ 2300 2301 #if defined(CHILD_REPORTED_EXEC_EVENTS_PER_EXEC_CALL) 2302 int 2303 child_reported_exec_events_per_exec_call (void) 2304 { 2305 return 1; /* ttrace reports the event once per call. */ 2306 } 2307 #endif 2308 2309 2310 2311 /* Our implementation of hardware watchpoints involves making memory 2312 pages write-protected. We must remember a page's original permissions, 2313 and we must also know when it is appropriate to restore a page's 2314 permissions to its original state. 2315 2316 We use a "dictionary" of hardware-watched pages to do this. Each 2317 hardware-watched page is recorded in the dictionary. Each page's 2318 dictionary entry contains the original permissions and a reference 2319 count. Pages are hashed into the dictionary by their start address. 2320 2321 When hardware watchpoint is set on page X for the first time, page X 2322 is added to the dictionary with a reference count of 1. If other 2323 hardware watchpoints are subsequently set on page X, its reference 2324 count is incremented. When hardware watchpoints are removed from 2325 page X, its reference count is decremented. If a page's reference 2326 count drops to 0, it's permissions are restored and the page's entry 2327 is thrown out of the dictionary. 2328 */ 2329 typedef struct memory_page 2330 { 2331 CORE_ADDR page_start; 2332 int reference_count; 2333 int original_permissions; 2334 struct memory_page *next; 2335 struct memory_page *previous; 2336 } 2337 memory_page_t; 2338 2339 #define MEMORY_PAGE_DICTIONARY_BUCKET_COUNT 128 2340 2341 static struct 2342 { 2343 LONGEST page_count; 2344 int page_size; 2345 int page_protections_allowed; 2346 /* These are just the heads of chains of actual page descriptors. */ 2347 memory_page_t buckets[MEMORY_PAGE_DICTIONARY_BUCKET_COUNT]; 2348 } 2349 memory_page_dictionary; 2350 2351 2352 static void 2353 require_memory_page_dictionary (void) 2354 { 2355 int i; 2356 2357 /* Is the memory page dictionary ready for use? If so, we're done. */ 2358 if (memory_page_dictionary.page_count >= (LONGEST) 0) 2359 return; 2360 2361 /* Else, initialize it. */ 2362 memory_page_dictionary.page_count = (LONGEST) 0; 2363 2364 for (i = 0; i < MEMORY_PAGE_DICTIONARY_BUCKET_COUNT; i++) 2365 { 2366 memory_page_dictionary.buckets[i].page_start = (CORE_ADDR) 0; 2367 memory_page_dictionary.buckets[i].reference_count = 0; 2368 memory_page_dictionary.buckets[i].next = NULL; 2369 memory_page_dictionary.buckets[i].previous = NULL; 2370 } 2371 } 2372 2373 2374 static void 2375 retire_memory_page_dictionary (void) 2376 { 2377 memory_page_dictionary.page_count = (LONGEST) - 1; 2378 } 2379 2380 2381 /* Write-protect the memory page that starts at this address. 2382 2383 Returns the original permissions of the page. 2384 */ 2385 static int 2386 write_protect_page (int pid, CORE_ADDR page_start) 2387 { 2388 int tt_status; 2389 int original_permissions; 2390 int new_permissions; 2391 2392 tt_status = call_ttrace (TT_PROC_GET_MPROTECT, 2393 pid, 2394 (TTRACE_ARG_TYPE) page_start, 2395 TT_NIL, 2396 (TTRACE_ARG_TYPE) & original_permissions); 2397 if (errno || (tt_status < 0)) 2398 { 2399 return 0; /* What else can we do? */ 2400 } 2401 2402 /* We'll also write-protect the page now, if that's allowed. */ 2403 if (memory_page_dictionary.page_protections_allowed) 2404 { 2405 new_permissions = original_permissions & ~PROT_WRITE; 2406 tt_status = call_ttrace (TT_PROC_SET_MPROTECT, 2407 pid, 2408 (TTRACE_ARG_TYPE) page_start, 2409 (TTRACE_ARG_TYPE) memory_page_dictionary.page_size, 2410 (TTRACE_ARG_TYPE) new_permissions); 2411 if (errno || (tt_status < 0)) 2412 { 2413 return 0; /* What else can we do? */ 2414 } 2415 } 2416 2417 return original_permissions; 2418 } 2419 2420 2421 /* Unwrite-protect the memory page that starts at this address, restoring 2422 (what we must assume are) its original permissions. 2423 */ 2424 static void 2425 unwrite_protect_page (int pid, CORE_ADDR page_start, int original_permissions) 2426 { 2427 int tt_status; 2428 2429 tt_status = call_ttrace (TT_PROC_SET_MPROTECT, 2430 pid, 2431 (TTRACE_ARG_TYPE) page_start, 2432 (TTRACE_ARG_TYPE) memory_page_dictionary.page_size, 2433 (TTRACE_ARG_TYPE) original_permissions); 2434 if (errno || (tt_status < 0)) 2435 { 2436 return; /* What else can we do? */ 2437 } 2438 } 2439 2440 2441 /* Memory page-protections are used to implement "hardware" watchpoints 2442 on HP-UX. 2443 2444 For every memory page that is currently being watched (i.e., that 2445 presently should be write-protected), write-protect it. 2446 */ 2447 void 2448 hppa_enable_page_protection_events (int pid) 2449 { 2450 int bucket; 2451 2452 memory_page_dictionary.page_protections_allowed = 1; 2453 2454 for (bucket = 0; bucket < MEMORY_PAGE_DICTIONARY_BUCKET_COUNT; bucket++) 2455 { 2456 memory_page_t *page; 2457 2458 page = memory_page_dictionary.buckets[bucket].next; 2459 while (page != NULL) 2460 { 2461 page->original_permissions = write_protect_page (pid, page->page_start); 2462 page = page->next; 2463 } 2464 } 2465 } 2466 2467 2468 /* Memory page-protections are used to implement "hardware" watchpoints 2469 on HP-UX. 2470 2471 For every memory page that is currently being watched (i.e., that 2472 presently is or should be write-protected), un-write-protect it. 2473 */ 2474 void 2475 hppa_disable_page_protection_events (int pid) 2476 { 2477 int bucket; 2478 2479 for (bucket = 0; bucket < MEMORY_PAGE_DICTIONARY_BUCKET_COUNT; bucket++) 2480 { 2481 memory_page_t *page; 2482 2483 page = memory_page_dictionary.buckets[bucket].next; 2484 while (page != NULL) 2485 { 2486 unwrite_protect_page (pid, page->page_start, page->original_permissions); 2487 page = page->next; 2488 } 2489 } 2490 2491 memory_page_dictionary.page_protections_allowed = 0; 2492 } 2493 2494 /* Count the number of outstanding events. At this 2495 * point, we have selected one thread and its event 2496 * as the one to be "reported" upwards to core gdb. 2497 * That thread is already marked as "handled". 2498 * 2499 * Note: we could just scan our own thread list. FIXME! 2500 */ 2501 static int 2502 count_unhandled_events (int real_pid, lwpid_t real_tid) 2503 { 2504 ttstate_t tstate; 2505 lwpid_t ttid; 2506 int events_left; 2507 2508 /* Ok, find out how many threads have real events to report. 2509 */ 2510 events_left = 0; 2511 ttid = get_process_first_stopped_thread_id (real_pid, &tstate); 2512 2513 #ifdef THREAD_DEBUG 2514 if (debug_on) 2515 { 2516 if (ttid == 0) 2517 printf ("Process %d has no threads\n", real_pid); 2518 else 2519 printf ("Process %d has these threads:\n", real_pid); 2520 } 2521 #endif 2522 2523 while (ttid > 0) 2524 { 2525 if (tstate.tts_event != TTEVT_NONE 2526 && !was_handled (ttid)) 2527 { 2528 /* TTEVT_NONE implies we just stopped it ourselves 2529 * because we're the stop-the-world guys, so it's 2530 * not an event from our point of view. 2531 * 2532 * If "was_handled" is true, this is an event we 2533 * already handled, so don't count it. 2534 * 2535 * Note that we don't count the thread with the 2536 * currently-reported event, as it's already marked 2537 * as handled. 2538 */ 2539 events_left++; 2540 } 2541 2542 #if defined( THREAD_DEBUG ) || defined( WAIT_BUFFER_DEBUG ) 2543 if (debug_on) 2544 { 2545 if (ttid == real_tid) 2546 printf ("*"); /* Thread we're reporting */ 2547 else 2548 printf (" "); 2549 2550 if (tstate.tts_event != TTEVT_NONE) 2551 printf ("+"); /* Thread with a real event */ 2552 else 2553 printf (" "); 2554 2555 if (was_handled (ttid)) 2556 printf ("h"); /* Thread has been handled */ 2557 else 2558 printf (" "); 2559 2560 printf (" %d, with event %s", ttid, 2561 get_printable_name_of_ttrace_event (tstate.tts_event)); 2562 2563 if (tstate.tts_event == TTEVT_SIGNAL 2564 && 5 == tstate.tts_u.tts_signal.tts_signo) 2565 { 2566 CORE_ADDR pc_val; 2567 2568 pc_val = get_raw_pc (ttid); 2569 2570 if (pc_val > 0) 2571 printf (" breakpoint at 0x%x\n", pc_val); 2572 else 2573 printf (" bpt, can't fetch pc.\n"); 2574 } 2575 else 2576 printf ("\n"); 2577 } 2578 #endif 2579 2580 ttid = get_process_next_stopped_thread_id (real_pid, &tstate); 2581 } 2582 2583 #if defined( THREAD_DEBUG ) || defined( WAIT_BUFFER_DEBUG ) 2584 if (debug_on) 2585 if (events_left > 0) 2586 printf ("There are thus %d pending events\n", events_left); 2587 #endif 2588 2589 return events_left; 2590 } 2591 2592 /* This function is provided as a sop to clients that are calling 2593 * ptrace_wait to wait for a process to stop. (see the 2594 * implementation of child_wait.) Return value is the pid for 2595 * the event that ended the wait. 2596 * 2597 * Note: used by core gdb and so uses the pseudo-pid (really tid). 2598 */ 2599 int 2600 ptrace_wait (ptid_t ptid, int *status) 2601 { 2602 ttstate_t tsp; 2603 int ttwait_return; 2604 int real_pid; 2605 ttstate_t state; 2606 lwpid_t real_tid; 2607 int return_pid; 2608 2609 /* The ptrace implementation of this also ignores pid. 2610 */ 2611 *status = 0; 2612 2613 ttwait_return = call_ttrace_wait (0, TTRACE_WAITOK, &tsp, sizeof (tsp)); 2614 if (ttwait_return < 0) 2615 { 2616 /* ??rehrauer: It appears that if our inferior exits and we 2617 haven't asked for exit events, that we're not getting any 2618 indication save a negative return from ttrace_wait and an 2619 errno set to ESRCH? 2620 */ 2621 if (errno == ESRCH) 2622 { 2623 *status = 0; /* WIFEXITED */ 2624 return PIDGET (inferior_ptid); 2625 } 2626 2627 warning ("Call of ttrace_wait returned with errno %d.", 2628 errno); 2629 *status = ttwait_return; 2630 return PIDGET (inferior_ptid); 2631 } 2632 2633 real_pid = tsp.tts_pid; 2634 real_tid = tsp.tts_lwpid; 2635 2636 /* One complication is that the "tts_event" structure has 2637 * a set of flags, and more than one can be set. So we 2638 * either have to force an order (as we do here), or handle 2639 * more than one flag at a time. 2640 */ 2641 if (tsp.tts_event & TTEVT_LWP_CREATE) 2642 { 2643 2644 /* Unlike what you might expect, this event is reported in 2645 * the _creating_ thread, and the _created_ thread (whose tid 2646 * we have) is still running. So we have to stop it. This 2647 * has already been done in "call_ttrace_wait", but should we 2648 * ever abandon the "stop-the-world" model, here's the command 2649 * to use: 2650 * 2651 * call_ttrace( TT_LWP_STOP, real_tid, TT_NIL, TT_NIL, TT_NIL ); 2652 * 2653 * Note that this would depend on being called _after_ "add_tthread" 2654 * below for the tid-to-pid translation to be done in "call_ttrace". 2655 */ 2656 2657 #ifdef THREAD_DEBUG 2658 if (debug_on) 2659 printf ("New thread: pid %d, tid %d, creator tid %d\n", 2660 real_pid, tsp.tts_u.tts_thread.tts_target_lwpid, 2661 real_tid); 2662 #endif 2663 2664 /* Now we have to return the tid of the created thread, not 2665 * the creating thread, or "wait_for_inferior" won't know we 2666 * have a new "process" (thread). Plus we should record it 2667 * right, too. 2668 */ 2669 real_tid = tsp.tts_u.tts_thread.tts_target_lwpid; 2670 2671 add_tthread (real_pid, real_tid); 2672 } 2673 2674 else if ((tsp.tts_event & TTEVT_LWP_TERMINATE) 2675 || (tsp.tts_event & TTEVT_LWP_EXIT)) 2676 { 2677 2678 #ifdef THREAD_DEBUG 2679 if (debug_on) 2680 printf ("Thread dies: %d\n", real_tid); 2681 #endif 2682 2683 del_tthread (real_tid); 2684 } 2685 2686 else if (tsp.tts_event & TTEVT_EXEC) 2687 { 2688 2689 #ifdef THREAD_DEBUG 2690 if (debug_on) 2691 printf ("Pid %d has zero'th thread %d; inferior pid is %d\n", 2692 real_pid, real_tid, PIDGET (inferior_ptid)); 2693 #endif 2694 2695 add_tthread (real_pid, real_tid); 2696 } 2697 2698 #ifdef THREAD_DEBUG 2699 else if (debug_on) 2700 { 2701 printf ("Process-level event %s, using tid %d\n", 2702 get_printable_name_of_ttrace_event (tsp.tts_event), 2703 real_tid); 2704 2705 /* OK to do this, as "add_tthread" won't add 2706 * duplicate entries. Also OK not to do it, 2707 * as this event isn't one which can change the 2708 * thread state. 2709 */ 2710 add_tthread (real_pid, real_tid); 2711 } 2712 #endif 2713 2714 2715 /* How many events are left to report later? 2716 * In a non-stop-the-world model, this isn't needed. 2717 * 2718 * Note that it's not always safe to query the thread state of a process, 2719 * which is what count_unhandled_events does. (If unsafe, we're left with 2720 * no other resort than to assume that no more events remain...) 2721 */ 2722 if (can_touch_threads_of_process (real_pid, tsp.tts_event)) 2723 more_events_left = count_unhandled_events (real_pid, real_tid); 2724 2725 else 2726 { 2727 if (more_events_left > 0) 2728 warning ("Vfork or fork causing loss of %d buffered events.", 2729 more_events_left); 2730 2731 more_events_left = 0; 2732 } 2733 2734 /* Attempt to translate the ttrace_wait-returned status into the 2735 ptrace equivalent. 2736 2737 ??rehrauer: This is somewhat fragile. We really ought to rewrite 2738 clients that expect to pick apart a ptrace wait status, to use 2739 something a little more abstract. 2740 */ 2741 if ((tsp.tts_event & TTEVT_EXEC) 2742 || (tsp.tts_event & TTEVT_FORK) 2743 || (tsp.tts_event & TTEVT_VFORK)) 2744 { 2745 /* Forks come in pairs (parent and child), so core gdb 2746 * will do two waits. Be ready to notice this. 2747 */ 2748 if (tsp.tts_event & TTEVT_FORK) 2749 { 2750 process_state = FORKING; 2751 2752 #ifdef WAIT_BUFFER_DEBUG 2753 if (debug_on) 2754 printf ("Process set to FORKING\n"); 2755 #endif 2756 } 2757 else if (tsp.tts_event & TTEVT_VFORK) 2758 { 2759 process_state = VFORKING; 2760 2761 #ifdef WAIT_BUFFER_DEBUG 2762 if (debug_on) 2763 printf ("Process set to VFORKING\n"); 2764 #endif 2765 } 2766 2767 /* Make an exec or fork look like a breakpoint. Definitely a hack, 2768 but I don't think non HP-UX-specific clients really carefully 2769 inspect the first events they get after inferior startup, so 2770 it probably almost doesn't matter what we claim this is. 2771 */ 2772 2773 #ifdef THREAD_DEBUG 2774 if (debug_on) 2775 printf ("..a process 'event'\n"); 2776 #endif 2777 2778 /* Also make fork and exec events look like bpts, so they can be caught. 2779 */ 2780 *status = 0177 | (_SIGTRAP << 8); 2781 } 2782 2783 /* Special-cases: We ask for syscall entry and exit events to implement 2784 "fast" (aka "hardware") watchpoints. 2785 2786 When we get a syscall entry, we want to disable page-protections, 2787 and resume the inferior; this isn't an event we wish for 2788 wait_for_inferior to see. Note that we must resume ONLY the 2789 thread that reported the syscall entry; we don't want to allow 2790 other threads to run with the page protections off, as they might 2791 then be able to write to watch memory without it being caught. 2792 2793 When we get a syscall exit, we want to reenable page-protections, 2794 but we don't want to resume the inferior; this is an event we wish 2795 wait_for_inferior to see. Make it look like the signal we normally 2796 get for a single-step completion. This should cause wait_for_inferior 2797 to evaluate whether any watchpoint triggered. 2798 2799 Or rather, that's what we'd LIKE to do for syscall exit; we can't, 2800 due to some HP-UX "features". Some syscalls have problems with 2801 write-protections on some pages, and some syscalls seem to have 2802 pending writes to those pages at the time we're getting the return 2803 event. So, we'll single-step the inferior to get out of the syscall, 2804 and then reenable protections. 2805 2806 Note that we're intentionally allowing the syscall exit case to 2807 fall through into the succeeding cases, as sometimes we single- 2808 step out of one syscall only to immediately enter another... 2809 */ 2810 else if ((tsp.tts_event & TTEVT_SYSCALL_ENTRY) 2811 || (tsp.tts_event & TTEVT_SYSCALL_RETURN)) 2812 { 2813 /* Make a syscall event look like a breakpoint. Same comments 2814 as for exec & fork events. 2815 */ 2816 #ifdef THREAD_DEBUG 2817 if (debug_on) 2818 printf ("..a syscall 'event'\n"); 2819 #endif 2820 2821 /* Also make syscall events look like bpts, so they can be caught. 2822 */ 2823 *status = 0177 | (_SIGTRAP << 8); 2824 } 2825 2826 else if ((tsp.tts_event & TTEVT_LWP_CREATE) 2827 || (tsp.tts_event & TTEVT_LWP_TERMINATE) 2828 || (tsp.tts_event & TTEVT_LWP_EXIT)) 2829 { 2830 /* Make a thread event look like a breakpoint. Same comments 2831 * as for exec & fork events. 2832 */ 2833 #ifdef THREAD_DEBUG 2834 if (debug_on) 2835 printf ("..a thread 'event'\n"); 2836 #endif 2837 2838 /* Also make thread events look like bpts, so they can be caught. 2839 */ 2840 *status = 0177 | (_SIGTRAP << 8); 2841 } 2842 2843 else if ((tsp.tts_event & TTEVT_EXIT)) 2844 { /* WIFEXITED */ 2845 2846 #ifdef THREAD_DEBUG 2847 if (debug_on) 2848 printf ("..an exit\n"); 2849 #endif 2850 2851 /* Prevent rest of gdb from thinking this is 2852 * a new thread if for some reason it's never 2853 * seen the main thread before. 2854 */ 2855 inferior_ptid = pid_to_ptid (map_to_gdb_tid (real_tid)); /* HACK, FIX */ 2856 2857 *status = 0 | (tsp.tts_u.tts_exit.tts_exitcode); 2858 } 2859 2860 else if (tsp.tts_event & TTEVT_SIGNAL) 2861 { /* WIFSTOPPED */ 2862 #ifdef THREAD_DEBUG 2863 if (debug_on) 2864 printf ("..a signal, %d\n", tsp.tts_u.tts_signal.tts_signo); 2865 #endif 2866 2867 *status = 0177 | (tsp.tts_u.tts_signal.tts_signo << 8); 2868 } 2869 2870 else 2871 { /* !WIFSTOPPED */ 2872 2873 /* This means the process or thread terminated. But we should've 2874 caught an explicit exit/termination above. So warn (this is 2875 really an internal error) and claim the process or thread 2876 terminated with a SIGTRAP. 2877 */ 2878 2879 warning ("process_wait: unknown process state"); 2880 2881 #ifdef THREAD_DEBUG 2882 if (debug_on) 2883 printf ("Process-level event %s, using tid %d\n", 2884 get_printable_name_of_ttrace_event (tsp.tts_event), 2885 real_tid); 2886 #endif 2887 2888 *status = _SIGTRAP; 2889 } 2890 2891 #ifdef THREAD_DEBUG 2892 if (debug_on) 2893 printf ("Done waiting, pid is %d, tid %d\n", real_pid, real_tid); 2894 #endif 2895 2896 /* All code external to this module uses the tid, but calls 2897 * it "pid". There's some tweaking so that the outside sees 2898 * the first thread as having the same number as the starting 2899 * pid. 2900 */ 2901 return_pid = map_to_gdb_tid (real_tid); 2902 2903 if (real_tid == 0 || return_pid == 0) 2904 { 2905 warning ("Internal error: process-wait failed."); 2906 } 2907 2908 return return_pid; 2909 } 2910 2911 2912 /* This function causes the caller's process to be traced by its 2913 parent. This is intended to be called after GDB forks itself, 2914 and before the child execs the target. Despite the name, it 2915 is called by the child. 2916 2917 Note that HP-UX ttrace is rather funky in how this is done. 2918 If the parent wants to get the initial exec event of a child, 2919 it must set the ttrace event mask of the child to include execs. 2920 (The child cannot do this itself.) This must be done after the 2921 child is forked, but before it execs. 2922 2923 To coordinate the parent and child, we implement a semaphore using 2924 pipes. After SETTRC'ing itself, the child tells the parent that 2925 it is now traceable by the parent, and waits for the parent's 2926 acknowledgement. The parent can then set the child's event mask, 2927 and notify the child that it can now exec. 2928 2929 (The acknowledgement by parent happens as a result of a call to 2930 child_acknowledge_created_inferior.) 2931 */ 2932 int 2933 parent_attach_all (int p1, PTRACE_ARG3_TYPE p2, int p3) 2934 { 2935 int tt_status; 2936 2937 /* We need a memory home for a constant, to pass it to ttrace. 2938 The value of the constant is arbitrary, so long as both 2939 parent and child use the same value. Might as well use the 2940 "magic" constant provided by ttrace... 2941 */ 2942 uint64_t tc_magic_child = TT_VERSION; 2943 uint64_t tc_magic_parent = 0; 2944 2945 tt_status = call_real_ttrace ( 2946 TT_PROC_SETTRC, 2947 (int) TT_NIL, 2948 (lwpid_t) TT_NIL, 2949 TT_NIL, 2950 (TTRACE_ARG_TYPE) TT_VERSION, 2951 TT_NIL); 2952 2953 if (tt_status < 0) 2954 return tt_status; 2955 2956 /* Notify the parent that we're potentially ready to exec(). */ 2957 write (startup_semaphore.child_channel[SEM_TALK], 2958 &tc_magic_child, 2959 sizeof (tc_magic_child)); 2960 2961 /* Wait for acknowledgement from the parent. */ 2962 read (startup_semaphore.parent_channel[SEM_LISTEN], 2963 &tc_magic_parent, 2964 sizeof (tc_magic_parent)); 2965 2966 if (tc_magic_child != tc_magic_parent) 2967 warning ("mismatched semaphore magic"); 2968 2969 /* Discard our copy of the semaphore. */ 2970 (void) close (startup_semaphore.parent_channel[SEM_LISTEN]); 2971 (void) close (startup_semaphore.parent_channel[SEM_TALK]); 2972 (void) close (startup_semaphore.child_channel[SEM_LISTEN]); 2973 (void) close (startup_semaphore.child_channel[SEM_TALK]); 2974 2975 return tt_status; 2976 } 2977 2978 /* Despite being file-local, this routine is dealing with 2979 * actual process IDs, not thread ids. That's because it's 2980 * called before the first "wait" call, and there's no map 2981 * yet from tids to pids. 2982 * 2983 * When it is called, a forked child is running, but waiting on 2984 * the semaphore. If you stop the child and re-start it, 2985 * things get confused, so don't do that! An attached child is 2986 * stopped. 2987 * 2988 * Since this is called after either attach or run, we 2989 * have to be the common part of both. 2990 */ 2991 static void 2992 require_notification_of_events (int real_pid) 2993 { 2994 int tt_status; 2995 ttevent_t notifiable_events; 2996 2997 lwpid_t tid; 2998 ttstate_t thread_state; 2999 3000 #ifdef THREAD_DEBUG 3001 if (debug_on) 3002 printf ("Require notif, pid is %d\n", real_pid); 3003 #endif 3004 3005 /* Temporary HACK: tell inftarg.c/child_wait to not 3006 * loop until pids are the same. 3007 */ 3008 not_same_real_pid = 0; 3009 3010 sigemptyset (¬ifiable_events.tte_signals); 3011 notifiable_events.tte_opts = TTEO_NONE; 3012 3013 /* This ensures that forked children inherit their parent's 3014 * event mask, which we're setting here. 3015 * 3016 * NOTE: if you debug gdb with itself, then the ultimate 3017 * debuggee gets flags set by the outermost gdb, as 3018 * a child of a child will still inherit. 3019 */ 3020 notifiable_events.tte_opts |= TTEO_PROC_INHERIT; 3021 3022 notifiable_events.tte_events = TTEVT_DEFAULT; 3023 notifiable_events.tte_events |= TTEVT_SIGNAL; 3024 notifiable_events.tte_events |= TTEVT_EXEC; 3025 notifiable_events.tte_events |= TTEVT_EXIT; 3026 notifiable_events.tte_events |= TTEVT_FORK; 3027 notifiable_events.tte_events |= TTEVT_VFORK; 3028 notifiable_events.tte_events |= TTEVT_LWP_CREATE; 3029 notifiable_events.tte_events |= TTEVT_LWP_EXIT; 3030 notifiable_events.tte_events |= TTEVT_LWP_TERMINATE; 3031 3032 tt_status = call_real_ttrace ( 3033 TT_PROC_SET_EVENT_MASK, 3034 real_pid, 3035 (lwpid_t) TT_NIL, 3036 (TTRACE_ARG_TYPE) & notifiable_events, 3037 (TTRACE_ARG_TYPE) sizeof (notifiable_events), 3038 TT_NIL); 3039 } 3040 3041 static void 3042 require_notification_of_exec_events (int real_pid) 3043 { 3044 int tt_status; 3045 ttevent_t notifiable_events; 3046 3047 lwpid_t tid; 3048 ttstate_t thread_state; 3049 3050 #ifdef THREAD_DEBUG 3051 if (debug_on) 3052 printf ("Require notif, pid is %d\n", real_pid); 3053 #endif 3054 3055 /* Temporary HACK: tell inftarg.c/child_wait to not 3056 * loop until pids are the same. 3057 */ 3058 not_same_real_pid = 0; 3059 3060 sigemptyset (¬ifiable_events.tte_signals); 3061 notifiable_events.tte_opts = TTEO_NOSTRCCHLD; 3062 3063 /* This ensures that forked children don't inherit their parent's 3064 * event mask, which we're setting here. 3065 */ 3066 notifiable_events.tte_opts &= ~TTEO_PROC_INHERIT; 3067 3068 notifiable_events.tte_events = TTEVT_DEFAULT; 3069 notifiable_events.tte_events |= TTEVT_EXEC; 3070 notifiable_events.tte_events |= TTEVT_EXIT; 3071 3072 tt_status = call_real_ttrace ( 3073 TT_PROC_SET_EVENT_MASK, 3074 real_pid, 3075 (lwpid_t) TT_NIL, 3076 (TTRACE_ARG_TYPE) & notifiable_events, 3077 (TTRACE_ARG_TYPE) sizeof (notifiable_events), 3078 TT_NIL); 3079 } 3080 3081 3082 /* This function is called by the parent process, with pid being the 3083 * ID of the child process, after the debugger has forked. 3084 */ 3085 void 3086 child_acknowledge_created_inferior (int pid) 3087 { 3088 /* We need a memory home for a constant, to pass it to ttrace. 3089 The value of the constant is arbitrary, so long as both 3090 parent and child use the same value. Might as well use the 3091 "magic" constant provided by ttrace... 3092 */ 3093 uint64_t tc_magic_parent = TT_VERSION; 3094 uint64_t tc_magic_child = 0; 3095 3096 /* Wait for the child to tell us that it has forked. */ 3097 read (startup_semaphore.child_channel[SEM_LISTEN], 3098 &tc_magic_child, 3099 sizeof (tc_magic_child)); 3100 3101 /* Clear thread info now. We'd like to do this in 3102 * "require...", but that messes up attach. 3103 */ 3104 clear_thread_info (); 3105 3106 /* Tell the "rest of gdb" that the initial thread exists. 3107 * This isn't really a hack. Other thread-based versions 3108 * of gdb (e.g. gnu-nat.c) seem to do the same thing. 3109 * 3110 * Q: Why don't we also add this thread to the local 3111 * list via "add_tthread"? 3112 * 3113 * A: Because we don't know the tid, and can't stop the 3114 * the process safely to ask what it is. Anyway, we'll 3115 * add it when it gets the EXEC event. 3116 */ 3117 add_thread (pid_to_ptid (pid)); /* in thread.c */ 3118 3119 /* We can now set the child's ttrace event mask. 3120 */ 3121 require_notification_of_exec_events (pid); 3122 3123 /* Tell ourselves that the process is running. 3124 */ 3125 process_state = RUNNING; 3126 3127 /* Notify the child that it can exec. */ 3128 write (startup_semaphore.parent_channel[SEM_TALK], 3129 &tc_magic_parent, 3130 sizeof (tc_magic_parent)); 3131 3132 /* Discard our copy of the semaphore. */ 3133 (void) close (startup_semaphore.parent_channel[SEM_LISTEN]); 3134 (void) close (startup_semaphore.parent_channel[SEM_TALK]); 3135 (void) close (startup_semaphore.child_channel[SEM_LISTEN]); 3136 (void) close (startup_semaphore.child_channel[SEM_TALK]); 3137 } 3138 3139 3140 /* 3141 * arrange for notification of all events by 3142 * calling require_notification_of_events. 3143 */ 3144 void 3145 child_post_startup_inferior (ptid_t ptid) 3146 { 3147 require_notification_of_events (PIDGET (ptid)); 3148 } 3149 3150 /* From here on, we should expect tids rather than pids. 3151 */ 3152 static void 3153 hppa_enable_catch_fork (int tid) 3154 { 3155 int tt_status; 3156 ttevent_t ttrace_events; 3157 3158 /* Get the set of events that are currently enabled. 3159 */ 3160 tt_status = call_ttrace (TT_PROC_GET_EVENT_MASK, 3161 tid, 3162 (TTRACE_ARG_TYPE) & ttrace_events, 3163 (TTRACE_ARG_TYPE) sizeof (ttrace_events), 3164 TT_NIL); 3165 if (errno) 3166 perror_with_name ("ttrace"); 3167 3168 /* Add forks to that set. */ 3169 ttrace_events.tte_events |= TTEVT_FORK; 3170 3171 #ifdef THREAD_DEBUG 3172 if (debug_on) 3173 printf ("enable fork, tid is %d\n", tid); 3174 #endif 3175 3176 tt_status = call_ttrace (TT_PROC_SET_EVENT_MASK, 3177 tid, 3178 (TTRACE_ARG_TYPE) & ttrace_events, 3179 (TTRACE_ARG_TYPE) sizeof (ttrace_events), 3180 TT_NIL); 3181 if (errno) 3182 perror_with_name ("ttrace"); 3183 } 3184 3185 3186 static void 3187 hppa_disable_catch_fork (int tid) 3188 { 3189 int tt_status; 3190 ttevent_t ttrace_events; 3191 3192 /* Get the set of events that are currently enabled. 3193 */ 3194 tt_status = call_ttrace (TT_PROC_GET_EVENT_MASK, 3195 tid, 3196 (TTRACE_ARG_TYPE) & ttrace_events, 3197 (TTRACE_ARG_TYPE) sizeof (ttrace_events), 3198 TT_NIL); 3199 3200 if (errno) 3201 perror_with_name ("ttrace"); 3202 3203 /* Remove forks from that set. */ 3204 ttrace_events.tte_events &= ~TTEVT_FORK; 3205 3206 #ifdef THREAD_DEBUG 3207 if (debug_on) 3208 printf ("disable fork, tid is %d\n", tid); 3209 #endif 3210 3211 tt_status = call_ttrace (TT_PROC_SET_EVENT_MASK, 3212 tid, 3213 (TTRACE_ARG_TYPE) & ttrace_events, 3214 (TTRACE_ARG_TYPE) sizeof (ttrace_events), 3215 TT_NIL); 3216 3217 if (errno) 3218 perror_with_name ("ttrace"); 3219 } 3220 3221 3222 #if defined(CHILD_INSERT_FORK_CATCHPOINT) 3223 int 3224 child_insert_fork_catchpoint (int tid) 3225 { 3226 /* Enable reporting of fork events from the kernel. */ 3227 /* ??rehrauer: For the moment, we're always enabling these events, 3228 and just ignoring them if there's no catchpoint to catch them. 3229 */ 3230 return 0; 3231 } 3232 #endif 3233 3234 3235 #if defined(CHILD_REMOVE_FORK_CATCHPOINT) 3236 int 3237 child_remove_fork_catchpoint (int tid) 3238 { 3239 /* Disable reporting of fork events from the kernel. */ 3240 /* ??rehrauer: For the moment, we're always enabling these events, 3241 and just ignoring them if there's no catchpoint to catch them. 3242 */ 3243 return 0; 3244 } 3245 #endif 3246 3247 3248 static void 3249 hppa_enable_catch_vfork (int tid) 3250 { 3251 int tt_status; 3252 ttevent_t ttrace_events; 3253 3254 /* Get the set of events that are currently enabled. 3255 */ 3256 tt_status = call_ttrace (TT_PROC_GET_EVENT_MASK, 3257 tid, 3258 (TTRACE_ARG_TYPE) & ttrace_events, 3259 (TTRACE_ARG_TYPE) sizeof (ttrace_events), 3260 TT_NIL); 3261 3262 if (errno) 3263 perror_with_name ("ttrace"); 3264 3265 /* Add vforks to that set. */ 3266 ttrace_events.tte_events |= TTEVT_VFORK; 3267 3268 #ifdef THREAD_DEBUG 3269 if (debug_on) 3270 printf ("enable vfork, tid is %d\n", tid); 3271 #endif 3272 3273 tt_status = call_ttrace (TT_PROC_SET_EVENT_MASK, 3274 tid, 3275 (TTRACE_ARG_TYPE) & ttrace_events, 3276 (TTRACE_ARG_TYPE) sizeof (ttrace_events), 3277 TT_NIL); 3278 3279 if (errno) 3280 perror_with_name ("ttrace"); 3281 } 3282 3283 3284 static void 3285 hppa_disable_catch_vfork (int tid) 3286 { 3287 int tt_status; 3288 ttevent_t ttrace_events; 3289 3290 /* Get the set of events that are currently enabled. */ 3291 tt_status = call_ttrace (TT_PROC_GET_EVENT_MASK, 3292 tid, 3293 (TTRACE_ARG_TYPE) & ttrace_events, 3294 (TTRACE_ARG_TYPE) sizeof (ttrace_events), 3295 TT_NIL); 3296 3297 if (errno) 3298 perror_with_name ("ttrace"); 3299 3300 /* Remove vforks from that set. */ 3301 ttrace_events.tte_events &= ~TTEVT_VFORK; 3302 3303 #ifdef THREAD_DEBUG 3304 if (debug_on) 3305 printf ("disable vfork, tid is %d\n", tid); 3306 #endif 3307 tt_status = call_ttrace (TT_PROC_SET_EVENT_MASK, 3308 tid, 3309 (TTRACE_ARG_TYPE) & ttrace_events, 3310 (TTRACE_ARG_TYPE) sizeof (ttrace_events), 3311 TT_NIL); 3312 3313 if (errno) 3314 perror_with_name ("ttrace"); 3315 } 3316 3317 3318 #if defined(CHILD_INSERT_VFORK_CATCHPOINT) 3319 int 3320 child_insert_vfork_catchpoint (int tid) 3321 { 3322 /* Enable reporting of vfork events from the kernel. */ 3323 /* ??rehrauer: For the moment, we're always enabling these events, 3324 and just ignoring them if there's no catchpoint to catch them. 3325 */ 3326 return 0; 3327 } 3328 #endif 3329 3330 3331 #if defined(CHILD_REMOVE_VFORK_CATCHPOINT) 3332 int 3333 child_remove_vfork_catchpoint (int tid) 3334 { 3335 /* Disable reporting of vfork events from the kernel. */ 3336 /* ??rehrauer: For the moment, we're always enabling these events, 3337 and just ignoring them if there's no catchpoint to catch them. 3338 */ 3339 return 0; 3340 } 3341 #endif 3342 3343 /* Q: Do we need to map the returned process ID to a thread ID? 3344 3345 * A: I don't think so--here we want a _real_ pid. Any later 3346 * operations will call "require_notification_of_events" and 3347 * start the mapping. 3348 */ 3349 int 3350 hpux_has_forked (int tid, int *childpid) 3351 { 3352 int tt_status; 3353 ttstate_t ttrace_state; 3354 thread_info *tinfo; 3355 3356 /* Do we have cached thread state that we can consult? If so, use it. */ 3357 tinfo = find_thread_info (map_from_gdb_tid (tid)); 3358 if (tinfo != NULL) 3359 { 3360 copy_ttstate_t (&ttrace_state, &tinfo->last_stop_state); 3361 } 3362 3363 /* Nope, must read the thread's current state */ 3364 else 3365 { 3366 tt_status = call_ttrace (TT_LWP_GET_STATE, 3367 tid, 3368 (TTRACE_ARG_TYPE) & ttrace_state, 3369 (TTRACE_ARG_TYPE) sizeof (ttrace_state), 3370 TT_NIL); 3371 3372 if (errno) 3373 perror_with_name ("ttrace"); 3374 3375 if (tt_status < 0) 3376 return 0; 3377 } 3378 3379 if (ttrace_state.tts_event & TTEVT_FORK) 3380 { 3381 *childpid = ttrace_state.tts_u.tts_fork.tts_fpid; 3382 return 1; 3383 } 3384 3385 return 0; 3386 } 3387 3388 /* See hpux_has_forked for pid discussion. 3389 */ 3390 int 3391 hpux_has_vforked (int tid, int *childpid) 3392 { 3393 int tt_status; 3394 ttstate_t ttrace_state; 3395 thread_info *tinfo; 3396 3397 /* Do we have cached thread state that we can consult? If so, use it. */ 3398 tinfo = find_thread_info (map_from_gdb_tid (tid)); 3399 if (tinfo != NULL) 3400 copy_ttstate_t (&ttrace_state, &tinfo->last_stop_state); 3401 3402 /* Nope, must read the thread's current state */ 3403 else 3404 { 3405 tt_status = call_ttrace (TT_LWP_GET_STATE, 3406 tid, 3407 (TTRACE_ARG_TYPE) & ttrace_state, 3408 (TTRACE_ARG_TYPE) sizeof (ttrace_state), 3409 TT_NIL); 3410 3411 if (errno) 3412 perror_with_name ("ttrace"); 3413 3414 if (tt_status < 0) 3415 return 0; 3416 } 3417 3418 if (ttrace_state.tts_event & TTEVT_VFORK) 3419 { 3420 *childpid = ttrace_state.tts_u.tts_fork.tts_fpid; 3421 return 1; 3422 } 3423 3424 return 0; 3425 } 3426 3427 3428 #if defined(CHILD_INSERT_EXEC_CATCHPOINT) 3429 int 3430 child_insert_exec_catchpoint (int tid) 3431 { 3432 /* Enable reporting of exec events from the kernel. */ 3433 /* ??rehrauer: For the moment, we're always enabling these events, 3434 and just ignoring them if there's no catchpoint to catch them. 3435 */ 3436 return 0; 3437 } 3438 #endif 3439 3440 3441 #if defined(CHILD_REMOVE_EXEC_CATCHPOINT) 3442 int 3443 child_remove_exec_catchpoint (int tid) 3444 { 3445 /* Disable reporting of execevents from the kernel. */ 3446 /* ??rehrauer: For the moment, we're always enabling these events, 3447 and just ignoring them if there's no catchpoint to catch them. 3448 */ 3449 return 0; 3450 } 3451 #endif 3452 3453 3454 int 3455 hpux_has_execd (int tid, char **execd_pathname) 3456 { 3457 int tt_status; 3458 ttstate_t ttrace_state; 3459 thread_info *tinfo; 3460 3461 /* Do we have cached thread state that we can consult? If so, use it. */ 3462 tinfo = find_thread_info (map_from_gdb_tid (tid)); 3463 if (tinfo != NULL) 3464 copy_ttstate_t (&ttrace_state, &tinfo->last_stop_state); 3465 3466 /* Nope, must read the thread's current state */ 3467 else 3468 { 3469 tt_status = call_ttrace (TT_LWP_GET_STATE, 3470 tid, 3471 (TTRACE_ARG_TYPE) & ttrace_state, 3472 (TTRACE_ARG_TYPE) sizeof (ttrace_state), 3473 TT_NIL); 3474 3475 if (errno) 3476 perror_with_name ("ttrace"); 3477 3478 if (tt_status < 0) 3479 return 0; 3480 } 3481 3482 if (ttrace_state.tts_event & TTEVT_EXEC) 3483 { 3484 /* See child_pid_to_exec_file in this file: this is a macro. 3485 */ 3486 char *exec_file = target_pid_to_exec_file (tid); 3487 3488 *execd_pathname = savestring (exec_file, strlen (exec_file)); 3489 return 1; 3490 } 3491 3492 return 0; 3493 } 3494 3495 3496 int 3497 hpux_has_syscall_event (int pid, enum target_waitkind *kind, int *syscall_id) 3498 { 3499 int tt_status; 3500 ttstate_t ttrace_state; 3501 thread_info *tinfo; 3502 3503 /* Do we have cached thread state that we can consult? If so, use it. */ 3504 tinfo = find_thread_info (map_from_gdb_tid (pid)); 3505 if (tinfo != NULL) 3506 copy_ttstate_t (&ttrace_state, &tinfo->last_stop_state); 3507 3508 /* Nope, must read the thread's current state */ 3509 else 3510 { 3511 tt_status = call_ttrace (TT_LWP_GET_STATE, 3512 pid, 3513 (TTRACE_ARG_TYPE) & ttrace_state, 3514 (TTRACE_ARG_TYPE) sizeof (ttrace_state), 3515 TT_NIL); 3516 3517 if (errno) 3518 perror_with_name ("ttrace"); 3519 3520 if (tt_status < 0) 3521 return 0; 3522 } 3523 3524 *kind = TARGET_WAITKIND_SPURIOUS; /* Until proven otherwise... */ 3525 *syscall_id = -1; 3526 3527 if (ttrace_state.tts_event & TTEVT_SYSCALL_ENTRY) 3528 *kind = TARGET_WAITKIND_SYSCALL_ENTRY; 3529 else if (ttrace_state.tts_event & TTEVT_SYSCALL_RETURN) 3530 *kind = TARGET_WAITKIND_SYSCALL_RETURN; 3531 else 3532 return 0; 3533 3534 *syscall_id = ttrace_state.tts_scno; 3535 return 1; 3536 } 3537 3538 3539 3540 #if defined(CHILD_THREAD_ALIVE) 3541 3542 /* Check to see if the given thread is alive. 3543 3544 * We'll trust the thread list, as the more correct 3545 * approach of stopping the process and spinning down 3546 * the OS's thread list is _very_ expensive. 3547 * 3548 * May need a FIXME for that reason. 3549 */ 3550 int 3551 child_thread_alive (ptid_t ptid) 3552 { 3553 lwpid_t gdb_tid = PIDGET (ptid); 3554 lwpid_t tid; 3555 3556 /* This spins down the lists twice. 3557 * Possible peformance improvement here! 3558 */ 3559 tid = map_from_gdb_tid (gdb_tid); 3560 return !is_terminated (tid); 3561 } 3562 3563 #endif 3564 3565 3566 3567 /* This function attempts to read the specified number of bytes from the 3568 save_state_t that is our view into the hardware registers, starting at 3569 ss_offset, and ending at ss_offset + sizeof_buf - 1 3570 3571 If this function succeeds, it deposits the fetched bytes into buf, 3572 and returns 0. 3573 3574 If it fails, it returns a negative result. The contents of buf are 3575 undefined it this function fails. 3576 */ 3577 int 3578 read_from_register_save_state (int tid, TTRACE_ARG_TYPE ss_offset, char *buf, 3579 int sizeof_buf) 3580 { 3581 int tt_status; 3582 register_value_t register_value = 0; 3583 3584 tt_status = call_ttrace (TT_LWP_RUREGS, 3585 tid, 3586 ss_offset, 3587 (TTRACE_ARG_TYPE) sizeof_buf, 3588 (TTRACE_ARG_TYPE) buf); 3589 3590 if (tt_status == 1) 3591 /* Map ttrace's version of success to our version. 3592 * Sometime ttrace returns 0, but that's ok here. 3593 */ 3594 return 0; 3595 3596 return tt_status; 3597 } 3598 3599 3600 /* This function attempts to write the specified number of bytes to the 3601 save_state_t that is our view into the hardware registers, starting at 3602 ss_offset, and ending at ss_offset + sizeof_buf - 1 3603 3604 If this function succeeds, it deposits the bytes in buf, and returns 0. 3605 3606 If it fails, it returns a negative result. The contents of the save_state_t 3607 are undefined it this function fails. 3608 */ 3609 int 3610 write_to_register_save_state (int tid, TTRACE_ARG_TYPE ss_offset, char *buf, 3611 int sizeof_buf) 3612 { 3613 int tt_status; 3614 register_value_t register_value = 0; 3615 3616 tt_status = call_ttrace (TT_LWP_WUREGS, 3617 tid, 3618 ss_offset, 3619 (TTRACE_ARG_TYPE) sizeof_buf, 3620 (TTRACE_ARG_TYPE) buf); 3621 return tt_status; 3622 } 3623 3624 3625 /* This function is a sop to the largeish number of direct calls 3626 to call_ptrace that exist in other files. Rather than create 3627 functions whose name abstracts away from ptrace, and change all 3628 the present callers of call_ptrace, we'll do the expedient (and 3629 perhaps only practical) thing. 3630 3631 Note HP-UX explicitly disallows a mix of ptrace & ttrace on a traced 3632 process. Thus, we must translate all ptrace requests into their 3633 process-specific, ttrace equivalents. 3634 */ 3635 int 3636 call_ptrace (int pt_request, int gdb_tid, PTRACE_ARG3_TYPE addr, int data) 3637 { 3638 ttreq_t tt_request; 3639 TTRACE_ARG_TYPE tt_addr = (TTRACE_ARG_TYPE) addr; 3640 TTRACE_ARG_TYPE tt_data = (TTRACE_ARG_TYPE) data; 3641 TTRACE_ARG_TYPE tt_addr2 = TT_NIL; 3642 int tt_status; 3643 register_value_t register_value; 3644 int read_buf; 3645 3646 /* Perform the necessary argument translation. Note that some 3647 cases are funky enough in the ttrace realm that we handle them 3648 very specially. 3649 */ 3650 switch (pt_request) 3651 { 3652 /* The following cases cannot conveniently be handled conveniently 3653 by merely adjusting the ptrace arguments and feeding into the 3654 generic call to ttrace at the bottom of this function. 3655 3656 Note that because all branches of this switch end in "return", 3657 there's no need for any "break" statements. 3658 */ 3659 case PT_SETTRC: 3660 return parent_attach_all (0, 0, 0); 3661 3662 case PT_RUREGS: 3663 tt_status = read_from_register_save_state (gdb_tid, 3664 tt_addr, 3665 ®ister_value, 3666 sizeof (register_value)); 3667 if (tt_status < 0) 3668 return tt_status; 3669 return register_value; 3670 3671 case PT_WUREGS: 3672 register_value = (int) tt_data; 3673 tt_status = write_to_register_save_state (gdb_tid, 3674 tt_addr, 3675 ®ister_value, 3676 sizeof (register_value)); 3677 return tt_status; 3678 break; 3679 3680 case PT_READ_I: 3681 tt_status = call_ttrace (TT_PROC_RDTEXT, /* Implicit 4-byte xfer becomes block-xfer. */ 3682 gdb_tid, 3683 tt_addr, 3684 (TTRACE_ARG_TYPE) 4, 3685 (TTRACE_ARG_TYPE) & read_buf); 3686 if (tt_status < 0) 3687 return tt_status; 3688 return read_buf; 3689 3690 case PT_READ_D: 3691 tt_status = call_ttrace (TT_PROC_RDDATA, /* Implicit 4-byte xfer becomes block-xfer. */ 3692 gdb_tid, 3693 tt_addr, 3694 (TTRACE_ARG_TYPE) 4, 3695 (TTRACE_ARG_TYPE) & read_buf); 3696 if (tt_status < 0) 3697 return tt_status; 3698 return read_buf; 3699 3700 case PT_ATTACH: 3701 tt_status = call_real_ttrace (TT_PROC_ATTACH, 3702 map_from_gdb_tid (gdb_tid), 3703 (lwpid_t) TT_NIL, 3704 tt_addr, 3705 (TTRACE_ARG_TYPE) TT_VERSION, 3706 tt_addr2); 3707 if (tt_status < 0) 3708 return tt_status; 3709 return tt_status; 3710 3711 /* The following cases are handled by merely adjusting the ptrace 3712 arguments and feeding into the generic call to ttrace. 3713 */ 3714 case PT_DETACH: 3715 tt_request = TT_PROC_DETACH; 3716 break; 3717 3718 case PT_WRITE_I: 3719 tt_request = TT_PROC_WRTEXT; /* Translates 4-byte xfer to block-xfer. */ 3720 tt_data = 4; /* This many bytes. */ 3721 tt_addr2 = (TTRACE_ARG_TYPE) & data; /* Address of xfer source. */ 3722 break; 3723 3724 case PT_WRITE_D: 3725 tt_request = TT_PROC_WRDATA; /* Translates 4-byte xfer to block-xfer. */ 3726 tt_data = 4; /* This many bytes. */ 3727 tt_addr2 = (TTRACE_ARG_TYPE) & data; /* Address of xfer source. */ 3728 break; 3729 3730 case PT_RDTEXT: 3731 tt_request = TT_PROC_RDTEXT; 3732 break; 3733 3734 case PT_RDDATA: 3735 tt_request = TT_PROC_RDDATA; 3736 break; 3737 3738 case PT_WRTEXT: 3739 tt_request = TT_PROC_WRTEXT; 3740 break; 3741 3742 case PT_WRDATA: 3743 tt_request = TT_PROC_WRDATA; 3744 break; 3745 3746 case PT_CONTINUE: 3747 tt_request = TT_PROC_CONTINUE; 3748 break; 3749 3750 case PT_STEP: 3751 tt_request = TT_LWP_SINGLE; /* Should not be making this request? */ 3752 break; 3753 3754 case PT_KILL: 3755 tt_request = TT_PROC_EXIT; 3756 break; 3757 3758 case PT_GET_PROCESS_PATHNAME: 3759 tt_request = TT_PROC_GET_PATHNAME; 3760 break; 3761 3762 default: 3763 tt_request = pt_request; /* Let ttrace be the one to complain. */ 3764 break; 3765 } 3766 3767 return call_ttrace (tt_request, 3768 gdb_tid, 3769 tt_addr, 3770 tt_data, 3771 tt_addr2); 3772 } 3773 3774 /* Kill that pesky process! 3775 */ 3776 void 3777 kill_inferior (void) 3778 { 3779 int tid; 3780 int wait_status; 3781 thread_info *t; 3782 thread_info **paranoia; 3783 int para_count, i; 3784 3785 if (PIDGET (inferior_ptid) == 0) 3786 return; 3787 3788 /* Walk the list of "threads", some of which are "pseudo threads", 3789 aka "processes". For each that is NOT inferior_ptid, stop it, 3790 and detach it. 3791 3792 You see, we may not have just a single process to kill. If we're 3793 restarting or quitting or detaching just after the inferior has 3794 forked, then we've actually two processes to clean up. 3795 3796 But we can't just call target_mourn_inferior() for each, since that 3797 zaps the target vector. 3798 */ 3799 3800 paranoia = (thread_info **) xmalloc (thread_head.count * 3801 sizeof (thread_info *)); 3802 para_count = 0; 3803 3804 t = thread_head.head; 3805 while (t) 3806 { 3807 3808 paranoia[para_count] = t; 3809 for (i = 0; i < para_count; i++) 3810 { 3811 if (t->next == paranoia[i]) 3812 { 3813 warning ("Bad data in gdb's thread data; repairing."); 3814 t->next = 0; 3815 } 3816 } 3817 para_count++; 3818 3819 if (t->am_pseudo && (t->pid != PIDGET (inferior_ptid))) 3820 { 3821 call_ttrace (TT_PROC_EXIT, 3822 t->pid, 3823 TT_NIL, 3824 TT_NIL, 3825 TT_NIL); 3826 } 3827 t = t->next; 3828 } 3829 3830 xfree (paranoia); 3831 3832 call_ttrace (TT_PROC_EXIT, 3833 PIDGET (inferior_ptid), 3834 TT_NIL, 3835 TT_NIL, 3836 TT_NIL); 3837 target_mourn_inferior (); 3838 clear_thread_info (); 3839 } 3840 3841 3842 #ifndef DEPRECATED_CHILD_RESUME 3843 3844 /* Sanity check a thread about to be continued. 3845 */ 3846 static void 3847 thread_dropping_event_check (thread_info *p) 3848 { 3849 if (!p->handled) 3850 { 3851 /* 3852 * This seems to happen when we "next" over a 3853 * "fork()" while following the parent. If it's 3854 * the FORK event, that's ok. If it's a SIGNAL 3855 * in the unfollowed child, that's ok to--but 3856 * how can we know that's what's going on? 3857 * 3858 * FIXME! 3859 */ 3860 if (p->have_state) 3861 { 3862 if (p->last_stop_state.tts_event == TTEVT_FORK) 3863 { 3864 /* Ok */ 3865 ; 3866 } 3867 else if (p->last_stop_state.tts_event == TTEVT_SIGNAL) 3868 { 3869 /* Ok, close eyes and let it happen. 3870 */ 3871 ; 3872 } 3873 else 3874 { 3875 /* This shouldn't happen--we're dropping a 3876 * real event. 3877 */ 3878 warning ("About to continue process %d, thread %d with unhandled event %s.", 3879 p->pid, p->tid, 3880 get_printable_name_of_ttrace_event ( 3881 p->last_stop_state.tts_event)); 3882 3883 #ifdef PARANOIA 3884 if (debug_on) 3885 print_tthread (p); 3886 #endif 3887 } 3888 } 3889 else 3890 { 3891 /* No saved state, have to assume it failed. 3892 */ 3893 warning ("About to continue process %d, thread %d with unhandled event.", 3894 p->pid, p->tid); 3895 #ifdef PARANOIA 3896 if (debug_on) 3897 print_tthread (p); 3898 #endif 3899 } 3900 } 3901 3902 } /* thread_dropping_event_check */ 3903 3904 /* Use a loop over the threads to continue all the threads but 3905 * the one specified, which is to be stepped. 3906 */ 3907 static void 3908 threads_continue_all_but_one (lwpid_t gdb_tid, int signal) 3909 { 3910 thread_info *p; 3911 int thread_signal; 3912 lwpid_t real_tid; 3913 lwpid_t scan_tid; 3914 ttstate_t state; 3915 int real_pid; 3916 3917 #ifdef THREAD_DEBUG 3918 if (debug_on) 3919 printf ("Using loop over threads to step/resume with signals\n"); 3920 #endif 3921 3922 /* First update the thread list. 3923 */ 3924 set_all_unseen (); 3925 real_tid = map_from_gdb_tid (gdb_tid); 3926 real_pid = get_pid_for (real_tid); 3927 3928 scan_tid = get_process_first_stopped_thread_id (real_pid, &state); 3929 while (0 != scan_tid) 3930 { 3931 3932 #ifdef THREAD_DEBUG 3933 /* FIX: later should check state is stopped; 3934 * state.tts_flags & TTS_STATEMASK == TTS_WASSUSPENDED 3935 */ 3936 if (debug_on) 3937 if ((state.tts_flags & TTS_STATEMASK) != TTS_WASSUSPENDED) 3938 printf ("About to continue non-stopped thread %d\n", scan_tid); 3939 #endif 3940 3941 p = find_thread_info (scan_tid); 3942 if (NULL == p) 3943 { 3944 add_tthread (real_pid, scan_tid); 3945 p = find_thread_info (scan_tid); 3946 3947 /* This is either a newly-created thread or the 3948 * result of a fork; in either case there's no 3949 * actual event to worry about. 3950 */ 3951 p->handled = 1; 3952 3953 if (state.tts_event != TTEVT_NONE) 3954 { 3955 /* Oops, do need to worry! 3956 */ 3957 warning ("Unexpected thread with \"%s\" event.", 3958 get_printable_name_of_ttrace_event (state.tts_event)); 3959 } 3960 } 3961 else if (scan_tid != p->tid) 3962 error ("Bad data in thread database."); 3963 3964 #ifdef THREAD_DEBUG 3965 if (debug_on) 3966 if (p->terminated) 3967 printf ("Why are we continuing a dead thread?\n"); 3968 #endif 3969 3970 p->seen = 1; 3971 3972 scan_tid = get_process_next_stopped_thread_id (real_pid, &state); 3973 } 3974 3975 /* Remove unseen threads. 3976 */ 3977 update_thread_list (); 3978 3979 /* Now run down the thread list and continue or step. 3980 */ 3981 for (p = thread_head.head; p; p = p->next) 3982 { 3983 3984 /* Sanity check. 3985 */ 3986 thread_dropping_event_check (p); 3987 3988 /* Pass the correct signals along. 3989 */ 3990 if (p->have_signal) 3991 { 3992 thread_signal = p->signal_value; 3993 p->have_signal = 0; 3994 } 3995 else 3996 thread_signal = 0; 3997 3998 if (p->tid != real_tid) 3999 { 4000 /* 4001 * Not the thread of interest, so continue it 4002 * as the user expects. 4003 */ 4004 if (p->stepping_mode == DO_STEP) 4005 { 4006 /* Just step this thread. 4007 */ 4008 call_ttrace ( 4009 TT_LWP_SINGLE, 4010 p->tid, 4011 TT_USE_CURRENT_PC, 4012 (TTRACE_ARG_TYPE) target_signal_to_host (signal), 4013 TT_NIL); 4014 } 4015 else 4016 { 4017 /* Regular continue (default case). 4018 */ 4019 call_ttrace ( 4020 TT_LWP_CONTINUE, 4021 p->tid, 4022 TT_USE_CURRENT_PC, 4023 (TTRACE_ARG_TYPE) target_signal_to_host (thread_signal), 4024 TT_NIL); 4025 } 4026 } 4027 else 4028 { 4029 /* Step the thread of interest. 4030 */ 4031 call_ttrace ( 4032 TT_LWP_SINGLE, 4033 real_tid, 4034 TT_USE_CURRENT_PC, 4035 (TTRACE_ARG_TYPE) target_signal_to_host (signal), 4036 TT_NIL); 4037 } 4038 } /* Loop over threads */ 4039 } /* End threads_continue_all_but_one */ 4040 4041 /* Use a loop over the threads to continue all the threads. 4042 * This is done when a signal must be sent to any of the threads. 4043 */ 4044 static void 4045 threads_continue_all_with_signals (lwpid_t gdb_tid, int signal) 4046 { 4047 thread_info *p; 4048 int thread_signal; 4049 lwpid_t real_tid; 4050 lwpid_t scan_tid; 4051 ttstate_t state; 4052 int real_pid; 4053 4054 #ifdef THREAD_DEBUG 4055 if (debug_on) 4056 printf ("Using loop over threads to resume with signals\n"); 4057 #endif 4058 4059 /* Scan and update thread list. 4060 */ 4061 set_all_unseen (); 4062 real_tid = map_from_gdb_tid (gdb_tid); 4063 real_pid = get_pid_for (real_tid); 4064 4065 scan_tid = get_process_first_stopped_thread_id (real_pid, &state); 4066 while (0 != scan_tid) 4067 { 4068 4069 #ifdef THREAD_DEBUG 4070 if (debug_on) 4071 if ((state.tts_flags & TTS_STATEMASK) != TTS_WASSUSPENDED) 4072 warning ("About to continue non-stopped thread %d\n", scan_tid); 4073 #endif 4074 4075 p = find_thread_info (scan_tid); 4076 if (NULL == p) 4077 { 4078 add_tthread (real_pid, scan_tid); 4079 p = find_thread_info (scan_tid); 4080 4081 /* This is either a newly-created thread or the 4082 * result of a fork; in either case there's no 4083 * actual event to worry about. 4084 */ 4085 p->handled = 1; 4086 4087 if (state.tts_event != TTEVT_NONE) 4088 { 4089 /* Oops, do need to worry! 4090 */ 4091 warning ("Unexpected thread with \"%s\" event.", 4092 get_printable_name_of_ttrace_event (state.tts_event)); 4093 } 4094 } 4095 4096 #ifdef THREAD_DEBUG 4097 if (debug_on) 4098 if (p->terminated) 4099 printf ("Why are we continuing a dead thread? (1)\n"); 4100 #endif 4101 4102 p->seen = 1; 4103 4104 scan_tid = get_process_next_stopped_thread_id (real_pid, &state); 4105 } 4106 4107 /* Remove unseen threads from our list. 4108 */ 4109 update_thread_list (); 4110 4111 /* Continue the threads. 4112 */ 4113 for (p = thread_head.head; p; p = p->next) 4114 { 4115 4116 /* Sanity check. 4117 */ 4118 thread_dropping_event_check (p); 4119 4120 /* Pass the correct signals along. 4121 */ 4122 if (p->tid == real_tid) 4123 { 4124 thread_signal = signal; 4125 p->have_signal = 0; 4126 } 4127 else if (p->have_signal) 4128 { 4129 thread_signal = p->signal_value; 4130 p->have_signal = 0; 4131 } 4132 else 4133 thread_signal = 0; 4134 4135 if (p->stepping_mode == DO_STEP) 4136 { 4137 call_ttrace ( 4138 TT_LWP_SINGLE, 4139 p->tid, 4140 TT_USE_CURRENT_PC, 4141 (TTRACE_ARG_TYPE) target_signal_to_host (signal), 4142 TT_NIL); 4143 } 4144 else 4145 { 4146 /* Continue this thread (default case). 4147 */ 4148 call_ttrace ( 4149 TT_LWP_CONTINUE, 4150 p->tid, 4151 TT_USE_CURRENT_PC, 4152 (TTRACE_ARG_TYPE) target_signal_to_host (thread_signal), 4153 TT_NIL); 4154 } 4155 } 4156 } /* End threads_continue_all_with_signals */ 4157 4158 /* Step one thread only. 4159 */ 4160 static void 4161 thread_fake_step (lwpid_t tid, enum target_signal signal) 4162 { 4163 thread_info *p; 4164 4165 #ifdef THREAD_DEBUG 4166 if (debug_on) 4167 { 4168 printf ("Doing a fake-step over a bpt, etc. for %d\n", tid); 4169 4170 if (is_terminated (tid)) 4171 printf ("Why are we continuing a dead thread? (4)\n"); 4172 } 4173 #endif 4174 4175 if (doing_fake_step) 4176 warning ("Step while step already in progress."); 4177 4178 /* See if there's a saved signal value for this 4179 * thread to be passed on, but no current signal. 4180 */ 4181 p = find_thread_info (tid); 4182 if (p != NULL) 4183 { 4184 if (p->have_signal && signal == TARGET_SIGNAL_0) 4185 { 4186 /* Pass on a saved signal. 4187 */ 4188 signal = p->signal_value; 4189 } 4190 4191 p->have_signal = 0; 4192 } 4193 4194 if (!p->handled) 4195 warning ("Internal error: continuing unhandled thread."); 4196 4197 call_ttrace (TT_LWP_SINGLE, 4198 tid, 4199 TT_USE_CURRENT_PC, 4200 (TTRACE_ARG_TYPE) target_signal_to_host (signal), 4201 TT_NIL); 4202 4203 /* Do bookkeeping so "call_ttrace_wait" knows it has to wait 4204 * for this thread only, and clear any saved signal info. 4205 */ 4206 doing_fake_step = 1; 4207 fake_step_tid = tid; 4208 4209 } /* End thread_fake_step */ 4210 4211 /* Continue one thread when a signal must be sent to it. 4212 */ 4213 static void 4214 threads_continue_one_with_signal (lwpid_t gdb_tid, int signal) 4215 { 4216 thread_info *p; 4217 lwpid_t real_tid; 4218 int real_pid; 4219 4220 #ifdef THREAD_DEBUG 4221 if (debug_on) 4222 printf ("Continuing one thread with a signal\n"); 4223 #endif 4224 4225 real_tid = map_from_gdb_tid (gdb_tid); 4226 real_pid = get_pid_for (real_tid); 4227 4228 p = find_thread_info (real_tid); 4229 if (NULL == p) 4230 { 4231 add_tthread (real_pid, real_tid); 4232 } 4233 4234 #ifdef THREAD_DEBUG 4235 if (debug_on) 4236 if (p->terminated) 4237 printf ("Why are we continuing a dead thread? (2)\n"); 4238 #endif 4239 4240 if (!p->handled) 4241 warning ("Internal error: continuing unhandled thread."); 4242 4243 p->have_signal = 0; 4244 4245 call_ttrace (TT_LWP_CONTINUE, 4246 gdb_tid, 4247 TT_USE_CURRENT_PC, 4248 (TTRACE_ARG_TYPE) target_signal_to_host (signal), 4249 TT_NIL); 4250 } 4251 #endif 4252 4253 #ifndef DEPRECATED_CHILD_RESUME 4254 4255 /* Resume execution of the inferior process. 4256 4257 * This routine is in charge of setting the "handled" bits. 4258 * 4259 * If STEP is zero, continue it. 4260 * If STEP is nonzero, single-step it. 4261 * 4262 * If SIGNAL is nonzero, give it that signal. 4263 * 4264 * If TID is -1, apply to all threads. 4265 * If TID is not -1, apply to specified thread. 4266 * 4267 * STEP 4268 * \ !0 0 4269 * TID \________________________________________________ 4270 * | 4271 * -1 | Step current Continue all threads 4272 * | thread and (but which gets any 4273 * | continue others signal?--We look at 4274 * | "inferior_ptid") 4275 * | 4276 * N | Step _this_ thread Continue _this_ thread 4277 * | and leave others and leave others 4278 * | stopped; internally stopped; used only for 4279 * | used by gdb, never hardware watchpoints 4280 * | a user command. and attach, never a 4281 * | user command. 4282 */ 4283 void 4284 child_resume (ptid_t ptid, int step, enum target_signal signal) 4285 { 4286 int resume_all_threads; 4287 lwpid_t tid; 4288 process_state_t new_process_state; 4289 lwpid_t gdb_tid = PIDGET (ptid); 4290 4291 resume_all_threads = 4292 (gdb_tid == INFTTRACE_ALL_THREADS) || 4293 (vfork_in_flight); 4294 4295 if (resume_all_threads) 4296 { 4297 /* Resume all threads, but first pick a tid value 4298 * so we can get the pid when in call_ttrace doing 4299 * the map. 4300 */ 4301 if (vfork_in_flight) 4302 tid = vforking_child_pid; 4303 else 4304 tid = map_from_gdb_tid (PIDGET (inferior_ptid)); 4305 } 4306 else 4307 tid = map_from_gdb_tid (gdb_tid); 4308 4309 #ifdef THREAD_DEBUG 4310 if (debug_on) 4311 { 4312 if (more_events_left) 4313 printf ("More events; "); 4314 4315 if (signal != 0) 4316 printf ("Sending signal %d; ", signal); 4317 4318 if (resume_all_threads) 4319 { 4320 if (step == 0) 4321 printf ("Continue process %d\n", tid); 4322 else 4323 printf ("Step/continue thread %d\n", tid); 4324 } 4325 else 4326 { 4327 if (step == 0) 4328 printf ("Continue thread %d\n", tid); 4329 else 4330 printf ("Step just thread %d\n", tid); 4331 } 4332 4333 if (vfork_in_flight) 4334 printf ("Vfork in flight\n"); 4335 } 4336 #endif 4337 4338 if (process_state == RUNNING) 4339 warning ("Internal error in resume logic; doing resume or step anyway."); 4340 4341 if (!step /* Asked to continue... */ 4342 && resume_all_threads /* whole process.. */ 4343 && signal != 0 /* with a signal... */ 4344 && more_events_left > 0) 4345 { /* but we can't yet--save it! */ 4346 4347 /* Continue with signal means we have to set the pending 4348 * signal value for this thread. 4349 */ 4350 thread_info *k; 4351 4352 #ifdef THREAD_DEBUG 4353 if (debug_on) 4354 printf ("Saving signal %d for thread %d\n", signal, tid); 4355 #endif 4356 4357 k = find_thread_info (tid); 4358 if (k != NULL) 4359 { 4360 k->have_signal = 1; 4361 k->signal_value = signal; 4362 4363 #ifdef THREAD_DEBUG 4364 if (debug_on) 4365 if (k->terminated) 4366 printf ("Why are we continuing a dead thread? (3)\n"); 4367 #endif 4368 4369 } 4370 4371 #ifdef THREAD_DEBUG 4372 else if (debug_on) 4373 { 4374 printf ("No thread info for tid %d\n", tid); 4375 } 4376 #endif 4377 } 4378 4379 /* Are we faking this "continue" or "step"? 4380 4381 * We used to do steps by continuing all the threads for 4382 * which the events had been handled already. While 4383 * conceptually nicer (hides it all in a lower level), this 4384 * can lead to starvation and a hang (e.g. all but one thread 4385 * are unhandled at a breakpoint just before a "join" operation, 4386 * and one thread is in the join, and the user wants to step that 4387 * thread). 4388 */ 4389 if (resume_all_threads /* Whole process, therefore user command */ 4390 && more_events_left > 0) 4391 { /* But we can't do this yet--fake it! */ 4392 thread_info *p; 4393 4394 if (!step) 4395 { 4396 /* No need to do any notes on a per-thread 4397 * basis--we're done! 4398 */ 4399 #ifdef WAIT_BUFFER_DEBUG 4400 if (debug_on) 4401 printf ("Faking a process resume.\n"); 4402 #endif 4403 4404 return; 4405 } 4406 else 4407 { 4408 4409 #ifdef WAIT_BUFFER_DEBUG 4410 if (debug_on) 4411 printf ("Faking a process step.\n"); 4412 #endif 4413 4414 } 4415 4416 p = find_thread_info (tid); 4417 if (p == NULL) 4418 { 4419 warning ("No thread information for tid %d, 'next' command ignored.\n", tid); 4420 return; 4421 } 4422 else 4423 { 4424 4425 #ifdef THREAD_DEBUG 4426 if (debug_on) 4427 if (p->terminated) 4428 printf ("Why are we continuing a dead thread? (3.5)\n"); 4429 #endif 4430 4431 if (p->stepping_mode != DO_DEFAULT) 4432 { 4433 warning ("Step or continue command applied to thread which is already stepping or continuing; command ignored."); 4434 4435 return; 4436 } 4437 4438 if (step) 4439 p->stepping_mode = DO_STEP; 4440 else 4441 p->stepping_mode = DO_CONTINUE; 4442 4443 return; 4444 } /* Have thread info */ 4445 } /* Must fake step or go */ 4446 4447 /* Execept for fake-steps, from here on we know we are 4448 * going to wind up with a running process which will 4449 * need a real wait. 4450 */ 4451 new_process_state = RUNNING; 4452 4453 /* An address of TT_USE_CURRENT_PC tells ttrace to continue from where 4454 * it was. (If GDB wanted it to start some other way, we have already 4455 * written a new PC value to the child.) 4456 * 4457 * If this system does not support PT_STEP, a higher level function will 4458 * have called single_step() to transmute the step request into a 4459 * continue request (by setting breakpoints on all possible successor 4460 * instructions), so we don't have to worry about that here. 4461 */ 4462 if (step) 4463 { 4464 if (resume_all_threads) 4465 { 4466 /* 4467 * Regular user step: other threads get a "continue". 4468 */ 4469 threads_continue_all_but_one (tid, signal); 4470 clear_all_handled (); 4471 clear_all_stepping_mode (); 4472 } 4473 4474 else 4475 { 4476 /* "Fake step": gdb is stepping one thread over a 4477 * breakpoint, watchpoint, or out of a library load 4478 * event, etc. The rest just stay where they are. 4479 * 4480 * Also used when there are pending events: we really 4481 * step the current thread, but leave the rest stopped. 4482 * Users can't request this, but "wait_for_inferior" 4483 * does--a lot! 4484 */ 4485 thread_fake_step (tid, signal); 4486 4487 /* Clear the "handled" state of this thread, because 4488 * we'll soon get a new event for it. Other events 4489 * stay as they were. 4490 */ 4491 clear_handled (tid); 4492 clear_stepping_mode (tid); 4493 new_process_state = FAKE_STEPPING; 4494 } 4495 } 4496 4497 else 4498 { 4499 /* TT_LWP_CONTINUE can pass signals to threads, TT_PROC_CONTINUE can't. 4500 Therefore, we really can't use TT_PROC_CONTINUE here. 4501 4502 Consider a process which stopped due to signal which gdb decides 4503 to handle and not pass on to the inferior. In that case we must 4504 clear the pending signal by restarting the inferior using 4505 TT_LWP_CONTINUE and pass zero as the signal number. Else the 4506 pending signal will be passed to the inferior. interrupt.exp 4507 in the testsuite does this precise thing and fails due to the 4508 unwanted signal delivery to the inferior. */ 4509 /* drow/2002-12-05: However, note that we must use TT_PROC_CONTINUE 4510 if we are tracing a vfork. */ 4511 if (vfork_in_flight) 4512 { 4513 call_ttrace (TT_PROC_CONTINUE, tid, TT_NIL, TT_NIL, TT_NIL); 4514 clear_all_handled (); 4515 clear_all_stepping_mode (); 4516 } 4517 else if (resume_all_threads) 4518 { 4519 #ifdef THREAD_DEBUG 4520 if (debug_on) 4521 printf ("Doing a continue by loop of all threads\n"); 4522 #endif 4523 4524 threads_continue_all_with_signals (tid, signal); 4525 4526 clear_all_handled (); 4527 clear_all_stepping_mode (); 4528 } 4529 else 4530 { 4531 #ifdef THREAD_DEBUG 4532 printf ("Doing a continue w/signal of just thread %d\n", tid); 4533 #endif 4534 4535 threads_continue_one_with_signal (tid, signal); 4536 4537 /* Clear the "handled" state of this thread, because we 4538 will soon get a new event for it. Other events can 4539 stay as they were. */ 4540 clear_handled (tid); 4541 clear_stepping_mode (tid); 4542 } 4543 } 4544 4545 process_state = new_process_state; 4546 4547 #ifdef WAIT_BUFFER_DEBUG 4548 if (debug_on) 4549 printf ("Process set to %s\n", 4550 get_printable_name_of_process_state (process_state)); 4551 #endif 4552 4553 } 4554 #endif /* DEPRECATED_CHILD_RESUME */ 4555 4556 /* 4557 * Like it says. 4558 * 4559 * One worry is that we may not be attaching to "inferior_ptid" 4560 * and thus may not want to clear out our data. FIXME? 4561 * 4562 */ 4563 static void 4564 update_thread_state_after_attach (int pid, attach_continue_t kind_of_go) 4565 { 4566 int tt_status; 4567 ttstate_t thread_state; 4568 lwpid_t a_thread; 4569 lwpid_t tid; 4570 4571 /* The process better be stopped. 4572 */ 4573 if (process_state != STOPPED 4574 && process_state != VFORKING) 4575 warning ("Internal error attaching."); 4576 4577 /* Clear out old tthread info and start over. This has the 4578 * side effect of ensuring that the TRAP is reported as being 4579 * in the right thread (re-mapped from tid to pid). 4580 * 4581 * It's because we need to add the tthread _now_ that we 4582 * need to call "clear_thread_info" _now_, and that's why 4583 * "require_notification_of_events" doesn't clear the thread 4584 * info (it's called later than this routine). 4585 */ 4586 clear_thread_info (); 4587 a_thread = 0; 4588 4589 for (tid = get_process_first_stopped_thread_id (pid, &thread_state); 4590 tid != 0; 4591 tid = get_process_next_stopped_thread_id (pid, &thread_state)) 4592 { 4593 thread_info *p; 4594 4595 if (a_thread == 0) 4596 { 4597 a_thread = tid; 4598 #ifdef THREAD_DEBUG 4599 if (debug_on) 4600 printf ("Attaching to process %d, thread %d\n", 4601 pid, a_thread); 4602 #endif 4603 } 4604 4605 /* Tell ourselves and the "rest of gdb" that this thread 4606 * exists. 4607 * 4608 * This isn't really a hack. Other thread-based versions 4609 * of gdb (e.g. gnu-nat.c) seem to do the same thing. 4610 * 4611 * We don't need to do mapping here, as we know this 4612 * is the first thread and thus gets the real pid 4613 * (and is "inferior_ptid"). 4614 * 4615 * NOTE: it probably isn't the originating thread, 4616 * but that doesn't matter (we hope!). 4617 */ 4618 add_tthread (pid, tid); 4619 p = find_thread_info (tid); 4620 if (NULL == p) /* ?We just added it! */ 4621 error ("Internal error adding a thread on attach."); 4622 4623 copy_ttstate_t (&p->last_stop_state, &thread_state); 4624 p->have_state = 1; 4625 4626 if (DO_ATTACH_CONTINUE == kind_of_go) 4627 { 4628 /* 4629 * If we are going to CONTINUE afterwards, 4630 * raising a SIGTRAP, don't bother trying to 4631 * handle this event. But check first! 4632 */ 4633 switch (p->last_stop_state.tts_event) 4634 { 4635 4636 case TTEVT_NONE: 4637 /* Ok to set this handled. 4638 */ 4639 break; 4640 4641 default: 4642 warning ("Internal error; skipping event %s on process %d, thread %d.", 4643 get_printable_name_of_ttrace_event ( 4644 p->last_stop_state.tts_event), 4645 p->pid, p->tid); 4646 } 4647 4648 set_handled (pid, tid); 4649 4650 } 4651 else 4652 { 4653 /* There will be no "continue" opertion, so the 4654 * process remains stopped. Don't set any events 4655 * handled except the "gimmies". 4656 */ 4657 switch (p->last_stop_state.tts_event) 4658 { 4659 4660 case TTEVT_NONE: 4661 /* Ok to ignore this. 4662 */ 4663 set_handled (pid, tid); 4664 break; 4665 4666 case TTEVT_EXEC: 4667 case TTEVT_FORK: 4668 /* Expected "other" FORK or EXEC event from a 4669 * fork or vfork. 4670 */ 4671 break; 4672 4673 default: 4674 printf ("Internal error: failed to handle event %s on process %d, thread %d.", 4675 get_printable_name_of_ttrace_event ( 4676 p->last_stop_state.tts_event), 4677 p->pid, p->tid); 4678 } 4679 } 4680 4681 add_thread (pid_to_ptid (pid)); /* in thread.c */ 4682 } 4683 4684 #ifdef PARANOIA 4685 if (debug_on) 4686 print_tthreads (); 4687 #endif 4688 4689 /* One mustn't call ttrace_wait() after attaching via ttrace, 4690 'cause the process is stopped already. 4691 4692 However, the upper layers of gdb's execution control will 4693 want to wait after attaching (but not after forks, in 4694 which case they will be doing a "target_resume", anticipating 4695 a later TTEVT_EXEC or TTEVT_FORK event). 4696 4697 To make this attach() implementation more compatible with 4698 others, we'll make the attached-to process raise a SIGTRAP. 4699 4700 Issue: this continues only one thread. That could be 4701 dangerous if the thread is blocked--the process won't run 4702 and no trap will be raised. FIX! (check state.tts_flags? 4703 need one that's either TTS_WASRUNNING--but we've stopped 4704 it and made it TTS_WASSUSPENDED. Hum...FIXME!) 4705 */ 4706 if (DO_ATTACH_CONTINUE == kind_of_go) 4707 { 4708 tt_status = call_real_ttrace ( 4709 TT_LWP_CONTINUE, 4710 pid, 4711 a_thread, 4712 TT_USE_CURRENT_PC, 4713 (TTRACE_ARG_TYPE) target_signal_to_host (TARGET_SIGNAL_TRAP), 4714 TT_NIL); 4715 if (errno) 4716 perror_with_name ("ttrace"); 4717 4718 clear_handled (a_thread); /* So TRAP will be reported. */ 4719 4720 /* Now running. 4721 */ 4722 process_state = RUNNING; 4723 } 4724 4725 attach_flag = 1; 4726 } 4727 4728 4729 /* Start debugging the process whose number is PID. 4730 * (A _real_ pid). 4731 */ 4732 int 4733 attach (int pid) 4734 { 4735 int tt_status; 4736 4737 tt_status = call_real_ttrace ( 4738 TT_PROC_ATTACH, 4739 pid, 4740 (lwpid_t) TT_NIL, 4741 TT_NIL, 4742 (TTRACE_ARG_TYPE) TT_VERSION, 4743 TT_NIL); 4744 if (errno) 4745 perror_with_name ("ttrace attach"); 4746 4747 /* If successful, the process is now stopped. 4748 */ 4749 process_state = STOPPED; 4750 4751 /* Our caller ("attach_command" in "infcmd.c") 4752 * expects to do a "wait_for_inferior" after 4753 * the attach, so make sure the inferior is 4754 * running when we're done. 4755 */ 4756 update_thread_state_after_attach (pid, DO_ATTACH_CONTINUE); 4757 4758 return pid; 4759 } 4760 4761 4762 #if defined(CHILD_POST_ATTACH) 4763 void 4764 child_post_attach (int pid) 4765 { 4766 #ifdef THREAD_DEBUG 4767 if (debug_on) 4768 printf ("child-post-attach call\n"); 4769 #endif 4770 4771 require_notification_of_events (pid); 4772 } 4773 #endif 4774 4775 4776 /* Stop debugging the process whose number is PID 4777 and continue it with signal number SIGNAL. 4778 SIGNAL = 0 means just continue it. 4779 */ 4780 void 4781 detach (int signal) 4782 { 4783 errno = 0; 4784 call_ttrace (TT_PROC_DETACH, 4785 PIDGET (inferior_ptid), 4786 TT_NIL, 4787 (TTRACE_ARG_TYPE) signal, 4788 TT_NIL); 4789 attach_flag = 0; 4790 4791 clear_thread_info (); 4792 4793 /* Process-state? */ 4794 } 4795 4796 4797 /* Default the type of the ttrace transfer to int. */ 4798 #ifndef TTRACE_XFER_TYPE 4799 #define TTRACE_XFER_TYPE int 4800 #endif 4801 4802 void 4803 _initialize_kernel_u_addr (void) 4804 { 4805 } 4806 4807 #if !defined (CHILD_XFER_MEMORY) 4808 /* NOTE! I tried using TTRACE_READDATA, etc., to read and write memory 4809 in the NEW_SUN_TTRACE case. 4810 It ought to be straightforward. But it appears that writing did 4811 not write the data that I specified. I cannot understand where 4812 it got the data that it actually did write. */ 4813 4814 /* Copy LEN bytes to or from inferior's memory starting at MEMADDR 4815 to debugger memory starting at MYADDR. Copy to inferior if 4816 WRITE is nonzero. TARGET is ignored. 4817 4818 Returns the length copied, which is either the LEN argument or 4819 zero. This xfer function does not do partial moves, since 4820 deprecated_child_ops doesn't allow memory operations to cross below 4821 us in the target stack anyway. */ 4822 4823 int 4824 child_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write, 4825 struct mem_attrib *attrib, 4826 struct target_ops *target) 4827 { 4828 int i; 4829 /* Round starting address down to longword boundary. */ 4830 CORE_ADDR addr = memaddr & -(CORE_ADDR) sizeof (TTRACE_XFER_TYPE); 4831 /* Round ending address up; get number of longwords that makes. */ 4832 int count 4833 = (((memaddr + len) - addr) + sizeof (TTRACE_XFER_TYPE) - 1) 4834 / sizeof (TTRACE_XFER_TYPE); 4835 /* Allocate buffer of that many longwords. */ 4836 /* FIXME (alloca): This code, cloned from infptrace.c, is unsafe 4837 because it uses alloca to allocate a buffer of arbitrary size. 4838 For very large xfers, this could crash GDB's stack. */ 4839 TTRACE_XFER_TYPE *buffer 4840 = (TTRACE_XFER_TYPE *) alloca (count * sizeof (TTRACE_XFER_TYPE)); 4841 4842 if (write) 4843 { 4844 /* Fill start and end extra bytes of buffer with existing memory data. */ 4845 4846 if (addr != memaddr || len < (int) sizeof (TTRACE_XFER_TYPE)) 4847 { 4848 /* Need part of initial word -- fetch it. */ 4849 buffer[0] = call_ttrace (TT_LWP_RDTEXT, 4850 PIDGET (inferior_ptid), 4851 (TTRACE_ARG_TYPE) addr, 4852 TT_NIL, 4853 TT_NIL); 4854 } 4855 4856 if (count > 1) /* FIXME, avoid if even boundary */ 4857 { 4858 buffer[count - 1] = call_ttrace (TT_LWP_RDTEXT, 4859 PIDGET (inferior_ptid), 4860 ((TTRACE_ARG_TYPE) 4861 (addr + (count - 1) * sizeof (TTRACE_XFER_TYPE))), 4862 TT_NIL, 4863 TT_NIL); 4864 } 4865 4866 /* Copy data to be written over corresponding part of buffer */ 4867 4868 memcpy ((char *) buffer + (memaddr & (sizeof (TTRACE_XFER_TYPE) - 1)), 4869 myaddr, 4870 len); 4871 4872 /* Write the entire buffer. */ 4873 4874 for (i = 0; i < count; i++, addr += sizeof (TTRACE_XFER_TYPE)) 4875 { 4876 errno = 0; 4877 call_ttrace (TT_LWP_WRDATA, 4878 PIDGET (inferior_ptid), 4879 (TTRACE_ARG_TYPE) addr, 4880 (TTRACE_ARG_TYPE) buffer[i], 4881 TT_NIL); 4882 if (errno) 4883 { 4884 /* Using the appropriate one (I or D) is necessary for 4885 Gould NP1, at least. */ 4886 errno = 0; 4887 call_ttrace (TT_LWP_WRTEXT, 4888 PIDGET (inferior_ptid), 4889 (TTRACE_ARG_TYPE) addr, 4890 (TTRACE_ARG_TYPE) buffer[i], 4891 TT_NIL); 4892 } 4893 if (errno) 4894 return 0; 4895 } 4896 } 4897 else 4898 { 4899 /* Read all the longwords */ 4900 for (i = 0; i < count; i++, addr += sizeof (TTRACE_XFER_TYPE)) 4901 { 4902 errno = 0; 4903 buffer[i] = call_ttrace (TT_LWP_RDTEXT, 4904 PIDGET (inferior_ptid), 4905 (TTRACE_ARG_TYPE) addr, 4906 TT_NIL, 4907 TT_NIL); 4908 if (errno) 4909 return 0; 4910 QUIT; 4911 } 4912 4913 /* Copy appropriate bytes out of the buffer. */ 4914 memcpy (myaddr, 4915 (char *) buffer + (memaddr & (sizeof (TTRACE_XFER_TYPE) - 1)), 4916 len); 4917 } 4918 return len; 4919 } 4920 4921 4922 static void 4923 udot_info (void) 4924 { 4925 int udot_off; /* Offset into user struct */ 4926 int udot_val; /* Value from user struct at udot_off */ 4927 char mess[128]; /* For messages */ 4928 4929 if (!target_has_execution) 4930 { 4931 error ("The program is not being run."); 4932 } 4933 4934 #if !defined (KERNEL_U_SIZE) 4935 4936 /* Adding support for this command is easy. Typically you just add a 4937 routine, called "kernel_u_size" that returns the size of the user 4938 struct, to the appropriate *-nat.c file and then add to the native 4939 config file "#define KERNEL_U_SIZE kernel_u_size()" */ 4940 error ("Don't know how large ``struct user'' is in this version of gdb."); 4941 4942 #else 4943 4944 for (udot_off = 0; udot_off < KERNEL_U_SIZE; udot_off += sizeof (udot_val)) 4945 { 4946 if ((udot_off % 24) == 0) 4947 { 4948 if (udot_off > 0) 4949 { 4950 printf_filtered ("\n"); 4951 } 4952 printf_filtered ("%04x:", udot_off); 4953 } 4954 udot_val = call_ttrace (TT_LWP_RUREGS, 4955 PIDGET (inferior_ptid), 4956 (TTRACE_ARG_TYPE) udot_off, 4957 TT_NIL, 4958 TT_NIL); 4959 if (errno != 0) 4960 { 4961 sprintf (mess, "\nreading user struct at offset 0x%x", udot_off); 4962 perror_with_name (mess); 4963 } 4964 /* Avoid using nonportable (?) "*" in print specs */ 4965 printf_filtered (sizeof (int) == 4 ? " 0x%08x" : " 0x%16x", udot_val); 4966 } 4967 printf_filtered ("\n"); 4968 4969 #endif 4970 } 4971 #endif /* !defined (CHILD_XFER_MEMORY). */ 4972 4973 4974 /* TTrace version of "target_pid_to_exec_file" 4975 */ 4976 char * 4977 child_pid_to_exec_file (int tid) 4978 { 4979 int tt_status; 4980 static char exec_file_buffer[1024]; 4981 pid_t pid; 4982 static struct pst_status buf; 4983 4984 /* On various versions of hpux11, this may fail due to a supposed 4985 kernel bug. We have alternate methods to get this information 4986 (ie pstat). */ 4987 tt_status = call_ttrace (TT_PROC_GET_PATHNAME, 4988 tid, 4989 (uint64_t) exec_file_buffer, 4990 sizeof (exec_file_buffer) - 1, 4991 0); 4992 if (tt_status >= 0) 4993 return exec_file_buffer; 4994 4995 /* Try to get process information via pstat and extract the filename 4996 from the pst_cmd field within the pst_status structure. */ 4997 if (pstat_getproc (&buf, sizeof (struct pst_status), 0, tid) != -1) 4998 { 4999 char *p = buf.pst_cmd; 5000 5001 while (*p && *p != ' ') 5002 p++; 5003 *p = 0; 5004 5005 return (buf.pst_cmd); 5006 } 5007 5008 return (NULL); 5009 } 5010 5011 void 5012 pre_fork_inferior (void) 5013 { 5014 int status; 5015 5016 status = pipe (startup_semaphore.parent_channel); 5017 if (status < 0) 5018 { 5019 warning ("error getting parent pipe for startup semaphore"); 5020 return; 5021 } 5022 5023 status = pipe (startup_semaphore.child_channel); 5024 if (status < 0) 5025 { 5026 warning ("error getting child pipe for startup semaphore"); 5027 return; 5028 } 5029 } 5030 5031 /* Called from child_follow_fork in hppah-nat.c. 5032 * 5033 * This seems to be intended to attach after a fork or 5034 * vfork, while "attach" is used to attach to a pid 5035 * given by the user. The check for an existing attach 5036 * seems odd--it always fails in our test system. 5037 */ 5038 int 5039 hppa_require_attach (int pid) 5040 { 5041 int tt_status; 5042 CORE_ADDR pc; 5043 CORE_ADDR pc_addr; 5044 unsigned int regs_offset; 5045 process_state_t old_process_state = process_state; 5046 5047 /* Are we already attached? There appears to be no explicit 5048 * way to answer this via ttrace, so we try something which 5049 * should be innocuous if we are attached. If that fails, 5050 * then we assume we're not attached, and so attempt to make 5051 * it so. 5052 */ 5053 errno = 0; 5054 tt_status = call_real_ttrace (TT_PROC_STOP, 5055 pid, 5056 (lwpid_t) TT_NIL, 5057 (TTRACE_ARG_TYPE) TT_NIL, 5058 (TTRACE_ARG_TYPE) TT_NIL, 5059 TT_NIL); 5060 5061 if (errno) 5062 { 5063 /* No change to process-state! 5064 */ 5065 errno = 0; 5066 pid = attach (pid); 5067 } 5068 else 5069 { 5070 /* If successful, the process is now stopped. But if 5071 * we're VFORKING, the parent is still running, so don't 5072 * change the process state. 5073 */ 5074 if (process_state != VFORKING) 5075 process_state = STOPPED; 5076 5077 /* If we were already attached, you'd think that we 5078 * would need to start going again--but you'd be wrong, 5079 * as the fork-following code is actually in the middle 5080 * of the "resume" routine in in "infrun.c" and so 5081 * will (almost) immediately do a resume. 5082 * 5083 * On the other hand, if we are VFORKING, which means 5084 * that the child and the parent share a process for a 5085 * while, we know that "resume" won't be resuming 5086 * until the child EXEC event is seen. But we still 5087 * don't want to continue, as the event is already 5088 * there waiting. 5089 */ 5090 update_thread_state_after_attach (pid, DONT_ATTACH_CONTINUE); 5091 } /* STOP succeeded */ 5092 5093 return pid; 5094 } 5095 5096 int 5097 hppa_require_detach (int pid, int signal) 5098 { 5099 int tt_status; 5100 5101 /* If signal is non-zero, we must pass the signal on to the active 5102 thread prior to detaching. We do this by continuing the threads 5103 with the signal. 5104 */ 5105 if (signal != 0) 5106 { 5107 errno = 0; 5108 threads_continue_all_with_signals (pid, signal); 5109 } 5110 5111 errno = 0; 5112 tt_status = call_ttrace (TT_PROC_DETACH, 5113 pid, 5114 TT_NIL, 5115 TT_NIL, 5116 TT_NIL); 5117 5118 errno = 0; /* Ignore any errors. */ 5119 5120 /* process_state? */ 5121 5122 return pid; 5123 } 5124 5125 /* Given the starting address of a memory page, hash it to a bucket in 5126 the memory page dictionary. 5127 */ 5128 static int 5129 get_dictionary_bucket_of_page (CORE_ADDR page_start) 5130 { 5131 int hash; 5132 5133 hash = (page_start / memory_page_dictionary.page_size); 5134 hash = hash % MEMORY_PAGE_DICTIONARY_BUCKET_COUNT; 5135 5136 return hash; 5137 } 5138 5139 5140 /* Given a memory page's starting address, get (i.e., find an existing 5141 or create a new) dictionary entry for the page. The page will be 5142 write-protected when this function returns, but may have a reference 5143 count of 0 (if the page was newly-added to the dictionary). 5144 */ 5145 static memory_page_t * 5146 get_dictionary_entry_of_page (int pid, CORE_ADDR page_start) 5147 { 5148 int bucket; 5149 memory_page_t *page = NULL; 5150 memory_page_t *previous_page = NULL; 5151 5152 /* We're going to be using the dictionary now, than-kew. */ 5153 require_memory_page_dictionary (); 5154 5155 /* Try to find an existing dictionary entry for this page. Hash 5156 on the page's starting address. 5157 */ 5158 bucket = get_dictionary_bucket_of_page (page_start); 5159 page = &memory_page_dictionary.buckets[bucket]; 5160 while (page != NULL) 5161 { 5162 if (page->page_start == page_start) 5163 break; 5164 previous_page = page; 5165 page = page->next; 5166 } 5167 5168 /* Did we find a dictionary entry for this page? If not, then 5169 add it to the dictionary now. 5170 */ 5171 if (page == NULL) 5172 { 5173 /* Create a new entry. */ 5174 page = (memory_page_t *) xmalloc (sizeof (memory_page_t)); 5175 page->page_start = page_start; 5176 page->reference_count = 0; 5177 page->next = NULL; 5178 page->previous = NULL; 5179 5180 /* We'll write-protect the page now, if that's allowed. */ 5181 page->original_permissions = write_protect_page (pid, page_start); 5182 5183 /* Add the new entry to the dictionary. */ 5184 page->previous = previous_page; 5185 previous_page->next = page; 5186 5187 memory_page_dictionary.page_count++; 5188 } 5189 5190 return page; 5191 } 5192 5193 5194 static void 5195 remove_dictionary_entry_of_page (int pid, memory_page_t *page) 5196 { 5197 /* Restore the page's original permissions. */ 5198 unwrite_protect_page (pid, page->page_start, page->original_permissions); 5199 5200 /* Kick the page out of the dictionary. */ 5201 if (page->previous != NULL) 5202 page->previous->next = page->next; 5203 if (page->next != NULL) 5204 page->next->previous = page->previous; 5205 5206 /* Just in case someone retains a handle to this after it's freed. */ 5207 page->page_start = (CORE_ADDR) 0; 5208 5209 memory_page_dictionary.page_count--; 5210 5211 xfree (page); 5212 } 5213 5214 5215 static void 5216 hppa_enable_syscall_events (int pid) 5217 { 5218 int tt_status; 5219 ttevent_t ttrace_events; 5220 5221 /* Get the set of events that are currently enabled. */ 5222 tt_status = call_ttrace (TT_PROC_GET_EVENT_MASK, 5223 pid, 5224 (TTRACE_ARG_TYPE) & ttrace_events, 5225 (TTRACE_ARG_TYPE) sizeof (ttrace_events), 5226 TT_NIL); 5227 if (errno) 5228 perror_with_name ("ttrace"); 5229 5230 /* Add syscall events to that set. */ 5231 ttrace_events.tte_events |= TTEVT_SYSCALL_ENTRY; 5232 ttrace_events.tte_events |= TTEVT_SYSCALL_RETURN; 5233 5234 tt_status = call_ttrace (TT_PROC_SET_EVENT_MASK, 5235 pid, 5236 (TTRACE_ARG_TYPE) & ttrace_events, 5237 (TTRACE_ARG_TYPE) sizeof (ttrace_events), 5238 TT_NIL); 5239 if (errno) 5240 perror_with_name ("ttrace"); 5241 } 5242 5243 5244 static void 5245 hppa_disable_syscall_events (int pid) 5246 { 5247 int tt_status; 5248 ttevent_t ttrace_events; 5249 5250 /* Get the set of events that are currently enabled. */ 5251 tt_status = call_ttrace (TT_PROC_GET_EVENT_MASK, 5252 pid, 5253 (TTRACE_ARG_TYPE) & ttrace_events, 5254 (TTRACE_ARG_TYPE) sizeof (ttrace_events), 5255 TT_NIL); 5256 if (errno) 5257 perror_with_name ("ttrace"); 5258 5259 /* Remove syscall events from that set. */ 5260 ttrace_events.tte_events &= ~TTEVT_SYSCALL_ENTRY; 5261 ttrace_events.tte_events &= ~TTEVT_SYSCALL_RETURN; 5262 5263 tt_status = call_ttrace (TT_PROC_SET_EVENT_MASK, 5264 pid, 5265 (TTRACE_ARG_TYPE) & ttrace_events, 5266 (TTRACE_ARG_TYPE) sizeof (ttrace_events), 5267 TT_NIL); 5268 if (errno) 5269 perror_with_name ("ttrace"); 5270 } 5271 5272 5273 /* The address range beginning with START and ending with START+LEN-1 5274 (inclusive) is to be watched via page-protection by a new watchpoint. 5275 Set protection for all pages that overlap that range. 5276 5277 Note that our caller sets TYPE to: 5278 0 for a bp_hardware_watchpoint, 5279 1 for a bp_read_watchpoint, 5280 2 for a bp_access_watchpoint 5281 5282 (Yes, this is intentionally (though lord only knows why) different 5283 from the TYPE that is passed to hppa_remove_hw_watchpoint.) 5284 */ 5285 int 5286 hppa_insert_hw_watchpoint (int pid, CORE_ADDR start, LONGEST len, int type) 5287 { 5288 CORE_ADDR page_start; 5289 int dictionary_was_empty; 5290 int page_size; 5291 int page_id; 5292 LONGEST range_size_in_pages; 5293 5294 if (type != 0) 5295 error ("read or access hardware watchpoints not supported on HP-UX"); 5296 5297 /* Examine all pages in the address range. */ 5298 require_memory_page_dictionary (); 5299 5300 dictionary_was_empty = (memory_page_dictionary.page_count == (LONGEST) 0); 5301 5302 page_size = memory_page_dictionary.page_size; 5303 page_start = (start / page_size) * page_size; 5304 range_size_in_pages = ((LONGEST) len + (LONGEST) page_size - 1) / (LONGEST) page_size; 5305 5306 for (page_id = 0; page_id < range_size_in_pages; page_id++, page_start += page_size) 5307 { 5308 memory_page_t *page; 5309 5310 /* This gets the page entered into the dictionary if it was 5311 not already entered. 5312 */ 5313 page = get_dictionary_entry_of_page (pid, page_start); 5314 page->reference_count++; 5315 } 5316 5317 /* Our implementation depends on seeing calls to kernel code, for the 5318 following reason. Here we ask to be notified of syscalls. 5319 5320 When a protected page is accessed by user code, HP-UX raises a SIGBUS. 5321 Fine. 5322 5323 But when kernel code accesses the page, it doesn't give a SIGBUS. 5324 Rather, the system call that touched the page fails, with errno=EFAULT. 5325 Not good for us. 5326 5327 We could accomodate this "feature" by asking to be notified of syscall 5328 entries & exits; upon getting an entry event, disabling page-protections; 5329 upon getting an exit event, reenabling page-protections and then checking 5330 if any watchpoints triggered. 5331 5332 However, this turns out to be a real performance loser. syscalls are 5333 usually a frequent occurrence. Having to unprotect-reprotect all watched 5334 pages, and also to then read all watched memory locations and compare for 5335 triggers, can be quite expensive. 5336 5337 Instead, we'll only ask to be notified of syscall exits. When we get 5338 one, we'll check whether errno is set. If not, or if it's not EFAULT, 5339 we can just continue the inferior. 5340 5341 If errno is set upon syscall exit to EFAULT, we must perform some fairly 5342 hackish stuff to determine whether the failure really was due to a 5343 page-protect trap on a watched location. 5344 */ 5345 if (dictionary_was_empty) 5346 hppa_enable_syscall_events (pid); 5347 5348 return 1; 5349 } 5350 5351 5352 /* The address range beginning with START and ending with START+LEN-1 5353 (inclusive) was being watched via page-protection by a watchpoint 5354 which has been removed. Remove protection for all pages that 5355 overlap that range, which are not also being watched by other 5356 watchpoints. 5357 */ 5358 int 5359 hppa_remove_hw_watchpoint (int pid, CORE_ADDR start, LONGEST len, int type) 5360 { 5361 CORE_ADDR page_start; 5362 int dictionary_is_empty; 5363 int page_size; 5364 int page_id; 5365 LONGEST range_size_in_pages; 5366 5367 if (type != 0) 5368 error ("read or access hardware watchpoints not supported on HP-UX"); 5369 5370 /* Examine all pages in the address range. */ 5371 require_memory_page_dictionary (); 5372 5373 page_size = memory_page_dictionary.page_size; 5374 page_start = (start / page_size) * page_size; 5375 range_size_in_pages = ((LONGEST) len + (LONGEST) page_size - 1) / (LONGEST) page_size; 5376 5377 for (page_id = 0; page_id < range_size_in_pages; page_id++, page_start += page_size) 5378 { 5379 memory_page_t *page; 5380 5381 page = get_dictionary_entry_of_page (pid, page_start); 5382 page->reference_count--; 5383 5384 /* Was this the last reference of this page? If so, then we 5385 must scrub the entry from the dictionary, and also restore 5386 the page's original permissions. 5387 */ 5388 if (page->reference_count == 0) 5389 remove_dictionary_entry_of_page (pid, page); 5390 } 5391 5392 dictionary_is_empty = (memory_page_dictionary.page_count == (LONGEST) 0); 5393 5394 /* If write protections are currently disallowed, then that implies that 5395 wait_for_inferior believes that the inferior is within a system call. 5396 Since we want to see both syscall entry and return, it's clearly not 5397 good to disable syscall events in this state! 5398 5399 ??rehrauer: Yeah, it'd be better if we had a specific flag that said, 5400 "inferior is between syscall events now". Oh well. 5401 */ 5402 if (dictionary_is_empty && memory_page_dictionary.page_protections_allowed) 5403 hppa_disable_syscall_events (pid); 5404 5405 return 1; 5406 } 5407 5408 5409 /* Could we implement a watchpoint of this type via our available 5410 hardware support? 5411 5412 This query does not consider whether a particular address range 5413 could be so watched, but just whether support is generally available 5414 for such things. See hppa_range_profitable_for_hw_watchpoint for a 5415 query that answers whether a particular range should be watched via 5416 hardware support. 5417 */ 5418 int 5419 hppa_can_use_hw_watchpoint (int type, int cnt, int ot) 5420 { 5421 return (type == bp_hardware_watchpoint); 5422 } 5423 5424 5425 /* Assuming we could set a hardware watchpoint on this address, do 5426 we think it would be profitable ("a good idea") to do so? If not, 5427 we can always set a regular (aka single-step & test) watchpoint 5428 on the address... 5429 */ 5430 int 5431 hppa_range_profitable_for_hw_watchpoint (int pid, CORE_ADDR start, LONGEST len) 5432 { 5433 int range_is_stack_based; 5434 int range_is_accessible; 5435 CORE_ADDR page_start; 5436 int page_size; 5437 int page; 5438 LONGEST range_size_in_pages; 5439 5440 /* ??rehrauer: For now, say that all addresses are potentially 5441 profitable. Possibly later we'll want to test the address 5442 for "stackness"? 5443 */ 5444 range_is_stack_based = 0; 5445 5446 /* If any page in the range is inaccessible, then we cannot 5447 really use hardware watchpointing, even though our client 5448 thinks we can. In that case, it's actually an error to 5449 attempt to use hw watchpoints, so we'll tell our client 5450 that the range is "unprofitable", and hope that they listen... 5451 */ 5452 range_is_accessible = 1; /* Until proven otherwise. */ 5453 5454 /* Examine all pages in the address range. */ 5455 errno = 0; 5456 page_size = sysconf (_SC_PAGE_SIZE); 5457 5458 /* If we can't determine page size, we're hosed. Tell our 5459 client it's unprofitable to use hw watchpoints for this 5460 range. 5461 */ 5462 if (errno || (page_size <= 0)) 5463 { 5464 errno = 0; 5465 return 0; 5466 } 5467 5468 page_start = (start / page_size) * page_size; 5469 range_size_in_pages = len / (LONGEST) page_size; 5470 5471 for (page = 0; page < range_size_in_pages; page++, page_start += page_size) 5472 { 5473 int tt_status; 5474 int page_permissions; 5475 5476 /* Is this page accessible? */ 5477 errno = 0; 5478 tt_status = call_ttrace (TT_PROC_GET_MPROTECT, 5479 pid, 5480 (TTRACE_ARG_TYPE) page_start, 5481 TT_NIL, 5482 (TTRACE_ARG_TYPE) & page_permissions); 5483 if (errno || (tt_status < 0)) 5484 { 5485 errno = 0; 5486 range_is_accessible = 0; 5487 break; 5488 } 5489 5490 /* Yes, go for another... */ 5491 } 5492 5493 return (!range_is_stack_based && range_is_accessible); 5494 } 5495 5496 5497 char * 5498 hppa_pid_or_tid_to_str (ptid_t ptid) 5499 { 5500 static char buf[100]; /* Static because address returned. */ 5501 pid_t id = PIDGET (ptid); 5502 5503 /* Does this appear to be a process? If so, print it that way. */ 5504 if (is_process_id (id)) 5505 return child_pid_to_str (ptid); 5506 5507 /* Else, print both the GDB thread number and the system thread id. */ 5508 sprintf (buf, "thread %d (", pid_to_thread_id (ptid)); 5509 strcat (buf, hppa_tid_to_str (ptid)); 5510 strcat (buf, ")\0"); 5511 5512 return buf; 5513 } 5514 5515 5516 void 5517 hppa_ensure_vforking_parent_remains_stopped (int pid) 5518 { 5519 /* Nothing to do when using ttrace. Only the ptrace-based implementation 5520 must do real work. 5521 */ 5522 } 5523 5524 5525 int 5526 hppa_resume_execd_vforking_child_to_get_parent_vfork (void) 5527 { 5528 return 0; /* No, the parent vfork is available now. */ 5529 } 5530 5531 5532 /* Write a register as a 64bit value. This may be necessary if the 5533 native OS is too braindamaged to allow some (or all) registers to 5534 be written in 32bit hunks such as hpux11 and the PC queue registers. 5535 5536 This is horribly gross and disgusting. */ 5537 5538 int 5539 ttrace_write_reg_64 (int gdb_tid, CORE_ADDR dest_addr, CORE_ADDR src_addr) 5540 { 5541 pid_t pid; 5542 lwpid_t tid; 5543 int tt_status; 5544 5545 tid = map_from_gdb_tid (gdb_tid); 5546 pid = get_pid_for (tid); 5547 5548 errno = 0; 5549 tt_status = ttrace (TT_LWP_WUREGS, 5550 pid, 5551 tid, 5552 (TTRACE_ARG_TYPE) dest_addr, 5553 8, 5554 (TTRACE_ARG_TYPE) src_addr ); 5555 5556 #ifdef THREAD_DEBUG 5557 if (errno) 5558 { 5559 /* Don't bother for a known benign error: if you ask for the 5560 first thread state, but there is only one thread and it's 5561 not stopped, ttrace complains. 5562 5563 We have this inside the #ifdef because our caller will do 5564 this check for real. */ 5565 if( request != TT_PROC_GET_FIRST_LWP_STATE 5566 || errno != EPROTO ) 5567 { 5568 if( debug_on ) 5569 printf( "TT fail for %s, with pid %d, tid %d, status %d \n", 5570 get_printable_name_of_ttrace_request (TT_LWP_WUREGS), 5571 pid, tid, tt_status ); 5572 } 5573 } 5574 #endif 5575 5576 return tt_status; 5577 } 5578 5579 void 5580 _initialize_infttrace (void) 5581 { 5582 /* Initialize the ttrace-based hardware watchpoint implementation. */ 5583 memory_page_dictionary.page_count = (LONGEST) - 1; 5584 memory_page_dictionary.page_protections_allowed = 1; 5585 5586 errno = 0; 5587 memory_page_dictionary.page_size = sysconf (_SC_PAGE_SIZE); 5588 5589 /* We do a lot of casts from pointers to TTRACE_ARG_TYPE; make sure 5590 this is okay. */ 5591 if (sizeof (TTRACE_ARG_TYPE) < sizeof (void *)) 5592 internal_error (__FILE__, __LINE__, "failed internal consistency check"); 5593 5594 if (errno || (memory_page_dictionary.page_size <= 0)) 5595 perror_with_name ("sysconf"); 5596 } 5597