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