|
|
1.1 ! root 1: static char *sccsid = "@(#)pstat.c 4.9 (Berkeley) 5/7/81"; ! 2: /* ! 3: * Print system stuff ! 4: */ ! 5: ! 6: #define mask(x) (x&0377) ! 7: #define clear(x) ((int)x&0x7fffffff) ! 8: ! 9: #include <sys/param.h> ! 10: #include <sys/dir.h> ! 11: #include <sys/file.h> ! 12: #include <sys/user.h> ! 13: #include <sys/proc.h> ! 14: #include <sys/text.h> ! 15: #include <sys/inode.h> ! 16: #include <sys/map.h> ! 17: #include <sys/conf.h> ! 18: #include <sys/vm.h> ! 19: #include <nlist.h> ! 20: #include <sys/pte.h> ! 21: ! 22: char *fcore = "/dev/kmem"; ! 23: char *fnlist = "/unix"; ! 24: int fc; ! 25: ! 26: struct nlist nl[] = { ! 27: #define SINODE 0 ! 28: { "_inode" }, ! 29: #define STEXT 1 ! 30: { "_text" }, ! 31: #define SPROC 2 ! 32: { "_proc" }, ! 33: #define SDZ 3 ! 34: { "_dz_tty" }, ! 35: #define SNDZ 4 ! 36: { "_dz_cnt" }, ! 37: #define SKL 5 ! 38: { "_cons" }, ! 39: #define SFIL 6 ! 40: { "_file" }, ! 41: #define USRPTMA 7 ! 42: { "_Usrptmap" }, ! 43: #define USRPT 8 ! 44: { "_usrpt" }, ! 45: #define SNSWAP 9 ! 46: { "_nswap" }, ! 47: #define SWAPMAP 10 ! 48: { "_swapmap" }, ! 49: #define SDH 11 ! 50: { "_dh11" }, ! 51: #define SNDH 12 ! 52: { "_ndh11" }, ! 53: #define SGROUP 13 ! 54: { "_groups" }, ! 55: #define SCHANS 14 ! 56: { "_chans" }, ! 57: #define SSCHANS 15 ! 58: { "_schans" }, ! 59: #define SNPROC 16 ! 60: { "_nproc" }, ! 61: #define SNTEXT 17 ! 62: { "_ntext" }, ! 63: #define SNFILE 18 ! 64: { "_nfile" }, ! 65: #define SNINODE 19 ! 66: { "_ninode" }, ! 67: #define SNSWAPMAP 20 ! 68: { "_nswapmap" }, ! 69: #define STRIMPROF 21 ! 70: { "_trimprof" }, ! 71: 0, ! 72: }; ! 73: ! 74: int inof; /* inode table */ ! 75: int txtf; /* text table */ ! 76: int prcf; /* proc table */ ! 77: int ttyf; /* streams, some day */ ! 78: int usrf; /* user struct */ ! 79: long ubase; ! 80: int filf; /* file table */ ! 81: int swpf; /* swap usage */ ! 82: int totflg; /* total table usage */ ! 83: int clkf; /* clock trims */ ! 84: char partab[1]; ! 85: struct cdevsw cdevsw[1]; ! 86: struct bdevsw bdevsw[1]; ! 87: int allflg; ! 88: int kflg; ! 89: struct pte *Usrptma; ! 90: struct pte *usrpt; ! 91: long seekmask = 0xffffffff; ! 92: ! 93: main(argc, argv) ! 94: char **argv; ! 95: { ! 96: register char *argp; ! 97: ! 98: argc--, argv++; ! 99: while (argc > 0 && **argv == '-') { ! 100: argp = *argv++; ! 101: argp++; ! 102: argc--; ! 103: while (*argp++) ! 104: switch (argp[-1]) { ! 105: ! 106: case 'T': ! 107: totflg++; ! 108: break; ! 109: ! 110: case 'a': ! 111: allflg++; ! 112: break; ! 113: ! 114: case 'i': ! 115: inof++; ! 116: break; ! 117: ! 118: case 'k': ! 119: kflg++; ! 120: fcore = "/vmcore"; ! 121: seekmask = 0x7fffffff; ! 122: break; ! 123: ! 124: case 'x': ! 125: txtf++; ! 126: break; ! 127: ! 128: case 'p': ! 129: prcf++; ! 130: break; ! 131: ! 132: case 't': ! 133: ttyf++; ! 134: break; ! 135: ! 136: case 'u': ! 137: if (argc == 0) ! 138: break; ! 139: argc--; ! 140: usrf++; ! 141: sscanf( *argv++, "%x", &ubase); ! 142: break; ! 143: ! 144: case 'f': ! 145: filf++; ! 146: break; ! 147: case 's': ! 148: swpf++; ! 149: break; ! 150: case 'c': ! 151: clkf++; ! 152: break; ! 153: } ! 154: } ! 155: if (argc>0) { ! 156: fcore = argv[0]; ! 157: seekmask = 0x7fffffff; ! 158: } ! 159: if ((fc = open(fcore, 0)) < 0) { ! 160: printf("Can't find %s\n", fcore); ! 161: exit(1); ! 162: } ! 163: if (argc>1) ! 164: fnlist = argv[1]; ! 165: nlist(fnlist, nl); ! 166: if (nl[0].n_type == 0) { ! 167: printf("no namelist\n"); ! 168: exit(1); ! 169: } ! 170: usrpt = (struct pte *)nl[USRPT].n_value; ! 171: Usrptma = (struct pte *)nl[USRPTMA].n_value; ! 172: if (filf||totflg) ! 173: dofile(); ! 174: if (inof||totflg) ! 175: doinode(); ! 176: if (prcf||totflg) ! 177: doproc(); ! 178: if (txtf||totflg) ! 179: dotext(); ! 180: if (ttyf) ! 181: dotty(); ! 182: if (usrf) ! 183: dousr(); ! 184: if (swpf||totflg) ! 185: doswap(); ! 186: if (clkf||totflg) ! 187: doclk(); ! 188: } ! 189: ! 190: doinode() ! 191: { ! 192: register struct inode *ip; ! 193: struct inode *xinode, *ainode; ! 194: register int nin; ! 195: int ninode; ! 196: ! 197: nin = 0; ! 198: ninode = getw(nl[SNINODE].n_value); ! 199: xinode = (struct inode *)calloc(ninode, sizeof (struct inode)); ! 200: xxseek(fc, (int)(ainode = (struct inode *)getw(nl[SINODE].n_value)), 0); ! 201: read(fc, xinode, ninode * sizeof(struct inode)); ! 202: for (ip = xinode; ip < &xinode[ninode]; ip++) ! 203: if (ip->i_count) ! 204: nin++; ! 205: printf("%5d/%5d inodes\n", nin, ninode); ! 206: if (totflg) ! 207: return; ! 208: printf(" LOC FLAGS CNT DEVICE INO MODE NLN UID SPTR SIZE/DEV\n"); ! 209: for (ip = xinode; ip < &xinode[ninode]; ip++) { ! 210: if (ip->i_count == 0) ! 211: continue; ! 212: printf("%8.1x ", ainode + (ip - xinode)); ! 213: putf(ip->i_flag&ILOCK, 'L'); ! 214: putf(ip->i_flag&IUPD, 'U'); ! 215: putf(ip->i_flag&IACC, 'A'); ! 216: putf(ip->i_flag&IMOUNT, 'M'); ! 217: putf(ip->i_flag&IWANT, 'W'); ! 218: putf(ip->i_flag&ITEXT, 'T'); ! 219: printf("%4d", ip->i_count&0377); ! 220: printf("%3d,%3d", major(ip->i_dev), minor(ip->i_dev)); ! 221: printf("%6d", ip->i_number); ! 222: printf("%7o", ip->i_mode & 0xffff); ! 223: printf("%4d", ip->i_nlink); ! 224: printf("%4d", ip->i_uid); ! 225: printf("%8x", (int)ip->i_sptr&0xffffff); ! 226: if ((ip->i_mode&IFMT)==IFBLK || (ip->i_mode&IFMT)==IFCHR) ! 227: printf("%6d,%3d", major(ip->i_un.i_rdev), minor(ip->i_un.i_rdev)); ! 228: else ! 229: printf("%10ld", ip->i_size); ! 230: printf("\n"); ! 231: } ! 232: free(xinode); ! 233: } ! 234: ! 235: getw(loc) ! 236: off_t loc; ! 237: { ! 238: int word; ! 239: ! 240: if (kflg) ! 241: loc &= 0x7fffffff; ! 242: xxseek(fc, loc, 0); ! 243: read(fc, &word, sizeof (word)); ! 244: if (kflg) ! 245: word &= 0x7fffffff; ! 246: return (word); ! 247: } ! 248: ! 249: putf(v, n) ! 250: { ! 251: if (v) ! 252: printf("%c", n); ! 253: else ! 254: printf(" "); ! 255: } ! 256: ! 257: dotext() ! 258: { ! 259: register struct text *xp; ! 260: int ntext; ! 261: struct text *xtext, *atext; ! 262: int ntx; ! 263: ! 264: ntx = 0; ! 265: ntext = getw(nl[SNTEXT].n_value); ! 266: xtext = (struct text *)calloc(ntext, sizeof (struct text)); ! 267: xxseek(fc, (int)(atext = (struct text *)getw(nl[STEXT].n_value)), 0); ! 268: read(fc, xtext, ntext * sizeof (struct text)); ! 269: for (xp = xtext; xp < &xtext[ntext]; xp++) ! 270: if (xp->x_iptr!=NULL) ! 271: ntx++; ! 272: printf("%5d/%5d active texts\n", ntx, ntext); ! 273: if (totflg) ! 274: return; ! 275: printf(" LOC FLAGS DADDR CADDR RSS SIZE IPTR CNT CCNT\n"); ! 276: for (xp = xtext; xp < &xtext[ntext]; xp++) { ! 277: if (xp->x_iptr == NULL) ! 278: continue; ! 279: printf("%8.1x", atext + (xp - xtext)); ! 280: printf(" "); ! 281: putf(xp->x_flag&XPAGI, 'P'); ! 282: putf(xp->x_flag&XTRC, 'T'); ! 283: putf(xp->x_flag&XWRIT, 'W'); ! 284: putf(xp->x_flag&XLOAD, 'L'); ! 285: putf(xp->x_flag&XLOCK, 'K'); ! 286: putf(xp->x_flag&XWANT, 'w'); ! 287: printf("%5x", xp->x_daddr[0]); ! 288: printf("%11x", xp->x_caddr); ! 289: printf("%5d", xp->x_rssize); ! 290: printf("%5d", xp->x_size); ! 291: printf("%10.1x", xp->x_iptr); ! 292: printf("%5d", xp->x_count&0377); ! 293: printf("%5d", xp->x_ccount); ! 294: printf("\n"); ! 295: } ! 296: free(xtext); ! 297: } ! 298: ! 299: doproc() ! 300: { ! 301: struct proc *xproc, *aproc; ! 302: int nproc; ! 303: register struct proc *pp; ! 304: register loc, np; ! 305: struct pte apte; ! 306: ! 307: nproc = getw(nl[SNPROC].n_value); ! 308: xproc = (struct proc *)calloc(nproc, sizeof (struct proc)); ! 309: xxseek(fc, (int)(aproc = (struct proc *)getw(nl[SPROC].n_value)), 0); ! 310: read(fc, xproc, nproc * sizeof (struct proc)); ! 311: np = 0; ! 312: for (pp=xproc; pp < &xproc[nproc]; pp++) ! 313: if (pp->p_stat) ! 314: np++; ! 315: printf("%5d/%5d processes\n", np, nproc); ! 316: if (totflg) ! 317: return; ! 318: printf(" LOC S F POIP PRI SIG UID SLP TIM CPU NI PGRP PID PPID ADDR RSS SRSS SIZE WCHAN LINK TEXTP CLKT\n"); ! 319: for (pp=xproc; pp<&xproc[nproc]; pp++) { ! 320: if (pp->p_stat==0 && allflg==0) ! 321: continue; ! 322: printf("%8x", aproc + (pp - xproc)); ! 323: printf(" %2d", pp->p_stat); ! 324: printf(" %4x", pp->p_flag & 0xffff); ! 325: printf(" %4d", pp->p_poip); ! 326: printf(" %3d", pp->p_pri); ! 327: printf(" %8x", pp->p_sig); ! 328: printf(" %4d", pp->p_uid); ! 329: printf(" %3d", pp->p_slptime); ! 330: printf(" %3d", pp->p_time); ! 331: printf(" %4d", pp->p_cpu&0377); ! 332: printf(" %3d", pp->p_nice); ! 333: printf(" %6d", pp->p_pgrp); ! 334: printf(" %6d", pp->p_pid); ! 335: printf(" %6d", pp->p_ppid); ! 336: if (kflg) ! 337: pp->p_addr = (struct pte *)clear((int)pp->p_addr); ! 338: xxseek(fc, (long)(Usrptma+btokmx(pp->p_addr)), 0); ! 339: read(fc, &apte, sizeof(apte)); ! 340: printf(" %8x", ctob(apte.pg_pfnum+1) - sizeof(struct pte) * UPAGES); ! 341: printf(" %4x", pp->p_rssize); ! 342: printf(" %4x", pp->p_swrss); ! 343: printf(" %5x", pp->p_dsize+pp->p_ssize); ! 344: printf(" %7x", clear(pp->p_wchan)); ! 345: printf(" %7x", clear(pp->p_link)); ! 346: printf(" %7x", clear(pp->p_textp)); ! 347: printf(" %u", pp->p_clktim); ! 348: printf("\n"); ! 349: } ! 350: } ! 351: ! 352: dotty() ! 353: { ! 354: printf("redo tty stuff for new system\n"); ! 355: /* struct tty dz_tty[64]; ! 356: /* int ndz; ! 357: /* register struct tty *tp; ! 358: /* register char *mesg; ! 359: /* ! 360: /* printf("1 cons\n"); ! 361: /* if (kflg) ! 362: /* nl[SKL].n_value = clear(nl[SKL].n_value); ! 363: /* xxseek(fc, (long)nl[SKL].n_value, 0); ! 364: /* read(fc, dz_tty, sizeof(dz_tty[0])); ! 365: /* mesg = " # RAW CAN OUT MODE ADDR DEL COL STATE PGRP DISC\n"; ! 366: /* printf(mesg); ! 367: /* ttyprt(&dz_tty[0], 0); ! 368: /* if (nl[SNDZ].n_type == 0) ! 369: /* goto dh; ! 370: /* if (kflg) { ! 371: /* nl[SNDZ].n_value = clear(nl[SNDZ].n_value); ! 372: /* nl[SDZ].n_value = clear(nl[SDZ].n_value); ! 373: /* } ! 374: /* xxseek(fc, (long)nl[SNDZ].n_value, 0); ! 375: /* read(fc, &ndz, sizeof(ndz)); ! 376: /* printf("%d dz lines\n", ndz); ! 377: /* xxseek(fc, (long)nl[SDZ].n_value, 0); ! 378: /* read(fc, dz_tty, sizeof(dz_tty)); ! 379: /* for (tp = dz_tty; tp < &dz_tty[ndz]; tp++) ! 380: /* ttyprt(tp, tp - dz_tty); ! 381: /*dh: ! 382: /* if (nl[SNDH].n_type == 0) ! 383: /* return; ! 384: /* if (kflg) { ! 385: /* nl[SNDH].n_value = clear(nl[SNDH].n_value); ! 386: /* nl[SDH].n_value = clear(nl[SDH].n_value); ! 387: /* } ! 388: /* xxseek(fc, (long)nl[SNDH].n_value, 0); ! 389: /* read(fc, &ndz, sizeof(ndz)); ! 390: /* printf("%d dh lines\n", ndz); ! 391: /* xxseek(fc, (long)nl[SDH].n_value, 0); ! 392: /* read(fc, dz_tty, sizeof(dz_tty)); ! 393: /* for (tp = dz_tty; tp < &dz_tty[ndz]; tp++) ! 394: /* ttyprt(tp, tp - dz_tty); ! 395: /*} ! 396: /* ! 397: /*ttyprt(atp, line) ! 398: /*struct tty *atp; ! 399: /*{ ! 400: /* register struct tty *tp; ! 401: /* ! 402: /* printf("%2d", line); ! 403: /* tp = atp; ! 404: /* switch (tp->t_line) { ! 405: /* ! 406: /* case NETLDISC: ! 407: /* if (tp->t_rec) ! 408: /* printf("%4d%4d", 0, tp->t_inbuf); ! 409: /* else ! 410: /* printf("%4d%4d", tp->t_inbuf, 0); ! 411: /* break; ! 412: /* ! 413: /* default: ! 414: /* printf("%4d", tp->t_rawq.c_cc); ! 415: /* printf("%4d", tp->t_canq.c_cc); ! 416: /* } ! 417: /* printf("%4d", tp->t_outq.c_cc); ! 418: /* printf("%8.1o", tp->t_flags); ! 419: /* printf(" %8.1x", tp->t_addr); ! 420: /* printf("%3d", tp->t_delct); ! 421: /* printf("%4d ", tp->t_col); ! 422: /* putf(tp->t_state&TIMEOUT, 'T'); ! 423: /* putf(tp->t_state&WOPEN, 'W'); ! 424: /* putf(tp->t_state&ISOPEN, 'O'); ! 425: /* putf(tp->t_state&CARR_ON, 'C'); ! 426: /* putf(tp->t_state&BUSY, 'B'); ! 427: /* putf(tp->t_state&ASLEEP, 'A'); ! 428: /* putf(tp->t_state&XCLUDE, 'X'); ! 429: /* ! 430: /* putf(tp->t_state&HUPCLS, 'H'); ! 431: /* ! 432: /* printf("%6d", tp->t_pgrp); ! 433: /* switch (tp->t_line) { ! 434: /* ! 435: /* case NTTYDISC: ! 436: /* printf(" ntty"); ! 437: /* break; ! 438: /* ! 439: /* case NETLDISC: ! 440: /* printf(" net"); ! 441: /* break; ! 442: /* } ! 443: /* printf("\n");*/ ! 444: } ! 445: ! 446: dousr() ! 447: { ! 448: struct user U; ! 449: register i, j, *ip; ! 450: ! 451: /* This wins only if PAGSIZ > sizeof (struct user) */ ! 452: xxseek(fc, ubase * NBPG, 0); ! 453: read(fc, &U, sizeof(U)); ! 454: printf("pcb"); ! 455: ip = (int *)&U.u_pcb; ! 456: while (ip < &U.u_arg[0]) { ! 457: if ((ip - (int *)&U.u_pcb) % 4 == 0) ! 458: printf("\t"); ! 459: printf("%x ", *ip++); ! 460: if ((ip - (int *)&U.u_pcb) % 4 == 0) ! 461: printf("\n"); ! 462: } ! 463: if ((ip - (int *)&U.u_pcb) % 4 != 0) ! 464: printf("\n"); ! 465: printf("arg\t"); ! 466: for (i=0; i<5; i++) ! 467: printf(" %.1x", U.u_arg[i]); ! 468: printf("\n"); ! 469: for (i=0; i<sizeof(label_t)/sizeof(int); i++) { ! 470: if (i%5==0) ! 471: printf("\t"); ! 472: printf("%9.1x", U.u_ssav[i]); ! 473: if (i%5==4) ! 474: printf("\n"); ! 475: } ! 476: if (i%5) ! 477: printf("\n"); ! 478: printf("segflg\t%d\nerror %d\n", U.u_segflg, U.u_error); ! 479: printf("uids\t%d,%d,%d,%d\n", U.u_uid,U.u_gid,U.u_ruid,U.u_rgid); ! 480: printf("procp\t%.1x\n", U.u_procp); ! 481: printf("ap\t%.1x\n", U.u_ap); ! 482: printf("r_val?\t%.1x %.1x\n", U.u_r.r_val1, U.u_r.r_val2); ! 483: printf("base, count, offset %.1x %.1x %ld\n", U.u_base, ! 484: U.u_count, U.u_offset); ! 485: printf("cdir rdir %.1x %.1x\n", U.u_cdir, U.u_rdir); ! 486: printf("dbuf %.14s\n", U.u_dbuf); ! 487: printf("dirp %.1x\n", U.u_dirp); ! 488: printf("dent %d %.14s\n", U.u_dent.d_ino, U.u_dent.d_name); ! 489: printf("pdir %.1o\n", U.u_pdir); ! 490: printf("file\t"); ! 491: for (i=0; i<10; i++) ! 492: printf("%9.1x", U.u_ofile[i]); ! 493: printf("\n\t"); ! 494: for (i=10; i<NOFILE; i++) ! 495: printf("%9.1x", U.u_ofile[i]); ! 496: printf("\n"); ! 497: printf("pofile\t"); ! 498: for (i=0; i<10; i++) ! 499: printf("%9.1x", U.u_pofile[i]); ! 500: printf("\n\t"); ! 501: for (i=10; i<NOFILE; i++) ! 502: printf("%9.1x", U.u_pofile[i]); ! 503: printf("\n"); ! 504: printf("ssav"); ! 505: for (i=0; i<sizeof(label_t)/sizeof(int); i++) { ! 506: if (i%5==0) ! 507: printf("\t"); ! 508: printf("%9.1x", U.u_ssav[i]); ! 509: if (i%5==4) ! 510: printf("\n"); ! 511: } ! 512: if (i%5) ! 513: printf("\n"); ! 514: printf("sigs\t"); ! 515: for (i=0; i<NSIG; i++) ! 516: printf("%.1x ", U.u_signal[i]); ! 517: printf("\n"); ! 518: printf("ar0\t%.1x\n", U.u_ar0); ! 519: printf("prof\t%X %X %X %X\n", U.u_prof.pr_base, U.u_prof.pr_size, ! 520: U.u_prof.pr_off, U.u_prof.pr_scale); ! 521: printf("\neosys\t%d\n", U.u_eosys); ! 522: printf("sep\t%d\n", U.u_sep); ! 523: /* ! 524: printf("ttyp\t%.1x\n", U.u_ttyp); ! 525: printf("ttyd\t%d,%d\n", major(U.u_ttyd), minor(U.u_ttyd)); ! 526: */ ! 527: printf("exdata\t"); ! 528: ip = (int *)&U.u_exdata; ! 529: for (i = 0; i < 8; i++) ! 530: printf("%.1D ", *ip++); ! 531: printf("\n"); ! 532: printf("comm %.14s\n", U.u_comm); ! 533: printf("start\t%D\n", U.u_start); ! 534: printf("acflag\t%D\n", U.u_acflag); ! 535: printf("fpflag\t%D\n", U.u_fpflag); ! 536: printf("cmask\t%D\n", U.u_cmask); ! 537: printf("sizes\t%.1x %.1x %.1x\n", U.u_tsize, U.u_dsize, U.u_ssize); ! 538: printf("vm\t"); ! 539: ip = (int *)&U.u_vm; ! 540: for (i = 0; i < sizeof(U.u_vm)/sizeof(int); i++) ! 541: printf("%D ", ip[i]); ! 542: printf("\n"); ! 543: ip = (int *)&U.u_cvm; ! 544: printf("cvm\t"); ! 545: for (i = 0; i < sizeof(U.u_vm)/sizeof(int); i++) ! 546: printf("%D ", ip[i]); ! 547: printf("\n"); ! 548: /* ! 549: i = U.u_stack - &U; ! 550: while (U[++i] == 0); ! 551: i &= ~07; ! 552: while (i < 512) { ! 553: printf("%x ", 0140000+2*i); ! 554: for (j=0; j<8; j++) ! 555: printf("%9x", U[i++]); ! 556: printf("\n"); ! 557: } ! 558: */ ! 559: } ! 560: ! 561: oatoi(s) ! 562: char *s; ! 563: { ! 564: register v; ! 565: ! 566: v = 0; ! 567: while (*s) ! 568: v = (v<<3) + *s++ - '0'; ! 569: return(v); ! 570: } ! 571: ! 572: dofile() ! 573: { ! 574: int nfile; ! 575: struct file *xfile, *afile; ! 576: register struct file *fp; ! 577: register nf; ! 578: int loc; ! 579: ! 580: nf = 0; ! 581: nfile = getw(nl[SNFILE].n_value); ! 582: xfile = (struct file *)calloc(nfile, sizeof (struct file)); ! 583: xxseek(fc, (int)(afile = (struct file *)getw(nl[SFIL].n_value)), 0); ! 584: read(fc, xfile, nfile * sizeof (struct file)); ! 585: for (fp=xfile; fp < &xfile[nfile]; fp++) ! 586: if (fp->f_count) ! 587: nf++; ! 588: printf("%5d/%5d open files\n", nf, nfile); ! 589: if (totflg) ! 590: return; ! 591: printf(" LOC FLG CNT INO OFFS\n"); ! 592: for (fp=xfile,loc=nl[SFIL].n_value; fp < &xfile[nfile]; fp++,loc+=sizeof(xfile[0])) { ! 593: if (fp->f_count==0) ! 594: continue; ! 595: printf("%8x ", loc); ! 596: putf(fp->f_flag&FREAD, 'R'); ! 597: putf(fp->f_flag&FWRITE, 'W'); ! 598: putf(fp->f_flag&FPIPE, 'P'); ! 599: printf("%4d", mask(fp->f_count)); ! 600: printf("%9.1x", fp->f_inode); ! 601: printf(" %ld\n", fp->f_offset); ! 602: } ! 603: } ! 604: ! 605: doswap() ! 606: { ! 607: struct proc *proc; ! 608: int nproc; ! 609: struct text *xtext; ! 610: int ntext; ! 611: struct map *swapmap; ! 612: int nswapmap; ! 613: register struct proc *pp; ! 614: int nswap, used, tused, free; ! 615: register struct mapent *me; ! 616: register struct text *xp; ! 617: ! 618: nproc = getw(nl[SNPROC].n_value); ! 619: proc = (struct proc *)calloc(nproc, sizeof (struct proc)); ! 620: xxseek(fc, getw(nl[SPROC].n_value), 0); ! 621: read(fc, proc, nproc * sizeof (struct proc)); ! 622: nswapmap = getw(nl[SNSWAPMAP].n_value); ! 623: swapmap = (struct map *)calloc(nswapmap, sizeof (struct map)); ! 624: xxseek(fc, getw(nl[SWAPMAP].n_value), 0); ! 625: read(fc, swapmap, nswapmap * sizeof (struct map)); ! 626: nswap = getw(nl[SNSWAP].n_value); ! 627: free = 0; ! 628: for (me = (struct mapent *)(swapmap+1); ! 629: me < (struct mapent *)&swapmap[nswapmap]; me++) ! 630: free += me->m_size; ! 631: ntext = getw(nl[SNTEXT].n_value); ! 632: xtext = (struct text *)calloc(ntext, sizeof (struct text)); ! 633: xxseek(fc, getw(nl[STEXT].n_value), 0); ! 634: read(fc, xtext, ntext * sizeof (struct text)); ! 635: tused = 0; ! 636: for (xp = xtext; xp < &xtext[ntext]; xp++) ! 637: if (xp->x_iptr!=NULL) ! 638: tused += xdsize(xp); ! 639: used = tused; ! 640: for (pp = proc; pp < &proc[nproc]; pp++) { ! 641: if (pp->p_stat == 0 || pp->p_stat == SZOMB) ! 642: continue; ! 643: if (pp->p_flag & SSYS) ! 644: continue; ! 645: used += up(pp->p_dsize) + up(pp->p_ssize); ! 646: if ((pp->p_flag&SLOAD) == 0) ! 647: used += vusize(pp); ! 648: } ! 649: /* a DMMAX/2 block goes to argmap */ ! 650: if (totflg) ! 651: printf("%5d/%5d 00k swap\n", used/2/100, (used+free)/2/100); ! 652: printf("%d used (%d text), %d free, %d missing\n", ! 653: used/2, tused/2, free/2, (nswap - DMMAX/2 - (used + free))/2); ! 654: } ! 655: ! 656: doclk() ! 657: { ! 658: register int i; ! 659: unsigned int trimprof[3]; ! 660: ! 661: if (!nl[STRIMPROF].n_value) { ! 662: printf("Clock trim info unavailable.\n"); ! 663: return; ! 664: } ! 665: for (i = 0; i < 3; ++i) ! 666: trimprof[i] = getw(nl[STRIMPROF].n_value + (i * sizeof trimprof[0])); ! 667: printf("%12.12s %12.12s %12.12s\n", "SLOW", "ON TIME", "FAST"); ! 668: printf("%12d %12d %12d\n", trimprof[0], trimprof[1], trimprof[2]); ! 669: } ! 670: ! 671: up(size) ! 672: register int size; ! 673: { ! 674: register int i, block; ! 675: ! 676: i = 0; ! 677: block = DMMIN; ! 678: while (i < size) { ! 679: i += block; ! 680: if (block < DMMAX) ! 681: block *= 2; ! 682: } ! 683: return (i); ! 684: } ! 685: ! 686: vusize(p) ! 687: struct proc *p; ! 688: { ! 689: register int tsz = p->p_tsize / NPTEPG; ! 690: ! 691: return (clrnd(UPAGES + clrnd(ctopt(p->p_tsize+p->p_dsize+p->p_ssize+UPAGES)) - tsz)); ! 692: } ! 693: ! 694: xdsize(xp) ! 695: struct text *xp; ! 696: { ! 697: ! 698: if (xp->x_flag & XPAGI) ! 699: return (clrnd(xp->x_size + ctopt(xp->x_size))); ! 700: return (xp->x_size); ! 701: } ! 702: ! 703: xxseek(f, l) ! 704: long l; ! 705: { ! 706: return(lseek(f, l&seekmask, 0)); ! 707: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.