Annotation of 42BSD/etc/pstat.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char *sccsid = "@(#)pstat.c     4.24 (Berkeley) 10/15/83";
        !             3: #endif
        !             4: /*
        !             5:  * Print system stuff
        !             6:  */
        !             7: 
        !             8: #define mask(x) (x&0377)
        !             9: #define        clear(x) ((int)x&0x7fffffff)
        !            10: 
        !            11: #include <sys/param.h>
        !            12: #include <sys/dir.h>
        !            13: #define        KERNEL
        !            14: #include <sys/file.h>
        !            15: #undef KERNEL
        !            16: #include <sys/user.h>
        !            17: #include <sys/proc.h>
        !            18: #include <sys/text.h>
        !            19: #include <sys/inode.h>
        !            20: #include <sys/map.h>
        !            21: #include <sys/ioctl.h>
        !            22: #include <sys/tty.h>
        !            23: #include <sys/conf.h>
        !            24: #include <sys/vm.h>
        !            25: #include <nlist.h>
        !            26: #include <machine/pte.h>
        !            27: 
        !            28: char   *fcore  = "/dev/kmem";
        !            29: char   *fnlist = "/vmunix";
        !            30: int    fc;
        !            31: 
        !            32: struct nlist nl[] = {
        !            33: #define        SINODE  0
        !            34:        { "_inode" },
        !            35: #define        STEXT   1
        !            36:        { "_text" },
        !            37: #define        SPROC   2
        !            38:        { "_proc" },
        !            39: #define        SDZ     3
        !            40:        { "_dz_tty" },
        !            41: #define        SNDZ    4
        !            42:        { "_dz_cnt" },
        !            43: #define        SKL     5
        !            44:        { "_cons" },
        !            45: #define        SFIL    6
        !            46:        { "_file" },
        !            47: #define        USRPTMA 7
        !            48:        { "_Usrptmap" },
        !            49: #define        USRPT   8
        !            50:        { "_usrpt" },
        !            51: #define        SWAPMAP 9
        !            52:        { "_swapmap" },
        !            53: #define        SDH     10
        !            54:        { "_dh11" },
        !            55: #define        SNDH    11
        !            56:        { "_ndh11" },
        !            57: #define        SNPROC  12
        !            58:        { "_nproc" },
        !            59: #define        SNTEXT  13
        !            60:        { "_ntext" },
        !            61: #define        SNFILE  14
        !            62:        { "_nfile" },
        !            63: #define        SNINODE 15
        !            64:        { "_ninode" },
        !            65: #define        SNSWAPMAP 16
        !            66:        { "_nswapmap" },
        !            67: #define        SPTY    17
        !            68:        { "_pt_tty" },
        !            69: #define        SDMMIN  18
        !            70:        { "_dmmin" },
        !            71: #define        SDMMAX  19
        !            72:        { "_dmmax" },
        !            73: #define        SNSWDEV 20
        !            74:        { "_nswdev" },
        !            75: #define        SSWDEVT 21
        !            76:        { "_swdevt" },
        !            77:        { "" }
        !            78: };
        !            79: 
        !            80: int    inof;
        !            81: int    txtf;
        !            82: int    prcf;
        !            83: int    ttyf;
        !            84: int    usrf;
        !            85: long   ubase;
        !            86: int    filf;
        !            87: int    swpf;
        !            88: int    totflg;
        !            89: char   partab[1];
        !            90: struct cdevsw  cdevsw[1];
        !            91: struct bdevsw  bdevsw[1];
        !            92: int    allflg;
        !            93: int    kflg;
        !            94: struct pte *Usrptma;
        !            95: struct pte *usrpt;
        !            96: 
        !            97: main(argc, argv)
        !            98: char **argv;
        !            99: {
        !           100:        register char *argp;
        !           101:        int allflags;
        !           102: 
        !           103:        argc--, argv++;
        !           104:        while (argc > 0 && **argv == '-') {
        !           105:                argp = *argv++;
        !           106:                argp++;
        !           107:                argc--;
        !           108:                while (*argp++)
        !           109:                switch (argp[-1]) {
        !           110: 
        !           111:                case 'T':
        !           112:                        totflg++;
        !           113:                        break;
        !           114: 
        !           115:                case 'a':
        !           116:                        allflg++;
        !           117:                        break;
        !           118: 
        !           119:                case 'i':
        !           120:                        inof++;
        !           121:                        break;
        !           122: 
        !           123:                case 'k':
        !           124:                        kflg++;
        !           125:                        fcore = "/vmcore";
        !           126:                        break;
        !           127: 
        !           128:                case 'x':
        !           129:                        txtf++;
        !           130:                        break;
        !           131: 
        !           132:                case 'p':
        !           133:                        prcf++;
        !           134:                        break;
        !           135: 
        !           136:                case 't':
        !           137:                        ttyf++;
        !           138:                        break;
        !           139: 
        !           140:                case 'u':
        !           141:                        if (argc == 0)
        !           142:                                break;
        !           143:                        argc--;
        !           144:                        usrf++;
        !           145:                        sscanf( *argv++, "%x", &ubase);
        !           146:                        break;
        !           147: 
        !           148:                case 'f':
        !           149:                        filf++;
        !           150:                        break;
        !           151:                case 's':
        !           152:                        swpf++;
        !           153:                        break;
        !           154:                default:
        !           155:                        usage();
        !           156:                        exit(1);
        !           157:                }
        !           158:        }
        !           159:        if (argc>1)
        !           160:                fcore = argv[1];
        !           161:        if ((fc = open(fcore, 0)) < 0) {
        !           162:                printf("Can't find %s\n", fcore);
        !           163:                exit(1);
        !           164:        }
        !           165:        if (argc>0)
        !           166:                fnlist = argv[0];
        !           167:        nlist(fnlist, nl);
        !           168:        usrpt = (struct pte *)nl[USRPT].n_value;
        !           169:        Usrptma = (struct pte *)nl[USRPTMA].n_value;
        !           170:        if (nl[0].n_type == 0) {
        !           171:                printf("no namelist\n");
        !           172:                exit(1);
        !           173:        }
        !           174:        allflags = filf | totflg | inof | prcf | txtf | ttyf | usrf | swpf;
        !           175:        if (allflags == 0) {
        !           176:                printf("pstat: one or more of -[aixptfsu] is required\n");
        !           177:                exit(1);
        !           178:        }
        !           179:        if (filf||totflg)
        !           180:                dofile();
        !           181:        if (inof||totflg)
        !           182:                doinode();
        !           183:        if (prcf||totflg)
        !           184:                doproc();
        !           185:        if (txtf||totflg)
        !           186:                dotext();
        !           187:        if (ttyf)
        !           188:                dotty();
        !           189:        if (usrf)
        !           190:                dousr();
        !           191:        if (swpf||totflg)
        !           192:                doswap();
        !           193: }
        !           194: 
        !           195: usage()
        !           196: {
        !           197: 
        !           198:        printf("usage: pstat -[aixptfs] [-u [ubase]] [system] [core]\n");
        !           199: }
        !           200: 
        !           201: doinode()
        !           202: {
        !           203:        register struct inode *ip;
        !           204:        struct inode *xinode, *ainode;
        !           205:        register int nin;
        !           206:        int ninode;
        !           207: 
        !           208:        nin = 0;
        !           209:        ninode = getw(nl[SNINODE].n_value);
        !           210:        xinode = (struct inode *)calloc(ninode, sizeof (struct inode));
        !           211:        lseek(fc, (int)(ainode = (struct inode *)getw(nl[SINODE].n_value)), 0);
        !           212:        read(fc, xinode, ninode * sizeof(struct inode));
        !           213:        for (ip = xinode; ip < &xinode[ninode]; ip++)
        !           214:                if (ip->i_count)
        !           215:                        nin++;
        !           216:        if (totflg) {
        !           217:                printf("%3d/%3d inodes\n", nin, ninode);
        !           218:                return;
        !           219:        }
        !           220:        printf("%d/%d active inodes\n", nin, ninode);
        !           221: printf("   LOC      FLAGS    CNT DEVICE  RDC WRC  INO  MODE  NLK UID   SIZE/DEV\n");
        !           222:        for (ip = xinode; ip < &xinode[ninode]; ip++) {
        !           223:                if (ip->i_count == 0)
        !           224:                        continue;
        !           225:                printf("%8.1x ", ainode + (ip - xinode));
        !           226:                putf(ip->i_flag&ILOCKED, 'L');
        !           227:                putf(ip->i_flag&IUPD, 'U');
        !           228:                putf(ip->i_flag&IACC, 'A');
        !           229:                putf(ip->i_flag&IMOUNT, 'M');
        !           230:                putf(ip->i_flag&IWANT, 'W');
        !           231:                putf(ip->i_flag&ITEXT, 'T');
        !           232:                putf(ip->i_flag&ICHG, 'C');
        !           233:                putf(ip->i_flag&ISHLOCK, 'S');
        !           234:                putf(ip->i_flag&IEXLOCK, 'E');
        !           235:                putf(ip->i_flag&ILWAIT, 'Z');
        !           236:                printf("%4d", ip->i_count&0377);
        !           237:                printf("%4d,%3d", major(ip->i_dev), minor(ip->i_dev));
        !           238:                printf("%4d", ip->i_shlockc&0377);
        !           239:                printf("%4d", ip->i_exlockc&0377);
        !           240:                printf("%6d", ip->i_number);
        !           241:                printf("%6x", ip->i_mode & 0xffff);
        !           242:                printf("%4d", ip->i_nlink);
        !           243:                printf("%4d", ip->i_uid);
        !           244:                if ((ip->i_mode&IFMT)==IFBLK || (ip->i_mode&IFMT)==IFCHR)
        !           245:                        printf("%6d,%3d", major(ip->i_rdev), minor(ip->i_rdev));
        !           246:                else
        !           247:                        printf("%10ld", ip->i_size);
        !           248:                printf("\n");
        !           249:        }
        !           250:        free(xinode);
        !           251: }
        !           252: 
        !           253: getw(loc)
        !           254:        off_t loc;
        !           255: {
        !           256:        int word;
        !           257: 
        !           258:        if (kflg)
        !           259:                loc &= 0x7fffffff;
        !           260:        lseek(fc, loc, 0);
        !           261:        read(fc, &word, sizeof (word));
        !           262:        if (kflg)
        !           263:                word &= 0x7fffffff;
        !           264:        return (word);
        !           265: }
        !           266: 
        !           267: putf(v, n)
        !           268: {
        !           269:        if (v)
        !           270:                printf("%c", n);
        !           271:        else
        !           272:                printf(" ");
        !           273: }
        !           274: 
        !           275: dotext()
        !           276: {
        !           277:        register struct text *xp;
        !           278:        int ntext;
        !           279:        struct text *xtext, *atext;
        !           280:        int ntx;
        !           281: 
        !           282:        ntx = 0;
        !           283:        ntext = getw(nl[SNTEXT].n_value);
        !           284:        xtext = (struct text *)calloc(ntext, sizeof (struct text));
        !           285:        lseek(fc, (int)(atext = (struct text *)getw(nl[STEXT].n_value)), 0);
        !           286:        read(fc, xtext, ntext * sizeof (struct text));
        !           287:        for (xp = xtext; xp < &xtext[ntext]; xp++)
        !           288:                if (xp->x_iptr!=NULL)
        !           289:                        ntx++;
        !           290:        if (totflg) {
        !           291:                printf("%3d/%3d texts\n", ntx, ntext);
        !           292:                return;
        !           293:        }
        !           294:        printf("%d/%d active texts\n", ntx, ntext);
        !           295:        printf("   LOC   FLAGS DADDR      CADDR  RSS SIZE      IPTR  CNT CCNT\n");
        !           296:        for (xp = xtext; xp < &xtext[ntext]; xp++) {
        !           297:                if (xp->x_iptr == NULL)
        !           298:                        continue;
        !           299:                printf("%8.1x", atext + (xp - xtext));
        !           300:                printf(" ");
        !           301:                putf(xp->x_flag&XPAGI, 'P');
        !           302:                putf(xp->x_flag&XTRC, 'T');
        !           303:                putf(xp->x_flag&XWRIT, 'W');
        !           304:                putf(xp->x_flag&XLOAD, 'L');
        !           305:                putf(xp->x_flag&XLOCK, 'K');
        !           306:                putf(xp->x_flag&XWANT, 'w');
        !           307:                printf("%5x", xp->x_daddr[0]);
        !           308:                printf("%11x", xp->x_caddr);
        !           309:                printf("%5d", xp->x_rssize);
        !           310:                printf("%5d", xp->x_size);
        !           311:                printf("%10.1x", xp->x_iptr);
        !           312:                printf("%5d", xp->x_count&0377);
        !           313:                printf("%5d", xp->x_ccount);
        !           314:                printf("\n");
        !           315:        }
        !           316:        free(xtext);
        !           317: }
        !           318: 
        !           319: doproc()
        !           320: {
        !           321:        struct proc *xproc, *aproc;
        !           322:        int nproc;
        !           323:        register struct proc *pp;
        !           324:        register loc, np;
        !           325:        struct pte apte;
        !           326: 
        !           327:        nproc = getw(nl[SNPROC].n_value);
        !           328:        xproc = (struct proc *)calloc(nproc, sizeof (struct proc));
        !           329:        lseek(fc, (int)(aproc = (struct proc *)getw(nl[SPROC].n_value)), 0);
        !           330:        read(fc, xproc, nproc * sizeof (struct proc));
        !           331:        np = 0;
        !           332:        for (pp=xproc; pp < &xproc[nproc]; pp++)
        !           333:                if (pp->p_stat)
        !           334:                        np++;
        !           335:        if (totflg) {
        !           336:                printf("%3d/%3d processes\n", np, nproc);
        !           337:                return;
        !           338:        }
        !           339:        printf("%d/%d processes\n", np, nproc);
        !           340:        printf("   LOC    S    F POIP PRI      SIG  UID SLP TIM  CPU  NI   PGRP    PID   PPID    ADDR   RSS SRSS SIZE    WCHAN    LINK   TEXTP CLKT\n");
        !           341:        for (pp=xproc; pp<&xproc[nproc]; pp++) {
        !           342:                if (pp->p_stat==0 && allflg==0)
        !           343:                        continue;
        !           344:                printf("%8x", aproc + (pp - xproc));
        !           345:                printf(" %2d", pp->p_stat);
        !           346:                printf(" %4x", pp->p_flag & 0xffff);
        !           347:                printf(" %4d", pp->p_poip);
        !           348:                printf(" %3d", pp->p_pri);
        !           349:                printf(" %8x", pp->p_sig);
        !           350:                printf(" %4d", pp->p_uid);
        !           351:                printf(" %3d", pp->p_slptime);
        !           352:                printf(" %3d", pp->p_time);
        !           353:                printf(" %4d", pp->p_cpu&0377);
        !           354:                printf(" %3d", pp->p_nice);
        !           355:                printf(" %6d", pp->p_pgrp);
        !           356:                printf(" %6d", pp->p_pid);
        !           357:                printf(" %6d", pp->p_ppid);
        !           358:                if (kflg)
        !           359:                        pp->p_addr = (struct pte *)clear((int)pp->p_addr);
        !           360:                lseek(fc, (long)(Usrptma+btokmx(pp->p_addr)), 0);
        !           361:                read(fc, &apte, sizeof(apte));
        !           362:                printf(" %8x", ctob(apte.pg_pfnum+1) - sizeof(struct pte) * UPAGES);
        !           363:                printf(" %4x", pp->p_rssize);
        !           364:                printf(" %4x", pp->p_swrss);
        !           365:                printf(" %5x", pp->p_dsize+pp->p_ssize);
        !           366:                printf(" %7x", clear(pp->p_wchan));
        !           367:                printf(" %7x", clear(pp->p_link));
        !           368:                printf(" %7x", clear(pp->p_textp));
        !           369:                printf("\n");
        !           370:        }
        !           371: }
        !           372: 
        !           373: dotty()
        !           374: {
        !           375:        struct tty dz_tty[128];
        !           376:        int ndz;
        !           377:        register struct tty *tp;
        !           378:        register char *mesg;
        !           379: 
        !           380:        printf("1 cons\n");
        !           381:        if (kflg)
        !           382:                nl[SKL].n_value = clear(nl[SKL].n_value);
        !           383:        lseek(fc, (long)nl[SKL].n_value, 0);
        !           384:        read(fc, dz_tty, sizeof(dz_tty[0]));
        !           385:        mesg = " # RAW CAN OUT   MODE    ADDR   DEL COL  STATE   PGRP DISC\n";
        !           386:        printf(mesg);
        !           387:        ttyprt(&dz_tty[0], 0);
        !           388:        if (nl[SNDZ].n_type == 0)
        !           389:                goto dh;
        !           390:        if (kflg) {
        !           391:                nl[SNDZ].n_value = clear(nl[SNDZ].n_value);
        !           392:                nl[SDZ].n_value = clear(nl[SDZ].n_value);
        !           393:        }
        !           394:        lseek(fc, (long)nl[SNDZ].n_value, 0);
        !           395:        read(fc, &ndz, sizeof(ndz));
        !           396:        printf("%d dz lines\n", ndz);
        !           397:        lseek(fc, (long)nl[SDZ].n_value, 0);
        !           398:        read(fc, dz_tty, ndz * sizeof (struct tty));
        !           399:        for (tp = dz_tty; tp < &dz_tty[ndz]; tp++)
        !           400:                ttyprt(tp, tp - dz_tty);
        !           401: dh:
        !           402:        if (nl[SNDH].n_type == 0)
        !           403:                goto pty;
        !           404:        if (kflg) {
        !           405:                nl[SNDH].n_value = clear(nl[SNDH].n_value);
        !           406:                nl[SDH].n_value = clear(nl[SDH].n_value);
        !           407:        }
        !           408:        lseek(fc, (long)nl[SNDH].n_value, 0);
        !           409:        read(fc, &ndz, sizeof(ndz));
        !           410:        printf("%d dh lines\n", ndz);
        !           411:        lseek(fc, (long)nl[SDH].n_value, 0);
        !           412:        read(fc, dz_tty, ndz * sizeof(struct tty));
        !           413:        for (tp = dz_tty; tp < &dz_tty[ndz]; tp++)
        !           414:                ttyprt(tp, tp - dz_tty);
        !           415: pty:
        !           416:        if (nl[SPTY].n_type == 0)
        !           417:                goto pty;
        !           418:        if (kflg) {
        !           419:                nl[SPTY].n_value = clear(nl[SPTY].n_value);
        !           420:        }
        !           421:        printf("32 pty lines\n");
        !           422:        lseek(fc, (long)nl[SPTY].n_value, 0);
        !           423:        read(fc, dz_tty, 32*sizeof(struct tty));
        !           424:        for (tp = dz_tty; tp < &dz_tty[32]; tp++)
        !           425:                ttyprt(tp, tp - dz_tty);
        !           426: }
        !           427: 
        !           428: ttyprt(atp, line)
        !           429: struct tty *atp;
        !           430: {
        !           431:        register struct tty *tp;
        !           432: 
        !           433:        printf("%2d", line);
        !           434:        tp = atp;
        !           435:        switch (tp->t_line) {
        !           436: 
        !           437: /*
        !           438:        case NETLDISC:
        !           439:                if (tp->t_rec)
        !           440:                        printf("%4d%4d", 0, tp->t_inbuf);
        !           441:                else
        !           442:                        printf("%4d%4d", tp->t_inbuf, 0);
        !           443:                break;
        !           444: */
        !           445: 
        !           446:        default:
        !           447:                printf("%4d", tp->t_rawq.c_cc);
        !           448:                printf("%4d", tp->t_canq.c_cc);
        !           449:        }
        !           450:        printf("%4d", tp->t_outq.c_cc);
        !           451:        printf("%8.1x", tp->t_flags);
        !           452:        printf(" %8.1x", tp->t_addr);
        !           453:        printf("%3d", tp->t_delct);
        !           454:        printf("%4d ", tp->t_col);
        !           455:        putf(tp->t_state&TS_TIMEOUT, 'T');
        !           456:        putf(tp->t_state&TS_WOPEN, 'W');
        !           457:        putf(tp->t_state&TS_ISOPEN, 'O');
        !           458:        putf(tp->t_state&TS_CARR_ON, 'C');
        !           459:        putf(tp->t_state&TS_BUSY, 'B');
        !           460:        putf(tp->t_state&TS_ASLEEP, 'A');
        !           461:        putf(tp->t_state&TS_XCLUDE, 'X');
        !           462:        putf(tp->t_state&TS_HUPCLS, 'H');
        !           463:        printf("%6d", tp->t_pgrp);
        !           464:        switch (tp->t_line) {
        !           465: 
        !           466:        case NTTYDISC:
        !           467:                printf(" ntty");
        !           468:                break;
        !           469: 
        !           470:        case NETLDISC:
        !           471:                printf(" net");
        !           472:                break;
        !           473:        }
        !           474:        printf("\n");
        !           475: }
        !           476: 
        !           477: dousr()
        !           478: {
        !           479:        struct user U;
        !           480:        register i, j, *ip;
        !           481: 
        !           482:        /* This wins only if PAGSIZ > sizeof (struct user) */
        !           483:        lseek(fc, ubase * NBPG, 0);
        !           484:        read(fc, &U, sizeof(U));
        !           485:        printf("pcb");
        !           486:        ip = (int *)&U.u_pcb;
        !           487:        while (ip < &U.u_arg[0]) {
        !           488:                if ((ip - (int *)&U.u_pcb) % 4 == 0)
        !           489:                        printf("\t");
        !           490:                printf("%x ", *ip++);
        !           491:                if ((ip - (int *)&U.u_pcb) % 4 == 0)
        !           492:                        printf("\n");
        !           493:        }
        !           494:        if ((ip - (int *)&U.u_pcb) % 4 != 0)
        !           495:                printf("\n");
        !           496:        printf("arg\t");
        !           497:        for (i=0; i<5; i++)
        !           498:                printf(" %.1x", U.u_arg[i]);
        !           499:        printf("\n");
        !           500:        for (i=0; i<sizeof(label_t)/sizeof(int); i++) {
        !           501:                if (i%5==0)
        !           502:                        printf("\t");
        !           503:                printf("%9.1x", U.u_ssave.val[i]);
        !           504:                if (i%5==4)
        !           505:                        printf("\n");
        !           506:        }
        !           507:        if (i%5)
        !           508:                printf("\n");
        !           509:        printf("segflg\t%d\nerror %d\n", U.u_segflg, U.u_error);
        !           510:        printf("uids\t%d,%d,%d,%d\n", U.u_uid,U.u_gid,U.u_ruid,U.u_rgid);
        !           511:        printf("procp\t%.1x\n", U.u_procp);
        !           512:        printf("ap\t%.1x\n", U.u_ap);
        !           513:        printf("r_val?\t%.1x %.1x\n", U.u_r.r_val1, U.u_r.r_val2);
        !           514:        printf("base, count, offset %.1x %.1x %ld\n", U.u_base,
        !           515:                U.u_count, U.u_offset);
        !           516:        printf("cdir rdir %.1x %.1x\n", U.u_cdir, U.u_rdir);
        !           517:        printf("dirp %.1x\n", U.u_dirp);
        !           518:        printf("dent %d %.14s\n", U.u_dent.d_ino, U.u_dent.d_name);
        !           519:        printf("pdir %.1o\n", U.u_pdir);
        !           520:        printf("file\t");
        !           521:        for (i=0; i<10; i++)
        !           522:                printf("%9.1x", U.u_ofile[i]);
        !           523:        printf("\n\t");
        !           524:        for (i=10; i<NOFILE; i++)
        !           525:                printf("%9.1x", U.u_ofile[i]);
        !           526:        printf("\n");
        !           527:        printf("pofile\t");
        !           528:        for (i=0; i<10; i++)
        !           529:                printf("%9.1x", U.u_pofile[i]);
        !           530:        printf("\n\t");
        !           531:        for (i=10; i<NOFILE; i++)
        !           532:                printf("%9.1x", U.u_pofile[i]);
        !           533:        printf("\n");
        !           534:        printf("ssave");
        !           535:        for (i=0; i<sizeof(label_t)/sizeof(int); i++) {
        !           536:                if (i%5==0)
        !           537:                        printf("\t");
        !           538:                printf("%9.1x", U.u_ssave.val[i]);
        !           539:                if (i%5==4)
        !           540:                        printf("\n");
        !           541:        }
        !           542:        if (i%5)
        !           543:                printf("\n");
        !           544:        printf("sigs\t");
        !           545:        for (i=0; i<NSIG; i++)
        !           546:                printf("%.1x ", U.u_signal[i]);
        !           547:        printf("\n");
        !           548:        printf("code\t%.1x\n", U.u_code);
        !           549:        printf("ar0\t%.1x\n", U.u_ar0);
        !           550:        printf("prof\t%X %X %X %X\n", U.u_prof.pr_base, U.u_prof.pr_size,
        !           551:            U.u_prof.pr_off, U.u_prof.pr_scale);
        !           552:        printf("\neosys\t%d\n", U.u_eosys);
        !           553:        printf("ttyp\t%.1x\n", U.u_ttyp);
        !           554:        printf("ttyd\t%d,%d\n", major(U.u_ttyd), minor(U.u_ttyd));
        !           555:        printf("exdata\t");
        !           556:        ip = (int *)&U.u_exdata;
        !           557:        for (i = 0; i < 8; i++)
        !           558:                printf("%.1D ", *ip++);
        !           559:        printf("\n");
        !           560:        printf("comm %.14s\n", U.u_comm);
        !           561:        printf("start\t%D\n", U.u_start);
        !           562:        printf("acflag\t%D\n", U.u_acflag);
        !           563:        printf("cmask\t%D\n", U.u_cmask);
        !           564:        printf("sizes\t%.1x %.1x %.1x\n", U.u_tsize, U.u_dsize, U.u_ssize);
        !           565:        printf("ru\t");
        !           566:        ip = (int *)&U.u_ru;
        !           567:        for (i = 0; i < sizeof(U.u_ru)/sizeof(int); i++)
        !           568:                printf("%D ", ip[i]);
        !           569:        printf("\n");
        !           570:        ip = (int *)&U.u_cru;
        !           571:        printf("cru\t");
        !           572:        for (i = 0; i < sizeof(U.u_cru)/sizeof(int); i++)
        !           573:                printf("%D ", ip[i]);
        !           574:        printf("\n");
        !           575: /*
        !           576:        i =  U.u_stack - &U;
        !           577:        while (U[++i] == 0);
        !           578:        i &= ~07;
        !           579:        while (i < 512) {
        !           580:                printf("%x ", 0140000+2*i);
        !           581:                for (j=0; j<8; j++)
        !           582:                        printf("%9x", U[i++]);
        !           583:                printf("\n");
        !           584:        }
        !           585: */
        !           586: }
        !           587: 
        !           588: oatoi(s)
        !           589: char *s;
        !           590: {
        !           591:        register v;
        !           592: 
        !           593:        v = 0;
        !           594:        while (*s)
        !           595:                v = (v<<3) + *s++ - '0';
        !           596:        return(v);
        !           597: }
        !           598: 
        !           599: dofile()
        !           600: {
        !           601:        int nfile;
        !           602:        struct file *xfile, *afile;
        !           603:        register struct file *fp;
        !           604:        register nf;
        !           605:        int loc;
        !           606:        static char *dtypes[] = { "???", "inode", "socket" };
        !           607: 
        !           608:        nf = 0;
        !           609:        nfile = getw(nl[SNFILE].n_value);
        !           610:        xfile = (struct file *)calloc(nfile, sizeof (struct file));
        !           611:        lseek(fc, (int)(afile = (struct file *)getw(nl[SFIL].n_value)), 0);
        !           612:        read(fc, xfile, nfile * sizeof (struct file));
        !           613:        for (fp=xfile; fp < &xfile[nfile]; fp++)
        !           614:                if (fp->f_count)
        !           615:                        nf++;
        !           616:        if (totflg) {
        !           617:                printf("%3d/%3d files\n", nf, nfile);
        !           618:                return;
        !           619:        }
        !           620:        printf("%d/%d open files\n", nf, nfile);
        !           621:        printf("   LOC   TYPE    FLG     CNT  MSG    DATA    OFFSET\n");
        !           622:        for (fp=xfile,loc=(int)afile; fp < &xfile[nfile]; fp++,loc+=sizeof(xfile[0])) {
        !           623:                if (fp->f_count==0)
        !           624:                        continue;
        !           625:                printf("%8x ", loc);
        !           626:                if (fp->f_type <= DTYPE_SOCKET)
        !           627:                        printf("%-8.8s", dtypes[fp->f_type]);
        !           628:                else
        !           629:                        printf("8d", fp->f_type);
        !           630:                putf(fp->f_flag&FREAD, 'R');
        !           631:                putf(fp->f_flag&FWRITE, 'W');
        !           632:                putf(fp->f_flag&FAPPEND, 'A');
        !           633:                putf(fp->f_flag&FSHLOCK, 'S');
        !           634:                putf(fp->f_flag&FEXLOCK, 'X');
        !           635:                putf(fp->f_flag&FASYNC, 'I');
        !           636:                printf("  %3d", mask(fp->f_count));
        !           637:                printf("  %3d", mask(fp->f_msgcount));
        !           638:                printf("  %8.1x", fp->f_data);
        !           639:                if (fp->f_offset < 0)
        !           640:                        printf("  %x\n", fp->f_offset);
        !           641:                else
        !           642:                        printf("  %ld\n", fp->f_offset);
        !           643:        }
        !           644: }
        !           645: 
        !           646: int dmmin, dmmax, nswdev;
        !           647: 
        !           648: doswap()
        !           649: {
        !           650:        struct proc *proc;
        !           651:        int nproc;
        !           652:        struct text *xtext;
        !           653:        int ntext;
        !           654:        struct map *swapmap;
        !           655:        int nswapmap;
        !           656:        struct swdevt *swdevt, *sw;
        !           657:        register struct proc *pp;
        !           658:        int nswap, used, tused, free, waste;
        !           659:        int db, sb;
        !           660:        register struct mapent *me;
        !           661:        register struct text *xp;
        !           662:        int i, j;
        !           663: 
        !           664:        nproc = getw(nl[SNPROC].n_value);
        !           665:        proc = (struct proc *)calloc(nproc, sizeof (struct proc));
        !           666:        ntext = getw(nl[SNTEXT].n_value);
        !           667:        xtext = (struct text *)calloc(ntext, sizeof (struct text));
        !           668:        nswapmap = getw(nl[SNSWAPMAP].n_value);
        !           669:        swapmap = (struct map *)calloc(nswapmap, sizeof (struct map));
        !           670:        nswdev = getw(nl[SNSWDEV].n_value);
        !           671:        swdevt = (struct swdevt *)calloc(nswdev, sizeof (struct swdevt));
        !           672:        lseek(fc, nl[SSWDEVT].n_value, L_SET);
        !           673:        read(fc, swdevt, nswdev * sizeof (struct swdevt));
        !           674:        lseek(fc, getw(nl[SPROC].n_value), 0);
        !           675:        read(fc, proc, nproc * sizeof (struct proc));
        !           676:        lseek(fc, getw(nl[STEXT].n_value), 0);
        !           677:        read(fc, xtext, ntext * sizeof (struct text));
        !           678:        lseek(fc, getw(nl[SWAPMAP].n_value), 0);
        !           679:        read(fc, swapmap, nswapmap * sizeof (struct map));
        !           680:        swapmap->m_name = "swap";
        !           681:        swapmap->m_limit = (struct mapent *)&swapmap[nswapmap];
        !           682:        dmmin = getw(nl[SDMMIN].n_value);
        !           683:        dmmax = getw(nl[SDMMAX].n_value);
        !           684:        nswap = 0;
        !           685:        for (sw = swdevt; sw < &swdevt[nswdev]; sw++)
        !           686:                nswap += sw->sw_nblks,
        !           687:        free = 0;
        !           688:        for (me = (struct mapent *)(swapmap+1);
        !           689:            me < (struct mapent *)&swapmap[nswapmap]; me++)
        !           690:                free += me->m_size;
        !           691:        tused = 0;
        !           692:        for (xp = xtext; xp < &xtext[ntext]; xp++)
        !           693:                if (xp->x_iptr!=NULL) {
        !           694:                        tused += ctod(xp->x_size);
        !           695:                        if (xp->x_flag & XPAGI)
        !           696:                                tused += ctod(ctopt(xp->x_size));
        !           697:                }
        !           698:        used = tused;
        !           699:        waste = 0;
        !           700:        for (pp = proc; pp < &proc[nproc]; pp++) {
        !           701:                if (pp->p_stat == 0 || pp->p_stat == SZOMB)
        !           702:                        continue;
        !           703:                if (pp->p_flag & SSYS)
        !           704:                        continue;
        !           705:                db = ctod(pp->p_dsize), sb = up(db);
        !           706:                used += sb;
        !           707:                waste += sb - db;
        !           708:                db = ctod(pp->p_ssize), sb = up(db);
        !           709:                used += sb;
        !           710:                waste += sb - db;
        !           711:                if ((pp->p_flag&SLOAD) == 0)
        !           712:                        used += vusize(pp);
        !           713:        }
        !           714:        if (totflg) {
        !           715: #define        btok(x) ((x) / (1024 / DEV_BSIZE))
        !           716:                printf("%3d/%3d 00k swap\n",
        !           717:                    btok(used/100), btok((used+free)/100));
        !           718:                return;
        !           719:        }
        !           720:        printf("%dk used (%dk text), %dk free, %dk wasted, %dk missing\n",
        !           721:            btok(used), btok(tused), btok(free), btok(waste),
        !           722: /* a dmmax/2 block goes to argmap */
        !           723:            btok(nswap - dmmax/2 - (used + free)));
        !           724:        printf("avail: ");
        !           725:        for (i = dmmax; i >= dmmin; i /= 2) {
        !           726:                j = 0;
        !           727:                while (rmalloc(swapmap, i) != 0)
        !           728:                        j++;
        !           729:                if (j) printf("%d*%dk ", j, btok(i));
        !           730:        }
        !           731:        free = 0;
        !           732:        for (me = (struct mapent *)(swapmap+1);
        !           733:            me < (struct mapent *)&swapmap[nswapmap]; me++)
        !           734:                free += me->m_size;
        !           735:        printf("%d*1k\n", btok(free));
        !           736: }
        !           737: 
        !           738: up(size)
        !           739:        register int size;
        !           740: {
        !           741:        register int i, block;
        !           742: 
        !           743:        i = 0;
        !           744:        block = dmmin;
        !           745:        while (i < size) {
        !           746:                i += block;
        !           747:                if (block < dmmax)
        !           748:                        block *= 2;
        !           749:        }
        !           750:        return (i);
        !           751: }
        !           752: 
        !           753: /*
        !           754:  * Compute number of pages to be allocated to the u. area
        !           755:  * and data and stack area page tables, which are stored on the
        !           756:  * disk immediately after the u. area.
        !           757:  */
        !           758: vusize(p)
        !           759:        register struct proc *p;
        !           760: {
        !           761:        register int tsz = p->p_tsize / NPTEPG;
        !           762: 
        !           763:        /*
        !           764:         * We do not need page table space on the disk for page
        !           765:         * table pages wholly containing text. 
        !           766:         */
        !           767:        return (clrnd(UPAGES +
        !           768:            clrnd(ctopt(p->p_tsize+p->p_dsize+p->p_ssize+UPAGES)) - tsz));
        !           769: }
        !           770: 
        !           771: /*
        !           772:  * Allocate 'size' units from the given
        !           773:  * map. Return the base of the allocated space.
        !           774:  * In a map, the addresses are increasing and the
        !           775:  * list is terminated by a 0 size.
        !           776:  *
        !           777:  * Algorithm is first-fit.
        !           778:  *
        !           779:  * This routine knows about the interleaving of the swapmap
        !           780:  * and handles that.
        !           781:  */
        !           782: long
        !           783: rmalloc(mp, size)
        !           784:        register struct map *mp;
        !           785:        long size;
        !           786: {
        !           787:        register struct mapent *ep = (struct mapent *)(mp+1);
        !           788:        register int addr;
        !           789:        register struct mapent *bp;
        !           790:        swblk_t first, rest;
        !           791: 
        !           792:        if (size <= 0 || size > dmmax)
        !           793:                return (0);
        !           794:        /*
        !           795:         * Search for a piece of the resource map which has enough
        !           796:         * free space to accomodate the request.
        !           797:         */
        !           798:        for (bp = ep; bp->m_size; bp++) {
        !           799:                if (bp->m_size >= size) {
        !           800:                        /*
        !           801:                         * If allocating from swapmap,
        !           802:                         * then have to respect interleaving
        !           803:                         * boundaries.
        !           804:                         */
        !           805:                        if (nswdev > 1 &&
        !           806:                            (first = dmmax - bp->m_addr%dmmax) < bp->m_size) {
        !           807:                                if (bp->m_size - first < size)
        !           808:                                        continue;
        !           809:                                addr = bp->m_addr + first;
        !           810:                                rest = bp->m_size - first - size;
        !           811:                                bp->m_size = first;
        !           812:                                if (rest)
        !           813:                                        rmfree(mp, rest, addr+size);
        !           814:                                return (addr);
        !           815:                        }
        !           816:                        /*
        !           817:                         * Allocate from the map.
        !           818:                         * If there is no space left of the piece
        !           819:                         * we allocated from, move the rest of
        !           820:                         * the pieces to the left.
        !           821:                         */
        !           822:                        addr = bp->m_addr;
        !           823:                        bp->m_addr += size;
        !           824:                        if ((bp->m_size -= size) == 0) {
        !           825:                                do {
        !           826:                                        bp++;
        !           827:                                        (bp-1)->m_addr = bp->m_addr;
        !           828:                                } while ((bp-1)->m_size = bp->m_size);
        !           829:                        }
        !           830:                        if (addr % CLSIZE)
        !           831:                                return (0);
        !           832:                        return (addr);
        !           833:                }
        !           834:        }
        !           835:        return (0);
        !           836: }
        !           837: 
        !           838: /*
        !           839:  * Free the previously allocated space at addr
        !           840:  * of size units into the specified map.
        !           841:  * Sort addr into map and combine on
        !           842:  * one or both ends if possible.
        !           843:  */
        !           844: rmfree(mp, size, addr)
        !           845:        struct map *mp;
        !           846:        long size, addr;
        !           847: {
        !           848:        struct mapent *firstbp;
        !           849:        register struct mapent *bp;
        !           850:        register int t;
        !           851: 
        !           852:        /*
        !           853:         * Both address and size must be
        !           854:         * positive, or the protocol has broken down.
        !           855:         */
        !           856:        if (addr <= 0 || size <= 0)
        !           857:                goto badrmfree;
        !           858:        /*
        !           859:         * Locate the piece of the map which starts after the
        !           860:         * returned space (or the end of the map).
        !           861:         */
        !           862:        firstbp = bp = (struct mapent *)(mp + 1);
        !           863:        for (; bp->m_addr <= addr && bp->m_size != 0; bp++)
        !           864:                continue;
        !           865:        /*
        !           866:         * If the piece on the left abuts us,
        !           867:         * then we should combine with it.
        !           868:         */
        !           869:        if (bp > firstbp && (bp-1)->m_addr+(bp-1)->m_size >= addr) {
        !           870:                /*
        !           871:                 * Check no overlap (internal error).
        !           872:                 */
        !           873:                if ((bp-1)->m_addr+(bp-1)->m_size > addr)
        !           874:                        goto badrmfree;
        !           875:                /*
        !           876:                 * Add into piece on the left by increasing its size.
        !           877:                 */
        !           878:                (bp-1)->m_size += size;
        !           879:                /*
        !           880:                 * If the combined piece abuts the piece on
        !           881:                 * the right now, compress it in also,
        !           882:                 * by shifting the remaining pieces of the map over.
        !           883:                 */
        !           884:                if (bp->m_addr && addr+size >= bp->m_addr) {
        !           885:                        if (addr+size > bp->m_addr)
        !           886:                                goto badrmfree;
        !           887:                        (bp-1)->m_size += bp->m_size;
        !           888:                        while (bp->m_size) {
        !           889:                                bp++;
        !           890:                                (bp-1)->m_addr = bp->m_addr;
        !           891:                                (bp-1)->m_size = bp->m_size;
        !           892:                        }
        !           893:                }
        !           894:                goto done;
        !           895:        }
        !           896:        /*
        !           897:         * Don't abut on the left, check for abutting on
        !           898:         * the right.
        !           899:         */
        !           900:        if (addr+size >= bp->m_addr && bp->m_size) {
        !           901:                if (addr+size > bp->m_addr)
        !           902:                        goto badrmfree;
        !           903:                bp->m_addr -= size;
        !           904:                bp->m_size += size;
        !           905:                goto done;
        !           906:        }
        !           907:        /*
        !           908:         * Don't abut at all.  Make a new entry
        !           909:         * and check for map overflow.
        !           910:         */
        !           911:        do {
        !           912:                t = bp->m_addr;
        !           913:                bp->m_addr = addr;
        !           914:                addr = t;
        !           915:                t = bp->m_size;
        !           916:                bp->m_size = size;
        !           917:                bp++;
        !           918:        } while (size = t);
        !           919:        /*
        !           920:         * Segment at bp is to be the delimiter;
        !           921:         * If there is not room for it 
        !           922:         * then the table is too full
        !           923:         * and we must discard something.
        !           924:         */
        !           925:        if (bp+1 > mp->m_limit) {
        !           926:                /*
        !           927:                 * Back bp up to last available segment.
        !           928:                 * which contains a segment already and must
        !           929:                 * be made into the delimiter.
        !           930:                 * Discard second to last entry,
        !           931:                 * since it is presumably smaller than the last
        !           932:                 * and move the last entry back one.
        !           933:                 */
        !           934:                bp--;
        !           935:                printf("%s: rmap ovflo, lost [%d,%d)\n", mp->m_name,
        !           936:                    (bp-1)->m_addr, (bp-1)->m_addr+(bp-1)->m_size);
        !           937:                bp[-1] = bp[0];
        !           938:                bp[0].m_size = bp[0].m_addr = 0;
        !           939:        }
        !           940: done:
        !           941:        return;
        !           942: badrmfree:
        !           943:        printf("bad rmfree\n");
        !           944: }

unix.superglobalmegacorp.com

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