1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 23 /* 24 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 25 * Use is subject to license terms. 26 */ 27 28 #pragma ident "%Z%%M% %I% %E% SMI" 29 30 #include <stdio.h> 31 #include <stdlib.h> 32 #include <unistd.h> 33 #include <ctype.h> 34 #include <fcntl.h> 35 #include <string.h> 36 #include <memory.h> 37 #include <errno.h> 38 #include <dirent.h> 39 #include <limits.h> 40 #include <signal.h> 41 #include <sys/types.h> 42 #include <sys/uio.h> 43 #include <sys/stat.h> 44 #include <sys/resource.h> 45 #include <sys/param.h> 46 #include <sys/stack.h> 47 #include <sys/fault.h> 48 #include <sys/syscall.h> 49 #include <sys/sysmacros.h> 50 51 #include "libproc.h" 52 #include "Pcontrol.h" 53 #include "Putil.h" 54 #include "P32ton.h" 55 56 int _libproc_debug; /* set non-zero to enable debugging printfs */ 57 sigset_t blockable_sigs; /* signals to block when we need to be safe */ 58 static int minfd; /* minimum file descriptor returned by dupfd(fd, 0) */ 59 60 /* 61 * Function prototypes for static routines in this module. 62 */ 63 static void deadcheck(struct ps_prochandle *); 64 static void restore_tracing_flags(struct ps_prochandle *); 65 static void Lfree_internal(struct ps_prochandle *, struct ps_lwphandle *); 66 67 /* 68 * Read/write interface for live processes: just pread/pwrite the 69 * /proc/<pid>/as file: 70 */ 71 72 static ssize_t 73 Pread_live(struct ps_prochandle *P, void *buf, size_t n, uintptr_t addr) 74 { 75 return (pread(P->asfd, buf, n, (off_t)addr)); 76 } 77 78 static ssize_t 79 Pwrite_live(struct ps_prochandle *P, const void *buf, size_t n, uintptr_t addr) 80 { 81 return (pwrite(P->asfd, buf, n, (off_t)addr)); 82 } 83 84 static const ps_rwops_t P_live_ops = { Pread_live, Pwrite_live }; 85 86 /* 87 * This is the library's .init handler. 88 */ 89 #pragma init(_libproc_init) 90 void 91 _libproc_init(void) 92 { 93 _libproc_debug = getenv("LIBPROC_DEBUG") != NULL; 94 95 (void) sigfillset(&blockable_sigs); 96 (void) sigdelset(&blockable_sigs, SIGKILL); 97 (void) sigdelset(&blockable_sigs, SIGSTOP); 98 } 99 100 /* 101 * Call set_minfd() once before calling dupfd() several times. 102 * We assume that the application will not reduce its current file 103 * descriptor limit lower than 512 once it has set at least that value. 104 */ 105 int 106 set_minfd(void) 107 { 108 static mutex_t minfd_lock = DEFAULTMUTEX; 109 struct rlimit rlim; 110 int fd; 111 112 if ((fd = minfd) < 256) { 113 (void) mutex_lock(&minfd_lock); 114 if ((fd = minfd) < 256) { 115 if (getrlimit(RLIMIT_NOFILE, &rlim) != 0) 116 rlim.rlim_cur = rlim.rlim_max = 0; 117 if (rlim.rlim_cur >= 512) 118 fd = 256; 119 else if ((fd = rlim.rlim_cur / 2) < 3) 120 fd = 3; 121 minfd = fd; 122 } 123 (void) mutex_unlock(&minfd_lock); 124 } 125 return (fd); 126 } 127 128 int 129 dupfd(int fd, int dfd) 130 { 131 int mfd; 132 133 /* 134 * Make fd be greater than 255 (the 32-bit stdio limit), 135 * or at least make it greater than 2 so that the 136 * program will work when spawned by init(1m). 137 * Also, if dfd is non-zero, dup the fd to be dfd. 138 */ 139 if ((mfd = minfd) == 0) 140 mfd = set_minfd(); 141 if (dfd > 0 || (0 <= fd && fd < mfd)) { 142 if (dfd <= 0) 143 dfd = mfd; 144 dfd = fcntl(fd, F_DUPFD, dfd); 145 (void) close(fd); 146 fd = dfd; 147 } 148 /* 149 * Mark it close-on-exec so any created process doesn't inherit it. 150 */ 151 if (fd >= 0) 152 (void) fcntl(fd, F_SETFD, FD_CLOEXEC); 153 return (fd); 154 } 155 156 /* 157 * Create a new controlled process. 158 * Leave it stopped on successful exit from exec() or execve(). 159 * Return an opaque pointer to its process control structure. 160 * Return NULL if process cannot be created (fork()/exec() not successful). 161 */ 162 struct ps_prochandle * 163 Pxcreate(const char *file, /* executable file name */ 164 char *const *argv, /* argument vector */ 165 char *const *envp, /* environment */ 166 int *perr, /* pointer to error return code */ 167 char *path, /* if non-null, holds exec path name on return */ 168 size_t len) /* size of the path buffer */ 169 { 170 char execpath[PATH_MAX]; 171 char procname[100]; 172 struct ps_prochandle *P; 173 pid_t pid; 174 int fd; 175 char *fname; 176 int rc; 177 int lasterrno = 0; 178 179 if (len == 0) /* zero length, no path */ 180 path = NULL; 181 if (path != NULL) 182 *path = '\0'; 183 184 if ((P = malloc(sizeof (struct ps_prochandle))) == NULL) { 185 *perr = C_STRANGE; 186 return (NULL); 187 } 188 189 if ((pid = fork1()) == -1) { 190 free(P); 191 *perr = C_FORK; 192 return (NULL); 193 } 194 195 if (pid == 0) { /* child process */ 196 id_t id; 197 extern char **environ; 198 199 /* 200 * If running setuid or setgid, reset credentials to normal. 201 */ 202 if ((id = getgid()) != getegid()) 203 (void) setgid(id); 204 if ((id = getuid()) != geteuid()) 205 (void) setuid(id); 206 207 Pcreate_callback(P); /* execute callback (see below) */ 208 (void) pause(); /* wait for PRSABORT from parent */ 209 210 /* 211 * This is ugly. There is no execvep() function that takes a 212 * path and an environment. We cheat here by replacing the 213 * global 'environ' variable right before we call this. 214 */ 215 if (envp) 216 environ = (char **)envp; 217 218 (void) execvp(file, argv); /* execute the program */ 219 _exit(127); 220 } 221 222 /* 223 * Initialize the process structure. 224 */ 225 (void) memset(P, 0, sizeof (*P)); 226 (void) mutex_init(&P->proc_lock, USYNC_THREAD, NULL); 227 P->flags |= CREATED; 228 P->state = PS_RUN; 229 P->pid = pid; 230 P->asfd = -1; 231 P->ctlfd = -1; 232 P->statfd = -1; 233 P->agentctlfd = -1; 234 P->agentstatfd = -1; 235 P->ops = &P_live_ops; 236 Pinitsym(P); 237 238 /* 239 * Open the /proc/pid files. 240 */ 241 (void) sprintf(procname, "/proc/%d/", (int)pid); 242 fname = procname + strlen(procname); 243 (void) set_minfd(); 244 245 /* 246 * Exclusive write open advises others not to interfere. 247 * There is no reason for any of these open()s to fail. 248 */ 249 (void) strcpy(fname, "as"); 250 if ((fd = open(procname, (O_RDWR|O_EXCL))) < 0 || 251 (fd = dupfd(fd, 0)) < 0) { 252 dprintf("Pcreate: failed to open %s: %s\n", 253 procname, strerror(errno)); 254 rc = C_STRANGE; 255 goto bad; 256 } 257 P->asfd = fd; 258 259 (void) strcpy(fname, "status"); 260 if ((fd = open(procname, O_RDONLY)) < 0 || 261 (fd = dupfd(fd, 0)) < 0) { 262 dprintf("Pcreate: failed to open %s: %s\n", 263 procname, strerror(errno)); 264 rc = C_STRANGE; 265 goto bad; 266 } 267 P->statfd = fd; 268 269 (void) strcpy(fname, "ctl"); 270 if ((fd = open(procname, O_WRONLY)) < 0 || 271 (fd = dupfd(fd, 0)) < 0) { 272 dprintf("Pcreate: failed to open %s: %s\n", 273 procname, strerror(errno)); 274 rc = C_STRANGE; 275 goto bad; 276 } 277 P->ctlfd = fd; 278 279 (void) Pstop(P, 0); /* stop the controlled process */ 280 281 /* 282 * Wait for process to sleep in pause(). 283 * If the process has already called pause(), then it should be 284 * stopped (PR_REQUESTED) while asleep in pause and we are done. 285 * Else we set up to catch entry/exit to pause() and set the process 286 * running again, expecting it to stop when it reaches pause(). 287 * There is no reason for this to fail other than an interrupt. 288 */ 289 (void) Psysentry(P, SYS_pause, 1); 290 (void) Psysexit(P, SYS_pause, 1); 291 for (;;) { 292 if (P->state == PS_STOP && 293 P->status.pr_lwp.pr_syscall == SYS_pause && 294 (P->status.pr_lwp.pr_why == PR_REQUESTED || 295 P->status.pr_lwp.pr_why == PR_SYSENTRY || 296 P->status.pr_lwp.pr_why == PR_SYSEXIT)) 297 break; 298 299 if (P->state != PS_STOP || /* interrupt or process died */ 300 Psetrun(P, 0, 0) != 0) { /* can't restart */ 301 if (errno == EINTR || errno == ERESTART) 302 rc = C_INTR; 303 else { 304 dprintf("Pcreate: Psetrun failed: %s\n", 305 strerror(errno)); 306 rc = C_STRANGE; 307 } 308 goto bad; 309 } 310 311 (void) Pwait(P, 0); 312 } 313 (void) Psysentry(P, SYS_pause, 0); 314 (void) Psysexit(P, SYS_pause, 0); 315 316 /* 317 * Kick the process off the pause() and catch 318 * it again on entry to exec() or exit(). 319 */ 320 (void) Psysentry(P, SYS_exit, 1); 321 (void) Psysentry(P, SYS_exec, 1); 322 (void) Psysentry(P, SYS_execve, 1); 323 if (Psetrun(P, 0, PRSABORT) == -1) { 324 dprintf("Pcreate: Psetrun failed: %s\n", strerror(errno)); 325 rc = C_STRANGE; 326 goto bad; 327 } 328 (void) Pwait(P, 0); 329 if (P->state != PS_STOP) { 330 dprintf("Pcreate: Pwait failed: %s\n", strerror(errno)); 331 rc = C_STRANGE; 332 goto bad; 333 } 334 335 /* 336 * Move the process through instances of failed exec()s 337 * to reach the point of stopped on successful exec(). 338 */ 339 (void) Psysexit(P, SYS_exec, TRUE); 340 (void) Psysexit(P, SYS_execve, TRUE); 341 342 while (P->state == PS_STOP && 343 P->status.pr_lwp.pr_why == PR_SYSENTRY && 344 (P->status.pr_lwp.pr_what == SYS_execve || 345 P->status.pr_lwp.pr_what == SYS_exec)) { 346 /* 347 * Fetch the exec path name now, before we complete 348 * the exec(). We may lose the process and be unable 349 * to get the information later. 350 */ 351 (void) Pread_string(P, execpath, sizeof (execpath), 352 (off_t)P->status.pr_lwp.pr_sysarg[0]); 353 if (path != NULL) 354 (void) strncpy(path, execpath, len); 355 /* 356 * Set the process running and wait for 357 * it to stop on exit from the exec(). 358 */ 359 (void) Psetrun(P, 0, 0); 360 (void) Pwait(P, 0); 361 362 if (P->state == PS_LOST && /* we lost control */ 363 Preopen(P) != 0) { /* and we can't get it back */ 364 rc = C_PERM; 365 goto bad; 366 } 367 368 /* 369 * If the exec() failed, continue the loop, expecting 370 * there to be more attempts to exec(), based on PATH. 371 */ 372 if (P->state == PS_STOP && 373 P->status.pr_lwp.pr_why == PR_SYSEXIT && 374 (P->status.pr_lwp.pr_what == SYS_execve || 375 P->status.pr_lwp.pr_what == SYS_exec) && 376 (lasterrno = P->status.pr_lwp.pr_errno) != 0) { 377 /* 378 * The exec() failed. Set the process running and 379 * wait for it to stop on entry to the next exec(). 380 */ 381 (void) Psetrun(P, 0, 0); 382 (void) Pwait(P, 0); 383 384 continue; 385 } 386 break; 387 } 388 389 if (P->state == PS_STOP && 390 P->status.pr_lwp.pr_why == PR_SYSEXIT && 391 (P->status.pr_lwp.pr_what == SYS_execve || 392 P->status.pr_lwp.pr_what == SYS_exec) && 393 P->status.pr_lwp.pr_errno == 0) { 394 /* 395 * The process is stopped on successful exec() or execve(). 396 * Turn off all tracing flags and return success. 397 */ 398 restore_tracing_flags(P); 399 #ifndef _LP64 400 /* We must be a 64-bit process to deal with a 64-bit process */ 401 if (P->status.pr_dmodel == PR_MODEL_LP64) { 402 rc = C_LP64; 403 goto bad; 404 } 405 #endif 406 /* 407 * Set run-on-last-close so the controlled process 408 * runs even if we die on a signal. 409 */ 410 (void) Psetflags(P, PR_RLC); 411 *perr = 0; 412 return (P); 413 } 414 415 rc = lasterrno == ENOENT ? C_NOENT : C_NOEXEC; 416 417 bad: 418 (void) kill(pid, SIGKILL); 419 if (path != NULL && rc != C_PERM && rc != C_LP64) 420 *path = '\0'; 421 Pfree(P); 422 *perr = rc; 423 return (NULL); 424 } 425 426 struct ps_prochandle * 427 Pcreate( 428 const char *file, /* executable file name */ 429 char *const *argv, /* argument vector */ 430 int *perr, /* pointer to error return code */ 431 char *path, /* if non-null, holds exec path name on return */ 432 size_t len) /* size of the path buffer */ 433 { 434 return (Pxcreate(file, argv, NULL, perr, path, len)); 435 } 436 437 /* 438 * Return a printable string corresponding to a Pcreate() error return. 439 */ 440 const char * 441 Pcreate_error(int error) 442 { 443 const char *str; 444 445 switch (error) { 446 case C_FORK: 447 str = "cannot fork"; 448 break; 449 case C_PERM: 450 str = "file is set-id or unreadable"; 451 break; 452 case C_NOEXEC: 453 str = "cannot execute file"; 454 break; 455 case C_INTR: 456 str = "operation interrupted"; 457 break; 458 case C_LP64: 459 str = "program is _LP64, self is not"; 460 break; 461 case C_STRANGE: 462 str = "unanticipated system error"; 463 break; 464 case C_NOENT: 465 str = "cannot find executable file"; 466 break; 467 default: 468 str = "unknown error"; 469 break; 470 } 471 472 return (str); 473 } 474 475 /* 476 * Callback to execute in each child process created with Pcreate() after fork 477 * but before it execs the new process image. By default, we do nothing, but 478 * by calling this function we allow the client program to define its own 479 * version of the function which will interpose on our empty default. This 480 * may be useful for clients that need to modify signal dispositions, terminal 481 * attributes, or process group and session properties for each new victim. 482 */ 483 /*ARGSUSED*/ 484 void 485 Pcreate_callback(struct ps_prochandle *P) 486 { 487 /* nothing to do here */ 488 } 489 490 /* 491 * Grab an existing process. 492 * Return an opaque pointer to its process control structure. 493 * 494 * pid: UNIX process ID. 495 * flags: 496 * PGRAB_RETAIN Retain tracing flags (default clears all tracing flags). 497 * PGRAB_FORCE Grab regardless of whether process is already traced. 498 * PGRAB_RDONLY Open the address space file O_RDONLY instead of O_RDWR, 499 * and do not open the process control file. 500 * PGRAB_NOSTOP Open the process but do not force it to stop. 501 * perr: pointer to error return code. 502 */ 503 struct ps_prochandle * 504 Pgrab(pid_t pid, int flags, int *perr) 505 { 506 struct ps_prochandle *P; 507 int fd, omode; 508 char procname[100]; 509 char *fname; 510 int rc = 0; 511 512 /* 513 * PGRAB_RDONLY means that we do not open the /proc/<pid>/control file, 514 * and so it implies RETAIN and NOSTOP since both require control. 515 */ 516 if (flags & PGRAB_RDONLY) 517 flags |= PGRAB_RETAIN | PGRAB_NOSTOP; 518 519 if ((P = malloc(sizeof (struct ps_prochandle))) == NULL) { 520 *perr = G_STRANGE; 521 return (NULL); 522 } 523 524 P->asfd = -1; 525 P->ctlfd = -1; 526 P->statfd = -1; 527 528 again: /* Come back here if we lose it in the Window of Vulnerability */ 529 if (P->ctlfd >= 0) 530 (void) close(P->ctlfd); 531 if (P->asfd >= 0) 532 (void) close(P->asfd); 533 if (P->statfd >= 0) 534 (void) close(P->statfd); 535 (void) memset(P, 0, sizeof (*P)); 536 (void) mutex_init(&P->proc_lock, USYNC_THREAD, NULL); 537 P->ctlfd = -1; 538 P->asfd = -1; 539 P->statfd = -1; 540 P->agentctlfd = -1; 541 P->agentstatfd = -1; 542 P->ops = &P_live_ops; 543 Pinitsym(P); 544 545 /* 546 * Open the /proc/pid files 547 */ 548 (void) sprintf(procname, "/proc/%d/", (int)pid); 549 fname = procname + strlen(procname); 550 (void) set_minfd(); 551 552 /* 553 * Request exclusive open to avoid grabbing someone else's 554 * process and to prevent others from interfering afterwards. 555 * If this fails and the 'PGRAB_FORCE' flag is set, attempt to 556 * open non-exclusively. 557 */ 558 (void) strcpy(fname, "as"); 559 omode = (flags & PGRAB_RDONLY) ? O_RDONLY : O_RDWR; 560 561 if (((fd = open(procname, omode | O_EXCL)) < 0 && 562 (fd = ((flags & PGRAB_FORCE)? open(procname, omode) : -1)) < 0) || 563 (fd = dupfd(fd, 0)) < 0) { 564 switch (errno) { 565 case ENOENT: 566 rc = G_NOPROC; 567 break; 568 case EACCES: 569 case EPERM: 570 rc = G_PERM; 571 break; 572 case EBUSY: 573 if (!(flags & PGRAB_FORCE) || geteuid() != 0) { 574 rc = G_BUSY; 575 break; 576 } 577 /* FALLTHROUGH */ 578 default: 579 dprintf("Pgrab: failed to open %s: %s\n", 580 procname, strerror(errno)); 581 rc = G_STRANGE; 582 break; 583 } 584 goto err; 585 } 586 P->asfd = fd; 587 588 (void) strcpy(fname, "status"); 589 if ((fd = open(procname, O_RDONLY)) < 0 || 590 (fd = dupfd(fd, 0)) < 0) { 591 switch (errno) { 592 case ENOENT: 593 rc = G_NOPROC; 594 break; 595 default: 596 dprintf("Pgrab: failed to open %s: %s\n", 597 procname, strerror(errno)); 598 rc = G_STRANGE; 599 break; 600 } 601 goto err; 602 } 603 P->statfd = fd; 604 605 if (!(flags & PGRAB_RDONLY)) { 606 (void) strcpy(fname, "ctl"); 607 if ((fd = open(procname, O_WRONLY)) < 0 || 608 (fd = dupfd(fd, 0)) < 0) { 609 switch (errno) { 610 case ENOENT: 611 rc = G_NOPROC; 612 break; 613 default: 614 dprintf("Pgrab: failed to open %s: %s\n", 615 procname, strerror(errno)); 616 rc = G_STRANGE; 617 break; 618 } 619 goto err; 620 } 621 P->ctlfd = fd; 622 } 623 624 P->state = PS_RUN; 625 P->pid = pid; 626 627 /* 628 * We are now in the Window of Vulnerability (WoV). The process may 629 * exec() a setuid/setgid or unreadable object file between the open() 630 * and the PCSTOP. We will get EAGAIN in this case and must start over. 631 * As Pstopstatus will trigger the first read() from a /proc file, 632 * we also need to handle EOVERFLOW here when 32-bit as an indicator 633 * that this process is 64-bit. Finally, if the process has become 634 * a zombie (PS_UNDEAD) while we were trying to grab it, just remain 635 * silent about this and pretend there was no process. 636 */ 637 if (Pstopstatus(P, PCNULL, 0) != 0) { 638 #ifndef _LP64 639 if (errno == EOVERFLOW) { 640 rc = G_LP64; 641 goto err; 642 } 643 #endif 644 if (P->state == PS_LOST) { /* WoV */ 645 (void) mutex_destroy(&P->proc_lock); 646 goto again; 647 } 648 649 if (P->state == PS_UNDEAD) 650 rc = G_NOPROC; 651 else 652 rc = G_STRANGE; 653 654 goto err; 655 } 656 657 /* 658 * If the process is a system process, we can't control it even as root 659 */ 660 if (P->status.pr_flags & PR_ISSYS) { 661 rc = G_SYS; 662 goto err; 663 } 664 #ifndef _LP64 665 /* 666 * We must be a 64-bit process to deal with a 64-bit process 667 */ 668 if (P->status.pr_dmodel == PR_MODEL_LP64) { 669 rc = G_LP64; 670 goto err; 671 } 672 #endif 673 674 /* 675 * Remember the status for use by Prelease(). 676 */ 677 P->orig_status = P->status; /* structure copy */ 678 679 /* 680 * Before stopping the process, make sure we are not grabbing ourselves. 681 * If we are, make sure we are doing it PGRAB_RDONLY. 682 */ 683 if (pid == getpid()) { 684 /* 685 * Verify that the process is really ourself: 686 * Set a magic number, read it through the 687 * /proc file and see if the results match. 688 */ 689 uint32_t magic1 = 0; 690 uint32_t magic2 = 2; 691 692 errno = 0; 693 694 if (Pread(P, &magic2, sizeof (magic2), (uintptr_t)&magic1) 695 == sizeof (magic2) && 696 magic2 == 0 && 697 (magic1 = 0xfeedbeef) && 698 Pread(P, &magic2, sizeof (magic2), (uintptr_t)&magic1) 699 == sizeof (magic2) && 700 magic2 == 0xfeedbeef && 701 !(flags & PGRAB_RDONLY)) { 702 rc = G_SELF; 703 goto err; 704 } 705 } 706 707 /* 708 * If the process is already stopped or has been directed 709 * to stop via /proc, do not set run-on-last-close. 710 */ 711 if (!(P->status.pr_lwp.pr_flags & (PR_ISTOP|PR_DSTOP)) && 712 !(flags & PGRAB_RDONLY)) { 713 /* 714 * Mark the process run-on-last-close so 715 * it runs even if we die from SIGKILL. 716 */ 717 if (Psetflags(P, PR_RLC) != 0) { 718 if (errno == EAGAIN) { /* WoV */ 719 (void) mutex_destroy(&P->proc_lock); 720 goto again; 721 } 722 if (errno == ENOENT) /* No complaint about zombies */ 723 rc = G_ZOMB; 724 else { 725 dprintf("Pgrab: failed to set RLC\n"); 726 rc = G_STRANGE; 727 } 728 goto err; 729 } 730 } 731 732 /* 733 * If a stop directive is pending and the process has not yet stopped, 734 * then synchronously wait for the stop directive to take effect. 735 * Limit the time spent waiting for the process to stop by iterating 736 * at most 10 times. The time-out of 20 ms corresponds to the time 737 * between sending the stop directive and the process actually stopped 738 * as measured by DTrace on a slow, busy system. If the process doesn't 739 * stop voluntarily, clear the PR_DSTOP flag so that the code below 740 * forces the process to stop. 741 */ 742 if (!(flags & PGRAB_RDONLY)) { 743 int niter = 0; 744 while ((P->status.pr_lwp.pr_flags & (PR_STOPPED|PR_DSTOP)) == 745 PR_DSTOP && niter < 10 && 746 Pstopstatus(P, PCTWSTOP, 20) != 0) { 747 niter++; 748 if (flags & PGRAB_NOSTOP) 749 break; 750 } 751 if (niter == 10 && !(flags & PGRAB_NOSTOP)) { 752 /* Try it harder down below */ 753 P->status.pr_lwp.pr_flags &= ~PR_DSTOP; 754 } 755 } 756 757 /* 758 * If the process is not already stopped or directed to stop 759 * and PGRAB_NOSTOP was not specified, stop the process now. 760 */ 761 if (!(P->status.pr_lwp.pr_flags & (PR_ISTOP|PR_DSTOP)) && 762 !(flags & PGRAB_NOSTOP)) { 763 /* 764 * Stop the process, get its status and signal/syscall masks. 765 */ 766 if (((P->status.pr_lwp.pr_flags & PR_STOPPED) && 767 Pstopstatus(P, PCDSTOP, 0) != 0) || 768 Pstopstatus(P, PCSTOP, 2000) != 0) { 769 #ifndef _LP64 770 if (errno == EOVERFLOW) { 771 rc = G_LP64; 772 goto err; 773 } 774 #endif 775 if (P->state == PS_LOST) { /* WoV */ 776 (void) mutex_destroy(&P->proc_lock); 777 goto again; 778 } 779 if ((errno != EINTR && errno != ERESTART) || 780 (P->state != PS_STOP && 781 !(P->status.pr_flags & PR_DSTOP))) { 782 if (P->state != PS_RUN && errno != ENOENT) { 783 dprintf("Pgrab: failed to PCSTOP\n"); 784 rc = G_STRANGE; 785 } else { 786 rc = G_ZOMB; 787 } 788 goto err; 789 } 790 } 791 792 /* 793 * Process should now either be stopped via /proc or there 794 * should be an outstanding stop directive. 795 */ 796 if (!(P->status.pr_flags & (PR_ISTOP|PR_DSTOP))) { 797 dprintf("Pgrab: process is not stopped\n"); 798 rc = G_STRANGE; 799 goto err; 800 } 801 #ifndef _LP64 802 /* 803 * Test this again now because the 32-bit victim process may 804 * have exec'd a 64-bit process in the meantime. 805 */ 806 if (P->status.pr_dmodel == PR_MODEL_LP64) { 807 rc = G_LP64; 808 goto err; 809 } 810 #endif 811 } 812 813 /* 814 * Cancel all tracing flags unless the PGRAB_RETAIN flag is set. 815 */ 816 if (!(flags & PGRAB_RETAIN)) { 817 (void) Psysentry(P, 0, FALSE); 818 (void) Psysexit(P, 0, FALSE); 819 (void) Psignal(P, 0, FALSE); 820 (void) Pfault(P, 0, FALSE); 821 Psync(P); 822 } 823 824 *perr = 0; 825 return (P); 826 827 err: 828 Pfree(P); 829 *perr = rc; 830 return (NULL); 831 } 832 833 /* 834 * Return a printable string corresponding to a Pgrab() error return. 835 */ 836 const char * 837 Pgrab_error(int error) 838 { 839 const char *str; 840 841 switch (error) { 842 case G_NOPROC: 843 str = "no such process"; 844 break; 845 case G_NOCORE: 846 str = "no such core file"; 847 break; 848 case G_NOPROCORCORE: 849 str = "no such process or core file"; 850 break; 851 case G_NOEXEC: 852 str = "cannot find executable file"; 853 break; 854 case G_ZOMB: 855 str = "zombie process"; 856 break; 857 case G_PERM: 858 str = "permission denied"; 859 break; 860 case G_BUSY: 861 str = "process is traced"; 862 break; 863 case G_SYS: 864 str = "system process"; 865 break; 866 case G_SELF: 867 str = "attempt to grab self"; 868 break; 869 case G_INTR: 870 str = "operation interrupted"; 871 break; 872 case G_LP64: 873 str = "program is _LP64, self is not"; 874 break; 875 case G_FORMAT: 876 str = "file is not an ELF core file"; 877 break; 878 case G_ELF: 879 str = "libelf error"; 880 break; 881 case G_NOTE: 882 str = "core file is corrupt or missing required data"; 883 break; 884 case G_STRANGE: 885 str = "unanticipated system error"; 886 break; 887 case G_ISAINVAL: 888 str = "wrong ELF machine type"; 889 break; 890 case G_BADLWPS: 891 str = "bad lwp specification"; 892 break; 893 default: 894 str = "unknown error"; 895 break; 896 } 897 898 return (str); 899 } 900 901 /* 902 * Free a process control structure. 903 * Close the file descriptors but don't do the Prelease logic. 904 */ 905 void 906 Pfree(struct ps_prochandle *P) 907 { 908 uint_t i; 909 910 if (P->core != NULL) { 911 extern void __priv_free_info(void *); 912 lwp_info_t *nlwp, *lwp = list_next(&P->core->core_lwp_head); 913 914 for (i = 0; i < P->core->core_nlwp; i++, lwp = nlwp) { 915 nlwp = list_next(lwp); 916 #ifdef __sparc 917 if (lwp->lwp_gwins != NULL) 918 free(lwp->lwp_gwins); 919 if (lwp->lwp_xregs != NULL) 920 free(lwp->lwp_xregs); 921 if (lwp->lwp_asrs != NULL) 922 free(lwp->lwp_asrs); 923 #endif 924 free(lwp); 925 } 926 927 if (P->core->core_platform != NULL) 928 free(P->core->core_platform); 929 if (P->core->core_uts != NULL) 930 free(P->core->core_uts); 931 if (P->core->core_cred != NULL) 932 free(P->core->core_cred); 933 if (P->core->core_priv != NULL) 934 free(P->core->core_priv); 935 if (P->core->core_privinfo != NULL) 936 __priv_free_info(P->core->core_privinfo); 937 if (P->core->core_ppii != NULL) 938 free(P->core->core_ppii); 939 if (P->core->core_zonename != NULL) 940 free(P->core->core_zonename); 941 #if defined(__i386) || defined(__amd64) 942 if (P->core->core_ldt != NULL) 943 free(P->core->core_ldt); 944 #endif 945 946 free(P->core); 947 } 948 949 if (P->ucaddrs != NULL) { 950 free(P->ucaddrs); 951 P->ucaddrs = NULL; 952 P->ucnelems = 0; 953 } 954 955 (void) mutex_lock(&P->proc_lock); 956 if (P->hashtab != NULL) { 957 struct ps_lwphandle *L; 958 for (i = 0; i < HASHSIZE; i++) { 959 while ((L = P->hashtab[i]) != NULL) 960 Lfree_internal(P, L); 961 } 962 free(P->hashtab); 963 } 964 (void) mutex_unlock(&P->proc_lock); 965 (void) mutex_destroy(&P->proc_lock); 966 967 if (P->agentctlfd >= 0) 968 (void) close(P->agentctlfd); 969 if (P->agentstatfd >= 0) 970 (void) close(P->agentstatfd); 971 if (P->ctlfd >= 0) 972 (void) close(P->ctlfd); 973 if (P->asfd >= 0) 974 (void) close(P->asfd); 975 if (P->statfd >= 0) 976 (void) close(P->statfd); 977 Preset_maps(P); 978 979 /* clear out the structure as a precaution against reuse */ 980 (void) memset(P, 0, sizeof (*P)); 981 P->ctlfd = -1; 982 P->asfd = -1; 983 P->statfd = -1; 984 P->agentctlfd = -1; 985 P->agentstatfd = -1; 986 987 free(P); 988 } 989 990 /* 991 * Return the state of the process, one of the PS_* values. 992 */ 993 int 994 Pstate(struct ps_prochandle *P) 995 { 996 return (P->state); 997 } 998 999 /* 1000 * Return the open address space file descriptor for the process. 1001 * Clients must not close this file descriptor, not use it 1002 * after the process is freed. 1003 */ 1004 int 1005 Pasfd(struct ps_prochandle *P) 1006 { 1007 return (P->asfd); 1008 } 1009 1010 /* 1011 * Return the open control file descriptor for the process. 1012 * Clients must not close this file descriptor, not use it 1013 * after the process is freed. 1014 */ 1015 int 1016 Pctlfd(struct ps_prochandle *P) 1017 { 1018 return (P->ctlfd); 1019 } 1020 1021 /* 1022 * Return a pointer to the process psinfo structure. 1023 * Clients should not hold on to this pointer indefinitely. 1024 * It will become invalid on Prelease(). 1025 */ 1026 const psinfo_t * 1027 Ppsinfo(struct ps_prochandle *P) 1028 { 1029 if (P->state == PS_IDLE) { 1030 errno = ENODATA; 1031 return (NULL); 1032 } 1033 1034 if (P->state != PS_DEAD && proc_get_psinfo(P->pid, &P->psinfo) == -1) 1035 return (NULL); 1036 1037 return (&P->psinfo); 1038 } 1039 1040 /* 1041 * Return a pointer to the process status structure. 1042 * Clients should not hold on to this pointer indefinitely. 1043 * It will become invalid on Prelease(). 1044 */ 1045 const pstatus_t * 1046 Pstatus(struct ps_prochandle *P) 1047 { 1048 return (&P->status); 1049 } 1050 1051 /* 1052 * Fill in a pointer to a process credentials structure. The ngroups parameter 1053 * is the number of supplementary group entries allocated in the caller's cred 1054 * structure. It should equal zero or one unless extra space has been 1055 * allocated for the group list by the caller. 1056 */ 1057 int 1058 Pcred(struct ps_prochandle *P, prcred_t *pcrp, int ngroups) 1059 { 1060 if (P->state == PS_IDLE) { 1061 errno = ENODATA; 1062 return (-1); 1063 } 1064 1065 if (P->state != PS_DEAD) 1066 return (proc_get_cred(P->pid, pcrp, ngroups)); 1067 1068 if (P->core->core_cred != NULL) { 1069 /* 1070 * Avoid returning more supplementary group data than the 1071 * caller has allocated in their buffer. We expect them to 1072 * check pr_ngroups afterward and potentially call us again. 1073 */ 1074 ngroups = MIN(ngroups, P->core->core_cred->pr_ngroups); 1075 1076 (void) memcpy(pcrp, P->core->core_cred, 1077 sizeof (prcred_t) + (ngroups - 1) * sizeof (gid_t)); 1078 1079 return (0); 1080 } 1081 1082 errno = ENODATA; 1083 return (-1); 1084 } 1085 1086 #if defined(__i386) || defined(__amd64) 1087 /* 1088 * Fill in a pointer to a process LDT structure. 1089 * The caller provides a buffer of size 'nldt * sizeof (struct ssd)'; 1090 * If pldt == NULL or nldt == 0, we return the number of existing LDT entries. 1091 * Otherwise we return the actual number of LDT entries fetched (<= nldt). 1092 */ 1093 int 1094 Pldt(struct ps_prochandle *P, struct ssd *pldt, int nldt) 1095 { 1096 if (P->state == PS_IDLE) { 1097 errno = ENODATA; 1098 return (-1); 1099 } 1100 1101 if (P->state != PS_DEAD) 1102 return (proc_get_ldt(P->pid, pldt, nldt)); 1103 1104 if (pldt == NULL || nldt == 0) 1105 return (P->core->core_nldt); 1106 1107 if (P->core->core_ldt != NULL) { 1108 nldt = MIN(nldt, P->core->core_nldt); 1109 1110 (void) memcpy(pldt, P->core->core_ldt, 1111 nldt * sizeof (struct ssd)); 1112 1113 return (nldt); 1114 } 1115 1116 errno = ENODATA; 1117 return (-1); 1118 } 1119 #endif /* __i386 */ 1120 1121 /* 1122 * Fill in a pointer to a process privilege structure. 1123 */ 1124 ssize_t 1125 Ppriv(struct ps_prochandle *P, prpriv_t *pprv, size_t size) 1126 { 1127 if (P->state != PS_DEAD) { 1128 prpriv_t *pp = proc_get_priv(P->pid); 1129 if (pp != NULL) { 1130 size = MIN(size, PRIV_PRPRIV_SIZE(pp)); 1131 (void) memcpy(pprv, pp, size); 1132 free(pp); 1133 return (size); 1134 } 1135 return (-1); 1136 } 1137 1138 if (P->core->core_priv != NULL) { 1139 size = MIN(P->core->core_priv_size, size); 1140 (void) memcpy(pprv, P->core->core_priv, size); 1141 return (size); 1142 } 1143 errno = ENODATA; 1144 return (-1); 1145 } 1146 1147 int 1148 Psetpriv(struct ps_prochandle *P, prpriv_t *pprv) 1149 { 1150 int rc; 1151 long *ctl; 1152 size_t sz; 1153 1154 if (P->state == PS_DEAD) { 1155 errno = EBADF; 1156 return (-1); 1157 } 1158 1159 sz = PRIV_PRPRIV_SIZE(pprv) + sizeof (long); 1160 1161 sz = ((sz - 1) / sizeof (long) + 1) * sizeof (long); 1162 1163 ctl = malloc(sz); 1164 if (ctl == NULL) 1165 return (-1); 1166 1167 ctl[0] = PCSPRIV; 1168 1169 (void) memcpy(&ctl[1], pprv, PRIV_PRPRIV_SIZE(pprv)); 1170 1171 if (write(P->ctlfd, ctl, sz) != sz) 1172 rc = -1; 1173 else 1174 rc = 0; 1175 1176 free(ctl); 1177 1178 return (rc); 1179 } 1180 1181 void * 1182 Pprivinfo(struct ps_prochandle *P) 1183 { 1184 /* Use default from libc */ 1185 if (P->state != PS_DEAD) 1186 return (NULL); 1187 1188 return (P->core->core_privinfo); 1189 } 1190 1191 /* 1192 * Ensure that all cached state is written to the process. 1193 * The cached state is the LWP's signal mask and registers 1194 * and the process's tracing flags. 1195 */ 1196 void 1197 Psync(struct ps_prochandle *P) 1198 { 1199 int ctlfd = (P->agentctlfd >= 0)? P->agentctlfd : P->ctlfd; 1200 long cmd[6]; 1201 iovec_t iov[12]; 1202 int n = 0; 1203 1204 if (P->flags & SETHOLD) { 1205 cmd[0] = PCSHOLD; 1206 iov[n].iov_base = (caddr_t)&cmd[0]; 1207 iov[n++].iov_len = sizeof (long); 1208 iov[n].iov_base = (caddr_t)&P->status.pr_lwp.pr_lwphold; 1209 iov[n++].iov_len = sizeof (P->status.pr_lwp.pr_lwphold); 1210 } 1211 if (P->flags & SETREGS) { 1212 cmd[1] = PCSREG; 1213 #ifdef __i386 1214 /* XX64 we should probably restore REG_GS after this */ 1215 if (ctlfd == P->agentctlfd) 1216 P->status.pr_lwp.pr_reg[GS] = 0; 1217 #elif defined(__amd64) 1218 /* XX64 */ 1219 #endif 1220 iov[n].iov_base = (caddr_t)&cmd[1]; 1221 iov[n++].iov_len = sizeof (long); 1222 iov[n].iov_base = (caddr_t)&P->status.pr_lwp.pr_reg[0]; 1223 iov[n++].iov_len = sizeof (P->status.pr_lwp.pr_reg); 1224 } 1225 if (P->flags & SETSIG) { 1226 cmd[2] = PCSTRACE; 1227 iov[n].iov_base = (caddr_t)&cmd[2]; 1228 iov[n++].iov_len = sizeof (long); 1229 iov[n].iov_base = (caddr_t)&P->status.pr_sigtrace; 1230 iov[n++].iov_len = sizeof (P->status.pr_sigtrace); 1231 } 1232 if (P->flags & SETFAULT) { 1233 cmd[3] = PCSFAULT; 1234 iov[n].iov_base = (caddr_t)&cmd[3]; 1235 iov[n++].iov_len = sizeof (long); 1236 iov[n].iov_base = (caddr_t)&P->status.pr_flttrace; 1237 iov[n++].iov_len = sizeof (P->status.pr_flttrace); 1238 } 1239 if (P->flags & SETENTRY) { 1240 cmd[4] = PCSENTRY; 1241 iov[n].iov_base = (caddr_t)&cmd[4]; 1242 iov[n++].iov_len = sizeof (long); 1243 iov[n].iov_base = (caddr_t)&P->status.pr_sysentry; 1244 iov[n++].iov_len = sizeof (P->status.pr_sysentry); 1245 } 1246 if (P->flags & SETEXIT) { 1247 cmd[5] = PCSEXIT; 1248 iov[n].iov_base = (caddr_t)&cmd[5]; 1249 iov[n++].iov_len = sizeof (long); 1250 iov[n].iov_base = (caddr_t)&P->status.pr_sysexit; 1251 iov[n++].iov_len = sizeof (P->status.pr_sysexit); 1252 } 1253 1254 if (n == 0 || writev(ctlfd, iov, n) < 0) 1255 return; /* nothing to do or write failed */ 1256 1257 P->flags &= ~(SETSIG|SETFAULT|SETENTRY|SETEXIT|SETHOLD|SETREGS); 1258 } 1259 1260 /* 1261 * Reopen the /proc file (after PS_LOST). 1262 */ 1263 int 1264 Preopen(struct ps_prochandle *P) 1265 { 1266 int fd; 1267 char procname[100]; 1268 char *fname; 1269 1270 if (P->state == PS_DEAD || P->state == PS_IDLE) 1271 return (0); 1272 1273 if (P->agentcnt > 0) { 1274 P->agentcnt = 1; 1275 Pdestroy_agent(P); 1276 } 1277 1278 (void) sprintf(procname, "/proc/%d/", (int)P->pid); 1279 fname = procname + strlen(procname); 1280 1281 (void) strcpy(fname, "as"); 1282 if ((fd = open(procname, O_RDWR)) < 0 || 1283 close(P->asfd) < 0 || 1284 (fd = dupfd(fd, P->asfd)) != P->asfd) { 1285 dprintf("Preopen: failed to open %s: %s\n", 1286 procname, strerror(errno)); 1287 if (fd >= 0) 1288 (void) close(fd); 1289 return (-1); 1290 } 1291 P->asfd = fd; 1292 1293 (void) strcpy(fname, "status"); 1294 if ((fd = open(procname, O_RDONLY)) < 0 || 1295 close(P->statfd) < 0 || 1296 (fd = dupfd(fd, P->statfd)) != P->statfd) { 1297 dprintf("Preopen: failed to open %s: %s\n", 1298 procname, strerror(errno)); 1299 if (fd >= 0) 1300 (void) close(fd); 1301 return (-1); 1302 } 1303 P->statfd = fd; 1304 1305 (void) strcpy(fname, "ctl"); 1306 if ((fd = open(procname, O_WRONLY)) < 0 || 1307 close(P->ctlfd) < 0 || 1308 (fd = dupfd(fd, P->ctlfd)) != P->ctlfd) { 1309 dprintf("Preopen: failed to open %s: %s\n", 1310 procname, strerror(errno)); 1311 if (fd >= 0) 1312 (void) close(fd); 1313 return (-1); 1314 } 1315 P->ctlfd = fd; 1316 1317 /* 1318 * Set the state to PS_RUN and wait for the process to stop so that 1319 * we re-read the status from the new P->statfd. If this fails, Pwait 1320 * will reset the state to PS_LOST and we fail the reopen. Before 1321 * returning, we also forge a bit of P->status to allow the debugger to 1322 * see that we are PS_LOST following a successful exec. 1323 */ 1324 P->state = PS_RUN; 1325 if (Pwait(P, 0) == -1) { 1326 #ifdef _ILP32 1327 if (errno == EOVERFLOW) 1328 P->status.pr_dmodel = PR_MODEL_LP64; 1329 #endif 1330 P->status.pr_lwp.pr_why = PR_SYSEXIT; 1331 P->status.pr_lwp.pr_what = SYS_execve; 1332 P->status.pr_lwp.pr_errno = 0; 1333 return (-1); 1334 } 1335 1336 /* 1337 * The process should be stopped on exec (REQUESTED) 1338 * or else should be stopped on exit from exec() (SYSEXIT) 1339 */ 1340 if (P->state == PS_STOP && 1341 (P->status.pr_lwp.pr_why == PR_REQUESTED || 1342 (P->status.pr_lwp.pr_why == PR_SYSEXIT && 1343 (P->status.pr_lwp.pr_what == SYS_exec || 1344 P->status.pr_lwp.pr_what == SYS_execve)))) { 1345 /* fake up stop-on-exit-from-execve */ 1346 if (P->status.pr_lwp.pr_why == PR_REQUESTED) { 1347 P->status.pr_lwp.pr_why = PR_SYSEXIT; 1348 P->status.pr_lwp.pr_what = SYS_execve; 1349 P->status.pr_lwp.pr_errno = 0; 1350 } 1351 } else { 1352 dprintf("Preopen: expected REQUESTED or " 1353 "SYSEXIT(SYS_execve) stop\n"); 1354 } 1355 1356 return (0); 1357 } 1358 1359 /* 1360 * Define all settable flags other than the microstate accounting flags. 1361 */ 1362 #define ALL_SETTABLE_FLAGS (PR_FORK|PR_RLC|PR_KLC|PR_ASYNC|PR_BPTADJ|PR_PTRACE) 1363 1364 /* 1365 * Restore /proc tracing flags to their original values 1366 * in preparation for releasing the process. 1367 * Also called by Pcreate() to clear all tracing flags. 1368 */ 1369 static void 1370 restore_tracing_flags(struct ps_prochandle *P) 1371 { 1372 long flags; 1373 long cmd[4]; 1374 iovec_t iov[8]; 1375 1376 if (P->flags & CREATED) { 1377 /* we created this process; clear all tracing flags */ 1378 premptyset(&P->status.pr_sigtrace); 1379 premptyset(&P->status.pr_flttrace); 1380 premptyset(&P->status.pr_sysentry); 1381 premptyset(&P->status.pr_sysexit); 1382 if ((P->status.pr_flags & ALL_SETTABLE_FLAGS) != 0) 1383 (void) Punsetflags(P, ALL_SETTABLE_FLAGS); 1384 } else { 1385 /* we grabbed the process; restore its tracing flags */ 1386 P->status.pr_sigtrace = P->orig_status.pr_sigtrace; 1387 P->status.pr_flttrace = P->orig_status.pr_flttrace; 1388 P->status.pr_sysentry = P->orig_status.pr_sysentry; 1389 P->status.pr_sysexit = P->orig_status.pr_sysexit; 1390 if ((P->status.pr_flags & ALL_SETTABLE_FLAGS) != 1391 (flags = (P->orig_status.pr_flags & ALL_SETTABLE_FLAGS))) { 1392 (void) Punsetflags(P, ALL_SETTABLE_FLAGS); 1393 if (flags) 1394 (void) Psetflags(P, flags); 1395 } 1396 } 1397 1398 cmd[0] = PCSTRACE; 1399 iov[0].iov_base = (caddr_t)&cmd[0]; 1400 iov[0].iov_len = sizeof (long); 1401 iov[1].iov_base = (caddr_t)&P->status.pr_sigtrace; 1402 iov[1].iov_len = sizeof (P->status.pr_sigtrace); 1403 1404 cmd[1] = PCSFAULT; 1405 iov[2].iov_base = (caddr_t)&cmd[1]; 1406 iov[2].iov_len = sizeof (long); 1407 iov[3].iov_base = (caddr_t)&P->status.pr_flttrace; 1408 iov[3].iov_len = sizeof (P->status.pr_flttrace); 1409 1410 cmd[2] = PCSENTRY; 1411 iov[4].iov_base = (caddr_t)&cmd[2]; 1412 iov[4].iov_len = sizeof (long); 1413 iov[5].iov_base = (caddr_t)&P->status.pr_sysentry; 1414 iov[5].iov_len = sizeof (P->status.pr_sysentry); 1415 1416 cmd[3] = PCSEXIT; 1417 iov[6].iov_base = (caddr_t)&cmd[3]; 1418 iov[6].iov_len = sizeof (long); 1419 iov[7].iov_base = (caddr_t)&P->status.pr_sysexit; 1420 iov[7].iov_len = sizeof (P->status.pr_sysexit); 1421 1422 (void) writev(P->ctlfd, iov, 8); 1423 1424 P->flags &= ~(SETSIG|SETFAULT|SETENTRY|SETEXIT); 1425 } 1426 1427 /* 1428 * Release the process. Frees the process control structure. 1429 * flags: 1430 * PRELEASE_CLEAR Clear all tracing flags. 1431 * PRELEASE_RETAIN Retain current tracing flags. 1432 * PRELEASE_HANG Leave the process stopped and abandoned. 1433 * PRELEASE_KILL Terminate the process with SIGKILL. 1434 */ 1435 void 1436 Prelease(struct ps_prochandle *P, int flags) 1437 { 1438 if (P->state == PS_DEAD) { 1439 dprintf("Prelease: releasing handle %p PS_DEAD of pid %d\n", 1440 (void *)P, (int)P->pid); 1441 Pfree(P); 1442 return; 1443 } 1444 1445 if (P->state == PS_IDLE) { 1446 file_info_t *fptr = list_next(&P->file_head); 1447 dprintf("Prelease: releasing handle %p PS_IDLE of file %s\n", 1448 (void *)P, fptr->file_pname); 1449 Pfree(P); 1450 return; 1451 } 1452 1453 dprintf("Prelease: releasing handle %p pid %d\n", 1454 (void *)P, (int)P->pid); 1455 1456 if (P->ctlfd == -1) { 1457 Pfree(P); 1458 return; 1459 } 1460 1461 if (P->agentcnt > 0) { 1462 P->agentcnt = 1; 1463 Pdestroy_agent(P); 1464 } 1465 1466 /* 1467 * Attempt to stop the process. 1468 */ 1469 P->state = PS_RUN; 1470 (void) Pstop(P, 1000); 1471 1472 if (flags & PRELEASE_KILL) { 1473 if (P->state == PS_STOP) 1474 (void) Psetrun(P, SIGKILL, 0); 1475 (void) kill(P->pid, SIGKILL); 1476 Pfree(P); 1477 return; 1478 } 1479 1480 /* 1481 * If we lost control, all we can do now is close the files. 1482 * In this case, the last close sets the process running. 1483 */ 1484 if (P->state != PS_STOP && 1485 (P->status.pr_lwp.pr_flags & (PR_ISTOP|PR_DSTOP)) == 0) { 1486 Pfree(P); 1487 return; 1488 } 1489 1490 /* 1491 * We didn't lose control; we do more. 1492 */ 1493 Psync(P); 1494 1495 if (flags & PRELEASE_CLEAR) 1496 P->flags |= CREATED; 1497 1498 if (!(flags & PRELEASE_RETAIN)) 1499 restore_tracing_flags(P); 1500 1501 if (flags & PRELEASE_HANG) { 1502 /* Leave the process stopped and abandoned */ 1503 (void) Punsetflags(P, PR_RLC|PR_KLC); 1504 Pfree(P); 1505 return; 1506 } 1507 1508 /* 1509 * Set the process running if we created it or if it was 1510 * not originally stopped or directed to stop via /proc 1511 * or if we were given the PRELEASE_CLEAR flag. 1512 */ 1513 if ((P->flags & CREATED) || 1514 (P->orig_status.pr_lwp.pr_flags & (PR_ISTOP|PR_DSTOP)) == 0) { 1515 (void) Psetflags(P, PR_RLC); 1516 /* 1517 * We do this repeatedly because the process may have 1518 * more than one LWP stopped on an event of interest. 1519 * This makes sure all of them are set running. 1520 */ 1521 do { 1522 if (Psetrun(P, 0, 0) == -1 && errno == EBUSY) 1523 break; /* Agent LWP may be stuck */ 1524 } while (Pstopstatus(P, PCNULL, 0) == 0 && 1525 P->status.pr_lwp.pr_flags & (PR_ISTOP|PR_DSTOP)); 1526 1527 if (P->status.pr_lwp.pr_flags & (PR_ISTOP|PR_DSTOP)) 1528 dprintf("Prelease: failed to set process running\n"); 1529 } 1530 1531 Pfree(P); 1532 } 1533 1534 /* debugging */ 1535 void 1536 prldump(const char *caller, lwpstatus_t *lsp) 1537 { 1538 char name[32]; 1539 uint32_t bits; 1540 1541 switch (lsp->pr_why) { 1542 case PR_REQUESTED: 1543 dprintf("%s: REQUESTED\n", caller); 1544 break; 1545 case PR_SIGNALLED: 1546 dprintf("%s: SIGNALLED %s\n", caller, 1547 proc_signame(lsp->pr_what, name, sizeof (name))); 1548 break; 1549 case PR_FAULTED: 1550 dprintf("%s: FAULTED %s\n", caller, 1551 proc_fltname(lsp->pr_what, name, sizeof (name))); 1552 break; 1553 case PR_SYSENTRY: 1554 dprintf("%s: SYSENTRY %s\n", caller, 1555 proc_sysname(lsp->pr_what, name, sizeof (name))); 1556 break; 1557 case PR_SYSEXIT: 1558 dprintf("%s: SYSEXIT %s\n", caller, 1559 proc_sysname(lsp->pr_what, name, sizeof (name))); 1560 break; 1561 case PR_JOBCONTROL: 1562 dprintf("%s: JOBCONTROL %s\n", caller, 1563 proc_signame(lsp->pr_what, name, sizeof (name))); 1564 break; 1565 case PR_SUSPENDED: 1566 dprintf("%s: SUSPENDED\n", caller); 1567 break; 1568 default: 1569 dprintf("%s: Unknown\n", caller); 1570 break; 1571 } 1572 1573 if (lsp->pr_cursig) 1574 dprintf("%s: p_cursig = %d\n", caller, lsp->pr_cursig); 1575 1576 bits = *((uint32_t *)&lsp->pr_lwppend); 1577 if (bits) 1578 dprintf("%s: pr_lwppend = 0x%.8X\n", caller, bits); 1579 } 1580 1581 /* debugging */ 1582 static void 1583 prdump(struct ps_prochandle *P) 1584 { 1585 uint32_t bits; 1586 1587 prldump("Pstopstatus", &P->status.pr_lwp); 1588 1589 bits = *((uint32_t *)&P->status.pr_sigpend); 1590 if (bits) 1591 dprintf("Pstopstatus: pr_sigpend = 0x%.8X\n", bits); 1592 } 1593 1594 /* 1595 * Wait for the specified process to stop or terminate. 1596 * Or, just get the current status (PCNULL). 1597 * Or, direct it to stop and get the current status (PCDSTOP). 1598 * If the agent LWP exists, do these things to the agent, 1599 * else do these things to the process as a whole. 1600 */ 1601 int 1602 Pstopstatus(struct ps_prochandle *P, 1603 long request, /* PCNULL, PCDSTOP, PCSTOP, PCWSTOP */ 1604 uint_t msec) /* if non-zero, timeout in milliseconds */ 1605 { 1606 int ctlfd = (P->agentctlfd >= 0)? P->agentctlfd : P->ctlfd; 1607 long ctl[3]; 1608 ssize_t rc; 1609 int err; 1610 int old_state = P->state; 1611 1612 switch (P->state) { 1613 case PS_RUN: 1614 break; 1615 case PS_STOP: 1616 if (request != PCNULL && request != PCDSTOP) 1617 return (0); 1618 break; 1619 case PS_LOST: 1620 if (request != PCNULL) { 1621 errno = EAGAIN; 1622 return (-1); 1623 } 1624 break; 1625 case PS_UNDEAD: 1626 case PS_DEAD: 1627 case PS_IDLE: 1628 if (request != PCNULL) { 1629 errno = ENOENT; 1630 return (-1); 1631 } 1632 break; 1633 default: /* corrupted state */ 1634 dprintf("Pstopstatus: corrupted state: %d\n", P->state); 1635 errno = EINVAL; 1636 return (-1); 1637 } 1638 1639 ctl[0] = PCDSTOP; 1640 ctl[1] = PCTWSTOP; 1641 ctl[2] = (long)msec; 1642 rc = 0; 1643 switch (request) { 1644 case PCSTOP: 1645 rc = write(ctlfd, &ctl[0], 3*sizeof (long)); 1646 break; 1647 case PCWSTOP: 1648 rc = write(ctlfd, &ctl[1], 2*sizeof (long)); 1649 break; 1650 case PCDSTOP: 1651 rc = write(ctlfd, &ctl[0], 1*sizeof (long)); 1652 break; 1653 case PCNULL: 1654 if (P->state == PS_DEAD || P->state == PS_IDLE) 1655 return (0); 1656 break; 1657 default: /* programming error */ 1658 errno = EINVAL; 1659 return (-1); 1660 } 1661 err = (rc < 0)? errno : 0; 1662 Psync(P); 1663 1664 if (P->agentstatfd < 0) { 1665 if (pread(P->statfd, &P->status, 1666 sizeof (P->status), (off_t)0) < 0) 1667 err = errno; 1668 } else { 1669 if (pread(P->agentstatfd, &P->status.pr_lwp, 1670 sizeof (P->status.pr_lwp), (off_t)0) < 0) 1671 err = errno; 1672 P->status.pr_flags = P->status.pr_lwp.pr_flags; 1673 } 1674 1675 if (err) { 1676 switch (err) { 1677 case EINTR: /* user typed ctl-C */ 1678 case ERESTART: 1679 dprintf("Pstopstatus: EINTR\n"); 1680 break; 1681 case EAGAIN: /* we lost control of the the process */ 1682 case EOVERFLOW: 1683 dprintf("Pstopstatus: PS_LOST, errno=%d\n", err); 1684 P->state = PS_LOST; 1685 break; 1686 default: /* check for dead process */ 1687 if (_libproc_debug) { 1688 const char *errstr; 1689 1690 switch (request) { 1691 case PCNULL: 1692 errstr = "Pstopstatus PCNULL"; break; 1693 case PCSTOP: 1694 errstr = "Pstopstatus PCSTOP"; break; 1695 case PCDSTOP: 1696 errstr = "Pstopstatus PCDSTOP"; break; 1697 case PCWSTOP: 1698 errstr = "Pstopstatus PCWSTOP"; break; 1699 default: 1700 errstr = "Pstopstatus PC???"; break; 1701 } 1702 dprintf("%s: %s\n", errstr, strerror(err)); 1703 } 1704 deadcheck(P); 1705 break; 1706 } 1707 if (err != EINTR && err != ERESTART) { 1708 errno = err; 1709 return (-1); 1710 } 1711 } 1712 1713 if (!(P->status.pr_flags & PR_STOPPED)) { 1714 P->state = PS_RUN; 1715 if (request == PCNULL || request == PCDSTOP || msec != 0) 1716 return (0); 1717 dprintf("Pstopstatus: process is not stopped\n"); 1718 errno = EPROTO; 1719 return (-1); 1720 } 1721 1722 P->state = PS_STOP; 1723 1724 if (_libproc_debug) /* debugging */ 1725 prdump(P); 1726 1727 /* 1728 * If the process was already stopped coming into Pstopstatus(), 1729 * then don't use its PC to set P->sysaddr since it may have been 1730 * changed since the time the process originally stopped. 1731 */ 1732 if (old_state == PS_STOP) 1733 return (0); 1734 1735 switch (P->status.pr_lwp.pr_why) { 1736 case PR_SYSENTRY: 1737 case PR_SYSEXIT: 1738 if (Pissyscall_prev(P, P->status.pr_lwp.pr_reg[R_PC], 1739 &P->sysaddr) == 0) 1740 P->sysaddr = P->status.pr_lwp.pr_reg[R_PC]; 1741 break; 1742 case PR_REQUESTED: 1743 case PR_SIGNALLED: 1744 case PR_FAULTED: 1745 case PR_JOBCONTROL: 1746 case PR_SUSPENDED: 1747 break; 1748 default: 1749 errno = EPROTO; 1750 return (-1); 1751 } 1752 1753 return (0); 1754 } 1755 1756 /* 1757 * Wait for the process to stop for any reason. 1758 */ 1759 int 1760 Pwait(struct ps_prochandle *P, uint_t msec) 1761 { 1762 return (Pstopstatus(P, PCWSTOP, msec)); 1763 } 1764 1765 /* 1766 * Direct the process to stop; wait for it to stop. 1767 */ 1768 int 1769 Pstop(struct ps_prochandle *P, uint_t msec) 1770 { 1771 return (Pstopstatus(P, PCSTOP, msec)); 1772 } 1773 1774 /* 1775 * Direct the process to stop; don't wait. 1776 */ 1777 int 1778 Pdstop(struct ps_prochandle *P) 1779 { 1780 return (Pstopstatus(P, PCDSTOP, 0)); 1781 } 1782 1783 static void 1784 deadcheck(struct ps_prochandle *P) 1785 { 1786 int fd; 1787 void *buf; 1788 size_t size; 1789 1790 if (P->statfd < 0) 1791 P->state = PS_UNDEAD; 1792 else { 1793 if (P->agentstatfd < 0) { 1794 fd = P->statfd; 1795 buf = &P->status; 1796 size = sizeof (P->status); 1797 } else { 1798 fd = P->agentstatfd; 1799 buf = &P->status.pr_lwp; 1800 size = sizeof (P->status.pr_lwp); 1801 } 1802 while (pread(fd, buf, size, (off_t)0) != size) { 1803 switch (errno) { 1804 default: 1805 P->state = PS_UNDEAD; 1806 break; 1807 case EINTR: 1808 case ERESTART: 1809 continue; 1810 case EAGAIN: 1811 P->state = PS_LOST; 1812 break; 1813 } 1814 break; 1815 } 1816 P->status.pr_flags = P->status.pr_lwp.pr_flags; 1817 } 1818 } 1819 1820 /* 1821 * Get the value of one register from stopped process. 1822 */ 1823 int 1824 Pgetareg(struct ps_prochandle *P, int regno, prgreg_t *preg) 1825 { 1826 if (regno < 0 || regno >= NPRGREG) { 1827 errno = EINVAL; 1828 return (-1); 1829 } 1830 1831 if (P->state == PS_IDLE) { 1832 errno = ENODATA; 1833 return (-1); 1834 } 1835 1836 if (P->state != PS_STOP && P->state != PS_DEAD) { 1837 errno = EBUSY; 1838 return (-1); 1839 } 1840 1841 *preg = P->status.pr_lwp.pr_reg[regno]; 1842 return (0); 1843 } 1844 1845 /* 1846 * Put value of one register into stopped process. 1847 */ 1848 int 1849 Pputareg(struct ps_prochandle *P, int regno, prgreg_t reg) 1850 { 1851 if (regno < 0 || regno >= NPRGREG) { 1852 errno = EINVAL; 1853 return (-1); 1854 } 1855 1856 if (P->state != PS_STOP) { 1857 errno = EBUSY; 1858 return (-1); 1859 } 1860 1861 P->status.pr_lwp.pr_reg[regno] = reg; 1862 P->flags |= SETREGS; /* set registers before continuing */ 1863 return (0); 1864 } 1865 1866 int 1867 Psetrun(struct ps_prochandle *P, 1868 int sig, /* signal to pass to process */ 1869 int flags) /* PRSTEP|PRSABORT|PRSTOP|PRCSIG|PRCFAULT */ 1870 { 1871 int ctlfd = (P->agentctlfd >= 0) ? P->agentctlfd : P->ctlfd; 1872 int sbits = (PR_DSTOP | PR_ISTOP | PR_ASLEEP); 1873 1874 long ctl[1 + /* PCCFAULT */ 1875 1 + sizeof (siginfo_t)/sizeof (long) + /* PCSSIG/PCCSIG */ 1876 2 ]; /* PCRUN */ 1877 1878 long *ctlp = ctl; 1879 size_t size; 1880 1881 if (P->state != PS_STOP && (P->status.pr_lwp.pr_flags & sbits) == 0) { 1882 errno = EBUSY; 1883 return (-1); 1884 } 1885 1886 Psync(P); /* flush tracing flags and registers */ 1887 1888 if (flags & PRCFAULT) { /* clear current fault */ 1889 *ctlp++ = PCCFAULT; 1890 flags &= ~PRCFAULT; 1891 } 1892 1893 if (flags & PRCSIG) { /* clear current signal */ 1894 *ctlp++ = PCCSIG; 1895 flags &= ~PRCSIG; 1896 } else if (sig && sig != P->status.pr_lwp.pr_cursig) { 1897 /* make current signal */ 1898 siginfo_t *infop; 1899 1900 *ctlp++ = PCSSIG; 1901 infop = (siginfo_t *)ctlp; 1902 (void) memset(infop, 0, sizeof (*infop)); 1903 infop->si_signo = sig; 1904 ctlp += sizeof (siginfo_t) / sizeof (long); 1905 } 1906 1907 *ctlp++ = PCRUN; 1908 *ctlp++ = flags; 1909 size = (char *)ctlp - (char *)ctl; 1910 1911 P->info_valid = 0; /* will need to update map and file info */ 1912 1913 /* 1914 * If we've cached ucontext-list information while we were stopped, 1915 * free it now. 1916 */ 1917 if (P->ucaddrs != NULL) { 1918 free(P->ucaddrs); 1919 P->ucaddrs = NULL; 1920 P->ucnelems = 0; 1921 } 1922 1923 if (write(ctlfd, ctl, size) != size) { 1924 /* If it is dead or lost, return the real status, not PS_RUN */ 1925 if (errno == ENOENT || errno == EAGAIN) { 1926 (void) Pstopstatus(P, PCNULL, 0); 1927 return (0); 1928 } 1929 /* If it is not in a jobcontrol stop, issue an error message */ 1930 if (errno != EBUSY || 1931 P->status.pr_lwp.pr_why != PR_JOBCONTROL) { 1932 dprintf("Psetrun: %s\n", strerror(errno)); 1933 return (-1); 1934 } 1935 /* Otherwise pretend that the job-stopped process is running */ 1936 } 1937 1938 P->state = PS_RUN; 1939 return (0); 1940 } 1941 1942 ssize_t 1943 Pread(struct ps_prochandle *P, 1944 void *buf, /* caller's buffer */ 1945 size_t nbyte, /* number of bytes to read */ 1946 uintptr_t address) /* address in process */ 1947 { 1948 return (P->ops->p_pread(P, buf, nbyte, address)); 1949 } 1950 1951 ssize_t 1952 Pread_string(struct ps_prochandle *P, 1953 char *buf, /* caller's buffer */ 1954 size_t size, /* upper limit on bytes to read */ 1955 uintptr_t addr) /* address in process */ 1956 { 1957 enum { STRSZ = 40 }; 1958 char string[STRSZ + 1]; 1959 ssize_t leng = 0; 1960 int nbyte; 1961 1962 if (size < 2) { 1963 errno = EINVAL; 1964 return (-1); 1965 } 1966 1967 size--; /* ensure trailing null fits in buffer */ 1968 1969 *buf = '\0'; 1970 string[STRSZ] = '\0'; 1971 1972 for (nbyte = STRSZ; nbyte == STRSZ && leng < size; addr += STRSZ) { 1973 if ((nbyte = P->ops->p_pread(P, string, STRSZ, addr)) <= 0) { 1974 buf[leng] = '\0'; 1975 return (leng ? leng : -1); 1976 } 1977 if ((nbyte = strlen(string)) > 0) { 1978 if (leng + nbyte > size) 1979 nbyte = size - leng; 1980 (void) strncpy(buf + leng, string, nbyte); 1981 leng += nbyte; 1982 } 1983 } 1984 buf[leng] = '\0'; 1985 return (leng); 1986 } 1987 1988 ssize_t 1989 Pwrite(struct ps_prochandle *P, 1990 const void *buf, /* caller's buffer */ 1991 size_t nbyte, /* number of bytes to write */ 1992 uintptr_t address) /* address in process */ 1993 { 1994 return (P->ops->p_pwrite(P, buf, nbyte, address)); 1995 } 1996 1997 int 1998 Pclearsig(struct ps_prochandle *P) 1999 { 2000 int ctlfd = (P->agentctlfd >= 0)? P->agentctlfd : P->ctlfd; 2001 long ctl = PCCSIG; 2002 2003 if (write(ctlfd, &ctl, sizeof (ctl)) != sizeof (ctl)) 2004 return (-1); 2005 P->status.pr_lwp.pr_cursig = 0; 2006 return (0); 2007 } 2008 2009 int 2010 Pclearfault(struct ps_prochandle *P) 2011 { 2012 int ctlfd = (P->agentctlfd >= 0)? P->agentctlfd : P->ctlfd; 2013 long ctl = PCCFAULT; 2014 2015 if (write(ctlfd, &ctl, sizeof (ctl)) != sizeof (ctl)) 2016 return (-1); 2017 return (0); 2018 } 2019 2020 /* 2021 * Set a breakpoint trap, return original instruction. 2022 */ 2023 int 2024 Psetbkpt(struct ps_prochandle *P, uintptr_t address, ulong_t *saved) 2025 { 2026 long ctl[1 + sizeof (priovec_t) / sizeof (long) + /* PCREAD */ 2027 1 + sizeof (priovec_t) / sizeof (long)]; /* PCWRITE */ 2028 long *ctlp = ctl; 2029 size_t size; 2030 priovec_t *iovp; 2031 instr_t bpt = BPT; 2032 instr_t old; 2033 2034 if (P->state == PS_DEAD || P->state == PS_UNDEAD || 2035 P->state == PS_IDLE) { 2036 errno = ENOENT; 2037 return (-1); 2038 } 2039 2040 /* fetch the old instruction */ 2041 *ctlp++ = PCREAD; 2042 iovp = (priovec_t *)ctlp; 2043 iovp->pio_base = &old; 2044 iovp->pio_len = sizeof (old); 2045 iovp->pio_offset = address; 2046 ctlp += sizeof (priovec_t) / sizeof (long); 2047 2048 /* write the BPT instruction */ 2049 *ctlp++ = PCWRITE; 2050 iovp = (priovec_t *)ctlp; 2051 iovp->pio_base = &bpt; 2052 iovp->pio_len = sizeof (bpt); 2053 iovp->pio_offset = address; 2054 ctlp += sizeof (priovec_t) / sizeof (long); 2055 2056 size = (char *)ctlp - (char *)ctl; 2057 if (write(P->ctlfd, ctl, size) != size) 2058 return (-1); 2059 2060 /* 2061 * Fail if there was already a breakpoint there from another debugger 2062 * or DTrace's user-level tracing on x86. 2063 */ 2064 if (old == BPT) { 2065 errno = EBUSY; 2066 return (-1); 2067 } 2068 2069 *saved = (ulong_t)old; 2070 return (0); 2071 } 2072 2073 /* 2074 * Restore original instruction where a breakpoint was set. 2075 */ 2076 int 2077 Pdelbkpt(struct ps_prochandle *P, uintptr_t address, ulong_t saved) 2078 { 2079 instr_t old = (instr_t)saved; 2080 instr_t cur; 2081 2082 if (P->state == PS_DEAD || P->state == PS_UNDEAD || 2083 P->state == PS_IDLE) { 2084 errno = ENOENT; 2085 return (-1); 2086 } 2087 2088 /* 2089 * If the breakpoint instruction we had placed has been overwritten 2090 * with a new instruction, then don't try to replace it with the 2091 * old instruction. Doing do can cause problems with self-modifying 2092 * code -- PLTs for example. If the Pread() fails, we assume that we 2093 * should proceed though most likely the Pwrite() will also fail. 2094 */ 2095 if (Pread(P, &cur, sizeof (cur), address) == sizeof (cur) && 2096 cur != BPT) 2097 return (0); 2098 2099 if (Pwrite(P, &old, sizeof (old), address) != sizeof (old)) 2100 return (-1); 2101 2102 return (0); 2103 } 2104 2105 /* 2106 * Common code for Pxecbkpt() and Lxecbkpt(). 2107 * Develop the array of requests that will do the job, then 2108 * write them to the specified control file descriptor. 2109 * Return the non-zero errno if the write fails. 2110 */ 2111 static int 2112 execute_bkpt( 2113 int ctlfd, /* process or LWP control file descriptor */ 2114 const fltset_t *faultset, /* current set of traced faults */ 2115 const sigset_t *sigmask, /* current signal mask */ 2116 uintptr_t address, /* address of breakpint */ 2117 ulong_t saved) /* the saved instruction */ 2118 { 2119 long ctl[ 2120 1 + sizeof (sigset_t) / sizeof (long) + /* PCSHOLD */ 2121 1 + sizeof (fltset_t) / sizeof (long) + /* PCSFAULT */ 2122 1 + sizeof (priovec_t) / sizeof (long) + /* PCWRITE */ 2123 2 + /* PCRUN */ 2124 1 + /* PCWSTOP */ 2125 1 + /* PCCFAULT */ 2126 1 + sizeof (priovec_t) / sizeof (long) + /* PCWRITE */ 2127 1 + sizeof (fltset_t) / sizeof (long) + /* PCSFAULT */ 2128 1 + sizeof (sigset_t) / sizeof (long)]; /* PCSHOLD */ 2129 long *ctlp = ctl; 2130 sigset_t unblock; 2131 size_t size; 2132 ssize_t ssize; 2133 priovec_t *iovp; 2134 sigset_t *holdp; 2135 fltset_t *faultp; 2136 instr_t old = (instr_t)saved; 2137 instr_t bpt = BPT; 2138 int error = 0; 2139 2140 /* block our signals for the duration */ 2141 (void) sigprocmask(SIG_BLOCK, &blockable_sigs, &unblock); 2142 2143 /* hold posted signals */ 2144 *ctlp++ = PCSHOLD; 2145 holdp = (sigset_t *)ctlp; 2146 prfillset(holdp); 2147 prdelset(holdp, SIGKILL); 2148 prdelset(holdp, SIGSTOP); 2149 ctlp += sizeof (sigset_t) / sizeof (long); 2150 2151 /* force tracing of FLTTRACE */ 2152 if (!(prismember(faultset, FLTTRACE))) { 2153 *ctlp++ = PCSFAULT; 2154 faultp = (fltset_t *)ctlp; 2155 *faultp = *faultset; 2156 praddset(faultp, FLTTRACE); 2157 ctlp += sizeof (fltset_t) / sizeof (long); 2158 } 2159 2160 /* restore the old instruction */ 2161 *ctlp++ = PCWRITE; 2162 iovp = (priovec_t *)ctlp; 2163 iovp->pio_base = &old; 2164 iovp->pio_len = sizeof (old); 2165 iovp->pio_offset = address; 2166 ctlp += sizeof (priovec_t) / sizeof (long); 2167 2168 /* clear current signal and fault; set running w/ single-step */ 2169 *ctlp++ = PCRUN; 2170 *ctlp++ = PRCSIG | PRCFAULT | PRSTEP; 2171 2172 /* wait for stop, cancel the fault */ 2173 *ctlp++ = PCWSTOP; 2174 *ctlp++ = PCCFAULT; 2175 2176 /* restore the breakpoint trap */ 2177 *ctlp++ = PCWRITE; 2178 iovp = (priovec_t *)ctlp; 2179 iovp->pio_base = &bpt; 2180 iovp->pio_len = sizeof (bpt); 2181 iovp->pio_offset = address; 2182 ctlp += sizeof (priovec_t) / sizeof (long); 2183 2184 /* restore fault tracing set */ 2185 if (!(prismember(faultset, FLTTRACE))) { 2186 *ctlp++ = PCSFAULT; 2187 *(fltset_t *)ctlp = *faultset; 2188 ctlp += sizeof (fltset_t) / sizeof (long); 2189 } 2190 2191 /* restore the hold mask */ 2192 *ctlp++ = PCSHOLD; 2193 *(sigset_t *)ctlp = *sigmask; 2194 ctlp += sizeof (sigset_t) / sizeof (long); 2195 2196 size = (char *)ctlp - (char *)ctl; 2197 if ((ssize = write(ctlfd, ctl, size)) != size) 2198 error = (ssize == -1)? errno : EINTR; 2199 (void) sigprocmask(SIG_SETMASK, &unblock, NULL); 2200 return (error); 2201 } 2202 2203 /* 2204 * Step over a breakpoint, i.e., execute the instruction that 2205 * really belongs at the breakpoint location (the current %pc) 2206 * and leave the process stopped at the next instruction. 2207 */ 2208 int 2209 Pxecbkpt(struct ps_prochandle *P, ulong_t saved) 2210 { 2211 int ctlfd = (P->agentctlfd >= 0)? P->agentctlfd : P->ctlfd; 2212 int rv, error; 2213 2214 if (P->state != PS_STOP) { 2215 errno = EBUSY; 2216 return (-1); 2217 } 2218 2219 Psync(P); 2220 2221 error = execute_bkpt(ctlfd, 2222 &P->status.pr_flttrace, &P->status.pr_lwp.pr_lwphold, 2223 P->status.pr_lwp.pr_reg[R_PC], saved); 2224 rv = Pstopstatus(P, PCNULL, 0); 2225 2226 if (error != 0) { 2227 if (P->status.pr_lwp.pr_why == PR_JOBCONTROL && 2228 error == EBUSY) { /* jobcontrol stop -- back off */ 2229 P->state = PS_RUN; 2230 return (0); 2231 } 2232 if (error == ENOENT) 2233 return (0); 2234 errno = error; 2235 return (-1); 2236 } 2237 2238 return (rv); 2239 } 2240 2241 /* 2242 * Install the watchpoint described by wp. 2243 */ 2244 int 2245 Psetwapt(struct ps_prochandle *P, const prwatch_t *wp) 2246 { 2247 long ctl[1 + sizeof (prwatch_t) / sizeof (long)]; 2248 prwatch_t *cwp = (prwatch_t *)&ctl[1]; 2249 2250 if (P->state == PS_DEAD || P->state == PS_UNDEAD || 2251 P->state == PS_IDLE) { 2252 errno = ENOENT; 2253 return (-1); 2254 } 2255 2256 ctl[0] = PCWATCH; 2257 cwp->pr_vaddr = wp->pr_vaddr; 2258 cwp->pr_size = wp->pr_size; 2259 cwp->pr_wflags = wp->pr_wflags; 2260 2261 if (write(P->ctlfd, ctl, sizeof (ctl)) != sizeof (ctl)) 2262 return (-1); 2263 2264 return (0); 2265 } 2266 2267 /* 2268 * Remove the watchpoint described by wp. 2269 */ 2270 int 2271 Pdelwapt(struct ps_prochandle *P, const prwatch_t *wp) 2272 { 2273 long ctl[1 + sizeof (prwatch_t) / sizeof (long)]; 2274 prwatch_t *cwp = (prwatch_t *)&ctl[1]; 2275 2276 if (P->state == PS_DEAD || P->state == PS_UNDEAD || 2277 P->state == PS_IDLE) { 2278 errno = ENOENT; 2279 return (-1); 2280 } 2281 2282 ctl[0] = PCWATCH; 2283 cwp->pr_vaddr = wp->pr_vaddr; 2284 cwp->pr_size = wp->pr_size; 2285 cwp->pr_wflags = 0; 2286 2287 if (write(P->ctlfd, ctl, sizeof (ctl)) != sizeof (ctl)) 2288 return (-1); 2289 2290 return (0); 2291 } 2292 2293 /* 2294 * Common code for Pxecwapt() and Lxecwapt(). Develop the array of requests 2295 * that will do the job, then write them to the specified control file 2296 * descriptor. Return the non-zero errno if the write fails. 2297 */ 2298 static int 2299 execute_wapt( 2300 int ctlfd, /* process or LWP control file descriptor */ 2301 const fltset_t *faultset, /* current set of traced faults */ 2302 const sigset_t *sigmask, /* current signal mask */ 2303 const prwatch_t *wp) /* watchpoint descriptor */ 2304 { 2305 long ctl[ 2306 1 + sizeof (sigset_t) / sizeof (long) + /* PCSHOLD */ 2307 1 + sizeof (fltset_t) / sizeof (long) + /* PCSFAULT */ 2308 1 + sizeof (prwatch_t) / sizeof (long) + /* PCWATCH */ 2309 2 + /* PCRUN */ 2310 1 + /* PCWSTOP */ 2311 1 + /* PCCFAULT */ 2312 1 + sizeof (prwatch_t) / sizeof (long) + /* PCWATCH */ 2313 1 + sizeof (fltset_t) / sizeof (long) + /* PCSFAULT */ 2314 1 + sizeof (sigset_t) / sizeof (long)]; /* PCSHOLD */ 2315 2316 long *ctlp = ctl; 2317 int error = 0; 2318 2319 sigset_t unblock; 2320 sigset_t *holdp; 2321 fltset_t *faultp; 2322 prwatch_t *prw; 2323 ssize_t ssize; 2324 size_t size; 2325 2326 (void) sigprocmask(SIG_BLOCK, &blockable_sigs, &unblock); 2327 2328 /* 2329 * Hold all posted signals in the victim process prior to stepping. 2330 */ 2331 *ctlp++ = PCSHOLD; 2332 holdp = (sigset_t *)ctlp; 2333 prfillset(holdp); 2334 prdelset(holdp, SIGKILL); 2335 prdelset(holdp, SIGSTOP); 2336 ctlp += sizeof (sigset_t) / sizeof (long); 2337 2338 /* 2339 * Force tracing of FLTTRACE since we need to single step. 2340 */ 2341 if (!(prismember(faultset, FLTTRACE))) { 2342 *ctlp++ = PCSFAULT; 2343 faultp = (fltset_t *)ctlp; 2344 *faultp = *faultset; 2345 praddset(faultp, FLTTRACE); 2346 ctlp += sizeof (fltset_t) / sizeof (long); 2347 } 2348 2349 /* 2350 * Clear only the current watchpoint by setting pr_wflags to zero. 2351 */ 2352 *ctlp++ = PCWATCH; 2353 prw = (prwatch_t *)ctlp; 2354 prw->pr_vaddr = wp->pr_vaddr; 2355 prw->pr_size = wp->pr_size; 2356 prw->pr_wflags = 0; 2357 ctlp += sizeof (prwatch_t) / sizeof (long); 2358 2359 /* 2360 * Clear the current signal and fault; set running with single-step. 2361 * Then wait for the victim to stop and cancel the FLTTRACE. 2362 */ 2363 *ctlp++ = PCRUN; 2364 *ctlp++ = PRCSIG | PRCFAULT | PRSTEP; 2365 *ctlp++ = PCWSTOP; 2366 *ctlp++ = PCCFAULT; 2367 2368 /* 2369 * Restore the current watchpoint. 2370 */ 2371 *ctlp++ = PCWATCH; 2372 (void) memcpy(ctlp, wp, sizeof (prwatch_t)); 2373 ctlp += sizeof (prwatch_t) / sizeof (long); 2374 2375 /* 2376 * Restore fault tracing set if we modified it. 2377 */ 2378 if (!(prismember(faultset, FLTTRACE))) { 2379 *ctlp++ = PCSFAULT; 2380 *(fltset_t *)ctlp = *faultset; 2381 ctlp += sizeof (fltset_t) / sizeof (long); 2382 } 2383 2384 /* 2385 * Restore the hold mask to the current hold mask (i.e. the one 2386 * before we executed any of the previous operations). 2387 */ 2388 *ctlp++ = PCSHOLD; 2389 *(sigset_t *)ctlp = *sigmask; 2390 ctlp += sizeof (sigset_t) / sizeof (long); 2391 2392 size = (char *)ctlp - (char *)ctl; 2393 if ((ssize = write(ctlfd, ctl, size)) != size) 2394 error = (ssize == -1)? errno : EINTR; 2395 (void) sigprocmask(SIG_SETMASK, &unblock, NULL); 2396 return (error); 2397 } 2398 2399 /* 2400 * Step over a watchpoint, i.e., execute the instruction that was stopped by 2401 * the watchpoint, and then leave the LWP stopped at the next instruction. 2402 */ 2403 int 2404 Pxecwapt(struct ps_prochandle *P, const prwatch_t *wp) 2405 { 2406 int ctlfd = (P->agentctlfd >= 0)? P->agentctlfd : P->ctlfd; 2407 int rv, error; 2408 2409 if (P->state != PS_STOP) { 2410 errno = EBUSY; 2411 return (-1); 2412 } 2413 2414 Psync(P); 2415 error = execute_wapt(ctlfd, 2416 &P->status.pr_flttrace, &P->status.pr_lwp.pr_lwphold, wp); 2417 rv = Pstopstatus(P, PCNULL, 0); 2418 2419 if (error != 0) { 2420 if (P->status.pr_lwp.pr_why == PR_JOBCONTROL && 2421 error == EBUSY) { /* jobcontrol stop -- back off */ 2422 P->state = PS_RUN; 2423 return (0); 2424 } 2425 if (error == ENOENT) 2426 return (0); 2427 errno = error; 2428 return (-1); 2429 } 2430 2431 return (rv); 2432 } 2433 2434 int 2435 Psetflags(struct ps_prochandle *P, long flags) 2436 { 2437 int rc; 2438 long ctl[2]; 2439 2440 ctl[0] = PCSET; 2441 ctl[1] = flags; 2442 2443 if (write(P->ctlfd, ctl, 2*sizeof (long)) != 2*sizeof (long)) { 2444 rc = -1; 2445 } else { 2446 P->status.pr_flags |= flags; 2447 P->status.pr_lwp.pr_flags |= flags; 2448 rc = 0; 2449 } 2450 2451 return (rc); 2452 } 2453 2454 int 2455 Punsetflags(struct ps_prochandle *P, long flags) 2456 { 2457 int rc; 2458 long ctl[2]; 2459 2460 ctl[0] = PCUNSET; 2461 ctl[1] = flags; 2462 2463 if (write(P->ctlfd, ctl, 2*sizeof (long)) != 2*sizeof (long)) { 2464 rc = -1; 2465 } else { 2466 P->status.pr_flags &= ~flags; 2467 P->status.pr_lwp.pr_flags &= ~flags; 2468 rc = 0; 2469 } 2470 2471 return (rc); 2472 } 2473 2474 /* 2475 * Common function to allow clients to manipulate the action to be taken 2476 * on receipt of a signal, receipt of machine fault, entry to a system call, 2477 * or exit from a system call. We make use of our private prset_* functions 2478 * in order to make this code be common. The 'which' parameter identifies 2479 * the code for the event of interest (0 means change the entire set), and 2480 * the 'stop' parameter is a boolean indicating whether the process should 2481 * stop when the event of interest occurs. The previous value is returned 2482 * to the caller; -1 is returned if an error occurred. 2483 */ 2484 static int 2485 Psetaction(struct ps_prochandle *P, void *sp, size_t size, 2486 uint_t flag, int max, int which, int stop) 2487 { 2488 int oldval; 2489 2490 if (which < 0 || which > max) { 2491 errno = EINVAL; 2492 return (-1); 2493 } 2494 2495 if (P->state == PS_DEAD || P->state == PS_UNDEAD || 2496 P->state == PS_IDLE) { 2497 errno = ENOENT; 2498 return (-1); 2499 } 2500 2501 oldval = prset_ismember(sp, size, which) ? TRUE : FALSE; 2502 2503 if (stop) { 2504 if (which == 0) { 2505 prset_fill(sp, size); 2506 P->flags |= flag; 2507 } else if (!oldval) { 2508 prset_add(sp, size, which); 2509 P->flags |= flag; 2510 } 2511 } else { 2512 if (which == 0) { 2513 prset_empty(sp, size); 2514 P->flags |= flag; 2515 } else if (oldval) { 2516 prset_del(sp, size, which); 2517 P->flags |= flag; 2518 } 2519 } 2520 2521 if (P->state == PS_RUN) 2522 Psync(P); 2523 2524 return (oldval); 2525 } 2526 2527 /* 2528 * Set action on specified signal. 2529 */ 2530 int 2531 Psignal(struct ps_prochandle *P, int which, int stop) 2532 { 2533 int oldval; 2534 2535 if (which == SIGKILL && stop != 0) { 2536 errno = EINVAL; 2537 return (-1); 2538 } 2539 2540 oldval = Psetaction(P, &P->status.pr_sigtrace, sizeof (sigset_t), 2541 SETSIG, PRMAXSIG, which, stop); 2542 2543 if (oldval != -1 && which == 0 && stop != 0) 2544 prdelset(&P->status.pr_sigtrace, SIGKILL); 2545 2546 return (oldval); 2547 } 2548 2549 /* 2550 * Set all signal tracing flags. 2551 */ 2552 void 2553 Psetsignal(struct ps_prochandle *P, const sigset_t *set) 2554 { 2555 if (P->state == PS_DEAD || P->state == PS_UNDEAD || 2556 P->state == PS_IDLE) 2557 return; 2558 2559 P->status.pr_sigtrace = *set; 2560 P->flags |= SETSIG; 2561 2562 if (P->state == PS_RUN) 2563 Psync(P); 2564 } 2565 2566 /* 2567 * Set action on specified fault. 2568 */ 2569 int 2570 Pfault(struct ps_prochandle *P, int which, int stop) 2571 { 2572 return (Psetaction(P, &P->status.pr_flttrace, sizeof (fltset_t), 2573 SETFAULT, PRMAXFAULT, which, stop)); 2574 } 2575 2576 /* 2577 * Set all machine fault tracing flags. 2578 */ 2579 void 2580 Psetfault(struct ps_prochandle *P, const fltset_t *set) 2581 { 2582 if (P->state == PS_DEAD || P->state == PS_UNDEAD || 2583 P->state == PS_IDLE) 2584 return; 2585 2586 P->status.pr_flttrace = *set; 2587 P->flags |= SETFAULT; 2588 2589 if (P->state == PS_RUN) 2590 Psync(P); 2591 } 2592 2593 /* 2594 * Set action on specified system call entry. 2595 */ 2596 int 2597 Psysentry(struct ps_prochandle *P, int which, int stop) 2598 { 2599 return (Psetaction(P, &P->status.pr_sysentry, sizeof (sysset_t), 2600 SETENTRY, PRMAXSYS, which, stop)); 2601 } 2602 2603 /* 2604 * Set all system call entry tracing flags. 2605 */ 2606 void 2607 Psetsysentry(struct ps_prochandle *P, const sysset_t *set) 2608 { 2609 if (P->state == PS_DEAD || P->state == PS_UNDEAD || 2610 P->state == PS_IDLE) 2611 return; 2612 2613 P->status.pr_sysentry = *set; 2614 P->flags |= SETENTRY; 2615 2616 if (P->state == PS_RUN) 2617 Psync(P); 2618 } 2619 2620 /* 2621 * Set action on specified system call exit. 2622 */ 2623 int 2624 Psysexit(struct ps_prochandle *P, int which, int stop) 2625 { 2626 return (Psetaction(P, &P->status.pr_sysexit, sizeof (sysset_t), 2627 SETEXIT, PRMAXSYS, which, stop)); 2628 } 2629 2630 /* 2631 * Set all system call exit tracing flags. 2632 */ 2633 void 2634 Psetsysexit(struct ps_prochandle *P, const sysset_t *set) 2635 { 2636 if (P->state == PS_DEAD || P->state == PS_UNDEAD || 2637 P->state == PS_IDLE) 2638 return; 2639 2640 P->status.pr_sysexit = *set; 2641 P->flags |= SETEXIT; 2642 2643 if (P->state == PS_RUN) 2644 Psync(P); 2645 } 2646 2647 /* 2648 * Utility function to read the contents of a file that contains a 2649 * prheader_t at the start (/proc/pid/lstatus or /proc/pid/lpsinfo). 2650 * Returns a malloc()d buffer or NULL on failure. 2651 */ 2652 static prheader_t * 2653 read_lfile(struct ps_prochandle *P, const char *lname) 2654 { 2655 prheader_t *Lhp; 2656 char lpath[64]; 2657 struct stat64 statb; 2658 int fd; 2659 size_t size; 2660 ssize_t rval; 2661 2662 (void) snprintf(lpath, sizeof (lpath), "/proc/%d/%s", 2663 (int)P->status.pr_pid, lname); 2664 if ((fd = open(lpath, O_RDONLY)) < 0 || fstat64(fd, &statb) != 0) { 2665 if (fd >= 0) 2666 (void) close(fd); 2667 return (NULL); 2668 } 2669 2670 /* 2671 * 'size' is just the initial guess at the buffer size. 2672 * It will have to grow if the number of lwps increases 2673 * while we are looking at the process. 2674 * 'size' must be larger than the actual file size. 2675 */ 2676 size = statb.st_size + 32; 2677 2678 for (;;) { 2679 if ((Lhp = malloc(size)) == NULL) 2680 break; 2681 if ((rval = pread(fd, Lhp, size, 0)) < 0 || 2682 rval <= sizeof (prheader_t)) { 2683 free(Lhp); 2684 Lhp = NULL; 2685 break; 2686 } 2687 if (rval < size) 2688 break; 2689 /* need a bigger buffer */ 2690 free(Lhp); 2691 size *= 2; 2692 } 2693 2694 (void) close(fd); 2695 return (Lhp); 2696 } 2697 2698 /* 2699 * LWP iteration interface. 2700 */ 2701 int 2702 Plwp_iter(struct ps_prochandle *P, proc_lwp_f *func, void *cd) 2703 { 2704 prheader_t *Lhp; 2705 lwpstatus_t *Lsp; 2706 long nlwp; 2707 int rv; 2708 2709 switch (P->state) { 2710 case PS_RUN: 2711 (void) Pstopstatus(P, PCNULL, 0); 2712 break; 2713 2714 case PS_STOP: 2715 Psync(P); 2716 break; 2717 2718 case PS_IDLE: 2719 errno = ENODATA; 2720 return (-1); 2721 } 2722 2723 /* 2724 * For either live processes or cores, the single LWP case is easy: 2725 * the pstatus_t contains the lwpstatus_t for the only LWP. 2726 */ 2727 if (P->status.pr_nlwp <= 1) 2728 return (func(cd, &P->status.pr_lwp)); 2729 2730 /* 2731 * For the core file multi-LWP case, we just iterate through the 2732 * list of LWP structs we read in from the core file. 2733 */ 2734 if (P->state == PS_DEAD) { 2735 lwp_info_t *lwp = list_prev(&P->core->core_lwp_head); 2736 uint_t i; 2737 2738 for (i = 0; i < P->core->core_nlwp; i++, lwp = list_prev(lwp)) { 2739 if (lwp->lwp_psinfo.pr_sname != 'Z' && 2740 (rv = func(cd, &lwp->lwp_status)) != 0) 2741 break; 2742 } 2743 2744 return (rv); 2745 } 2746 2747 /* 2748 * For the live process multi-LWP case, we have to work a little 2749 * harder: the /proc/pid/lstatus file has the array of LWP structs. 2750 */ 2751 if ((Lhp = read_lfile(P, "lstatus")) == NULL) 2752 return (-1); 2753 2754 for (nlwp = Lhp->pr_nent, Lsp = (lwpstatus_t *)(uintptr_t)(Lhp + 1); 2755 nlwp > 0; 2756 nlwp--, Lsp = (lwpstatus_t *)((uintptr_t)Lsp + Lhp->pr_entsize)) { 2757 if ((rv = func(cd, Lsp)) != 0) 2758 break; 2759 } 2760 2761 free(Lhp); 2762 return (rv); 2763 } 2764 2765 /* 2766 * Extended LWP iteration interface. 2767 * Iterate over all LWPs, active and zombie. 2768 */ 2769 int 2770 Plwp_iter_all(struct ps_prochandle *P, proc_lwp_all_f *func, void *cd) 2771 { 2772 prheader_t *Lhp = NULL; 2773 lwpstatus_t *Lsp; 2774 lwpstatus_t *sp; 2775 prheader_t *Lphp = NULL; 2776 lwpsinfo_t *Lpsp; 2777 long nstat; 2778 long ninfo; 2779 int rv; 2780 2781 retry: 2782 if (Lhp != NULL) 2783 free(Lhp); 2784 if (Lphp != NULL) 2785 free(Lphp); 2786 if (P->state == PS_RUN) 2787 (void) Pstopstatus(P, PCNULL, 0); 2788 (void) Ppsinfo(P); 2789 2790 if (P->state == PS_STOP) 2791 Psync(P); 2792 2793 /* 2794 * For either live processes or cores, the single LWP case is easy: 2795 * the pstatus_t contains the lwpstatus_t for the only LWP and 2796 * the psinfo_t contains the lwpsinfo_t for the only LWP. 2797 */ 2798 if (P->status.pr_nlwp + P->status.pr_nzomb <= 1) 2799 return (func(cd, &P->status.pr_lwp, &P->psinfo.pr_lwp)); 2800 2801 /* 2802 * For the core file multi-LWP case, we just iterate through the 2803 * list of LWP structs we read in from the core file. 2804 */ 2805 if (P->state == PS_DEAD) { 2806 lwp_info_t *lwp = list_prev(&P->core->core_lwp_head); 2807 uint_t i; 2808 2809 for (i = 0; i < P->core->core_nlwp; i++, lwp = list_prev(lwp)) { 2810 sp = (lwp->lwp_psinfo.pr_sname == 'Z')? NULL : 2811 &lwp->lwp_status; 2812 if ((rv = func(cd, sp, &lwp->lwp_psinfo)) != 0) 2813 break; 2814 } 2815 2816 return (rv); 2817 } 2818 2819 /* 2820 * For the live process multi-LWP case, we have to work a little 2821 * harder: the /proc/pid/lstatus file has the array of lwpstatus_t's 2822 * and the /proc/pid/lpsinfo file has the array of lwpsinfo_t's. 2823 */ 2824 if ((Lhp = read_lfile(P, "lstatus")) == NULL) 2825 return (-1); 2826 if ((Lphp = read_lfile(P, "lpsinfo")) == NULL) { 2827 free(Lhp); 2828 return (-1); 2829 } 2830 2831 /* 2832 * If we are looking at a running process, or one we do not control, 2833 * the active and zombie lwps in the process may have changed since 2834 * we read the process status structure. If so, just start over. 2835 */ 2836 if (Lhp->pr_nent != P->status.pr_nlwp || 2837 Lphp->pr_nent != P->status.pr_nlwp + P->status.pr_nzomb) 2838 goto retry; 2839 2840 /* 2841 * To be perfectly safe, prescan the two arrays, checking consistency. 2842 * We rely on /proc giving us lwpstatus_t's and lwpsinfo_t's in the 2843 * same order (the lwp directory order) in their respective files. 2844 * We also rely on there being (possibly) more lwpsinfo_t's than 2845 * lwpstatus_t's (the extra lwpsinfo_t's are for zombie lwps). 2846 */ 2847 Lsp = (lwpstatus_t *)(uintptr_t)(Lhp + 1); 2848 Lpsp = (lwpsinfo_t *)(uintptr_t)(Lphp + 1); 2849 nstat = Lhp->pr_nent; 2850 for (ninfo = Lphp->pr_nent; ninfo != 0; ninfo--) { 2851 if (Lpsp->pr_sname != 'Z') { 2852 /* 2853 * Not a zombie lwp; check for matching lwpids. 2854 */ 2855 if (nstat == 0 || Lsp->pr_lwpid != Lpsp->pr_lwpid) 2856 goto retry; 2857 Lsp = (lwpstatus_t *)((uintptr_t)Lsp + Lhp->pr_entsize); 2858 nstat--; 2859 } 2860 Lpsp = (lwpsinfo_t *)((uintptr_t)Lpsp + Lphp->pr_entsize); 2861 } 2862 if (nstat != 0) 2863 goto retry; 2864 2865 /* 2866 * Rescan, this time for real. 2867 */ 2868 Lsp = (lwpstatus_t *)(uintptr_t)(Lhp + 1); 2869 Lpsp = (lwpsinfo_t *)(uintptr_t)(Lphp + 1); 2870 for (ninfo = Lphp->pr_nent; ninfo != 0; ninfo--) { 2871 if (Lpsp->pr_sname != 'Z') { 2872 sp = Lsp; 2873 Lsp = (lwpstatus_t *)((uintptr_t)Lsp + Lhp->pr_entsize); 2874 } else { 2875 sp = NULL; 2876 } 2877 if ((rv = func(cd, sp, Lpsp)) != 0) 2878 break; 2879 Lpsp = (lwpsinfo_t *)((uintptr_t)Lpsp + Lphp->pr_entsize); 2880 } 2881 2882 free(Lhp); 2883 free(Lphp); 2884 return (rv); 2885 } 2886 2887 core_content_t 2888 Pcontent(struct ps_prochandle *P) 2889 { 2890 if (P->state == PS_DEAD) 2891 return (P->core->core_content); 2892 if (P->state == PS_IDLE) 2893 return (CC_CONTENT_TEXT | CC_CONTENT_DATA | CC_CONTENT_CTF); 2894 2895 return (CC_CONTENT_ALL); 2896 } 2897 2898 /* 2899 * ================================================================= 2900 * The remainder of the functions in this file are for the 2901 * control of individual LWPs in the controlled process. 2902 * ================================================================= 2903 */ 2904 2905 /* 2906 * Find an entry in the process hash table for the specified lwpid. 2907 * The entry will either point to an existing struct ps_lwphandle 2908 * or it will point to an empty slot for a new struct ps_lwphandle. 2909 */ 2910 static struct ps_lwphandle ** 2911 Lfind(struct ps_prochandle *P, lwpid_t lwpid) 2912 { 2913 struct ps_lwphandle **Lp; 2914 struct ps_lwphandle *L; 2915 2916 for (Lp = &P->hashtab[lwpid % (HASHSIZE - 1)]; 2917 (L = *Lp) != NULL; Lp = &L->lwp_hash) 2918 if (L->lwp_id == lwpid) 2919 break; 2920 return (Lp); 2921 } 2922 2923 /* 2924 * Grab an LWP contained within the controlled process. 2925 * Return an opaque pointer to its LWP control structure. 2926 * perr: pointer to error return code. 2927 */ 2928 struct ps_lwphandle * 2929 Lgrab(struct ps_prochandle *P, lwpid_t lwpid, int *perr) 2930 { 2931 struct ps_lwphandle **Lp; 2932 struct ps_lwphandle *L; 2933 int fd; 2934 char procname[100]; 2935 char *fname; 2936 int rc = 0; 2937 2938 (void) mutex_lock(&P->proc_lock); 2939 2940 if (P->state == PS_UNDEAD || P->state == PS_IDLE) 2941 rc = G_NOPROC; 2942 else if (P->hashtab == NULL && 2943 (P->hashtab = calloc(HASHSIZE, sizeof (struct ps_lwphandle *))) 2944 == NULL) 2945 rc = G_STRANGE; 2946 else if (*(Lp = Lfind(P, lwpid)) != NULL) 2947 rc = G_BUSY; 2948 else if ((L = malloc(sizeof (struct ps_lwphandle))) == NULL) 2949 rc = G_STRANGE; 2950 if (rc) { 2951 *perr = rc; 2952 (void) mutex_unlock(&P->proc_lock); 2953 return (NULL); 2954 } 2955 2956 (void) memset(L, 0, sizeof (*L)); 2957 L->lwp_ctlfd = -1; 2958 L->lwp_statfd = -1; 2959 L->lwp_proc = P; 2960 L->lwp_id = lwpid; 2961 *Lp = L; /* insert into the hash table */ 2962 2963 if (P->state == PS_DEAD) { /* core file */ 2964 if (getlwpstatus(P, lwpid, &L->lwp_status) == -1) { 2965 rc = G_NOPROC; 2966 goto err; 2967 } 2968 L->lwp_state = PS_DEAD; 2969 *perr = 0; 2970 (void) mutex_unlock(&P->proc_lock); 2971 return (L); 2972 } 2973 2974 /* 2975 * Open the /proc/<pid>/lwp/<lwpid> files 2976 */ 2977 (void) sprintf(procname, "/proc/%d/lwp/%d/", (int)P->pid, (int)lwpid); 2978 fname = procname + strlen(procname); 2979 (void) set_minfd(); 2980 2981 (void) strcpy(fname, "lwpstatus"); 2982 if ((fd = open(procname, O_RDONLY)) < 0 || 2983 (fd = dupfd(fd, 0)) < 0) { 2984 switch (errno) { 2985 case ENOENT: 2986 rc = G_NOPROC; 2987 break; 2988 default: 2989 dprintf("Lgrab: failed to open %s: %s\n", 2990 procname, strerror(errno)); 2991 rc = G_STRANGE; 2992 break; 2993 } 2994 goto err; 2995 } 2996 L->lwp_statfd = fd; 2997 2998 if (pread(fd, &L->lwp_status, sizeof (L->lwp_status), (off_t)0) < 0) { 2999 switch (errno) { 3000 case ENOENT: 3001 rc = G_NOPROC; 3002 break; 3003 default: 3004 dprintf("Lgrab: failed to read %s: %s\n", 3005 procname, strerror(errno)); 3006 rc = G_STRANGE; 3007 break; 3008 } 3009 goto err; 3010 } 3011 3012 (void) strcpy(fname, "lwpctl"); 3013 if ((fd = open(procname, O_WRONLY)) < 0 || 3014 (fd = dupfd(fd, 0)) < 0) { 3015 switch (errno) { 3016 case ENOENT: 3017 rc = G_NOPROC; 3018 break; 3019 default: 3020 dprintf("Lgrab: failed to open %s: %s\n", 3021 procname, strerror(errno)); 3022 rc = G_STRANGE; 3023 break; 3024 } 3025 goto err; 3026 } 3027 L->lwp_ctlfd = fd; 3028 3029 L->lwp_state = 3030 ((L->lwp_status.pr_flags & (PR_STOPPED|PR_ISTOP)) 3031 == (PR_STOPPED|PR_ISTOP))? 3032 PS_STOP : PS_RUN; 3033 3034 *perr = 0; 3035 (void) mutex_unlock(&P->proc_lock); 3036 return (L); 3037 3038 err: 3039 Lfree_internal(P, L); 3040 *perr = rc; 3041 (void) mutex_unlock(&P->proc_lock); 3042 return (NULL); 3043 } 3044 3045 /* 3046 * Return a printable string corresponding to an Lgrab() error return. 3047 */ 3048 const char * 3049 Lgrab_error(int error) 3050 { 3051 const char *str; 3052 3053 switch (error) { 3054 case G_NOPROC: 3055 str = "no such LWP"; 3056 break; 3057 case G_BUSY: 3058 str = "LWP already grabbed"; 3059 break; 3060 case G_STRANGE: 3061 str = "unanticipated system error"; 3062 break; 3063 default: 3064 str = "unknown error"; 3065 break; 3066 } 3067 3068 return (str); 3069 } 3070 3071 /* 3072 * Free an LWP control structure. 3073 */ 3074 void 3075 Lfree(struct ps_lwphandle *L) 3076 { 3077 struct ps_prochandle *P = L->lwp_proc; 3078 3079 (void) mutex_lock(&P->proc_lock); 3080 Lfree_internal(P, L); 3081 (void) mutex_unlock(&P->proc_lock); 3082 } 3083 3084 static void 3085 Lfree_internal(struct ps_prochandle *P, struct ps_lwphandle *L) 3086 { 3087 *Lfind(P, L->lwp_id) = L->lwp_hash; /* delete from hash table */ 3088 if (L->lwp_ctlfd >= 0) 3089 (void) close(L->lwp_ctlfd); 3090 if (L->lwp_statfd >= 0) 3091 (void) close(L->lwp_statfd); 3092 3093 /* clear out the structure as a precaution against reuse */ 3094 (void) memset(L, 0, sizeof (*L)); 3095 L->lwp_ctlfd = -1; 3096 L->lwp_statfd = -1; 3097 3098 free(L); 3099 } 3100 3101 /* 3102 * Return the state of the process, one of the PS_* values. 3103 */ 3104 int 3105 Lstate(struct ps_lwphandle *L) 3106 { 3107 return (L->lwp_state); 3108 } 3109 3110 /* 3111 * Return the open control file descriptor for the LWP. 3112 * Clients must not close this file descriptor, nor use it 3113 * after the LWP is freed. 3114 */ 3115 int 3116 Lctlfd(struct ps_lwphandle *L) 3117 { 3118 return (L->lwp_ctlfd); 3119 } 3120 3121 /* 3122 * Return a pointer to the LWP lwpsinfo structure. 3123 * Clients should not hold on to this pointer indefinitely. 3124 * It will become invalid on Lfree(). 3125 */ 3126 const lwpsinfo_t * 3127 Lpsinfo(struct ps_lwphandle *L) 3128 { 3129 if (Plwp_getpsinfo(L->lwp_proc, L->lwp_id, &L->lwp_psinfo) == -1) 3130 return (NULL); 3131 3132 return (&L->lwp_psinfo); 3133 } 3134 3135 /* 3136 * Return a pointer to the LWP status structure. 3137 * Clients should not hold on to this pointer indefinitely. 3138 * It will become invalid on Lfree(). 3139 */ 3140 const lwpstatus_t * 3141 Lstatus(struct ps_lwphandle *L) 3142 { 3143 return (&L->lwp_status); 3144 } 3145 3146 /* 3147 * Given an LWP handle, return the process handle. 3148 */ 3149 struct ps_prochandle * 3150 Lprochandle(struct ps_lwphandle *L) 3151 { 3152 return (L->lwp_proc); 3153 } 3154 3155 /* 3156 * Ensure that all cached state is written to the LWP. 3157 * The cached state is the LWP's signal mask and registers. 3158 */ 3159 void 3160 Lsync(struct ps_lwphandle *L) 3161 { 3162 int ctlfd = L->lwp_ctlfd; 3163 long cmd[2]; 3164 iovec_t iov[4]; 3165 int n = 0; 3166 3167 if (L->lwp_flags & SETHOLD) { 3168 cmd[0] = PCSHOLD; 3169 iov[n].iov_base = (caddr_t)&cmd[0]; 3170 iov[n++].iov_len = sizeof (long); 3171 iov[n].iov_base = (caddr_t)&L->lwp_status.pr_lwphold; 3172 iov[n++].iov_len = sizeof (L->lwp_status.pr_lwphold); 3173 } 3174 if (L->lwp_flags & SETREGS) { 3175 cmd[1] = PCSREG; 3176 iov[n].iov_base = (caddr_t)&cmd[1]; 3177 iov[n++].iov_len = sizeof (long); 3178 iov[n].iov_base = (caddr_t)&L->lwp_status.pr_reg[0]; 3179 iov[n++].iov_len = sizeof (L->lwp_status.pr_reg); 3180 } 3181 3182 if (n == 0 || writev(ctlfd, iov, n) < 0) 3183 return; /* nothing to do or write failed */ 3184 3185 L->lwp_flags &= ~(SETHOLD|SETREGS); 3186 } 3187 3188 /* 3189 * Wait for the specified LWP to stop or terminate. 3190 * Or, just get the current status (PCNULL). 3191 * Or, direct it to stop and get the current status (PCDSTOP). 3192 */ 3193 static int 3194 Lstopstatus(struct ps_lwphandle *L, 3195 long request, /* PCNULL, PCDSTOP, PCSTOP, PCWSTOP */ 3196 uint_t msec) /* if non-zero, timeout in milliseconds */ 3197 { 3198 int ctlfd = L->lwp_ctlfd; 3199 long ctl[3]; 3200 ssize_t rc; 3201 int err; 3202 3203 switch (L->lwp_state) { 3204 case PS_RUN: 3205 break; 3206 case PS_STOP: 3207 if (request != PCNULL && request != PCDSTOP) 3208 return (0); 3209 break; 3210 case PS_LOST: 3211 if (request != PCNULL) { 3212 errno = EAGAIN; 3213 return (-1); 3214 } 3215 break; 3216 case PS_UNDEAD: 3217 case PS_DEAD: 3218 if (request != PCNULL) { 3219 errno = ENOENT; 3220 return (-1); 3221 } 3222 break; 3223 default: /* corrupted state */ 3224 dprintf("Lstopstatus: corrupted state: %d\n", L->lwp_state); 3225 errno = EINVAL; 3226 return (-1); 3227 } 3228 3229 ctl[0] = PCDSTOP; 3230 ctl[1] = PCTWSTOP; 3231 ctl[2] = (long)msec; 3232 rc = 0; 3233 switch (request) { 3234 case PCSTOP: 3235 rc = write(ctlfd, &ctl[0], 3*sizeof (long)); 3236 break; 3237 case PCWSTOP: 3238 rc = write(ctlfd, &ctl[1], 2*sizeof (long)); 3239 break; 3240 case PCDSTOP: 3241 rc = write(ctlfd, &ctl[0], 1*sizeof (long)); 3242 break; 3243 case PCNULL: 3244 if (L->lwp_state == PS_DEAD) 3245 return (0); /* Nothing else to do for cores */ 3246 break; 3247 default: /* programming error */ 3248 errno = EINVAL; 3249 return (-1); 3250 } 3251 err = (rc < 0)? errno : 0; 3252 Lsync(L); 3253 3254 if (pread(L->lwp_statfd, &L->lwp_status, 3255 sizeof (L->lwp_status), (off_t)0) < 0) 3256 err = errno; 3257 3258 if (err) { 3259 switch (err) { 3260 case EINTR: /* user typed ctl-C */ 3261 case ERESTART: 3262 dprintf("Lstopstatus: EINTR\n"); 3263 break; 3264 case EAGAIN: /* we lost control of the the process */ 3265 dprintf("Lstopstatus: EAGAIN\n"); 3266 L->lwp_state = PS_LOST; 3267 errno = err; 3268 return (-1); 3269 default: 3270 if (_libproc_debug) { 3271 const char *errstr; 3272 3273 switch (request) { 3274 case PCNULL: 3275 errstr = "Lstopstatus PCNULL"; break; 3276 case PCSTOP: 3277 errstr = "Lstopstatus PCSTOP"; break; 3278 case PCDSTOP: 3279 errstr = "Lstopstatus PCDSTOP"; break; 3280 case PCWSTOP: 3281 errstr = "Lstopstatus PCWSTOP"; break; 3282 default: 3283 errstr = "Lstopstatus PC???"; break; 3284 } 3285 dprintf("%s: %s\n", errstr, strerror(err)); 3286 } 3287 L->lwp_state = PS_UNDEAD; 3288 errno = err; 3289 return (-1); 3290 } 3291 } 3292 3293 if ((L->lwp_status.pr_flags & (PR_STOPPED|PR_ISTOP)) 3294 != (PR_STOPPED|PR_ISTOP)) { 3295 L->lwp_state = PS_RUN; 3296 if (request == PCNULL || request == PCDSTOP || msec != 0) 3297 return (0); 3298 dprintf("Lstopstatus: LWP is not stopped\n"); 3299 errno = EPROTO; 3300 return (-1); 3301 } 3302 3303 L->lwp_state = PS_STOP; 3304 3305 if (_libproc_debug) /* debugging */ 3306 prldump("Lstopstatus", &L->lwp_status); 3307 3308 switch (L->lwp_status.pr_why) { 3309 case PR_SYSENTRY: 3310 case PR_SYSEXIT: 3311 case PR_REQUESTED: 3312 case PR_SIGNALLED: 3313 case PR_FAULTED: 3314 case PR_JOBCONTROL: 3315 case PR_SUSPENDED: 3316 break; 3317 default: 3318 errno = EPROTO; 3319 return (-1); 3320 } 3321 3322 return (0); 3323 } 3324 3325 /* 3326 * Wait for the LWP to stop for any reason. 3327 */ 3328 int 3329 Lwait(struct ps_lwphandle *L, uint_t msec) 3330 { 3331 return (Lstopstatus(L, PCWSTOP, msec)); 3332 } 3333 3334 /* 3335 * Direct the LWP to stop; wait for it to stop. 3336 */ 3337 int 3338 Lstop(struct ps_lwphandle *L, uint_t msec) 3339 { 3340 return (Lstopstatus(L, PCSTOP, msec)); 3341 } 3342 3343 /* 3344 * Direct the LWP to stop; don't wait. 3345 */ 3346 int 3347 Ldstop(struct ps_lwphandle *L) 3348 { 3349 return (Lstopstatus(L, PCDSTOP, 0)); 3350 } 3351 3352 /* 3353 * Get the value of one register from stopped LWP. 3354 */ 3355 int 3356 Lgetareg(struct ps_lwphandle *L, int regno, prgreg_t *preg) 3357 { 3358 if (regno < 0 || regno >= NPRGREG) { 3359 errno = EINVAL; 3360 return (-1); 3361 } 3362 3363 if (L->lwp_state != PS_STOP) { 3364 errno = EBUSY; 3365 return (-1); 3366 } 3367 3368 *preg = L->lwp_status.pr_reg[regno]; 3369 return (0); 3370 } 3371 3372 /* 3373 * Put value of one register into stopped LWP. 3374 */ 3375 int 3376 Lputareg(struct ps_lwphandle *L, int regno, prgreg_t reg) 3377 { 3378 if (regno < 0 || regno >= NPRGREG) { 3379 errno = EINVAL; 3380 return (-1); 3381 } 3382 3383 if (L->lwp_state != PS_STOP) { 3384 errno = EBUSY; 3385 return (-1); 3386 } 3387 3388 L->lwp_status.pr_reg[regno] = reg; 3389 L->lwp_flags |= SETREGS; /* set registers before continuing */ 3390 return (0); 3391 } 3392 3393 int 3394 Lsetrun(struct ps_lwphandle *L, 3395 int sig, /* signal to pass to LWP */ 3396 int flags) /* PRSTEP|PRSABORT|PRSTOP|PRCSIG|PRCFAULT */ 3397 { 3398 int ctlfd = L->lwp_ctlfd; 3399 int sbits = (PR_DSTOP | PR_ISTOP | PR_ASLEEP); 3400 3401 long ctl[1 + /* PCCFAULT */ 3402 1 + sizeof (siginfo_t)/sizeof (long) + /* PCSSIG/PCCSIG */ 3403 2 ]; /* PCRUN */ 3404 3405 long *ctlp = ctl; 3406 size_t size; 3407 3408 if (L->lwp_state != PS_STOP && 3409 (L->lwp_status.pr_flags & sbits) == 0) { 3410 errno = EBUSY; 3411 return (-1); 3412 } 3413 3414 Lsync(L); /* flush registers */ 3415 3416 if (flags & PRCFAULT) { /* clear current fault */ 3417 *ctlp++ = PCCFAULT; 3418 flags &= ~PRCFAULT; 3419 } 3420 3421 if (flags & PRCSIG) { /* clear current signal */ 3422 *ctlp++ = PCCSIG; 3423 flags &= ~PRCSIG; 3424 } else if (sig && sig != L->lwp_status.pr_cursig) { 3425 /* make current signal */ 3426 siginfo_t *infop; 3427 3428 *ctlp++ = PCSSIG; 3429 infop = (siginfo_t *)ctlp; 3430 (void) memset(infop, 0, sizeof (*infop)); 3431 infop->si_signo = sig; 3432 ctlp += sizeof (siginfo_t) / sizeof (long); 3433 } 3434 3435 *ctlp++ = PCRUN; 3436 *ctlp++ = flags; 3437 size = (char *)ctlp - (char *)ctl; 3438 3439 L->lwp_proc->info_valid = 0; /* will need to update map and file info */ 3440 L->lwp_proc->state = PS_RUN; 3441 L->lwp_state = PS_RUN; 3442 3443 if (write(ctlfd, ctl, size) != size) { 3444 /* Pretend that a job-stopped LWP is running */ 3445 if (errno != EBUSY || L->lwp_status.pr_why != PR_JOBCONTROL) 3446 return (Lstopstatus(L, PCNULL, 0)); 3447 } 3448 3449 return (0); 3450 } 3451 3452 int 3453 Lclearsig(struct ps_lwphandle *L) 3454 { 3455 int ctlfd = L->lwp_ctlfd; 3456 long ctl = PCCSIG; 3457 3458 if (write(ctlfd, &ctl, sizeof (ctl)) != sizeof (ctl)) 3459 return (-1); 3460 L->lwp_status.pr_cursig = 0; 3461 return (0); 3462 } 3463 3464 int 3465 Lclearfault(struct ps_lwphandle *L) 3466 { 3467 int ctlfd = L->lwp_ctlfd; 3468 long ctl = PCCFAULT; 3469 3470 if (write(ctlfd, &ctl, sizeof (ctl)) != sizeof (ctl)) 3471 return (-1); 3472 return (0); 3473 } 3474 3475 /* 3476 * Step over a breakpoint, i.e., execute the instruction that 3477 * really belongs at the breakpoint location (the current %pc) 3478 * and leave the LWP stopped at the next instruction. 3479 */ 3480 int 3481 Lxecbkpt(struct ps_lwphandle *L, ulong_t saved) 3482 { 3483 struct ps_prochandle *P = L->lwp_proc; 3484 int rv, error; 3485 3486 if (L->lwp_state != PS_STOP) { 3487 errno = EBUSY; 3488 return (-1); 3489 } 3490 3491 Lsync(L); 3492 error = execute_bkpt(L->lwp_ctlfd, 3493 &P->status.pr_flttrace, &L->lwp_status.pr_lwphold, 3494 L->lwp_status.pr_reg[R_PC], saved); 3495 rv = Lstopstatus(L, PCNULL, 0); 3496 3497 if (error != 0) { 3498 if (L->lwp_status.pr_why == PR_JOBCONTROL && 3499 error == EBUSY) { /* jobcontrol stop -- back off */ 3500 L->lwp_state = PS_RUN; 3501 return (0); 3502 } 3503 if (error == ENOENT) 3504 return (0); 3505 errno = error; 3506 return (-1); 3507 } 3508 3509 return (rv); 3510 } 3511 3512 /* 3513 * Step over a watchpoint, i.e., execute the instruction that was stopped by 3514 * the watchpoint, and then leave the LWP stopped at the next instruction. 3515 */ 3516 int 3517 Lxecwapt(struct ps_lwphandle *L, const prwatch_t *wp) 3518 { 3519 struct ps_prochandle *P = L->lwp_proc; 3520 int rv, error; 3521 3522 if (L->lwp_state != PS_STOP) { 3523 errno = EBUSY; 3524 return (-1); 3525 } 3526 3527 Lsync(L); 3528 error = execute_wapt(L->lwp_ctlfd, 3529 &P->status.pr_flttrace, &L->lwp_status.pr_lwphold, wp); 3530 rv = Lstopstatus(L, PCNULL, 0); 3531 3532 if (error != 0) { 3533 if (L->lwp_status.pr_why == PR_JOBCONTROL && 3534 error == EBUSY) { /* jobcontrol stop -- back off */ 3535 L->lwp_state = PS_RUN; 3536 return (0); 3537 } 3538 if (error == ENOENT) 3539 return (0); 3540 errno = error; 3541 return (-1); 3542 } 3543 3544 return (rv); 3545 } 3546 3547 int 3548 Lstack(struct ps_lwphandle *L, stack_t *stkp) 3549 { 3550 struct ps_prochandle *P = L->lwp_proc; 3551 uintptr_t addr = L->lwp_status.pr_ustack; 3552 3553 if (P->status.pr_dmodel == PR_MODEL_NATIVE) { 3554 if (Pread(P, stkp, sizeof (*stkp), addr) != sizeof (*stkp)) 3555 return (-1); 3556 #ifdef _LP64 3557 } else { 3558 stack32_t stk32; 3559 3560 if (Pread(P, &stk32, sizeof (stk32), addr) != sizeof (stk32)) 3561 return (-1); 3562 3563 stack_32_to_n(&stk32, stkp); 3564 #endif 3565 } 3566 3567 return (0); 3568 } 3569 3570 int 3571 Lmain_stack(struct ps_lwphandle *L, stack_t *stkp) 3572 { 3573 struct ps_prochandle *P = L->lwp_proc; 3574 3575 if (Lstack(L, stkp) != 0) 3576 return (-1); 3577 3578 /* 3579 * If the SS_ONSTACK flag is set then this LWP is operating on the 3580 * alternate signal stack. We can recover the original stack from 3581 * pr_oldcontext. 3582 */ 3583 if (!(stkp->ss_flags & SS_ONSTACK)) 3584 return (0); 3585 3586 if (P->status.pr_dmodel == PR_MODEL_NATIVE) { 3587 ucontext_t *ctxp = (void *)L->lwp_status.pr_oldcontext; 3588 3589 if (Pread(P, stkp, sizeof (*stkp), 3590 (uintptr_t)&ctxp->uc_stack) != sizeof (*stkp)) 3591 return (-1); 3592 #ifdef _LP64 3593 } else { 3594 ucontext32_t *ctxp = (void *)L->lwp_status.pr_oldcontext; 3595 stack32_t stk32; 3596 3597 if (Pread(P, &stk32, sizeof (stk32), 3598 (uintptr_t)&ctxp->uc_stack) != sizeof (stk32)) 3599 return (-1); 3600 3601 stack_32_to_n(&stk32, stkp); 3602 #endif 3603 } 3604 3605 return (0); 3606 } 3607 3608 int 3609 Lalt_stack(struct ps_lwphandle *L, stack_t *stkp) 3610 { 3611 if (L->lwp_status.pr_altstack.ss_flags & SS_DISABLE) { 3612 errno = ENODATA; 3613 return (-1); 3614 } 3615 3616 *stkp = L->lwp_status.pr_altstack; 3617 3618 return (0); 3619 } 3620 3621 /* 3622 * Add a mapping to the given proc handle. Resizes the array as appropriate and 3623 * manages reference counts on the given file_info_t. 3624 * 3625 * The 'map_relocate' member is used to tell Psort_mappings() that the 3626 * associated file_map pointer needs to be relocated after the mappings have 3627 * been sorted. It is only set for the first mapping, and has no meaning 3628 * outside these two functions. 3629 */ 3630 int 3631 Padd_mapping(struct ps_prochandle *P, off64_t off, file_info_t *fp, 3632 prmap_t *pmap) 3633 { 3634 map_info_t *mp; 3635 3636 if (P->map_count == P->map_alloc) { 3637 size_t next = P->map_alloc ? P->map_alloc * 2 : 16; 3638 3639 if ((P->mappings = realloc(P->mappings, 3640 next * sizeof (map_info_t))) == NULL) 3641 return (-1); 3642 3643 P->map_alloc = next; 3644 } 3645 3646 mp = &P->mappings[P->map_count++]; 3647 3648 mp->map_offset = off; 3649 mp->map_pmap = *pmap; 3650 mp->map_relocate = 0; 3651 if ((mp->map_file = fp) != NULL) { 3652 if (fp->file_map == NULL) { 3653 fp->file_map = mp; 3654 mp->map_relocate = 1; 3655 } 3656 fp->file_ref++; 3657 } 3658 3659 return (0); 3660 } 3661 3662 static int 3663 map_sort(const void *a, const void *b) 3664 { 3665 const map_info_t *ap = a, *bp = b; 3666 3667 if (ap->map_pmap.pr_vaddr < bp->map_pmap.pr_vaddr) 3668 return (-1); 3669 else if (ap->map_pmap.pr_vaddr > bp->map_pmap.pr_vaddr) 3670 return (1); 3671 else 3672 return (0); 3673 } 3674 3675 /* 3676 * Sort the current set of mappings. Should be called during target 3677 * initialization after all calls to Padd_mapping() have been made. 3678 */ 3679 void 3680 Psort_mappings(struct ps_prochandle *P) 3681 { 3682 int i; 3683 map_info_t *mp; 3684 3685 qsort(P->mappings, P->map_count, sizeof (map_info_t), map_sort); 3686 3687 /* 3688 * Update all the file_map pointers to refer to the new locations. 3689 */ 3690 for (i = 0; i < P->map_count; i++) { 3691 mp = &P->mappings[i]; 3692 if (mp->map_relocate) 3693 mp->map_file->file_map = mp; 3694 mp->map_relocate = 0; 3695 } 3696 } 3697