示例#1
0
ps_err_e
ps_lgetxregs(struct ps_prochandle *P, lwpid_t lwpid, caddr_t xregs)
{
	if (P->state != PS_STOP && P->state != PS_DEAD)
		return (PS_ERR);

	/* LINTED - alignment */
	if (Plwp_getxregs(P, lwpid, (prxregset_t *)xregs) == 0)
		return (PS_OK);

	return (PS_BADLID);
}
示例#2
0
static int
old_per_lwp(void *data, const lwpstatus_t *lsp, const lwpsinfo_t *lip)
{
	pgcore_t *pgc = data;
	struct ps_prochandle *P = pgc->P;

	/*
	 * Legacy core files don't contain information about zombie LWPs.
	 * We use Plwp_iter_all() so that we get the lwpsinfo_t structure
	 * more cheaply.
	 */
	if (lsp == NULL)
		return (0);

	if (P->status.pr_dmodel == PR_MODEL_NATIVE) {
		prstatus_t prstatus;
		mkprstatus(P, lsp, lip, &prstatus);
		if (write_note(pgc->pgc_fd, NT_PRSTATUS, &prstatus,
		    sizeof (prstatus_t), pgc->pgc_doff) != 0)
			return (0);
		if (write_note(pgc->pgc_fd, NT_PRFPREG, &lsp->pr_fpreg,
		    sizeof (prfpregset_t), pgc->pgc_doff) != 0)
			return (1);
#ifdef _LP64
	} else {
		prstatus32_t pr32;
		prfpregset32_t pf32;
		mkprstatus32(P, lsp, lip, &pr32);
		if (write_note(pgc->pgc_fd, NT_PRSTATUS, &pr32,
		    sizeof (prstatus32_t), pgc->pgc_doff) != 0)
			return (1);
		prfpregset_n_to_32(&lsp->pr_fpreg, &pf32);
		if (write_note(pgc->pgc_fd, NT_PRFPREG, &pf32,
		    sizeof (prfpregset32_t), pgc->pgc_doff) != 0)
			return (1);
#endif	/* _LP64 */
	}

#ifdef sparc
	{
		prxregset_t xregs;
		if (Plwp_getxregs(P, lsp->pr_lwpid, &xregs) == 0 &&
		    write_note(pgc->pgc_fd, NT_PRXREG, &xregs,
		    sizeof (prxregset_t), pgc->pgc_doff) != 0)
			return (1);
	}
#endif	/* sparc */

	return (0);
}
示例#3
0
static int
lwplook(look_arg_t *arg, const lwpstatus_t *psp, const lwpsinfo_t *pip)
{
	int flags;
	uint32_t sighold, sighold1, sighold2;
	uint32_t sigpend, sigpend1, sigpend2;
	int cursig;
	char buf[32];

	if (!proc_lwp_in_set(arg->lwps, pip->pr_lwpid))
		return (0);

	arg->count++;

	if (psp == NULL)
		return (lwplook_zombie(pip));

	/*
	 * PR_PCINVAL is just noise if the lwp is not stopped.
	 * Don't bother reporting it unless the lwp is stopped.
	 */
	flags = psp->pr_flags & LWPFLAGS;
	if (!(flags & PR_STOPPED))
		flags &= ~PR_PCINVAL;

	(void) printf(" /%d:\tflags = %s", (int)psp->pr_lwpid, prflags(flags));
	if ((flags & PR_ASLEEP) || (psp->pr_syscall &&
	    !(arg->pflags & PR_ISSYS))) {
		if (flags & PR_ASLEEP) {
			if ((flags & ~PR_ASLEEP) != 0)
				(void) printf("|");
			(void) printf("ASLEEP");
		}
		if (psp->pr_syscall && !(arg->pflags & PR_ISSYS)) {
			uint_t i;

			(void) printf("  %s(",
			    proc_sysname(psp->pr_syscall, buf, sizeof (buf)));
			for (i = 0; i < psp->pr_nsysarg; i++) {
				if (i != 0)
					(void) printf(",");
				(void) printf("0x%lx", psp->pr_sysarg[i]);
			}
			(void) printf(")");
		}
	}
	(void) printf("\n");

	if (flags & PR_STOPPED) {
		(void) printf("\twhy = %s", prwhy(psp->pr_why));
		if (psp->pr_why != PR_REQUESTED &&
		    psp->pr_why != PR_SUSPENDED)
			(void) printf("  what = %s",
			    prwhat(psp->pr_why, psp->pr_what));
		(void) printf("\n");
	}

#if (MAXSIG > 2 * 32) && (MAXSIG <= 3 * 32)	/* assumption */
	sighold  = *((uint32_t *)&psp->pr_lwphold);
	sighold1 = *((uint32_t *)&psp->pr_lwphold + 1);
	sighold2 = *((uint32_t *)&psp->pr_lwphold + 2);
	sigpend  = *((uint32_t *)&psp->pr_lwppend);
	sigpend1 = *((uint32_t *)&psp->pr_lwppend + 1);
	sigpend2 = *((uint32_t *)&psp->pr_lwppend + 2);
#else
#error "fix me: MAXSIG out of bounds"
#endif
	cursig   = psp->pr_cursig;

	if (sighold | sighold1 | sighold2)
		(void) printf("\tsigmask = 0x%.8x,0x%.8x,0x%.8x\n",
		    sighold, sighold1, sighold2);
	if (sigpend | sigpend1 | sigpend2)
		(void) printf("\tlwppend = 0x%.8x,0x%.8x,0x%.8x\n",
		    sigpend, sigpend1, sigpend2);
	if (cursig)
		(void) printf("\tcursig = %s\n",
		    proc_signame(cursig, buf, sizeof (buf)));

	if (rflag) {
		if (Pstate(Pr) == PS_DEAD || (arg->pflags & PR_STOPPED)) {
#if defined(__sparc) && defined(_ILP32)
			/*
			 * If we're SPARC/32-bit, see if we can get extra
			 * register state for this lwp.  If it's a v8plus
			 * program, print the 64-bit register values.
			 */
			prxregset_t prx;

			if (Plwp_getxregs(Pr, psp->pr_lwpid, &prx) == 0 &&
			    prx.pr_type == XR_TYPE_V8P)
				dumpregs_v8p(psp->pr_reg, &prx, is64);
			else
#endif	/* __sparc && _ILP32 */
				dumpregs(psp->pr_reg, is64);
		} else
			(void) printf("\tNot stopped, can't show registers\n");
	}

	return (0);
}
示例#4
0
static int
new_per_lwp(void *data, const lwpstatus_t *lsp, const lwpsinfo_t *lip)
{
	pgcore_t *pgc = data;
	struct ps_prochandle *P = pgc->P;
	psinfo_t ps;

	/*
	 * If lsp is NULL this indicates that this is a zombie LWP in
	 * which case we dump only the lwpsinfo_t structure and none of
	 * the other ancillary LWP state data.
	 */
	if (P->status.pr_dmodel == PR_MODEL_NATIVE) {
		if (write_note(pgc->pgc_fd, NT_LWPSINFO, lip,
		    sizeof (lwpsinfo_t), pgc->pgc_doff) != 0)
			return (1);
		if (lsp == NULL)
			return (0);
		if (write_note(pgc->pgc_fd, NT_LWPSTATUS, lsp,
		    sizeof (lwpstatus_t), pgc->pgc_doff) != 0)
			return (1);
#ifdef _LP64
	} else {
		lwpsinfo32_t li32;
		lwpstatus32_t ls32;
		lwpsinfo_n_to_32(lip, &li32);
		if (write_note(pgc->pgc_fd, NT_LWPSINFO, &li32,
		    sizeof (lwpsinfo32_t), pgc->pgc_doff) != 0)
			return (1);
		if (lsp == NULL)
			return (0);
		lwpstatus_n_to_32(lsp, &ls32);
		if (write_note(pgc->pgc_fd, NT_LWPSTATUS, &ls32,
		    sizeof (lwpstatus32_t), pgc->pgc_doff) != 0)
			return (1);
#endif	/* _LP64 */
	}

#ifdef sparc
	{
		prxregset_t xregs;
		gwindows_t gwins;
		size_t size;

		if (Plwp_getxregs(P, lsp->pr_lwpid, &xregs) == 0) {
			if (write_note(pgc->pgc_fd, NT_PRXREG, &xregs,
			    sizeof (prxregset_t), pgc->pgc_doff) != 0)
				return (1);
		}

		if (Plwp_getgwindows(P, lsp->pr_lwpid, &gwins) == 0 &&
		    gwins.wbcnt > 0) {
			size = sizeof (gwins) - sizeof (gwins.wbuf) +
			    gwins.wbcnt * sizeof (gwins.wbuf[0]);

			if (write_note(pgc->pgc_fd, NT_GWINDOWS, &gwins, size,
			    pgc->pgc_doff) != 0)
				return (1);
		}

	}
#ifdef __sparcv9
	if (P->status.pr_dmodel == PR_MODEL_LP64) {
		asrset_t asrs;
		if (Plwp_getasrs(P, lsp->pr_lwpid, asrs) == 0) {
			if (write_note(pgc->pgc_fd, NT_ASRS, &asrs,
			    sizeof (asrset_t), pgc->pgc_doff) != 0)
				return (1);
		}
	}
#endif	/* __sparcv9 */
#endif	/* sparc */

	if (!(lsp->pr_flags & PR_AGENT))
		return (0);

	if (Plwp_getspymaster(P, lsp->pr_lwpid, &ps) != 0)
		return (0);

	if (P->status.pr_dmodel == PR_MODEL_NATIVE) {
		if (write_note(pgc->pgc_fd, NT_SPYMASTER, &ps,
		    sizeof (psinfo_t), pgc->pgc_doff) != 0)
			return (1);
#ifdef _LP64
	} else {
		psinfo32_t ps32;
		psinfo_n_to_32(&ps, &ps32);
		if (write_note(pgc->pgc_fd, NT_SPYMASTER, &ps32,
		    sizeof (psinfo32_t), pgc->pgc_doff) != 0)
			return (1);
#endif	/* _LP64 */
	}


	return (0);
}