/* ARGSUSED */ static int lwpstop(int *lwpcount, const lwpstatus_t *status, const lwpsinfo_t *info) { struct ps_lwphandle *L; int gcode; if (proc_lwp_in_set(lwps, info->pr_lwpid)) { /* * There is a race between the callback from the iterator and * grabbing of the lwp. If the lwp has already exited, Lgrab * will return the error code G_NOPROC. It's not a real error, * only if there is no lwp matching the specification. */ if ((L = Lgrab(P, info->pr_lwpid, &gcode)) != NULL) { (void) Ldstop(L); Lfree(L); if (*lwpcount >= 0) (*lwpcount)++; } else if (gcode != G_NOPROC) { (void) fprintf(stderr, "%s: cannot control %d/%d: %s\n", command, (int)Pstatus(P)->pr_pid, (int)info->pr_lwpid, Lgrab_error(gcode)); *lwpcount = -1; } } 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); }