summaryrefslogtreecommitdiff
path: root/usr/src/lib/libproc/common/Plwpregs.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libproc/common/Plwpregs.c')
-rw-r--r--usr/src/lib/libproc/common/Plwpregs.c37
1 files changed, 36 insertions, 1 deletions
diff --git a/usr/src/lib/libproc/common/Plwpregs.c b/usr/src/lib/libproc/common/Plwpregs.c
index 76f658a458..7549bc142d 100644
--- a/usr/src/lib/libproc/common/Plwpregs.c
+++ b/usr/src/lib/libproc/common/Plwpregs.c
@@ -23,7 +23,9 @@
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
+/*
+ * Copyright (c) 2013, Joyent, Inc. All rights reserved.
+ */
#include <sys/types.h>
#include <sys/uio.h>
@@ -349,6 +351,39 @@ Plwp_getpsinfo(struct ps_prochandle *P, lwpid_t lwpid, lwpsinfo_t *lps)
}
int
+Plwp_getspymaster(struct ps_prochandle *P, lwpid_t lwpid, psinfo_t *ps)
+{
+ lwpstatus_t lps;
+
+ if (P->state == PS_IDLE) {
+ errno = ENODATA;
+ return (-1);
+ }
+
+ if (getlwpstatus(P, lwpid, &lps) != 0)
+ return (-1);
+
+ if (!(lps.pr_flags & PR_AGENT)) {
+ errno = EINVAL;
+ return (-1);
+ }
+
+ if (P->state != PS_DEAD) {
+ return (getlwpfile(P, lwpid, "spymaster",
+ ps, sizeof (psinfo_t)));
+ }
+
+ if (P->spymaster.pr_nlwp != 0) {
+ (void) memcpy(ps, &P->spymaster, sizeof (psinfo_t));
+ return (0);
+ }
+
+ errno = ENODATA;
+
+ return (-1);
+}
+
+int
Plwp_stack(struct ps_prochandle *P, lwpid_t lwpid, stack_t *stkp)
{
uintptr_t addr;