added depend label
[unix-history] / usr / src / usr.bin / vmstat / vmstat.c
CommitLineData
f42904bc
DF
1/*
2 * Copyright (c) 1980 Regents of the University of California.
3 * All rights reserved. The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
5 */
6
7#ifndef lint
8char copyright[] =
9"@(#) Copyright (c) 1980 Regents of the University of California.\n\
10 All rights reserved.\n";
11#endif not lint
12
338c4a5d 13#ifndef lint
9a122ff6 14static char sccsid[] = "@(#)vmstat.c 5.8 (Berkeley) %G%";
f42904bc 15#endif not lint
338c4a5d 16
7f02df2f 17#include <stdio.h>
a448353a
SL
18#include <ctype.h>
19#include <nlist.h>
20
7f02df2f 21#include <sys/param.h>
a448353a 22#include <sys/file.h>
7f02df2f 23#include <sys/vm.h>
920a4346 24#include <sys/dkstat.h>
61d7d2b3 25#include <sys/buf.h>
dfdfb4c8 26#include <sys/dir.h>
a448353a 27#include <sys/inode.h>
4b894a2c 28#include <sys/namei.h>
242684ee 29#include <sys/text.h>
7f02df2f
BJ
30
31struct nlist nl[] = {
682f1dcb
BJ
32#define X_CPTIME 0
33 { "_cp_time" },
34#define X_RATE 1
7f02df2f 35 { "_rate" },
682f1dcb 36#define X_TOTAL 2
7f02df2f 37 { "_total" },
682f1dcb 38#define X_DEFICIT 3
7f02df2f 39 { "_deficit" },
682f1dcb 40#define X_FORKSTAT 4
7f02df2f 41 { "_forkstat" },
682f1dcb 42#define X_SUM 5
7f02df2f 43 { "_sum" },
682f1dcb 44#define X_FIRSTFREE 6
7f02df2f 45 { "_firstfree" },
682f1dcb 46#define X_MAXFREE 7
7f02df2f 47 { "_maxfree" },
a43be079
SL
48#define X_BOOTTIME 8
49 { "_boottime" },
682f1dcb
BJ
50#define X_DKXFER 9
51 { "_dk_xfer" },
338c4a5d 52#define X_REC 10
7f02df2f 53 { "_rectime" },
338c4a5d 54#define X_PGIN 11
7f02df2f 55 { "_pgintime" },
338c4a5d 56#define X_HZ 12
61d7d2b3 57 { "_hz" },
a448353a 58#define X_PHZ 13
b3a37270 59 { "_phz" },
dfdfb4c8
KM
60#define X_NCHSTATS 14
61 { "_nchstats" },
4b894a2c
KM
62#define X_INTRNAMES 15
63 { "_intrnames" },
64#define X_EINTRNAMES 16
65 { "_eintrnames" },
66#define X_INTRCNT 17
67 { "_intrcnt" },
68#define X_EINTRCNT 18
69 { "_eintrcnt" },
a448353a
SL
70#define X_DK_NDRIVE 19
71 { "_dk_ndrive" },
b6b10463
SL
72#define X_XSTATS 20
73 { "_xstats" },
338c4a5d 74#ifdef vax
242684ee 75#define X_MBDINIT (X_XSTATS+1)
338c4a5d 76 { "_mbdinit" },
242684ee 77#define X_UBDINIT (X_XSTATS+2)
338c4a5d 78 { "_ubdinit" },
242684ee 79#endif
242684ee
SL
80#ifdef tahoe
81#define X_VBDINIT (X_XSTATS+1)
82 { "_vbdinit" },
7aa7d88f
SL
83#define X_CKEYSTATS (X_XSTATS+2)
84 { "_ckeystats" },
85#define X_DKEYSTATS (X_XSTATS+3)
86 { "_dkeystats" },
338c4a5d
SL
87#endif
88 { "" },
7f02df2f
BJ
89};
90
a448353a
SL
91char **dr_name;
92int *dr_select;
93int dk_ndrive;
94int ndrives = 0;
95#ifdef vax
96char *defdrives[] = { "hp0", "hp1", "hp2", 0 };
97#else
98char *defdrives[] = { 0 };
99#endif
7f02df2f
BJ
100double stat1();
101int firstfree, maxfree;
61d7d2b3 102int hz;
b3a37270
SL
103int phz;
104int HZ;
a448353a 105
a448353a 106struct {
7f02df2f 107 int busy;
682f1dcb 108 long time[CPUSTATES];
a448353a 109 long *xfer;
7f02df2f
BJ
110 struct vmmeter Rate;
111 struct vmtotal Total;
112 struct vmmeter Sum;
113 struct forkstat Forkstat;
7f02df2f
BJ
114 unsigned rectime;
115 unsigned pgintime;
7f02df2f
BJ
116} s, s1, z;
117#define rate s.Rate
118#define total s.Total
119#define sum s.Sum
120#define forkstat s.Forkstat
121
338c4a5d 122struct vmmeter osum;
7f02df2f
BJ
123int deficit;
124double etime;
125int mf;
4b894a2c
KM
126time_t now, boottime;
127int printhdr();
196ccf10 128int lines = 1;
7f02df2f 129
920a4346
SL
130#define INTS(x) ((x) - (hz + phz))
131
7f02df2f 132main(argc, argv)
338c4a5d
SL
133 int argc;
134 char **argv;
7f02df2f 135{
7f02df2f 136 extern char *ctime();
920a4346 137 register i;
4b894a2c 138 int iter, nintv, iflag = 0;
7f02df2f 139 long t;
920a4346 140 char *arg, **cp, buf[BUFSIZ];
7f02df2f 141
7f02df2f
BJ
142 nlist("/vmunix", nl);
143 if(nl[0].n_type == 0) {
920a4346 144 fprintf(stderr, "no /vmunix namelist\n");
7f02df2f
BJ
145 exit(1);
146 }
147 mf = open("/dev/kmem", 0);
148 if(mf < 0) {
920a4346 149 fprintf(stderr, "cannot open /dev/kmem\n");
7f02df2f
BJ
150 exit(1);
151 }
152 iter = 0;
153 argc--, argv++;
154 while (argc>0 && argv[0][0]=='-') {
155 char *cp = *argv++;
156 argc--;
157 while (*++cp) switch (*cp) {
158
7f02df2f
BJ
159 case 't':
160 dotimes();
161 exit(0);
338c4a5d 162
7f02df2f
BJ
163 case 'z':
164 close(mf);
165 mf = open("/dev/kmem", 2);
a448353a 166 lseek(mf, (long)nl[X_SUM].n_value, L_SET);
7f02df2f
BJ
167 write(mf, &z.Sum, sizeof z.Sum);
168 exit(0);
169
170 case 'f':
171 doforkst();
172 exit(0);
173
174 case 's':
175 dosum();
176 exit(0);
177
4b894a2c
KM
178 case 'i':
179 iflag++;
180 break;
181
7f02df2f 182 default:
a448353a
SL
183 fprintf(stderr,
184 "usage: vmstat [ -fsi ] [ interval ] [ count]\n");
7f02df2f
BJ
185 exit(1);
186 }
187 }
a448353a 188 lseek(mf, (long)nl[X_FIRSTFREE].n_value, L_SET);
7f02df2f 189 read(mf, &firstfree, sizeof firstfree);
a448353a 190 lseek(mf, (long)nl[X_MAXFREE].n_value, L_SET);
7f02df2f 191 read(mf, &maxfree, sizeof maxfree);
a448353a 192 lseek(mf, (long)nl[X_BOOTTIME].n_value, L_SET);
a43be079 193 read(mf, &boottime, sizeof boottime);
a448353a 194 lseek(mf, (long)nl[X_HZ].n_value, L_SET);
61d7d2b3 195 read(mf, &hz, sizeof hz);
a448353a
SL
196 if (nl[X_PHZ].n_value != 0) {
197 lseek(mf, (long)nl[X_PHZ].n_value, L_SET);
198 read(mf, &phz, sizeof phz);
199 }
b3a37270 200 HZ = phz ? phz : hz;
9a122ff6 201 if (nl[X_DK_NDRIVE].n_value == 0) {
920a4346 202 fprintf(stderr, "dk_ndrive undefined in system\n");
a448353a
SL
203 exit(1);
204 }
205 lseek(mf, nl[X_DK_NDRIVE].n_value, L_SET);
206 read(mf, &dk_ndrive, sizeof (dk_ndrive));
207 if (dk_ndrive <= 0) {
920a4346 208 fprintf(stderr, "dk_ndrive %d\n", dk_ndrive);
a448353a
SL
209 exit(1);
210 }
211 dr_select = (int *)calloc(dk_ndrive, sizeof (int));
212 dr_name = (char **)calloc(dk_ndrive, sizeof (char *));
213#define allocate(e, t) \
214 s./**/e = (t *)calloc(dk_ndrive, sizeof (t)); \
215 s1./**/e = (t *)calloc(dk_ndrive, sizeof (t));
216 allocate(xfer, long);
217 for (arg = buf, i = 0; i < dk_ndrive; i++) {
218 dr_name[i] = arg;
219 sprintf(dr_name[i], "dk%d", i);
220 arg += strlen(dr_name[i]) + 1;
61d7d2b3
MT
221 }
222 read_names();
7f02df2f 223 time(&now);
a43be079 224 nintv = now - boottime;
7f02df2f 225 if (nintv <= 0 || nintv > 60*60*24*365*10) {
920a4346
SL
226 fprintf(stderr,
227 "Time makes no sense... namelist must be wrong.\n");
7f02df2f
BJ
228 exit(1);
229 }
4b894a2c
KM
230 if (iflag) {
231 dointr(nintv);
232 exit(0);
233 }
a448353a
SL
234 /*
235 * Choose drives to be displayed. Priority
236 * goes to (in order) drives supplied as arguments,
237 * default drives. If everything isn't filled
238 * in and there are drives not taken care of,
239 * display the first few that fit.
240 */
241 ndrives = 0;
242 while (argc > 0 && !isdigit(argv[0][0])) {
243 for (i = 0; i < dk_ndrive; i++) {
244 if (strcmp(dr_name[i], argv[0]))
245 continue;
246 dr_select[i] = 1;
247 ndrives++;
248 }
249 argc--, argv++;
250 }
251 for (i = 0; i < dk_ndrive && ndrives < 4; i++) {
252 if (dr_select[i])
253 continue;
254 for (cp = defdrives; *cp; cp++)
255 if (strcmp(dr_name[i], *cp) == 0) {
256 dr_select[i] = 1;
257 ndrives++;
258 break;
259 }
260 }
261 for (i = 0; i < dk_ndrive && ndrives < 4; i++) {
262 if (dr_select[i])
263 continue;
264 dr_select[i] = 1;
265 ndrives++;
266 }
267 if (argc > 1)
268 iter = atoi(argv[1]);
4b894a2c 269 signal(SIGCONT, printhdr);
7f02df2f 270loop:
196ccf10
SL
271 if (--lines == 0)
272 printhdr();
a448353a 273 lseek(mf, (long)nl[X_CPTIME].n_value, L_SET);
682f1dcb 274 read(mf, s.time, sizeof s.time);
a448353a
SL
275 lseek(mf, (long)nl[X_DKXFER].n_value, L_SET);
276 read(mf, s.xfer, dk_ndrive * sizeof (long));
277 if (nintv != 1)
278 lseek(mf, (long)nl[X_SUM].n_value, L_SET);
279 else
280 lseek(mf, (long)nl[X_RATE].n_value, L_SET);
281 read(mf, &rate, sizeof rate);
282 lseek(mf, (long)nl[X_TOTAL].n_value, L_SET);
7f02df2f 283 read(mf, &total, sizeof total);
338c4a5d 284 osum = sum;
a448353a 285 lseek(mf, (long)nl[X_SUM].n_value, L_SET);
338c4a5d 286 read(mf, &sum, sizeof sum);
a448353a 287 lseek(mf, (long)nl[X_DEFICIT].n_value, L_SET);
7f02df2f 288 read(mf, &deficit, sizeof deficit);
682f1dcb 289 etime = 0;
a448353a 290 for (i=0; i < dk_ndrive; i++) {
682f1dcb
BJ
291 t = s.xfer[i];
292 s.xfer[i] -= s1.xfer[i];
293 s1.xfer[i] = t;
7f02df2f
BJ
294 }
295 for (i=0; i < CPUSTATES; i++) {
682f1dcb
BJ
296 t = s.time[i];
297 s.time[i] -= s1.time[i];
298 s1.time[i] = t;
299 etime += s.time[i];
7f02df2f 300 }
7f02df2f
BJ
301 if(etime == 0.)
302 etime = 1.;
61d7d2b3 303 printf("%2d%2d%2d", total.t_rq, total.t_dw+total.t_pw, total.t_sw);
338c4a5d 304#define pgtok(a) ((a)*NBPG/1024)
920a4346 305 printf("%6d%6d", pgtok(total.t_avm), pgtok(total.t_free));
b3a37270
SL
306 printf("%4d%3d", (rate.v_pgrec - (rate.v_xsfrec+rate.v_xifrec))/nintv,
307 (rate.v_xsfrec+rate.v_xifrec)/nintv);
338c4a5d
SL
308 printf("%4d", pgtok(rate.v_pgpgin)/nintv);
309 printf("%4d%4d%4d%4d", pgtok(rate.v_pgpgout)/nintv,
310 pgtok(rate.v_dfree)/nintv, pgtok(deficit), rate.v_scan/nintv);
a448353a
SL
311 etime /= (float)HZ;
312 for (i = 0; i < dk_ndrive; i++)
313 if (dr_select[i])
314 stats(i);
b3a37270
SL
315 printf("%4d%4d%4d", INTS(rate.v_intr/nintv), rate.v_syscall/nintv,
316 rate.v_swtch/nintv);
7f02df2f
BJ
317 for(i=0; i<CPUSTATES; i++) {
318 float f = stat1(i);
319 if (i == 0) { /* US+NI */
320 i++;
321 f += stat1(i);
322 }
323 printf("%3.0f", f);
324 }
325 printf("\n");
326 fflush(stdout);
7f02df2f 327 nintv = 1;
196ccf10 328 if (--iter &&argc > 0) {
7f02df2f 329 sleep(atoi(argv[0]));
7f02df2f
BJ
330 goto loop;
331 }
332}
333
4b894a2c
KM
334printhdr()
335{
a448353a
SL
336 register int i, j;
337
920a4346 338 printf(" procs memory page ");
a448353a
SL
339 i = (ndrives * 3 - 6) / 2;
340 if (i < 0)
341 i = 0;
342 for (j = 0; j < i; j++)
343 putchar(' ');
344 printf("faults");
345 i = ndrives * 3 - 6 - i;
346 for (j = 0; j < i; j++)
347 putchar(' ');
348 printf(" cpu\n");
920a4346 349 printf(" r b w avm fre re at pi po fr de sr ");
a448353a
SL
350 for (i = 0; i < dk_ndrive; i++)
351 if (dr_select[i])
352 printf("%c%c ", dr_name[i][0], dr_name[i][2]);
353 printf(" in sy cs us sy id\n");
196ccf10 354 lines = 19;
4b894a2c
KM
355}
356
7f02df2f
BJ
357dotimes()
358{
359
a448353a 360 lseek(mf, (long)nl[X_REC].n_value, L_SET);
7f02df2f 361 read(mf, &s.rectime, sizeof s.rectime);
a448353a 362 lseek(mf, (long)nl[X_PGIN].n_value, L_SET);
7f02df2f 363 read(mf, &s.pgintime, sizeof s.pgintime);
a448353a 364 lseek(mf, (long)nl[X_SUM].n_value, L_SET);
7f02df2f
BJ
365 read(mf, &sum, sizeof sum);
366 printf("%d reclaims, %d total time (usec)\n", sum.v_pgrec, s.rectime);
367 printf("average: %d usec / reclaim\n", s.rectime/sum.v_pgrec);
368 printf("\n");
369 printf("%d page ins, %d total time (msec)\n",sum.v_pgin, s.pgintime/10);
370 printf("average: %8.1f msec / page in\n", s.pgintime/(sum.v_pgin*10.0));
371}
7f02df2f 372
70b78b6e
SL
373#if defined(tahoe)
374#include <tahoe/cpu.h>
375#endif
376
7f02df2f
BJ
377dosum()
378{
a448353a 379 struct nchstats nchstats;
7aa7d88f 380 struct xstats xstats;
dfdfb4c8 381 long nchtotal;
7aa7d88f
SL
382#if defined(tahoe)
383 struct keystats keystats;
384#endif
7f02df2f 385
a448353a 386 lseek(mf, (long)nl[X_SUM].n_value, L_SET);
7f02df2f
BJ
387 read(mf, &sum, sizeof sum);
388 printf("%9d swap ins\n", sum.v_swpin);
389 printf("%9d swap outs\n", sum.v_swpout);
390 printf("%9d pages swapped in\n", sum.v_pswpin / CLSIZE);
391 printf("%9d pages swapped out\n", sum.v_pswpout / CLSIZE);
392 printf("%9d total address trans. faults taken\n", sum.v_faults);
393 printf("%9d page ins\n", sum.v_pgin);
394 printf("%9d page outs\n", sum.v_pgout);
513dfff1
BJ
395 printf("%9d pages paged in\n", sum.v_pgpgin);
396 printf("%9d pages paged out\n", sum.v_pgpgout);
397 printf("%9d sequential process pages freed\n", sum.v_seqfree);
e23f616a 398 printf("%9d total reclaims (%d%% fast)\n", sum.v_pgrec,
920a4346 399 pct(sum.v_fastpgrec, sum.v_pgrec));
7f02df2f
BJ
400 printf("%9d reclaims from free list\n", sum.v_pgfrec);
401 printf("%9d intransit blocking page faults\n", sum.v_intrans);
402 printf("%9d zero fill pages created\n", sum.v_nzfod / CLSIZE);
403 printf("%9d zero fill page faults\n", sum.v_zfod / CLSIZE);
404 printf("%9d executable fill pages created\n", sum.v_nexfod / CLSIZE);
405 printf("%9d executable fill page faults\n", sum.v_exfod / CLSIZE);
406 printf("%9d swap text pages found in free list\n", sum.v_xsfrec);
407 printf("%9d inode text pages found in free list\n", sum.v_xifrec);
408 printf("%9d file fill pages created\n", sum.v_nvrfod / CLSIZE);
409 printf("%9d file fill page faults\n", sum.v_vrfod / CLSIZE);
410 printf("%9d pages examined by the clock daemon\n", sum.v_scan);
411 printf("%9d revolutions of the clock hand\n", sum.v_rev);
412 printf("%9d pages freed by the clock daemon\n", sum.v_dfree / CLSIZE);
413 printf("%9d cpu context switches\n", sum.v_swtch);
414 printf("%9d device interrupts\n", sum.v_intr);
4b894a2c 415 printf("%9d software interrupts\n", sum.v_soft);
a448353a 416#ifdef vax
3d61d7ac 417 printf("%9d pseudo-dma dz interrupts\n", sum.v_pdma);
a448353a 418#endif
7f02df2f
BJ
419 printf("%9d traps\n", sum.v_trap);
420 printf("%9d system calls\n", sum.v_syscall);
dfdfb4c8 421 lseek(mf, (long)nl[X_NCHSTATS].n_value, 0);
a448353a
SL
422 read(mf, &nchstats, sizeof nchstats);
423 nchtotal = nchstats.ncs_goodhits + nchstats.ncs_badhits +
424 nchstats.ncs_falsehits + nchstats.ncs_miss + nchstats.ncs_long;
dfdfb4c8
KM
425 printf("%9d total name lookups", nchtotal);
426 printf(" (cache hits %d%% system %d%% per-process)\n",
920a4346
SL
427 pct(nchstats.ncs_goodhits, nchtotal),
428 pct(nchstats.ncs_pass2, nchtotal));
c8520a5c 429 printf("%9s badhits %d, falsehits %d, toolong %d\n", "",
a448353a 430 nchstats.ncs_badhits, nchstats.ncs_falsehits, nchstats.ncs_long);
b6b10463
SL
431 lseek(mf, (long)nl[X_XSTATS].n_value, 0);
432 read(mf, &xstats, sizeof xstats);
433 printf("%9d total calls to xalloc (cache hits %d%%)\n",
920a4346 434 xstats.alloc, pct(xstats.alloc_cachehit, xstats.alloc));
b6b10463
SL
435 printf("%9s sticky %d flushed %d unused %d\n", "",
436 xstats.alloc_inuse, xstats.alloc_cacheflush, xstats.alloc_unused);
437 printf("%9d total calls to xfree", xstats.free);
438 printf(" (sticky %d cached %d swapped %d)\n",
439 xstats.free_inuse, xstats.free_cache, xstats.free_cacheswap);
7aa7d88f
SL
440#if defined(tahoe)
441 lseek(mf, (long)nl[X_CKEYSTATS].n_value, 0);
442 read(mf, &keystats, sizeof keystats);
443 printf("%9d %s (free %d%% norefs %d%% taken %d%% shared %d%%)\n",
444 keystats.ks_allocs, "code cache keys allocated",
920a4346
SL
445 pct(keystats.ks_free, keystats.ks_allocs),
446 pct(keystats.ks_norefs, keystats.ks_allocs),
447 pct(keystats.ks_taken, keystats.ks_allocs),
448 pct(keystats.ks_shared, keystats.ks_allocs));
7aa7d88f
SL
449 lseek(mf, (long)nl[X_DKEYSTATS].n_value, 0);
450 read(mf, &keystats, sizeof keystats);
451 printf("%9d %s (free %d%% norefs %d%% taken %d%% shared %d%%)\n",
452 keystats.ks_allocs, "data cache keys allocated",
920a4346
SL
453 pct(keystats.ks_free, keystats.ks_allocs),
454 pct(keystats.ks_norefs, keystats.ks_allocs),
455 pct(keystats.ks_taken, keystats.ks_allocs),
456 pct(keystats.ks_shared, keystats.ks_allocs));
7aa7d88f 457#endif
7f02df2f
BJ
458}
459
7f02df2f
BJ
460doforkst()
461{
462
a448353a 463 lseek(mf, (long)nl[X_FORKSTAT].n_value, L_SET);
7f02df2f
BJ
464 read(mf, &forkstat, sizeof forkstat);
465 printf("%d forks, %d pages, average=%.2f\n",
466 forkstat.cntfork, forkstat.sizfork,
467 (float) forkstat.sizfork / forkstat.cntfork);
468 printf("%d vforks, %d pages, average=%.2f\n",
469 forkstat.cntvfork, forkstat.sizvfork,
470 (float)forkstat.sizvfork / forkstat.cntvfork);
471}
472
473stats(dn)
474{
475
a448353a 476 if (dn >= dk_ndrive) {
7f02df2f
BJ
477 printf(" 0");
478 return;
479 }
682f1dcb 480 printf("%3.0f", s.xfer[dn]/etime);
7f02df2f
BJ
481}
482
483double
484stat1(row)
485{
682f1dcb
BJ
486 double t;
487 register i;
7f02df2f
BJ
488
489 t = 0;
490 for(i=0; i<CPUSTATES; i++)
682f1dcb
BJ
491 t += s.time[i];
492 if(t == 0.)
493 t = 1.;
494 return(s.time[row]*100./t);
7f02df2f
BJ
495}
496
497pct(top, bot)
498{
499
500 if (bot == 0)
501 return (0);
502 return ((top * 100) / bot);
503}
61d7d2b3 504
4b894a2c
KM
505dointr(nintv)
506{
507 int nintr, inttotal;
508 long *intrcnt;
509 char *intrname, *malloc();
510
511 nintr = (nl[X_EINTRCNT].n_value - nl[X_INTRCNT].n_value) / sizeof(long);
512 intrcnt = (long *) malloc(nl[X_EINTRCNT].n_value -
513 nl[X_INTRCNT].n_value);
514 intrname = malloc(nl[X_EINTRNAMES].n_value - nl[X_INTRNAMES].n_value);
515 if (intrcnt == NULL || intrname == NULL) {
516 fprintf(stderr, "vmstat: out of memory\n");
517 exit(9);
518 }
a448353a 519 lseek(mf, (long)nl[X_INTRCNT].n_value, L_SET);
4b894a2c 520 read(mf, intrcnt, nintr * sizeof (long));
a448353a 521 lseek(mf, (long)nl[X_INTRNAMES].n_value, L_SET);
4b894a2c
KM
522 read(mf, intrname, nl[X_EINTRNAMES].n_value - nl[X_INTRNAMES].n_value);
523 printf("interrupt total rate\n");
524 inttotal = 0;
525 while (nintr--) {
526 if (*intrcnt)
527 printf("%-12s %8ld %8ld\n", intrname,
528 *intrcnt, *intrcnt / nintv);
529 intrname += strlen(intrname) + 1;
530 inttotal += *intrcnt++;
531 }
532 printf("Total %8ld %8ld\n", inttotal, inttotal / nintv);
533}
534
a448353a
SL
535#define steal(where, var) \
536 lseek(mf, where, L_SET); read(mf, &var, sizeof var);
61d7d2b3
MT
537/*
538 * Read the drive names out of kmem.
61d7d2b3 539 */
338c4a5d 540#ifdef vax
a448353a
SL
541#include <vaxuba/ubavar.h>
542#include <vaxmba/mbavar.h>
543
61d7d2b3
MT
544read_names()
545{
546 struct mba_device mdev;
547 register struct mba_device *mp;
548 struct mba_driver mdrv;
549 short two_char;
550 char *cp = (char *) &two_char;
551 struct uba_device udev, *up;
552 struct uba_driver udrv;
553
554 mp = (struct mba_device *) nl[X_MBDINIT].n_value;
555 up = (struct uba_device *) nl[X_UBDINIT].n_value;
93ca0bfe 556 if (up == 0) {
338c4a5d 557 fprintf(stderr, "vmstat: Disk init info not in namelist\n");
61d7d2b3
MT
558 exit(1);
559 }
93ca0bfe 560 if (mp) for (;;) {
61d7d2b3
MT
561 steal(mp++, mdev);
562 if (mdev.mi_driver == 0)
563 break;
564 if (mdev.mi_dk < 0 || mdev.mi_alive == 0)
565 continue;
566 steal(mdev.mi_driver, mdrv);
567 steal(mdrv.md_dname, two_char);
a448353a
SL
568 sprintf(dr_name[mdev.mi_dk], "%c%c%d",
569 cp[0], cp[1], mdev.mi_unit);
61d7d2b3 570 }
93ca0bfe 571 for (;;) {
61d7d2b3
MT
572 steal(up++, udev);
573 if (udev.ui_driver == 0)
574 break;
575 if (udev.ui_dk < 0 || udev.ui_alive == 0)
576 continue;
577 steal(udev.ui_driver, udrv);
578 steal(udrv.ud_dname, two_char);
a448353a
SL
579 sprintf(dr_name[udev.ui_dk], "%c%c%d",
580 cp[0], cp[1], udev.ui_unit);
61d7d2b3
MT
581 }
582}
338c4a5d 583#endif
242684ee 584
242684ee
SL
585#ifdef tahoe
586#include <tahoevba/vbavar.h>
587
588/*
589 * Read the drive names out of kmem.
590 */
591read_names()
592{
593 struct vba_device udev, *up;
594 struct vba_driver udrv;
595 short two_char;
596 char *cp = (char *)&two_char;
597
598 up = (struct vba_device *) nl[X_VBDINIT].n_value;
599 if (up == 0) {
600 fprintf(stderr, "vmstat: Disk init info not in namelist\n");
601 exit(1);
602 }
603 for (;;) {
604 steal(up++, udev);
605 if (udev.ui_driver == 0)
606 break;
607 if (udev.ui_dk < 0 || udev.ui_alive == 0)
608 continue;
609 steal(udev.ui_driver, udrv);
610 steal(udrv.ud_dname, two_char);
611 sprintf(dr_name[udev.ui_dk], "%c%c%d",
612 cp[0], cp[1], udev.ui_unit);
613 }
614}
615#endif