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); }
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); }
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); }
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); }