110826Ssam #ifndef lint 2*18761Ssam static char *sccsid = "@(#)vmstat.c 4.17 (Berkeley) 04/24/85"; 310826Ssam #endif 410826Ssam 51155Sbill #include <stdio.h> 6*18761Ssam #include <ctype.h> 7*18761Ssam #include <nlist.h> 8*18761Ssam 91155Sbill #include <sys/param.h> 10*18761Ssam #include <sys/file.h> 111155Sbill #include <sys/vm.h> 121155Sbill #include <sys/dk.h> 133162Stoy #include <sys/buf.h> 1415807Smckusick #include <sys/dir.h> 15*18761Ssam #include <sys/inode.h> 1617262Smckusick #include <sys/namei.h> 171155Sbill 181155Sbill struct nlist nl[] = { 191448Sbill #define X_CPTIME 0 201448Sbill { "_cp_time" }, 211448Sbill #define X_RATE 1 221155Sbill { "_rate" }, 231448Sbill #define X_TOTAL 2 241155Sbill { "_total" }, 251448Sbill #define X_DEFICIT 3 261155Sbill { "_deficit" }, 271448Sbill #define X_FORKSTAT 4 281155Sbill { "_forkstat" }, 291448Sbill #define X_SUM 5 301155Sbill { "_sum" }, 311448Sbill #define X_FIRSTFREE 6 321155Sbill { "_firstfree" }, 331448Sbill #define X_MAXFREE 7 341155Sbill { "_maxfree" }, 359249Ssam #define X_BOOTTIME 8 369249Ssam { "_boottime" }, 371448Sbill #define X_DKXFER 9 381448Sbill { "_dk_xfer" }, 3910826Ssam #define X_REC 10 401155Sbill { "_rectime" }, 4110826Ssam #define X_PGIN 11 421155Sbill { "_pgintime" }, 4310826Ssam #define X_HZ 12 443162Stoy { "_hz" }, 45*18761Ssam #define X_PHZ 13 4615266Ssam { "_phz" }, 4715807Smckusick #define X_NCHSTATS 14 4815807Smckusick { "_nchstats" }, 4917262Smckusick #define X_INTRNAMES 15 5017262Smckusick { "_intrnames" }, 5117262Smckusick #define X_EINTRNAMES 16 5217262Smckusick { "_eintrnames" }, 5317262Smckusick #define X_INTRCNT 17 5417262Smckusick { "_intrcnt" }, 5517262Smckusick #define X_EINTRCNT 18 5617262Smckusick { "_eintrcnt" }, 57*18761Ssam #define X_DK_NDRIVE 19 58*18761Ssam { "_dk_ndrive" }, 5910826Ssam #ifdef vax 60*18761Ssam #define X_MBDINIT 20 6110826Ssam { "_mbdinit" }, 62*18761Ssam #define X_UBDINIT 21 6310826Ssam { "_ubdinit" }, 6410826Ssam #endif 6510826Ssam { "" }, 661155Sbill }; 671155Sbill 68*18761Ssam char **dr_name; 69*18761Ssam int *dr_select; 70*18761Ssam int dk_ndrive; 71*18761Ssam int ndrives = 0; 72*18761Ssam #ifdef vax 73*18761Ssam char *defdrives[] = { "hp0", "hp1", "hp2", 0 }; 74*18761Ssam #else 75*18761Ssam char *defdrives[] = { 0 }; 76*18761Ssam #endif 771155Sbill double stat1(); 781155Sbill int firstfree, maxfree; 793162Stoy int hz; 8015266Ssam int phz; 8115266Ssam int HZ; 82*18761Ssam 8315266Ssam #ifdef vax 8415266Ssam #define INTS(x) ((x) - (hz + phz)) 8515266Ssam #endif 8615266Ssam 87*18761Ssam struct { 881155Sbill int busy; 891448Sbill long time[CPUSTATES]; 90*18761Ssam long *xfer; 911155Sbill struct vmmeter Rate; 921155Sbill struct vmtotal Total; 931155Sbill struct vmmeter Sum; 941155Sbill struct forkstat Forkstat; 951155Sbill unsigned rectime; 961155Sbill unsigned pgintime; 971155Sbill } s, s1, z; 981155Sbill #define rate s.Rate 991155Sbill #define total s.Total 1001155Sbill #define sum s.Sum 1011155Sbill #define forkstat s.Forkstat 1021155Sbill 10310826Ssam struct vmmeter osum; 1041155Sbill int zero; 1051155Sbill int deficit; 1061155Sbill double etime; 1071155Sbill int mf; 10817262Smckusick time_t now, boottime; 10917262Smckusick int printhdr(); 1101155Sbill 1111155Sbill main(argc, argv) 11210826Ssam int argc; 11310826Ssam char **argv; 1141155Sbill { 1151155Sbill int lines; 1161155Sbill extern char *ctime(); 1171155Sbill register i,j; 11817262Smckusick int iter, nintv, iflag = 0; 1191155Sbill double f1, f2; 1201155Sbill long t; 121*18761Ssam char *arg, **cp, name[6], buf[BUFSIZ]; 1221155Sbill 1231155Sbill nlist("/vmunix", nl); 1241155Sbill if(nl[0].n_type == 0) { 1251155Sbill printf("no /vmunix namelist\n"); 1261155Sbill exit(1); 1271155Sbill } 1281155Sbill mf = open("/dev/kmem", 0); 1291155Sbill if(mf < 0) { 1301155Sbill printf("cannot open /dev/kmem\n"); 1311155Sbill exit(1); 1321155Sbill } 1331155Sbill iter = 0; 1341155Sbill argc--, argv++; 1351155Sbill while (argc>0 && argv[0][0]=='-') { 1361155Sbill char *cp = *argv++; 1371155Sbill argc--; 1381155Sbill while (*++cp) switch (*cp) { 1391155Sbill 1401155Sbill case 't': 1411155Sbill dotimes(); 1421155Sbill exit(0); 14310826Ssam 1441155Sbill case 'z': 1451155Sbill close(mf); 1461155Sbill mf = open("/dev/kmem", 2); 147*18761Ssam lseek(mf, (long)nl[X_SUM].n_value, L_SET); 1481155Sbill write(mf, &z.Sum, sizeof z.Sum); 1491155Sbill exit(0); 1501155Sbill 1511155Sbill case 'f': 1521155Sbill doforkst(); 1531155Sbill exit(0); 1541155Sbill 1551155Sbill case 's': 1561155Sbill dosum(); 1571155Sbill exit(0); 1581155Sbill 15917262Smckusick case 'i': 16017262Smckusick iflag++; 16117262Smckusick break; 16217262Smckusick 1631155Sbill default: 164*18761Ssam fprintf(stderr, 165*18761Ssam "usage: vmstat [ -fsi ] [ interval ] [ count]\n"); 1661155Sbill exit(1); 1671155Sbill } 1681155Sbill } 169*18761Ssam lseek(mf, (long)nl[X_FIRSTFREE].n_value, L_SET); 1701155Sbill read(mf, &firstfree, sizeof firstfree); 171*18761Ssam lseek(mf, (long)nl[X_MAXFREE].n_value, L_SET); 1721155Sbill read(mf, &maxfree, sizeof maxfree); 173*18761Ssam lseek(mf, (long)nl[X_BOOTTIME].n_value, L_SET); 1749249Ssam read(mf, &boottime, sizeof boottime); 175*18761Ssam lseek(mf, (long)nl[X_HZ].n_value, L_SET); 1763162Stoy read(mf, &hz, sizeof hz); 177*18761Ssam if (nl[X_PHZ].n_value != 0) { 178*18761Ssam lseek(mf, (long)nl[X_PHZ].n_value, L_SET); 179*18761Ssam read(mf, &phz, sizeof phz); 180*18761Ssam } 18115266Ssam HZ = phz ? phz : hz; 182*18761Ssam if (nl[DK_NDRIVE].n_value == 0) { 183*18761Ssam printf("dk_ndrive undefined in system\n"); 184*18761Ssam exit(1); 1853162Stoy } 186*18761Ssam lseek(mf, nl[X_DK_NDRIVE].n_value, L_SET); 187*18761Ssam read(mf, &dk_ndrive, sizeof (dk_ndrive)); 188*18761Ssam if (dk_ndrive <= 0) { 189*18761Ssam printf("dk_ndrive %d\n", dk_ndrive); 190*18761Ssam exit(1); 191*18761Ssam } 192*18761Ssam dr_select = (int *)calloc(dk_ndrive, sizeof (int)); 193*18761Ssam dr_name = (char **)calloc(dk_ndrive, sizeof (char *)); 194*18761Ssam #define allocate(e, t) \ 195*18761Ssam s./**/e = (t *)calloc(dk_ndrive, sizeof (t)); \ 196*18761Ssam s1./**/e = (t *)calloc(dk_ndrive, sizeof (t)); 197*18761Ssam allocate(xfer, long); 198*18761Ssam for (arg = buf, i = 0; i < dk_ndrive; i++) { 199*18761Ssam dr_name[i] = arg; 200*18761Ssam sprintf(dr_name[i], "dk%d", i); 201*18761Ssam arg += strlen(dr_name[i]) + 1; 202*18761Ssam } 2033162Stoy read_names(); 2041155Sbill time(&now); 2059249Ssam nintv = now - boottime; 2061155Sbill if (nintv <= 0 || nintv > 60*60*24*365*10) { 2071155Sbill printf("Time makes no sense... namelist must be wrong.\n"); 2081155Sbill exit(1); 2091155Sbill } 21017262Smckusick if (iflag) { 21117262Smckusick dointr(nintv); 21217262Smckusick exit(0); 21317262Smckusick } 214*18761Ssam /* 215*18761Ssam * Choose drives to be displayed. Priority 216*18761Ssam * goes to (in order) drives supplied as arguments, 217*18761Ssam * default drives. If everything isn't filled 218*18761Ssam * in and there are drives not taken care of, 219*18761Ssam * display the first few that fit. 220*18761Ssam */ 221*18761Ssam ndrives = 0; 222*18761Ssam while (argc > 0 && !isdigit(argv[0][0])) { 223*18761Ssam for (i = 0; i < dk_ndrive; i++) { 224*18761Ssam if (strcmp(dr_name[i], argv[0])) 225*18761Ssam continue; 226*18761Ssam dr_select[i] = 1; 227*18761Ssam ndrives++; 228*18761Ssam } 229*18761Ssam argc--, argv++; 230*18761Ssam } 231*18761Ssam for (i = 0; i < dk_ndrive && ndrives < 4; i++) { 232*18761Ssam if (dr_select[i]) 233*18761Ssam continue; 234*18761Ssam for (cp = defdrives; *cp; cp++) 235*18761Ssam if (strcmp(dr_name[i], *cp) == 0) { 236*18761Ssam dr_select[i] = 1; 237*18761Ssam ndrives++; 238*18761Ssam break; 239*18761Ssam } 240*18761Ssam } 241*18761Ssam for (i = 0; i < dk_ndrive && ndrives < 4; i++) { 242*18761Ssam if (dr_select[i]) 243*18761Ssam continue; 244*18761Ssam dr_select[i] = 1; 245*18761Ssam ndrives++; 246*18761Ssam } 247*18761Ssam if (argc > 1) 248*18761Ssam iter = atoi(argv[1]); 24917262Smckusick signal(SIGCONT, printhdr); 2501155Sbill reprint: 2511155Sbill lines = 20; 2521155Sbill /* s1 = z; */ 25317262Smckusick printhdr(); 2541155Sbill loop: 255*18761Ssam lseek(mf, (long)nl[X_CPTIME].n_value, L_SET); 2561448Sbill read(mf, s.time, sizeof s.time); 257*18761Ssam lseek(mf, (long)nl[X_DKXFER].n_value, L_SET); 258*18761Ssam read(mf, s.xfer, dk_ndrive * sizeof (long)); 259*18761Ssam if (nintv != 1) 260*18761Ssam lseek(mf, (long)nl[X_SUM].n_value, L_SET); 261*18761Ssam else 262*18761Ssam lseek(mf, (long)nl[X_RATE].n_value, L_SET); 263*18761Ssam read(mf, &rate, sizeof rate); 264*18761Ssam lseek(mf, (long)nl[X_TOTAL].n_value, L_SET); 2651155Sbill read(mf, &total, sizeof total); 26610826Ssam osum = sum; 267*18761Ssam lseek(mf, (long)nl[X_SUM].n_value, L_SET); 26810826Ssam read(mf, &sum, sizeof sum); 269*18761Ssam lseek(mf, (long)nl[X_DEFICIT].n_value, L_SET); 2701155Sbill read(mf, &deficit, sizeof deficit); 2711448Sbill etime = 0; 272*18761Ssam for (i=0; i < dk_ndrive; i++) { 2731448Sbill t = s.xfer[i]; 2741448Sbill s.xfer[i] -= s1.xfer[i]; 2751448Sbill s1.xfer[i] = t; 2761155Sbill } 2771155Sbill for (i=0; i < CPUSTATES; i++) { 2781448Sbill t = s.time[i]; 2791448Sbill s.time[i] -= s1.time[i]; 2801448Sbill s1.time[i] = t; 2811448Sbill etime += s.time[i]; 2821155Sbill } 2831155Sbill if(etime == 0.) 2841155Sbill etime = 1.; 2853162Stoy printf("%2d%2d%2d", total.t_rq, total.t_dw+total.t_pw, total.t_sw); 28610826Ssam #define pgtok(a) ((a)*NBPG/1024) 28710826Ssam printf("%6d%5d", pgtok(total.t_avm), pgtok(total.t_free)); 28815266Ssam printf("%4d%3d", (rate.v_pgrec - (rate.v_xsfrec+rate.v_xifrec))/nintv, 28915266Ssam (rate.v_xsfrec+rate.v_xifrec)/nintv); 29010826Ssam printf("%4d", pgtok(rate.v_pgpgin)/nintv); 29110826Ssam printf("%4d%4d%4d%4d", pgtok(rate.v_pgpgout)/nintv, 29210826Ssam pgtok(rate.v_dfree)/nintv, pgtok(deficit), rate.v_scan/nintv); 293*18761Ssam etime /= (float)HZ; 294*18761Ssam for (i = 0; i < dk_ndrive; i++) 295*18761Ssam if (dr_select[i]) 296*18761Ssam stats(i); 29715266Ssam printf("%4d%4d%4d", INTS(rate.v_intr/nintv), rate.v_syscall/nintv, 29815266Ssam rate.v_swtch/nintv); 2991155Sbill for(i=0; i<CPUSTATES; i++) { 3001155Sbill float f = stat1(i); 3011155Sbill if (i == 0) { /* US+NI */ 3021155Sbill i++; 3031155Sbill f += stat1(i); 3041155Sbill } 3051155Sbill printf("%3.0f", f); 3061155Sbill } 3071155Sbill printf("\n"); 3081155Sbill fflush(stdout); 3091155Sbill contin: 3101155Sbill nintv = 1; 3111155Sbill --iter; 3121155Sbill if(iter) 3131155Sbill if(argc > 0) { 3141155Sbill sleep(atoi(argv[0])); 3151155Sbill if (--lines <= 0) 3161155Sbill goto reprint; 3171155Sbill goto loop; 3181155Sbill } 3191155Sbill } 3201155Sbill 32117262Smckusick printhdr() 32217262Smckusick { 323*18761Ssam register int i, j; 324*18761Ssam 325*18761Ssam printf(" procs memory page "); 326*18761Ssam i = (ndrives * 3 - 6) / 2; 327*18761Ssam if (i < 0) 328*18761Ssam i = 0; 329*18761Ssam for (j = 0; j < i; j++) 330*18761Ssam putchar(' '); 331*18761Ssam printf("faults"); 332*18761Ssam i = ndrives * 3 - 6 - i; 333*18761Ssam for (j = 0; j < i; j++) 334*18761Ssam putchar(' '); 335*18761Ssam printf(" cpu\n"); 336*18761Ssam printf(" r b w avm fre re at pi po fr de sr "); 337*18761Ssam for (i = 0; i < dk_ndrive; i++) 338*18761Ssam if (dr_select[i]) 339*18761Ssam printf("%c%c ", dr_name[i][0], dr_name[i][2]); 340*18761Ssam printf(" in sy cs us sy id\n"); 34117262Smckusick } 34217262Smckusick 3431155Sbill dotimes() 3441155Sbill { 3451155Sbill 346*18761Ssam lseek(mf, (long)nl[X_REC].n_value, L_SET); 3471155Sbill read(mf, &s.rectime, sizeof s.rectime); 348*18761Ssam lseek(mf, (long)nl[X_PGIN].n_value, L_SET); 3491155Sbill read(mf, &s.pgintime, sizeof s.pgintime); 350*18761Ssam lseek(mf, (long)nl[X_SUM].n_value, L_SET); 3511155Sbill read(mf, &sum, sizeof sum); 3521155Sbill printf("%d reclaims, %d total time (usec)\n", sum.v_pgrec, s.rectime); 3531155Sbill printf("average: %d usec / reclaim\n", s.rectime/sum.v_pgrec); 3541155Sbill printf("\n"); 3551155Sbill printf("%d page ins, %d total time (msec)\n",sum.v_pgin, s.pgintime/10); 3561155Sbill printf("average: %8.1f msec / page in\n", s.pgintime/(sum.v_pgin*10.0)); 3571155Sbill } 3581155Sbill 3591155Sbill dosum() 3601155Sbill { 361*18761Ssam struct nchstats nchstats; 36215807Smckusick long nchtotal; 3631155Sbill 364*18761Ssam lseek(mf, (long)nl[X_SUM].n_value, L_SET); 3651155Sbill read(mf, &sum, sizeof sum); 3661155Sbill printf("%9d swap ins\n", sum.v_swpin); 3671155Sbill printf("%9d swap outs\n", sum.v_swpout); 3681155Sbill printf("%9d pages swapped in\n", sum.v_pswpin / CLSIZE); 3691155Sbill printf("%9d pages swapped out\n", sum.v_pswpout / CLSIZE); 3701155Sbill printf("%9d total address trans. faults taken\n", sum.v_faults); 3711155Sbill printf("%9d page ins\n", sum.v_pgin); 3721155Sbill printf("%9d page outs\n", sum.v_pgout); 3733612Sroot printf("%9d pages paged in\n", sum.v_pgpgin); 3743612Sroot printf("%9d pages paged out\n", sum.v_pgpgout); 3753612Sroot printf("%9d sequential process pages freed\n", sum.v_seqfree); 37612830Ssam printf("%9d total reclaims (%d%% fast)\n", sum.v_pgrec, 37712830Ssam (sum.v_fastpgrec * 100) / (sum.v_pgrec == 0 ? 1 : sum.v_pgrec)); 3781155Sbill printf("%9d reclaims from free list\n", sum.v_pgfrec); 3791155Sbill printf("%9d intransit blocking page faults\n", sum.v_intrans); 3801155Sbill printf("%9d zero fill pages created\n", sum.v_nzfod / CLSIZE); 3811155Sbill printf("%9d zero fill page faults\n", sum.v_zfod / CLSIZE); 3821155Sbill printf("%9d executable fill pages created\n", sum.v_nexfod / CLSIZE); 3831155Sbill printf("%9d executable fill page faults\n", sum.v_exfod / CLSIZE); 3841155Sbill printf("%9d swap text pages found in free list\n", sum.v_xsfrec); 3851155Sbill printf("%9d inode text pages found in free list\n", sum.v_xifrec); 3861155Sbill printf("%9d file fill pages created\n", sum.v_nvrfod / CLSIZE); 3871155Sbill printf("%9d file fill page faults\n", sum.v_vrfod / CLSIZE); 3881155Sbill printf("%9d pages examined by the clock daemon\n", sum.v_scan); 3891155Sbill printf("%9d revolutions of the clock hand\n", sum.v_rev); 3901155Sbill printf("%9d pages freed by the clock daemon\n", sum.v_dfree / CLSIZE); 3911155Sbill printf("%9d cpu context switches\n", sum.v_swtch); 3921155Sbill printf("%9d device interrupts\n", sum.v_intr); 39317262Smckusick printf("%9d software interrupts\n", sum.v_soft); 394*18761Ssam #ifdef vax 3951155Sbill printf("%9d pseduo-dma dz interrupts\n", sum.v_pdma); 396*18761Ssam #endif 3971155Sbill printf("%9d traps\n", sum.v_trap); 3981155Sbill printf("%9d system calls\n", sum.v_syscall); 39915807Smckusick lseek(mf, (long)nl[X_NCHSTATS].n_value, 0); 400*18761Ssam read(mf, &nchstats, sizeof nchstats); 401*18761Ssam nchtotal = nchstats.ncs_goodhits + nchstats.ncs_badhits + 402*18761Ssam nchstats.ncs_falsehits + nchstats.ncs_miss + nchstats.ncs_long; 40315807Smckusick printf("%9d total name lookups", nchtotal); 40416586Ssam #define nz(x) ((x) ? (x) : 1) 40515807Smckusick printf(" (cache hits %d%% system %d%% per-process)\n", 406*18761Ssam nchstats.ncs_goodhits * 100 / nz(nchtotal), 407*18761Ssam nchstats.ncs_pass2 * 100 / nz(nchtotal)); 40816586Ssam printf("%9s badhits %d, falsehits %d, toolong %d\n", "", 409*18761Ssam nchstats.ncs_badhits, nchstats.ncs_falsehits, nchstats.ncs_long); 4101155Sbill } 4111155Sbill 4121155Sbill doforkst() 4131155Sbill { 4141155Sbill 415*18761Ssam lseek(mf, (long)nl[X_FORKSTAT].n_value, L_SET); 4161155Sbill read(mf, &forkstat, sizeof forkstat); 4171155Sbill printf("%d forks, %d pages, average=%.2f\n", 4181155Sbill forkstat.cntfork, forkstat.sizfork, 4191155Sbill (float) forkstat.sizfork / forkstat.cntfork); 4201155Sbill printf("%d vforks, %d pages, average=%.2f\n", 4211155Sbill forkstat.cntvfork, forkstat.sizvfork, 4221155Sbill (float)forkstat.sizvfork / forkstat.cntvfork); 4231155Sbill } 4241155Sbill 4251155Sbill stats(dn) 4261155Sbill { 4271155Sbill 428*18761Ssam if (dn >= dk_ndrive) { 4291155Sbill printf(" 0"); 4301155Sbill return; 4311155Sbill } 4321448Sbill printf("%3.0f", s.xfer[dn]/etime); 4331155Sbill } 4341155Sbill 4351155Sbill double 4361155Sbill stat1(row) 4371155Sbill { 4381448Sbill double t; 4391448Sbill register i; 4401155Sbill 4411155Sbill t = 0; 4421155Sbill for(i=0; i<CPUSTATES; i++) 4431448Sbill t += s.time[i]; 4441448Sbill if(t == 0.) 4451448Sbill t = 1.; 4461448Sbill return(s.time[row]*100./t); 4471155Sbill } 4481155Sbill 4491155Sbill pct(top, bot) 4501155Sbill { 4511155Sbill 4521155Sbill if (bot == 0) 4531155Sbill return (0); 4541155Sbill return ((top * 100) / bot); 4551155Sbill } 4563162Stoy 45717262Smckusick dointr(nintv) 45817262Smckusick { 45917262Smckusick int nintr, inttotal; 46017262Smckusick long *intrcnt; 46117262Smckusick char *intrname, *malloc(); 46217262Smckusick 46317262Smckusick nintr = (nl[X_EINTRCNT].n_value - nl[X_INTRCNT].n_value) / sizeof(long); 46417262Smckusick intrcnt = (long *) malloc(nl[X_EINTRCNT].n_value - 46517262Smckusick nl[X_INTRCNT].n_value); 46617262Smckusick intrname = malloc(nl[X_EINTRNAMES].n_value - nl[X_INTRNAMES].n_value); 46717262Smckusick if (intrcnt == NULL || intrname == NULL) { 46817262Smckusick fprintf(stderr, "vmstat: out of memory\n"); 46917262Smckusick exit(9); 47017262Smckusick } 471*18761Ssam lseek(mf, (long)nl[X_INTRCNT].n_value, L_SET); 47217262Smckusick read(mf, intrcnt, nintr * sizeof (long)); 473*18761Ssam lseek(mf, (long)nl[X_INTRNAMES].n_value, L_SET); 47417262Smckusick read(mf, intrname, nl[X_EINTRNAMES].n_value - nl[X_INTRNAMES].n_value); 47517262Smckusick printf("interrupt total rate\n"); 47617262Smckusick inttotal = 0; 47717262Smckusick while (nintr--) { 47817262Smckusick if (*intrcnt) 47917262Smckusick printf("%-12s %8ld %8ld\n", intrname, 48017262Smckusick *intrcnt, *intrcnt / nintv); 48117262Smckusick intrname += strlen(intrname) + 1; 48217262Smckusick inttotal += *intrcnt++; 48317262Smckusick } 48417262Smckusick printf("Total %8ld %8ld\n", inttotal, inttotal / nintv); 48517262Smckusick } 48617262Smckusick 487*18761Ssam #define steal(where, var) \ 488*18761Ssam lseek(mf, where, L_SET); read(mf, &var, sizeof var); 4893162Stoy /* 4903162Stoy * Read the drive names out of kmem. 4913162Stoy */ 49210826Ssam #ifdef vax 493*18761Ssam #include <vaxuba/ubavar.h> 494*18761Ssam #include <vaxmba/mbavar.h> 495*18761Ssam 4963162Stoy read_names() 4973162Stoy { 4983162Stoy struct mba_device mdev; 4993162Stoy register struct mba_device *mp; 5003162Stoy struct mba_driver mdrv; 5013162Stoy short two_char; 5023162Stoy char *cp = (char *) &two_char; 5033162Stoy struct uba_device udev, *up; 5043162Stoy struct uba_driver udrv; 5053162Stoy 5063162Stoy mp = (struct mba_device *) nl[X_MBDINIT].n_value; 5073162Stoy up = (struct uba_device *) nl[X_UBDINIT].n_value; 5083492Sroot if (up == 0) { 50910826Ssam fprintf(stderr, "vmstat: Disk init info not in namelist\n"); 5103162Stoy exit(1); 5113162Stoy } 5123492Sroot if (mp) for (;;) { 5133162Stoy steal(mp++, mdev); 5143162Stoy if (mdev.mi_driver == 0) 5153162Stoy break; 5163162Stoy if (mdev.mi_dk < 0 || mdev.mi_alive == 0) 5173162Stoy continue; 5183162Stoy steal(mdev.mi_driver, mdrv); 5193162Stoy steal(mdrv.md_dname, two_char); 520*18761Ssam sprintf(dr_name[mdev.mi_dk], "%c%c%d", 521*18761Ssam cp[0], cp[1], mdev.mi_unit); 5223162Stoy } 5233492Sroot for (;;) { 5243162Stoy steal(up++, udev); 5253162Stoy if (udev.ui_driver == 0) 5263162Stoy break; 5273162Stoy if (udev.ui_dk < 0 || udev.ui_alive == 0) 5283162Stoy continue; 5293162Stoy steal(udev.ui_driver, udrv); 5303162Stoy steal(udrv.ud_dname, two_char); 531*18761Ssam sprintf(dr_name[udev.ui_dk], "%c%c%d", 532*18761Ssam cp[0], cp[1], udev.ui_unit); 5333162Stoy } 5343162Stoy } 53510826Ssam #endif 536