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