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