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