36 #include <fcntl.h>
37 #include <strings.h>
38 #include <dirent.h>
39 #include <errno.h>
40 #include <sys/types.h>
41 #include <sys/int_fmtio.h>
42 #include <libproc.h>
43
44 typedef struct look_arg {
45 int pflags;
46 const char *lwps;
47 int count;
48 } look_arg_t;
49
50 static int look(char *);
51 static int lwplook(look_arg_t *, const lwpstatus_t *, const lwpsinfo_t *);
52 static char *prflags(int);
53 static char *prwhy(int);
54 static char *prwhat(int, int);
55 static void dumpregs(const prgregset_t, int);
56 #if defined(__sparc) && defined(_ILP32)
57 static void dumpregs_v8p(const prgregset_t, const prxregset_t *, int);
58 #endif
59
60 static char *command;
61 static struct ps_prochandle *Pr;
62
63 static int is64; /* Is current process 64-bit? */
64 static int rflag; /* Show registers? */
65
66 #define LWPFLAGS \
67 (PR_STOPPED|PR_ISTOP|PR_DSTOP|PR_ASLEEP|PR_PCINVAL|PR_STEP \
68 |PR_AGENT|PR_DETACH|PR_DAEMON)
69
70 #define PROCFLAGS \
71 (PR_ISSYS|PR_VFORKP|PR_ORPHAN|PR_NOSIGCHLD|PR_WAITPID \
72 |PR_FORK|PR_RLC|PR_KLC|PR_ASYNC|PR_BPTADJ|PR_MSACCT|PR_MSFORK|PR_PTRACE)
73
74 #define ALLFLAGS (LWPFLAGS|PROCFLAGS)
75
76 int
77 main(int argc, char **argv)
78 {
332 if (sigpend | sigpend1 | sigpend2)
333 (void) printf("\tlwppend = 0x%.8x,0x%.8x,0x%.8x\n",
334 sigpend, sigpend1, sigpend2);
335 if (cursig)
336 (void) printf("\tcursig = %s\n",
337 proc_signame(cursig, buf, sizeof (buf)));
338
339 if ((flags & PR_AGENT) &&
340 Plwp_getspymaster(Pr, pip->pr_lwpid, &ps) == 0) {
341 time_t time = ps.pr_time.tv_sec;
342 char t[64];
343
344 (void) strftime(t, sizeof (t), "%F:%H.%M.%S", localtime(&time));
345
346 (void) printf("\tspymaster = pid %d, \"%s\" at %s\n",
347 (int)ps.pr_pid, ps.pr_psargs, t);
348 }
349
350 if (rflag) {
351 if (Pstate(Pr) == PS_DEAD || (arg->pflags & PR_STOPPED)) {
352 #if defined(__sparc) && defined(_ILP32)
353 /*
354 * If we're SPARC/32-bit, see if we can get extra
355 * register state for this lwp. If it's a v8plus
356 * program, print the 64-bit register values.
357 */
358 prxregset_t prx;
359
360 if (Plwp_getxregs(Pr, psp->pr_lwpid, &prx) == 0 &&
361 prx.pr_type == XR_TYPE_V8P)
362 dumpregs_v8p(psp->pr_reg, &prx, is64);
363 else
364 #endif /* __sparc && _ILP32 */
365 dumpregs(psp->pr_reg, is64);
366 } else
367 (void) printf("\tNot stopped, can't show registers\n");
368 }
369
370 return (0);
371 }
372
373 static char *
374 prflags(int arg)
375 {
376 static char code_buf[200];
377 char *str = code_buf;
378
379 if (arg == 0)
380 return ("0");
381
382 if (arg & ~ALLFLAGS)
383 (void) sprintf(str, "0x%x", arg & ~ALLFLAGS);
384 else
385 *str = '\0';
386
387 /*
388 * Display the semi-permanent lwp flags first.
490 switch (why) {
491 case PR_SIGNALLED:
492 case PR_JOBCONTROL:
493 str = proc_signame(what, buf, sizeof (buf));
494 break;
495 case PR_SYSENTRY:
496 case PR_SYSEXIT:
497 str = proc_sysname(what, buf, sizeof (buf));
498 break;
499 case PR_FAULTED:
500 str = proc_fltname(what, buf, sizeof (buf));
501 break;
502 default:
503 (void) sprintf(str = buf, "%d", what);
504 break;
505 }
506
507 return (str);
508 }
509
510 #if defined(__sparc)
511 static const char * const regname[NPRGREG] = {
512 " %g0", " %g1", " %g2", " %g3", " %g4", " %g5", " %g6", " %g7",
513 " %o0", " %o1", " %o2", " %o3", " %o4", " %o5", " %sp", " %o7",
514 " %l0", " %l1", " %l2", " %l3", " %l4", " %l5", " %l6", " %l7",
515 " %i0", " %i1", " %i2", " %i3", " %i4", " %i5", " %fp", " %i7",
516 #ifdef __sparcv9
517 "%ccr", " %pc", "%npc", " %y", "%asi", "%fprs"
518 #else
519 "%psr", " %pc", "%npc", " %y", "%wim", "%tbr"
520 #endif
521 };
522 #endif /* __sparc */
523
524 #if defined(__amd64)
525 static const char * const regname[NPRGREG] = {
526 "%r15", "%r14", "%r13", "%r12", "%r11", "%r10", " %r9", " %r8",
527 "%rdi", "%rsi", "%rbp", "%rbx", "%rdx", "%rcx", "%rax", "%trapno",
528 "%err", "%rip", " %cs", "%rfl", "%rsp", " %ss", " %fs", " %gs",
529 " %es", " %ds", "%fsbase", "%gsbase"
530 };
531
532 static const char * const regname32[NPRGREG32] = {
533 " %gs", " %fs", " %es", " %ds", "%edi", "%esi", "%ebp", "%esp",
534 "%ebx", "%edx", "%ecx", "%eax", "%trapno", "%err", "%eip", " %cs",
535 "%efl", "%uesp", " %ss"
536 };
537
538 /* XX64 Do we want to expose this through libproc */
539 void
540 prgregset_n_to_32(const prgreg_t *src, prgreg32_t *dst)
541 {
542 bzero(dst, NPRGREG32 * sizeof (prgreg32_t));
543 dst[GS] = src[REG_GS];
594 int width = is64? 16 : 8;
595 int cols = is64? 2 : 4;
596 int i;
597
598 #if defined(__amd64) && defined(_LP64)
599 if (!is64) {
600 dumpregs32(reg);
601 return;
602 }
603 #endif
604
605 for (i = 0; i < NPRGREG; i++) {
606 (void) printf(" %s = 0x%.*lX",
607 regname[i], width, (long)reg[i]);
608 if ((i+1) % cols == 0)
609 (void) putchar('\n');
610 }
611 if (i % cols != 0)
612 (void) putchar('\n');
613 }
614
615 #if defined(__sparc) && defined(_ILP32)
616 static void
617 dumpregs_v8p(const prgregset_t reg, const prxregset_t *xreg, int is64)
618 {
619 static const uint32_t zero[8] = { 0 };
620 int gr, xr, cols = 2;
621 uint64_t xval;
622
623 if (memcmp(xreg->pr_un.pr_v8p.pr_xg, zero, sizeof (zero)) == 0 &&
624 memcmp(xreg->pr_un.pr_v8p.pr_xo, zero, sizeof (zero)) == 0) {
625 dumpregs(reg, is64);
626 return;
627 }
628
629 for (gr = R_G0, xr = XR_G0; gr <= R_G7; gr++, xr++) {
630 xval = (uint64_t)xreg->pr_un.pr_v8p.pr_xg[xr] << 32 |
631 (uint64_t)(uint32_t)reg[gr];
632 (void) printf(" %s = 0x%.16" PRIX64, regname[gr], xval);
633 if ((gr + 1) % cols == 0)
634 (void) putchar('\n');
635 }
636
637 for (gr = R_O0, xr = XR_O0; gr <= R_O7; gr++, xr++) {
638 xval = (uint64_t)xreg->pr_un.pr_v8p.pr_xo[xr] << 32 |
639 (uint64_t)(uint32_t)reg[gr];
640 (void) printf(" %s = 0x%.16" PRIX64, regname[gr], xval);
641 if ((gr + 1) % cols == 0)
642 (void) putchar('\n');
643 }
644
645 for (gr = R_L0; gr < NPRGREG; gr++) {
646 (void) printf(" %s = 0x%.8lX",
647 regname[gr], (long)reg[gr]);
648 if ((gr + 1) % cols == 0)
649 (void) putchar('\n');
650 }
651
652 if (gr % cols != 0)
653 (void) putchar('\n');
654 }
655 #endif /* __sparc && _ILP32 */
|
36 #include <fcntl.h>
37 #include <strings.h>
38 #include <dirent.h>
39 #include <errno.h>
40 #include <sys/types.h>
41 #include <sys/int_fmtio.h>
42 #include <libproc.h>
43
44 typedef struct look_arg {
45 int pflags;
46 const char *lwps;
47 int count;
48 } look_arg_t;
49
50 static int look(char *);
51 static int lwplook(look_arg_t *, const lwpstatus_t *, const lwpsinfo_t *);
52 static char *prflags(int);
53 static char *prwhy(int);
54 static char *prwhat(int, int);
55 static void dumpregs(const prgregset_t, int);
56
57 static char *command;
58 static struct ps_prochandle *Pr;
59
60 static int is64; /* Is current process 64-bit? */
61 static int rflag; /* Show registers? */
62
63 #define LWPFLAGS \
64 (PR_STOPPED|PR_ISTOP|PR_DSTOP|PR_ASLEEP|PR_PCINVAL|PR_STEP \
65 |PR_AGENT|PR_DETACH|PR_DAEMON)
66
67 #define PROCFLAGS \
68 (PR_ISSYS|PR_VFORKP|PR_ORPHAN|PR_NOSIGCHLD|PR_WAITPID \
69 |PR_FORK|PR_RLC|PR_KLC|PR_ASYNC|PR_BPTADJ|PR_MSACCT|PR_MSFORK|PR_PTRACE)
70
71 #define ALLFLAGS (LWPFLAGS|PROCFLAGS)
72
73 int
74 main(int argc, char **argv)
75 {
329 if (sigpend | sigpend1 | sigpend2)
330 (void) printf("\tlwppend = 0x%.8x,0x%.8x,0x%.8x\n",
331 sigpend, sigpend1, sigpend2);
332 if (cursig)
333 (void) printf("\tcursig = %s\n",
334 proc_signame(cursig, buf, sizeof (buf)));
335
336 if ((flags & PR_AGENT) &&
337 Plwp_getspymaster(Pr, pip->pr_lwpid, &ps) == 0) {
338 time_t time = ps.pr_time.tv_sec;
339 char t[64];
340
341 (void) strftime(t, sizeof (t), "%F:%H.%M.%S", localtime(&time));
342
343 (void) printf("\tspymaster = pid %d, \"%s\" at %s\n",
344 (int)ps.pr_pid, ps.pr_psargs, t);
345 }
346
347 if (rflag) {
348 if (Pstate(Pr) == PS_DEAD || (arg->pflags & PR_STOPPED)) {
349 dumpregs(psp->pr_reg, is64);
350 } else {
351 (void) printf("\tNot stopped, can't show registers\n");
352 }
353 }
354
355 return (0);
356 }
357
358 static char *
359 prflags(int arg)
360 {
361 static char code_buf[200];
362 char *str = code_buf;
363
364 if (arg == 0)
365 return ("0");
366
367 if (arg & ~ALLFLAGS)
368 (void) sprintf(str, "0x%x", arg & ~ALLFLAGS);
369 else
370 *str = '\0';
371
372 /*
373 * Display the semi-permanent lwp flags first.
475 switch (why) {
476 case PR_SIGNALLED:
477 case PR_JOBCONTROL:
478 str = proc_signame(what, buf, sizeof (buf));
479 break;
480 case PR_SYSENTRY:
481 case PR_SYSEXIT:
482 str = proc_sysname(what, buf, sizeof (buf));
483 break;
484 case PR_FAULTED:
485 str = proc_fltname(what, buf, sizeof (buf));
486 break;
487 default:
488 (void) sprintf(str = buf, "%d", what);
489 break;
490 }
491
492 return (str);
493 }
494
495 #if defined(__amd64)
496 static const char * const regname[NPRGREG] = {
497 "%r15", "%r14", "%r13", "%r12", "%r11", "%r10", " %r9", " %r8",
498 "%rdi", "%rsi", "%rbp", "%rbx", "%rdx", "%rcx", "%rax", "%trapno",
499 "%err", "%rip", " %cs", "%rfl", "%rsp", " %ss", " %fs", " %gs",
500 " %es", " %ds", "%fsbase", "%gsbase"
501 };
502
503 static const char * const regname32[NPRGREG32] = {
504 " %gs", " %fs", " %es", " %ds", "%edi", "%esi", "%ebp", "%esp",
505 "%ebx", "%edx", "%ecx", "%eax", "%trapno", "%err", "%eip", " %cs",
506 "%efl", "%uesp", " %ss"
507 };
508
509 /* XX64 Do we want to expose this through libproc */
510 void
511 prgregset_n_to_32(const prgreg_t *src, prgreg32_t *dst)
512 {
513 bzero(dst, NPRGREG32 * sizeof (prgreg32_t));
514 dst[GS] = src[REG_GS];
565 int width = is64? 16 : 8;
566 int cols = is64? 2 : 4;
567 int i;
568
569 #if defined(__amd64) && defined(_LP64)
570 if (!is64) {
571 dumpregs32(reg);
572 return;
573 }
574 #endif
575
576 for (i = 0; i < NPRGREG; i++) {
577 (void) printf(" %s = 0x%.*lX",
578 regname[i], width, (long)reg[i]);
579 if ((i+1) % cols == 0)
580 (void) putchar('\n');
581 }
582 if (i % cols != 0)
583 (void) putchar('\n');
584 }
|