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