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