|
|
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/file.h> ! 10: #include <sys/user.h> ! 11: #include <sys/proc.h> ! 12: #include <sys/text.h> ! 13: #include <sys/inode.h> ! 14: #include <sys/conf.h> ! 15: #include <nlist.h> ! 16: #include <sys/vm.h> ! 17: #include <sys/pte.h> ! 18: #include <stdio.h> ! 19: ! 20: char *fcore = "/dev/mem"; ! 21: char *fnlist = "/unix"; ! 22: int fc; ! 23: ! 24: struct nlist nl[] = { ! 25: #define SINODE 0 ! 26: { "_inode" }, ! 27: #define STEXT 1 ! 28: { "_text" }, ! 29: #define SPROC 2 ! 30: { "_proc" }, ! 31: #define SFIL 3 ! 32: { "_file" }, ! 33: #define USRPTMA 4 ! 34: { "_Usrptmap" }, ! 35: #define USRPT 5 ! 36: { "_usrpt" }, ! 37: #define SNPROC 6 ! 38: { "_proccnt" }, ! 39: #define SNTEXT 7 ! 40: { "_textcnt" }, ! 41: #define SNFILE 8 ! 42: { "_filecnt" }, ! 43: #define SNINODE 9 ! 44: { "_inodecnt" }, ! 45: #define SNSWAPMAP 10 ! 46: { "_swmapcnt" }, ! 47: 0, ! 48: }; ! 49: ! 50: int inof; /* inode table */ ! 51: int txtf; /* text table */ ! 52: int prcf; /* proc table */ ! 53: int usrf; /* user struct */ ! 54: long ubase; ! 55: int filf; /* file table */ ! 56: int totflg; /* total table usage */ ! 57: char partab[1]; ! 58: struct cdevsw cdevsw[1]; ! 59: struct bdevsw bdevsw[1]; ! 60: int allflg; ! 61: int kflg; ! 62: struct pte *Usrptma; ! 63: struct pte *usrpt; ! 64: long seekmask = 0xffffffff; ! 65: ! 66: main(argc, argv) ! 67: char **argv; ! 68: { ! 69: register char *argp; ! 70: ! 71: argc--, argv++; ! 72: while (argc > 0 && **argv == '-') { ! 73: argp = *argv++; ! 74: argp++; ! 75: argc--; ! 76: while (*argp++) ! 77: switch (argp[-1]) { ! 78: ! 79: case 'T': ! 80: totflg++; ! 81: break; ! 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: seekmask = 0x7fffffff; ! 95: break; ! 96: ! 97: case 'x': ! 98: txtf++; ! 99: break; ! 100: ! 101: case 'p': ! 102: prcf++; ! 103: break; ! 104: ! 105: case 'u': ! 106: if (argc == 0) ! 107: break; ! 108: argc--; ! 109: usrf++; ! 110: sscanf( *argv++, "%x", &ubase); ! 111: break; ! 112: ! 113: case 'f': ! 114: filf++; ! 115: break; ! 116: } ! 117: } ! 118: if (argc>0) { ! 119: fcore = argv[0]; ! 120: seekmask = 0x7fffffff; ! 121: } ! 122: if ((fc = open(fcore, 0)) < 0) { ! 123: perror(fcore); ! 124: exit(1); ! 125: } ! 126: if (argc>1) ! 127: fnlist = argv[1]; ! 128: nlist(fnlist, nl); ! 129: if (nl[0].n_type == 0) { ! 130: fprintf(stderr, "no namelist\n"); ! 131: exit(1); ! 132: } ! 133: usrpt = (struct pte *)nl[USRPT].n_value; ! 134: Usrptma = (struct pte *)nl[USRPTMA].n_value; ! 135: if (filf||totflg) ! 136: dofile(); ! 137: if (inof||totflg) ! 138: doinode(); ! 139: if (prcf||totflg) ! 140: doproc(); ! 141: if (txtf||totflg) ! 142: dotext(); ! 143: if (usrf) ! 144: dousr(); ! 145: exit(0); ! 146: } ! 147: ! 148: doinode() ! 149: { ! 150: register struct inode *ip; ! 151: struct inode *xinode, *ainode; ! 152: register int nin; ! 153: int ninode; ! 154: ! 155: nin = 0; ! 156: ninode = getw(nl[SNINODE].n_value); ! 157: xinode = (struct inode *)calloc(ninode, sizeof (struct inode)); ! 158: xxseek(fc, (int)(ainode = (struct inode *)(nl[SINODE].n_value)), 0); ! 159: read(fc, xinode, ninode * sizeof(struct inode)); ! 160: for (ip = xinode; ip < &xinode[ninode]; ip++) ! 161: if (ip->i_count) ! 162: nin++; ! 163: printf("%5d/%5d inodes\n", nin, ninode); ! 164: if (totflg) ! 165: return; ! 166: printf(" LOC FLAGS CNT FS DEVICE INO MODE NLN UID SPTR SIZE/DEV MROOT\n"); ! 167: for (ip = xinode; ip < &xinode[ninode]; ip++) { ! 168: if (ip->i_count == 0) ! 169: continue; ! 170: printf("%8.1x ", ainode + (ip - xinode)); ! 171: putf(ip->i_flag&ILOCK, 'L'); ! 172: putf(ip->i_flag&IUPD, 'U'); ! 173: putf(ip->i_flag&IACC, 'A'); ! 174: putf(ip->i_flag&IOPEN, 'O'); ! 175: putf(ip->i_flag&IWANT, 'W'); ! 176: putf(ip->i_flag&ITEXT, 'T'); ! 177: printf("%4d", ip->i_count&0377); ! 178: printf("%3d", ip->i_fstyp); ! 179: printf("%4d,%3d", major(ip->i_dev), minor(ip->i_dev)); ! 180: printf("%6d", ip->i_number); ! 181: printf("%7o", ip->i_mode & 0xffff); ! 182: printf("%4d", ip->i_nlink); ! 183: printf("%4d", ip->i_uid); ! 184: printf("%8x", (int)ip->i_sptr&0xffffff); ! 185: if ((ip->i_mode&IFMT)==IFBLK || (ip->i_mode&IFMT)==IFCHR) ! 186: printf("%6d,%3d", major(ip->i_un.i_rdev), minor(ip->i_un.i_rdev)); ! 187: else ! 188: printf("%10ld", ip->i_size); ! 189: printf("%8x", (int)ip->i_mroot&0xfffffff); ! 190: printf("\n"); ! 191: } ! 192: free(xinode); ! 193: } ! 194: ! 195: getw(loc) ! 196: off_t loc; ! 197: { ! 198: int word; ! 199: ! 200: if (kflg) ! 201: loc &= 0x7fffffff; ! 202: xxseek(fc, loc, 0); ! 203: read(fc, &word, sizeof (word)); ! 204: if (kflg) ! 205: word &= 0x7fffffff; ! 206: return (word); ! 207: } ! 208: ! 209: putf(v, n) ! 210: { ! 211: if (v) ! 212: printf("%c", n); ! 213: else ! 214: printf(" "); ! 215: } ! 216: ! 217: dotext() ! 218: { ! 219: register struct text *xp; ! 220: int ntext; ! 221: struct text *xtext, *atext; ! 222: int ntx; ! 223: ! 224: ntx = 0; ! 225: ntext = getw(nl[SNTEXT].n_value); ! 226: xtext = (struct text *)calloc(ntext, sizeof (struct text)); ! 227: xxseek(fc, (int)(atext = (struct text *)(nl[STEXT].n_value)), 0); ! 228: read(fc, xtext, ntext * sizeof (struct text)); ! 229: for (xp = xtext; xp < &xtext[ntext]; xp++) ! 230: if (xp->x_iptr!=NULL) ! 231: ntx++; ! 232: printf("%5d/%5d active texts\n", ntx, ntext); ! 233: if (totflg) ! 234: return; ! 235: printf(" LOC FLAGS DADDR CADDR RSS SIZE IPTR CNT CCNT\n"); ! 236: for (xp = xtext; xp < &xtext[ntext]; xp++) { ! 237: if (xp->x_iptr == NULL) ! 238: continue; ! 239: printf("%8.1x", atext + (xp - xtext)); ! 240: printf(" "); ! 241: putf(xp->x_flag&XPAGI, 'P'); ! 242: putf(xp->x_flag&XTRC, 'T'); ! 243: putf(xp->x_flag&XWRIT, 'W'); ! 244: putf(xp->x_flag&XLOAD, 'L'); ! 245: putf(xp->x_flag&XLOCK, 'K'); ! 246: putf(xp->x_flag&XWANT, 'w'); ! 247: printf("%5x", xp->x_daddr[0]); ! 248: printf("%11x", xp->x_caddr); ! 249: printf("%5d", xp->x_rssize); ! 250: printf("%5d", xp->x_size); ! 251: printf("%10.1x", xp->x_iptr); ! 252: printf("%5d", xp->x_count&0377); ! 253: printf("%5d", xp->x_ccount); ! 254: printf("\n"); ! 255: } ! 256: free(xtext); ! 257: } ! 258: ! 259: doproc() ! 260: { ! 261: struct proc *xproc, *aproc; ! 262: int nproc; ! 263: register struct proc *pp; ! 264: register np; ! 265: ! 266: nproc = getw(nl[SNPROC].n_value); ! 267: xproc = (struct proc *)calloc(nproc, sizeof (struct proc)); ! 268: xxseek(fc, (int)(aproc = (struct proc *)(nl[SPROC].n_value)), 0); ! 269: read(fc, xproc, nproc * sizeof (struct proc)); ! 270: np = 0; ! 271: for (pp=xproc; pp < &xproc[nproc]; pp++) ! 272: if (pp->p_stat) ! 273: np++; ! 274: printf("%5d/%5d processes\n", np, nproc); ! 275: if (totflg) ! 276: return; ! 277: printf(" LOC S F ADDR PRI SIG UID SLP TIM CPU NI PGRP PID PPID RSS SRSS SIZE WCHAN LINK TEXTP CLKT\n"); ! 278: for (pp=xproc; pp<&xproc[nproc]; pp++) { ! 279: if (pp->p_stat==0 && allflg==0) ! 280: continue; ! 281: printf("%8x", aproc + (pp - xproc)); ! 282: printf(" %2d", pp->p_stat); ! 283: printf(" %4x", pp->p_flag & 0xffff); ! 284: printf(" %8x", pp->p_addr); ! 285: printf(" %3d", pp->p_pri); ! 286: printf(" %4x", pp->p_sig); ! 287: printf(" %4d", pp->p_uid); ! 288: printf(" %3d", pp->p_slptime); ! 289: printf(" %3d", pp->p_time); ! 290: printf(" %4d", pp->p_cpu&0377); ! 291: printf(" %3d", pp->p_nice); ! 292: printf(" %6d", pp->p_pgrp); ! 293: printf(" %6d", pp->p_pid); ! 294: printf(" %6d", pp->p_ppid); ! 295: printf(" %4x", pp->p_rssize); ! 296: printf(" %4x", pp->p_swrss); ! 297: printf(" %5x", pp->p_dsize+pp->p_ssize); ! 298: printf(" %7x", clear(pp->p_wchan)); ! 299: printf(" %7x", clear(pp->p_link)); ! 300: printf(" %7x", clear(pp->p_textp)); ! 301: printf(" %u", pp->p_clktim); ! 302: printf("\n"); ! 303: } ! 304: } ! 305: ! 306: dousr() ! 307: { ! 308: struct user U; ! 309: register i, *ip; ! 310: ! 311: /* This wins only if PAGSIZ > sizeof (struct user) */ ! 312: xxseek(fc, ubase * NBPG, 0); ! 313: read(fc, &U, sizeof(U)); ! 314: printf("pcb"); ! 315: ip = (int *)&U.u_pcb; ! 316: while (ip < &U.u_arg[0]) { ! 317: if ((ip - (int *)&U.u_pcb) % 4 == 0) ! 318: printf("\t"); ! 319: printf("%x ", *ip++); ! 320: if ((ip - (int *)&U.u_pcb) % 4 == 0) ! 321: printf("\n"); ! 322: } ! 323: if ((ip - (int *)&U.u_pcb) % 4 != 0) ! 324: printf("\n"); ! 325: printf("arg\t"); ! 326: for (i=0; i<5; i++) ! 327: printf(" %.1x", U.u_arg[i]); ! 328: printf("\n"); ! 329: for (i=0; i<sizeof(label_t)/sizeof(int); i++) { ! 330: if (i%5==0) ! 331: printf("\t"); ! 332: printf("%9.1x", U.u_ssav[i]); ! 333: if (i%5==4) ! 334: printf("\n"); ! 335: } ! 336: if (i%5) ! 337: printf("\n"); ! 338: printf("segflg\t%d\nerror %d\n", U.u_segflg, U.u_error); ! 339: printf("uids\t%d,%d,%d,%d\n", U.u_uid,U.u_gid,U.u_ruid,U.u_rgid); ! 340: printf("procp\t%.1x\n", U.u_procp); ! 341: printf("ap\t%.1x\n", U.u_ap); ! 342: printf("r_val?\t%.1x %.1x\n", U.u_r.r_val1, U.u_r.r_val2); ! 343: printf("base, count, offset %.1x %.1x %ld\n", U.u_base, ! 344: U.u_count, U.u_offset); ! 345: printf("cdir rdir %.1x %.1x\n", U.u_cdir, U.u_rdir); ! 346: printf("file\t"); ! 347: for (i=0; i<10; i++) ! 348: printf("%9.1x", U.u_ofile[i]); ! 349: printf("\n\t"); ! 350: for (i=10; i<NOFILE; i++) ! 351: printf("%9.1x", U.u_ofile[i]); ! 352: printf("\n"); ! 353: printf("pofile\t"); ! 354: for (i=0; i<10; i++) ! 355: printf("%9.1x", U.u_pofile[i]); ! 356: printf("\n\t"); ! 357: for (i=10; i<NOFILE; i++) ! 358: printf("%9.1x", U.u_pofile[i]); ! 359: printf("\n"); ! 360: printf("ssav"); ! 361: for (i=0; i<sizeof(label_t)/sizeof(int); i++) { ! 362: if (i%5==0) ! 363: printf("\t"); ! 364: printf("%9.1x", U.u_ssav[i]); ! 365: if (i%5==4) ! 366: printf("\n"); ! 367: } ! 368: if (i%5) ! 369: printf("\n"); ! 370: printf("sigs\t"); ! 371: for (i=0; i<NSIG; i++) ! 372: printf("%.1x ", U.u_signal[i]); ! 373: printf("\n"); ! 374: printf("ar0\t%.1x\n", U.u_ar0); ! 375: printf("prof\t%X %X %X %X\n", U.u_prof.pr_base, U.u_prof.pr_size, ! 376: U.u_prof.pr_off, U.u_prof.pr_scale); ! 377: /* ! 378: printf("ttyp\t%.1x\n", U.u_ttyp); ! 379: printf("ttyd\t%d,%d\n", major(U.u_ttyd), minor(U.u_ttyd)); ! 380: */ ! 381: printf("exdata\t"); ! 382: ip = (int *)&U.u_exdata; ! 383: for (i = 0; i < 8; i++) ! 384: printf("%.1D ", *ip++); ! 385: printf("\n"); ! 386: printf("comm %.14s\n", U.u_comm); ! 387: printf("start\t%D\n", U.u_start); ! 388: printf("acflag\t%D\n", U.u_acflag); ! 389: printf("cmask\t%D\n", U.u_cmask); ! 390: printf("sizes\t%.1x %.1x %.1x\n", U.u_tsize, U.u_dsize, U.u_ssize); ! 391: printf("vm\t"); ! 392: ip = (int *)&U.u_vm; ! 393: for (i = 0; i < sizeof(U.u_vm)/sizeof(int); i++) ! 394: printf("%D ", ip[i]); ! 395: printf("\n"); ! 396: ip = (int *)&U.u_cvm; ! 397: printf("cvm\t"); ! 398: for (i = 0; i < sizeof(U.u_vm)/sizeof(int); i++) ! 399: printf("%D ", ip[i]); ! 400: printf("\n"); ! 401: /* ! 402: i = U.u_stack - &U; ! 403: while (U[++i] == 0); ! 404: i &= ~07; ! 405: while (i < 512) { ! 406: printf("%x ", 0140000+2*i); ! 407: for (j=0; j<8; j++) ! 408: printf("%9x", U[i++]); ! 409: printf("\n"); ! 410: } ! 411: */ ! 412: } ! 413: ! 414: oatoi(s) ! 415: char *s; ! 416: { ! 417: register v; ! 418: ! 419: v = 0; ! 420: while (*s) ! 421: v = (v<<3) + *s++ - '0'; ! 422: return(v); ! 423: } ! 424: ! 425: dofile() ! 426: { ! 427: int nfile; ! 428: struct file *xfile, *afile; ! 429: register struct file *fp; ! 430: register nf; ! 431: ! 432: nf = 0; ! 433: nfile = getw(nl[SNFILE].n_value); ! 434: xfile = (struct file *)calloc(nfile, sizeof (struct file)); ! 435: xxseek(fc, (int)(afile = (struct file *)(nl[SFIL].n_value)), 0); ! 436: read(fc, xfile, nfile * sizeof (struct file)); ! 437: for (fp=xfile; fp < &xfile[nfile]; fp++) ! 438: if (fp->f_count) ! 439: nf++; ! 440: printf("%5d/%5d open files\n", nf, nfile); ! 441: if (totflg) ! 442: return; ! 443: printf(" LOC FLG CNT INO OFFS\n"); ! 444: for (fp=xfile; fp < &xfile[nfile]; fp++,afile++) { ! 445: if (fp->f_count==0) ! 446: continue; ! 447: printf("%8x ", afile); ! 448: putf(fp->f_flag&FREAD, 'R'); ! 449: putf(fp->f_flag&FWRITE, 'W'); ! 450: putf(fp->f_flag&FHUNGUP, 'H'); ! 451: printf("%4d", mask(fp->f_count)); ! 452: printf("%9.1x", fp->f_inode); ! 453: printf(" %ld\n", fp->f_offset); ! 454: } ! 455: } ! 456: ! 457: xxseek(f, l, w) ! 458: long l; ! 459: { ! 460: return(lseek(f, l&seekmask, w)); ! 461: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.