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