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