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