Annotation of 3BSD/cmd/pstat.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Print system stuff
                      3:  */
                      4: 
                      5: #define mask(x) (x&0377)
                      6: #define        clear(x) ((int)x&0x7fffffff)
                      7: 
                      8: #include <sys/param.h>
                      9: #include <sys/dir.h>
                     10: #include <sys/file.h>
                     11: #include <sys/user.h>
                     12: #include <sys/proc.h>
                     13: #include <sys/text.h>
                     14: #include <sys/inode.h>
                     15: #include <sys/map.h>
                     16: #include <sys/tty.h>
                     17: #include <sys/conf.h>
                     18: #include <sys/vm.h>
                     19: 
                     20: char   *fcore  = "/dev/kmem";
                     21: char   *fnlist = "/vmunix";
                     22: int    fc;
                     23: 
                     24: struct setup {
                     25:        char    name[8];
                     26:        int     type;
                     27:        unsigned        value;
                     28: } setup[] = {
                     29: #define        SINODE  0
                     30:        "_inode", 0, 0,
                     31: #define        STEXT   1
                     32:        "_text", 0, 0,
                     33: #define        SPROC   2
                     34:        "_proc", 0, 0,
                     35: #define        SDZ     3
                     36:        "_dz_tty", 0, 0,
                     37: #define        SNDZ    4
                     38:        "_dz_cnt", 0, 0,
                     39: #define        SKL     5
                     40:        "_cons", 0, 0,
                     41: #define        SFIL    6
                     42:        "_file", 0, 0,
                     43: #define        SMPXC   7
                     44:        "_mpx_cha", 0, 0,
                     45: #define        SMPXM   8
                     46:        "_mpx_mac", 0, 0,
                     47: #define        SMPXB1  9
                     48:        "_mptbc", 0, 0,
                     49: #define        SMPXB2  10
                     50:        "_mptbuf", 0, 0,
                     51: #define        SMPSM   11
                     52:        "_mpsm", 0, 0,
                     53:        0,
                     54: };
                     55: 
                     56: int    inof;
                     57: int    txtf;
                     58: int    prcf;
                     59: int    ttyf;
                     60: int    mpxf;
                     61: int    usrf;
                     62: long   ubase;
                     63: int    filf;
                     64: char   partab[1];
                     65: struct cdevsw  cdevsw[1];
                     66: struct bdevsw  bdevsw[1];
                     67: int    allflg;
                     68: int    kflg;
                     69: 
                     70: main(argc, argv)
                     71: char **argv;
                     72: {
                     73:        register char *argp;
                     74: 
                     75:        argc--, argv++;
                     76:        while (argc > 0 && **argv == '-') {
                     77:                argp = *argv++;
                     78:                argp++;
                     79:                argc--;
                     80:                while (*argp++)
                     81:                switch (argp[-1]) {
                     82: 
                     83:                case 'a':
                     84:                        allflg++;
                     85:                        break;
                     86: 
                     87:                case 'i':
                     88:                        inof++;
                     89:                        break;
                     90: 
                     91:                case 'k':
                     92:                        kflg++;
                     93:                        fcore = "/vmcore";
                     94:                        break;
                     95: 
                     96:                case 'x':
                     97:                        txtf++;
                     98:                        break;
                     99:                case 'p':
                    100:                        prcf++;
                    101:                        break;
                    102: 
                    103:                case 't':
                    104:                        ttyf++;
                    105:                        break;
                    106: 
                    107:                case 'm':
                    108:                        mpxf++;
                    109:                        break;
                    110: 
                    111:                case 'u':
                    112:                        if (argc == 0)
                    113:                                break;
                    114:                        argc--;
                    115:                        usrf++;
                    116:                        sscanf( *argv++, "%x", &ubase);
                    117:                        break;
                    118: 
                    119:                case 'f':
                    120:                        filf++;
                    121:                        break;
                    122:                }
                    123:        }
                    124:        if (argc>0)
                    125:                fcore = argv[0];
                    126:        if ((fc = open(fcore, 0)) < 0) {
                    127:                printf("Can't find %s\n", fcore);
                    128:                exit(1);
                    129:        }
                    130:        if (argc>1)
                    131:                fnlist = argv[1];
                    132:        nlist(fnlist, setup);
                    133:        if (kflg) {
                    134:                register struct setup *sp;
                    135:                for (sp=setup; sp->value; sp++)
                    136:                        sp->value &= 0x7fffffff;
                    137:        }
                    138:        if (setup[SINODE].type == -1) {
                    139:                printf("no namelist\n");
                    140:                exit(1);
                    141:        }
                    142:        if (inof)
                    143:                doinode();
                    144:        if (txtf)
                    145:                dotext();
                    146:        if (ttyf)
                    147:                dotty();
                    148:        if (prcf)
                    149:                doproc();
                    150:        if (usrf)
                    151:                dousr();
                    152:        if (filf)
                    153:                dofil();
                    154: /*
                    155:        if(mpxf)
                    156:                dompx();
                    157: */
                    158: }
                    159: 
                    160: doinode()
                    161: {
                    162:        register struct inode *ip;
                    163:        struct inode xinode[NINODE];
                    164:        register int nin, loc;
                    165: 
                    166:        nin = 0;
                    167:        lseek(fc, (long)setup[SINODE].value, 0);
                    168:        read(fc, xinode, sizeof(xinode));
                    169:        for (ip = xinode; ip < &xinode[NINODE]; ip++)
                    170:                if (ip->i_count)
                    171:                        nin++;
                    172:        printf("%d active xinodes\n", nin);
                    173:        printf("   LOC    FLAGS  CNT DEVICE  INO  MODE  NLK UID   SIZE/DEV\n");
                    174:        loc = setup[SINODE].value;
                    175:        for (ip = xinode; ip < &xinode[NINODE]; ip++, loc += sizeof(xinode[0])) {
                    176:                if (ip->i_count == 0)
                    177:                        continue;
                    178:                printf("%8.1x ", loc);
                    179:                putf(ip->i_flag&ILOCK, 'L');
                    180:                putf(ip->i_flag&IUPD, 'U');
                    181:                putf(ip->i_flag&IACC, 'A');
                    182:                putf(ip->i_flag&IMOUNT, 'M');
                    183:                putf(ip->i_flag&IWANT, 'W');
                    184:                putf(ip->i_flag&ITEXT, 'T');
                    185:                printf("%4d", ip->i_count&0377);
                    186:                printf("%4d,%3d", major(ip->i_dev), minor(ip->i_dev));
                    187:                printf("%5l", ip->i_number);
                    188:                printf("%6x", ip->i_mode & 0xffff);
                    189:                printf("%4d", ip->i_nlink);
                    190:                printf("%4d", ip->i_uid);
                    191:                if ((ip->i_mode&IFMT)==IFBLK || (ip->i_mode&IFMT)==IFCHR)
                    192:                        printf("%6d,%3d", major(ip->i_un.i_rdev), minor(ip->i_un.i_rdev));
                    193:                else
                    194:                        printf("%10ld", ip->i_size);
                    195:                printf("\n");
                    196:        }
                    197: }
                    198: 
                    199: putf(v, n)
                    200: {
                    201:        if (v)
                    202:                printf("%c", n);
                    203:        else
                    204:                printf(" ");
                    205: }
                    206: 
                    207: dotext()
                    208: {
                    209:        register struct text *xp;
                    210:        struct text xtext[NTEXT];
                    211:        register loc;
                    212:        int ntx;
                    213: 
                    214:        ntx = 0;
                    215:        lseek(fc, (long)setup[STEXT].value, 0);
                    216:        read(fc, xtext, sizeof(xtext));
                    217:        for (xp = xtext; xp < &xtext[NTEXT]; xp++)
                    218:                if (xp->x_iptr!=NULL)
                    219:                        ntx++;
                    220:        printf("%d text segments\n", ntx);
                    221:        printf("   LOC   FLAGS  DADDR   CADDR  RSS   SIZE   IPTR    CNT CCNT\n");
                    222:        loc = setup[STEXT].value;
                    223:        for (xp = xtext; xp < &xtext[NTEXT]; xp++, loc+=sizeof(xtext[0])) {
                    224:                if (xp->x_iptr == NULL)
                    225:                        continue;
                    226:                printf("%8.1x", loc);
                    227:                printf(" ");
                    228:                putf(xp->x_flag&XPAGI, 'P');
                    229:                putf(xp->x_flag&XTRC, 'T');
                    230:                putf(xp->x_flag&XWRIT, 'W');
                    231:                putf(xp->x_flag&XLOAD, 'L');
                    232:                putf(xp->x_flag&XLOCK, 'K');
                    233:                putf(xp->x_flag&XWANT, 'w');
                    234:                printf("%5x", xp->x_daddr);
                    235:                printf("%11x", xp->x_caddr);
                    236:                printf("%5d", xp->x_rssize);
                    237:                printf("%5d", xp->x_size);
                    238:                printf("%10.1x", xp->x_iptr);
                    239:                printf("%5d", xp->x_count&0377);
                    240:                printf("%4d", xp->x_ccount);
                    241:                printf("\n");
                    242:        }
                    243: }
                    244: 
                    245: doproc()
                    246: {
                    247:        struct proc xproc[NPROC];
                    248:        register struct proc *pp;
                    249:        register loc, np;
                    250: 
                    251:        lseek(fc, (long)setup[SPROC].value, 0);
                    252:        read(fc, xproc, sizeof(xproc));
                    253:        np = 0;
                    254:        for (pp=xproc; pp < &xproc[NPROC]; pp++)
                    255:                if (pp->p_stat)
                    256:                        np++;
                    257:        printf("%d processes\n", np);
                    258:        printf("   LOC    S    F POIP PRI SIG  UID  SLP TIM  CPU  NI    PGRP   PID   PPID    ADDR   RSS  SRSS SIZE   WCHAN    LINK   TEXTP CLKT\n");
                    259:        for (loc=setup[SPROC].value,pp=xproc; pp<&xproc[NPROC]; pp++,loc+=sizeof(xproc[0])) {
                    260:                if (pp->p_stat==0 && allflg==0)
                    261:                        continue;
                    262:                printf("%8x", loc);
                    263:                printf(" %2d", pp->p_stat);
                    264:                printf(" %4x", pp->p_flag & 0xffff);
                    265:                printf(" %4d", pp->p_poip);
                    266:                printf(" %3d", pp->p_pri);
                    267:                printf(" %4x", pp->p_sig);
                    268:                printf(" %4d", pp->p_uid);
                    269:                printf(" %3d", pp->p_slptime);
                    270:                printf(" %3d", pp->p_time);
                    271:                printf(" %4d", pp->p_cpu&0377);
                    272:                printf(" %3d", pp->p_nice);
                    273:                printf(" %6d", pp->p_pgrp);
                    274:                printf(" %6d", pp->p_pid);
                    275:                printf(" %6d", pp->p_ppid);
                    276:                printf(" %8x", pp->p_addr[0]);
                    277:                printf(" %4x", pp->p_rssize);
                    278:                printf(" %4x", pp->p_swrss);
                    279:                printf(" %5x", pp->p_dsize+pp->p_ssize);
                    280:                printf(" %7x", clear(pp->p_wchan));
                    281:                printf(" %7x", clear(pp->p_link));
                    282:                printf(" %7x", clear(pp->p_textp));
                    283:                printf("    %u", pp->p_clktim);
                    284:                printf("\n");
                    285:        }
                    286: }
                    287: 
                    288: dotty()
                    289: {
                    290:        struct tty dz_tty[32];
                    291:        int ndz;
                    292:        register struct tty *tp;
                    293:        register char *mesg;
                    294: 
                    295:        printf("1 cons\n");
                    296:        lseek(fc, (long)setup[SKL].value, 0);
                    297:        read(fc, dz_tty, sizeof(dz_tty[0]));
                    298:        mesg = " RAW CAN OUT   MODE    ADDR   DEL COL  STATE   PGRP\n";
                    299:        printf(mesg);
                    300:        ttyprt(&dz_tty[0]);
                    301:        if (setup[SNDZ].type == -1)
                    302:                return;
                    303:        lseek(fc, (long)setup[SNDZ].value, 0);
                    304:        read(fc, &ndz, sizeof(ndz));
                    305:        printf("%d dz lines\n", ndz);
                    306:        lseek(fc, (long)setup[SDZ].value, 0);
                    307:        read(fc, dz_tty, sizeof(dz_tty));
                    308:        for (tp = dz_tty; tp < &dz_tty[ndz]; tp++)
                    309:                ttyprt(tp);
                    310: }
                    311: 
                    312: ttyprt(atp)
                    313: struct tty *atp;
                    314: {
                    315:        register struct tty *tp;
                    316: 
                    317:        tp = atp;
                    318:        printf("%4d", tp->t_rawq.c_cc);
                    319:        printf("%4d", tp->t_canq.c_cc);
                    320:        printf("%4d", tp->t_outq.c_cc);
                    321:        printf("%8.1o", tp->t_flags);
                    322:        printf(" %8.1x", tp->t_addr);
                    323:        printf("%3d", tp->t_delct);
                    324:        printf("%4d ", tp->t_col);
                    325:        putf(tp->t_state&TIMEOUT, 'T');
                    326:        putf(tp->t_state&WOPEN, 'W');
                    327:        putf(tp->t_state&ISOPEN, 'O');
                    328:        putf(tp->t_state&CARR_ON, 'C');
                    329:        putf(tp->t_state&BUSY, 'B');
                    330:        putf(tp->t_state&ASLEEP, 'A');
                    331:        putf(tp->t_state&XCLUDE, 'X');
                    332: /*
                    333:        putf(tp->t_state&HUPCLS, 'H');
                    334:  */
                    335:        printf("%6d", tp->t_pgrp);
                    336:        printf("\n");
                    337: }
                    338: 
                    339: dousr()
                    340: {
                    341:        struct user U;
                    342:        register i, j, *ip;
                    343: 
                    344:        /* This wins only if PAGSIZ > sizeof (struct user) */
                    345:        lseek(fc, ubase * NBPG, 0);
                    346:        read(fc, &U, sizeof(U));
                    347: /*
                    348:        printf("rsav %.1o %.1o\n", U.u_rsav[0], U.u_rsav[1]);
                    349:  */
                    350:        printf("segflg, error %d, %d\n", U.u_segflg, U.u_error);
                    351:        printf("uids %d,%d,%d,%d\n", U.u_uid,U.u_gid,U.u_ruid,U.u_rgid);
                    352:        printf("procp %.1x\n", U.u_procp);
                    353:        printf("base, count, offset %.1x %.1x %ld\n", U.u_base,
                    354:                U.u_count, U.u_offset);
                    355:        printf("cdir %.1x\n", U.u_cdir);
                    356:        printf("dbuf %.14s\n", U.u_dbuf);
                    357:        printf("dirp %.1x\n", U.u_dirp);
                    358:        printf("dent %d %.14s\n", U.u_dent.d_ino, U.u_dent.d_name);
                    359:        printf("pdir %.1o\n", U.u_pdir);
                    360: /*
                    361:        printf("dseg");
                    362:        for (i=0; i<8; i++)
                    363:                printf("%8.1o", U.u_uisa[i]);
                    364:        printf("\n    ");
                    365:        for (i=0; i<8; i++)
                    366:                printf("%8.1o", U.u_uisd[i]);
                    367:        if (U.u_sep) {
                    368:                printf("\ntseg");
                    369:                for (i=8; i<16; i++)
                    370:                        printf("%8.1o", U.u_uisa[i]);
                    371:                printf("\n    ");
                    372:                for (i=8; i<16; i++)
                    373:                        printf("%8.1o", U.u_uisd[i]);
                    374:        }
                    375:  */
                    376:        printf("\nfile");
                    377:        for (i=0; i<10; i++)
                    378:                printf("%9.1x", U.u_ofile[i]);
                    379:        printf("\n    ");
                    380:        for (i=10; i<NOFILE; i++)
                    381:                printf("%9.1x", U.u_ofile[i]);
                    382:        printf("\nargs");
                    383:        for (i=0; i<5; i++)
                    384:                printf(" %.1x", U.u_arg[i]);
                    385:        printf("\nsizes %.1x %.1x %.1x\n", U.u_tsize, U.u_dsize, U.u_ssize);
                    386:        printf("sep %d\n", U.u_sep);
                    387:        printf("qsav %.1x %.1x\n", U.u_qsav[0], U.u_qsav[1]);
                    388:        printf("ssav %.1x %.1x\n", U.u_ssav[0], U.u_ssav[1]);
                    389:        printf("sigs");
                    390:        for (i=0; i<NSIG; i++)
                    391:                printf(" %.1x", U.u_signal[i]);
                    392:        printf("\ntimes %ld %ld\n", U.u_utime/60, U.u_stime/60);
                    393:        printf("ctimes %ld %ld\n", U.u_cutime/60, U.u_cstime/60);
                    394:        printf("ar0 %.1x\n", U.u_ar0);
                    395: /*
                    396:        printf("prof");
                    397:        for (i=0; i<4; i++)
                    398:                printf(" %.1o", U.u_prof[i]);
                    399: */
                    400:        printf("\nintflg %d\n", U.u_intflg);
                    401:        printf("ttyp %.1x\n", U.u_ttyp);
                    402:        printf("ttydev %d,%d\n", major(U.u_ttyd), minor(U.u_ttyd));
                    403:        printf("comm %.14s\n", U.u_comm);
                    404: /*
                    405:        i =  U.u_stack - &U;
                    406:        while (U[++i] == 0);
                    407:        i &= ~07;
                    408:        while (i < 512) {
                    409:                printf("%x ", 0140000+2*i);
                    410:                for (j=0; j<8; j++)
                    411:                        printf("%9x", U[i++]);
                    412:                printf("\n");
                    413:        }
                    414: */
                    415: }
                    416: 
                    417: oatoi(s)
                    418: char *s;
                    419: {
                    420:        register v;
                    421: 
                    422:        v = 0;
                    423:        while (*s)
                    424:                v = (v<<3) + *s++ - '0';
                    425:        return(v);
                    426: }
                    427: 
                    428: dofil()
                    429: {
                    430:        struct file xfile[NFILE];
                    431:        register struct file *fp;
                    432:        register nf;
                    433:        int loc;
                    434: 
                    435:        nf = 0;
                    436:        lseek(fc, (long)setup[SFIL].value, 0);
                    437:        read(fc, xfile, sizeof(xfile));
                    438:        for (fp=xfile; fp < &xfile[NFILE]; fp++)
                    439:                if (fp->f_count)
                    440:                        nf++;
                    441:        printf("%d open files\n", nf);
                    442:        printf("   LOC   FLG  CNT   INO    OFFS\n");
                    443:        for (fp=xfile,loc=setup[SFIL].value; fp < &xfile[NFILE]; fp++,loc+=sizeof(xfile[0])) {
                    444:                if (fp->f_count==0)
                    445:                        continue;
                    446:                printf("%8x ", loc);
                    447:                putf(fp->f_flag&FREAD, 'R');
                    448:                putf(fp->f_flag&FWRITE, 'W');
                    449:                putf(fp->f_flag&FPIPE, 'P');
                    450:                printf("%4d", mask(fp->f_count));
                    451:                printf("%9.1x", fp->f_inode);
                    452:                printf("  %ld\n", fp->f_un.f_offset);
                    453:        }
                    454: }
                    455: 
                    456: /*********
                    457: #include <sys/mpx.h>
                    458: dompx()
                    459: {
                    460:        struct chan chan[C];
                    461:        struct mach mach[M];
                    462:        struct line line[M-1];
                    463:        int mptbc;
                    464:        char mptbuf[TBSIZ];
                    465:        register struct chan *cp;
                    466:        register struct mach *mp;
                    467:        register struct line *lp;
                    468:        int loc, nc;
                    469: 
                    470:        lseek(fc, (long)setup[SMPXC].value, 0);
                    471:        read(fc, chan, sizeof(chan));
                    472:        lseek(fc, (long)setup[SMPXM].value, 0);
                    473:        read(fc, mach, sizeof(mach));
                    474:        lseek(fc, (long)setup[SMPXB1].value, 0);
                    475:        read(fc, &mptbc, sizeof(mptbc));
                    476:        lseek(fc, (long)setup[SMPXB2].value, 0);
                    477:        read(fc, mptbuf, sizeof(mptbuf));
                    478:        lseek(fc, (long)setup[SMPSM].value, 0);
                    479:        read(fc, line, sizeof(line));
                    480:        nc = 0;
                    481:        for(cp=chan; cp < &chan[C]; cp++)
                    482:                if(cp->cflag&ALLOC)
                    483:                        nc++;
                    484:        printf("%d mpx channels\n", nc);
                    485:        printf("   LOC      FLG M   C    DEST\n");
                    486:        for(cp=chan,loc=setup[SMPXC].value; cp < &chan[C]; cp++,loc=+sizeof(chan[0])) {
                    487:                if((cp->cflag&ALLOC) == 0)
                    488:                        continue;
                    489:                printf("%7.1o ", loc);
                    490:                putf(cp->cflag&BLOCK, 'B');
                    491:                putf(cp->cflag&WWAIT, 'B');
                    492:                putf(cp->cflag&CRUN, 'R');
                    493:                putf(cp->cflag&RWAIT, 'W');
                    494:                putf(cp->cflag&ALLOC, 'A');
                    495:                putf(cp->cflag&DIS, 'D');
                    496:                putf(cp->cflag&DLY, 'D');
                    497:                printf(" %1d %3d ", mask(cp->m), mask(cp->c));
                    498:                printf("%7.1o ", cp->dest);
                    499:                printf("\n");
                    500:        }
                    501: 
                    502:        printf("%d mpx machines\n", M);
                    503:        printf("   LOC  FLG RCH RCN XCH XCN\n");
                    504:        for(mp=mach,loc=setup[SMPXM].value; mp < &mach[M]; mp++,loc=+sizeof(mach[0])) {
                    505:                printf("%7.1o ", loc);
                    506:                putf(mp->mflag&RNEXT, 'N');
                    507:                putf(mp->mflag&MRUN, 'R');
                    508:                putf(mp->mflag&XNEXT, 'N');
                    509:                printf(" %3d", mask(mp->rchan));
                    510:                printf(" %3d", mask(mp->rcount));
                    511:                printf(" %3d", mask(mp->xchan));
                    512:                printf(" %3d", mask(mp->xcount));
                    513:                for(nc=0; nc<128; nc++) {
                    514:                        cp = mp->chanp[nc];
                    515:                        if(cp == 0)
                    516:                                continue;
                    517:                        printf(" %d-%o", nc, cp);
                    518:                }
                    519:                printf("\n");
                    520:        }
                    521:        printf("%d mpx lines\n", M-1);
                    522:        printf("   LOC  RSQ XSQ AKF XMF STE TIM SUM\n");
                    523:        for(lp=line,loc=setup[SMPSM].value; lp < &line[M-1]; lp++, loc =+ sizeof(line[0])) {
                    524:                printf("%7.1o ", loc);
                    525:                printf("%3o ", lp->rseq);
                    526:                printf("%3o ", lp->xseq);
                    527:                printf("%3o ", lp->ackf);
                    528:                printf("%3o ", lp->xflag);
                    529:                printf("%3d ", lp->state);
                    530:                printf("%3d ", lp->time);
                    531:                printf("%7o\n", lp->sum);
                    532:        }
                    533:        printf("last characters recieved\n");
                    534:        nc = -1;
                    535:        loc = mptbc;
                    536:        for(;;) {
                    537:                if(nc != mptbuf[loc]) {
                    538:                        if(nc >= 0)
                    539:                                printf(")\n");
                    540:                        nc = mptbuf[loc];
                    541:                        printf("%d(", nc);
                    542:                } else
                    543:                        printf(",");
                    544:                loc++;
                    545:                if(loc >= TBSIZ)
                    546:                        loc = 0;
                    547:                if(loc == mptbc)
                    548:                        break;
                    549:                printf("%o", mask(mptbuf[loc]));
                    550:                loc++;
                    551:                if(loc >= TBSIZ)
                    552:                        loc = 0;
                    553:                if(loc == mptbc)
                    554:                        break;
                    555:        }
                    556:        printf(")\n");
                    557: }
                    558: *********/

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.