110826Ssam #ifndef lint 2*18768Ssam static char *sccsid = "@(#)vmstat.c 4.18 (Berkeley) 04/25/85"; 310826Ssam #endif 410826Ssam 51155Sbill #include <stdio.h> 618761Ssam #include <ctype.h> 718761Ssam #include <nlist.h> 818761Ssam 91155Sbill #include <sys/param.h> 1018761Ssam #include <sys/file.h> 111155Sbill #include <sys/vm.h> 121155Sbill #include <sys/dk.h> 133162Stoy #include <sys/buf.h> 1415807Smckusick #include <sys/dir.h> 1518761Ssam #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" }, 4518761Ssam #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" }, 5718761Ssam #define X_DK_NDRIVE 19 5818761Ssam { "_dk_ndrive" }, 5910826Ssam #ifdef vax 6018761Ssam #define X_MBDINIT 20 6110826Ssam { "_mbdinit" }, 6218761Ssam #define X_UBDINIT 21 6310826Ssam { "_ubdinit" }, 6410826Ssam #endif 6510826Ssam { "" }, 661155Sbill }; 671155Sbill 6818761Ssam char **dr_name; 6918761Ssam int *dr_select; 7018761Ssam int dk_ndrive; 7118761Ssam int ndrives = 0; 7218761Ssam #ifdef vax 7318761Ssam char *defdrives[] = { "hp0", "hp1", "hp2", 0 }; 7418761Ssam #else 7518761Ssam char *defdrives[] = { 0 }; 7618761Ssam #endif 771155Sbill double stat1(); 781155Sbill int firstfree, maxfree; 793162Stoy int hz; 8015266Ssam int phz; 8115266Ssam int HZ; 8218761Ssam 8315266Ssam #ifdef vax 8415266Ssam #define INTS(x) ((x) - (hz + phz)) 8515266Ssam #endif 8615266Ssam 8718761Ssam struct { 881155Sbill int busy; 891448Sbill long time[CPUSTATES]; 9018761Ssam 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(); 110*18768Ssam int lines = 1; 1111155Sbill 1121155Sbill main(argc, argv) 11310826Ssam int argc; 11410826Ssam char **argv; 1151155Sbill { 1161155Sbill extern char *ctime(); 1171155Sbill register i,j; 11817262Smckusick int iter, nintv, iflag = 0; 1191155Sbill double f1, f2; 1201155Sbill long t; 12118761Ssam 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); 14718761Ssam 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: 16418761Ssam fprintf(stderr, 16518761Ssam "usage: vmstat [ -fsi ] [ interval ] [ count]\n"); 1661155Sbill exit(1); 1671155Sbill } 1681155Sbill } 16918761Ssam lseek(mf, (long)nl[X_FIRSTFREE].n_value, L_SET); 1701155Sbill read(mf, &firstfree, sizeof firstfree); 17118761Ssam lseek(mf, (long)nl[X_MAXFREE].n_value, L_SET); 1721155Sbill read(mf, &maxfree, sizeof maxfree); 17318761Ssam lseek(mf, (long)nl[X_BOOTTIME].n_value, L_SET); 1749249Ssam read(mf, &boottime, sizeof boottime); 17518761Ssam lseek(mf, (long)nl[X_HZ].n_value, L_SET); 1763162Stoy read(mf, &hz, sizeof hz); 17718761Ssam if (nl[X_PHZ].n_value != 0) { 17818761Ssam lseek(mf, (long)nl[X_PHZ].n_value, L_SET); 17918761Ssam read(mf, &phz, sizeof phz); 18018761Ssam } 18115266Ssam HZ = phz ? phz : hz; 18218761Ssam if (nl[DK_NDRIVE].n_value == 0) { 18318761Ssam printf("dk_ndrive undefined in system\n"); 18418761Ssam exit(1); 1853162Stoy } 18618761Ssam lseek(mf, nl[X_DK_NDRIVE].n_value, L_SET); 18718761Ssam read(mf, &dk_ndrive, sizeof (dk_ndrive)); 18818761Ssam if (dk_ndrive <= 0) { 18918761Ssam printf("dk_ndrive %d\n", dk_ndrive); 19018761Ssam exit(1); 19118761Ssam } 19218761Ssam dr_select = (int *)calloc(dk_ndrive, sizeof (int)); 19318761Ssam dr_name = (char **)calloc(dk_ndrive, sizeof (char *)); 19418761Ssam #define allocate(e, t) \ 19518761Ssam s./**/e = (t *)calloc(dk_ndrive, sizeof (t)); \ 19618761Ssam s1./**/e = (t *)calloc(dk_ndrive, sizeof (t)); 19718761Ssam allocate(xfer, long); 19818761Ssam for (arg = buf, i = 0; i < dk_ndrive; i++) { 19918761Ssam dr_name[i] = arg; 20018761Ssam sprintf(dr_name[i], "dk%d", i); 20118761Ssam arg += strlen(dr_name[i]) + 1; 20218761Ssam } 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 } 21418761Ssam /* 21518761Ssam * Choose drives to be displayed. Priority 21618761Ssam * goes to (in order) drives supplied as arguments, 21718761Ssam * default drives. If everything isn't filled 21818761Ssam * in and there are drives not taken care of, 21918761Ssam * display the first few that fit. 22018761Ssam */ 22118761Ssam ndrives = 0; 22218761Ssam while (argc > 0 && !isdigit(argv[0][0])) { 22318761Ssam for (i = 0; i < dk_ndrive; i++) { 22418761Ssam if (strcmp(dr_name[i], argv[0])) 22518761Ssam continue; 22618761Ssam dr_select[i] = 1; 22718761Ssam ndrives++; 22818761Ssam } 22918761Ssam argc--, argv++; 23018761Ssam } 23118761Ssam for (i = 0; i < dk_ndrive && ndrives < 4; i++) { 23218761Ssam if (dr_select[i]) 23318761Ssam continue; 23418761Ssam for (cp = defdrives; *cp; cp++) 23518761Ssam if (strcmp(dr_name[i], *cp) == 0) { 23618761Ssam dr_select[i] = 1; 23718761Ssam ndrives++; 23818761Ssam break; 23918761Ssam } 24018761Ssam } 24118761Ssam for (i = 0; i < dk_ndrive && ndrives < 4; i++) { 24218761Ssam if (dr_select[i]) 24318761Ssam continue; 24418761Ssam dr_select[i] = 1; 24518761Ssam ndrives++; 24618761Ssam } 24718761Ssam if (argc > 1) 24818761Ssam iter = atoi(argv[1]); 24917262Smckusick signal(SIGCONT, printhdr); 2501155Sbill loop: 251*18768Ssam if (--lines == 0) 252*18768Ssam printhdr(); 25318761Ssam lseek(mf, (long)nl[X_CPTIME].n_value, L_SET); 2541448Sbill read(mf, s.time, sizeof s.time); 25518761Ssam lseek(mf, (long)nl[X_DKXFER].n_value, L_SET); 25618761Ssam read(mf, s.xfer, dk_ndrive * sizeof (long)); 25718761Ssam if (nintv != 1) 25818761Ssam lseek(mf, (long)nl[X_SUM].n_value, L_SET); 25918761Ssam else 26018761Ssam lseek(mf, (long)nl[X_RATE].n_value, L_SET); 26118761Ssam read(mf, &rate, sizeof rate); 26218761Ssam lseek(mf, (long)nl[X_TOTAL].n_value, L_SET); 2631155Sbill read(mf, &total, sizeof total); 26410826Ssam osum = sum; 26518761Ssam lseek(mf, (long)nl[X_SUM].n_value, L_SET); 26610826Ssam read(mf, &sum, sizeof sum); 26718761Ssam lseek(mf, (long)nl[X_DEFICIT].n_value, L_SET); 2681155Sbill read(mf, &deficit, sizeof deficit); 2691448Sbill etime = 0; 27018761Ssam for (i=0; i < dk_ndrive; i++) { 2711448Sbill t = s.xfer[i]; 2721448Sbill s.xfer[i] -= s1.xfer[i]; 2731448Sbill s1.xfer[i] = t; 2741155Sbill } 2751155Sbill for (i=0; i < CPUSTATES; i++) { 2761448Sbill t = s.time[i]; 2771448Sbill s.time[i] -= s1.time[i]; 2781448Sbill s1.time[i] = t; 2791448Sbill etime += s.time[i]; 2801155Sbill } 2811155Sbill if(etime == 0.) 2821155Sbill etime = 1.; 2833162Stoy printf("%2d%2d%2d", total.t_rq, total.t_dw+total.t_pw, total.t_sw); 28410826Ssam #define pgtok(a) ((a)*NBPG/1024) 28510826Ssam printf("%6d%5d", pgtok(total.t_avm), pgtok(total.t_free)); 28615266Ssam printf("%4d%3d", (rate.v_pgrec - (rate.v_xsfrec+rate.v_xifrec))/nintv, 28715266Ssam (rate.v_xsfrec+rate.v_xifrec)/nintv); 28810826Ssam printf("%4d", pgtok(rate.v_pgpgin)/nintv); 28910826Ssam printf("%4d%4d%4d%4d", pgtok(rate.v_pgpgout)/nintv, 29010826Ssam pgtok(rate.v_dfree)/nintv, pgtok(deficit), rate.v_scan/nintv); 29118761Ssam etime /= (float)HZ; 29218761Ssam for (i = 0; i < dk_ndrive; i++) 29318761Ssam if (dr_select[i]) 29418761Ssam stats(i); 29515266Ssam printf("%4d%4d%4d", INTS(rate.v_intr/nintv), rate.v_syscall/nintv, 29615266Ssam rate.v_swtch/nintv); 2971155Sbill for(i=0; i<CPUSTATES; i++) { 2981155Sbill float f = stat1(i); 2991155Sbill if (i == 0) { /* US+NI */ 3001155Sbill i++; 3011155Sbill f += stat1(i); 3021155Sbill } 3031155Sbill printf("%3.0f", f); 3041155Sbill } 3051155Sbill printf("\n"); 3061155Sbill fflush(stdout); 3071155Sbill contin: 3081155Sbill nintv = 1; 309*18768Ssam if (--iter &&argc > 0) { 3101155Sbill sleep(atoi(argv[0])); 3111155Sbill goto loop; 3121155Sbill } 3131155Sbill } 3141155Sbill 31517262Smckusick printhdr() 31617262Smckusick { 31718761Ssam register int i, j; 31818761Ssam 31918761Ssam printf(" procs memory page "); 32018761Ssam i = (ndrives * 3 - 6) / 2; 32118761Ssam if (i < 0) 32218761Ssam i = 0; 32318761Ssam for (j = 0; j < i; j++) 32418761Ssam putchar(' '); 32518761Ssam printf("faults"); 32618761Ssam i = ndrives * 3 - 6 - i; 32718761Ssam for (j = 0; j < i; j++) 32818761Ssam putchar(' '); 32918761Ssam printf(" cpu\n"); 33018761Ssam printf(" r b w avm fre re at pi po fr de sr "); 33118761Ssam for (i = 0; i < dk_ndrive; i++) 33218761Ssam if (dr_select[i]) 33318761Ssam printf("%c%c ", dr_name[i][0], dr_name[i][2]); 33418761Ssam printf(" in sy cs us sy id\n"); 335*18768Ssam lines = 19; 33617262Smckusick } 33717262Smckusick 3381155Sbill dotimes() 3391155Sbill { 3401155Sbill 34118761Ssam lseek(mf, (long)nl[X_REC].n_value, L_SET); 3421155Sbill read(mf, &s.rectime, sizeof s.rectime); 34318761Ssam lseek(mf, (long)nl[X_PGIN].n_value, L_SET); 3441155Sbill read(mf, &s.pgintime, sizeof s.pgintime); 34518761Ssam lseek(mf, (long)nl[X_SUM].n_value, L_SET); 3461155Sbill read(mf, &sum, sizeof sum); 3471155Sbill printf("%d reclaims, %d total time (usec)\n", sum.v_pgrec, s.rectime); 3481155Sbill printf("average: %d usec / reclaim\n", s.rectime/sum.v_pgrec); 3491155Sbill printf("\n"); 3501155Sbill printf("%d page ins, %d total time (msec)\n",sum.v_pgin, s.pgintime/10); 3511155Sbill printf("average: %8.1f msec / page in\n", s.pgintime/(sum.v_pgin*10.0)); 3521155Sbill } 3531155Sbill 3541155Sbill dosum() 3551155Sbill { 35618761Ssam struct nchstats nchstats; 35715807Smckusick long nchtotal; 3581155Sbill 35918761Ssam lseek(mf, (long)nl[X_SUM].n_value, L_SET); 3601155Sbill read(mf, &sum, sizeof sum); 3611155Sbill printf("%9d swap ins\n", sum.v_swpin); 3621155Sbill printf("%9d swap outs\n", sum.v_swpout); 3631155Sbill printf("%9d pages swapped in\n", sum.v_pswpin / CLSIZE); 3641155Sbill printf("%9d pages swapped out\n", sum.v_pswpout / CLSIZE); 3651155Sbill printf("%9d total address trans. faults taken\n", sum.v_faults); 3661155Sbill printf("%9d page ins\n", sum.v_pgin); 3671155Sbill printf("%9d page outs\n", sum.v_pgout); 3683612Sroot printf("%9d pages paged in\n", sum.v_pgpgin); 3693612Sroot printf("%9d pages paged out\n", sum.v_pgpgout); 3703612Sroot printf("%9d sequential process pages freed\n", sum.v_seqfree); 37112830Ssam printf("%9d total reclaims (%d%% fast)\n", sum.v_pgrec, 37212830Ssam (sum.v_fastpgrec * 100) / (sum.v_pgrec == 0 ? 1 : sum.v_pgrec)); 3731155Sbill printf("%9d reclaims from free list\n", sum.v_pgfrec); 3741155Sbill printf("%9d intransit blocking page faults\n", sum.v_intrans); 3751155Sbill printf("%9d zero fill pages created\n", sum.v_nzfod / CLSIZE); 3761155Sbill printf("%9d zero fill page faults\n", sum.v_zfod / CLSIZE); 3771155Sbill printf("%9d executable fill pages created\n", sum.v_nexfod / CLSIZE); 3781155Sbill printf("%9d executable fill page faults\n", sum.v_exfod / CLSIZE); 3791155Sbill printf("%9d swap text pages found in free list\n", sum.v_xsfrec); 3801155Sbill printf("%9d inode text pages found in free list\n", sum.v_xifrec); 3811155Sbill printf("%9d file fill pages created\n", sum.v_nvrfod / CLSIZE); 3821155Sbill printf("%9d file fill page faults\n", sum.v_vrfod / CLSIZE); 3831155Sbill printf("%9d pages examined by the clock daemon\n", sum.v_scan); 3841155Sbill printf("%9d revolutions of the clock hand\n", sum.v_rev); 3851155Sbill printf("%9d pages freed by the clock daemon\n", sum.v_dfree / CLSIZE); 3861155Sbill printf("%9d cpu context switches\n", sum.v_swtch); 3871155Sbill printf("%9d device interrupts\n", sum.v_intr); 38817262Smckusick printf("%9d software interrupts\n", sum.v_soft); 38918761Ssam #ifdef vax 3901155Sbill printf("%9d pseduo-dma dz interrupts\n", sum.v_pdma); 39118761Ssam #endif 3921155Sbill printf("%9d traps\n", sum.v_trap); 3931155Sbill printf("%9d system calls\n", sum.v_syscall); 39415807Smckusick lseek(mf, (long)nl[X_NCHSTATS].n_value, 0); 39518761Ssam read(mf, &nchstats, sizeof nchstats); 39618761Ssam nchtotal = nchstats.ncs_goodhits + nchstats.ncs_badhits + 39718761Ssam nchstats.ncs_falsehits + nchstats.ncs_miss + nchstats.ncs_long; 39815807Smckusick printf("%9d total name lookups", nchtotal); 39916586Ssam #define nz(x) ((x) ? (x) : 1) 40015807Smckusick printf(" (cache hits %d%% system %d%% per-process)\n", 40118761Ssam nchstats.ncs_goodhits * 100 / nz(nchtotal), 40218761Ssam nchstats.ncs_pass2 * 100 / nz(nchtotal)); 40316586Ssam printf("%9s badhits %d, falsehits %d, toolong %d\n", "", 40418761Ssam nchstats.ncs_badhits, nchstats.ncs_falsehits, nchstats.ncs_long); 4051155Sbill } 4061155Sbill 4071155Sbill doforkst() 4081155Sbill { 4091155Sbill 41018761Ssam lseek(mf, (long)nl[X_FORKSTAT].n_value, L_SET); 4111155Sbill read(mf, &forkstat, sizeof forkstat); 4121155Sbill printf("%d forks, %d pages, average=%.2f\n", 4131155Sbill forkstat.cntfork, forkstat.sizfork, 4141155Sbill (float) forkstat.sizfork / forkstat.cntfork); 4151155Sbill printf("%d vforks, %d pages, average=%.2f\n", 4161155Sbill forkstat.cntvfork, forkstat.sizvfork, 4171155Sbill (float)forkstat.sizvfork / forkstat.cntvfork); 4181155Sbill } 4191155Sbill 4201155Sbill stats(dn) 4211155Sbill { 4221155Sbill 42318761Ssam if (dn >= dk_ndrive) { 4241155Sbill printf(" 0"); 4251155Sbill return; 4261155Sbill } 4271448Sbill printf("%3.0f", s.xfer[dn]/etime); 4281155Sbill } 4291155Sbill 4301155Sbill double 4311155Sbill stat1(row) 4321155Sbill { 4331448Sbill double t; 4341448Sbill register i; 4351155Sbill 4361155Sbill t = 0; 4371155Sbill for(i=0; i<CPUSTATES; i++) 4381448Sbill t += s.time[i]; 4391448Sbill if(t == 0.) 4401448Sbill t = 1.; 4411448Sbill return(s.time[row]*100./t); 4421155Sbill } 4431155Sbill 4441155Sbill pct(top, bot) 4451155Sbill { 4461155Sbill 4471155Sbill if (bot == 0) 4481155Sbill return (0); 4491155Sbill return ((top * 100) / bot); 4501155Sbill } 4513162Stoy 45217262Smckusick dointr(nintv) 45317262Smckusick { 45417262Smckusick int nintr, inttotal; 45517262Smckusick long *intrcnt; 45617262Smckusick char *intrname, *malloc(); 45717262Smckusick 45817262Smckusick nintr = (nl[X_EINTRCNT].n_value - nl[X_INTRCNT].n_value) / sizeof(long); 45917262Smckusick intrcnt = (long *) malloc(nl[X_EINTRCNT].n_value - 46017262Smckusick nl[X_INTRCNT].n_value); 46117262Smckusick intrname = malloc(nl[X_EINTRNAMES].n_value - nl[X_INTRNAMES].n_value); 46217262Smckusick if (intrcnt == NULL || intrname == NULL) { 46317262Smckusick fprintf(stderr, "vmstat: out of memory\n"); 46417262Smckusick exit(9); 46517262Smckusick } 46618761Ssam lseek(mf, (long)nl[X_INTRCNT].n_value, L_SET); 46717262Smckusick read(mf, intrcnt, nintr * sizeof (long)); 46818761Ssam lseek(mf, (long)nl[X_INTRNAMES].n_value, L_SET); 46917262Smckusick read(mf, intrname, nl[X_EINTRNAMES].n_value - nl[X_INTRNAMES].n_value); 47017262Smckusick printf("interrupt total rate\n"); 47117262Smckusick inttotal = 0; 47217262Smckusick while (nintr--) { 47317262Smckusick if (*intrcnt) 47417262Smckusick printf("%-12s %8ld %8ld\n", intrname, 47517262Smckusick *intrcnt, *intrcnt / nintv); 47617262Smckusick intrname += strlen(intrname) + 1; 47717262Smckusick inttotal += *intrcnt++; 47817262Smckusick } 47917262Smckusick printf("Total %8ld %8ld\n", inttotal, inttotal / nintv); 48017262Smckusick } 48117262Smckusick 48218761Ssam #define steal(where, var) \ 48318761Ssam lseek(mf, where, L_SET); read(mf, &var, sizeof var); 4843162Stoy /* 4853162Stoy * Read the drive names out of kmem. 4863162Stoy */ 48710826Ssam #ifdef vax 48818761Ssam #include <vaxuba/ubavar.h> 48918761Ssam #include <vaxmba/mbavar.h> 49018761Ssam 4913162Stoy read_names() 4923162Stoy { 4933162Stoy struct mba_device mdev; 4943162Stoy register struct mba_device *mp; 4953162Stoy struct mba_driver mdrv; 4963162Stoy short two_char; 4973162Stoy char *cp = (char *) &two_char; 4983162Stoy struct uba_device udev, *up; 4993162Stoy struct uba_driver udrv; 5003162Stoy 5013162Stoy mp = (struct mba_device *) nl[X_MBDINIT].n_value; 5023162Stoy up = (struct uba_device *) nl[X_UBDINIT].n_value; 5033492Sroot if (up == 0) { 50410826Ssam fprintf(stderr, "vmstat: Disk init info not in namelist\n"); 5053162Stoy exit(1); 5063162Stoy } 5073492Sroot if (mp) for (;;) { 5083162Stoy steal(mp++, mdev); 5093162Stoy if (mdev.mi_driver == 0) 5103162Stoy break; 5113162Stoy if (mdev.mi_dk < 0 || mdev.mi_alive == 0) 5123162Stoy continue; 5133162Stoy steal(mdev.mi_driver, mdrv); 5143162Stoy steal(mdrv.md_dname, two_char); 51518761Ssam sprintf(dr_name[mdev.mi_dk], "%c%c%d", 51618761Ssam cp[0], cp[1], mdev.mi_unit); 5173162Stoy } 5183492Sroot for (;;) { 5193162Stoy steal(up++, udev); 5203162Stoy if (udev.ui_driver == 0) 5213162Stoy break; 5223162Stoy if (udev.ui_dk < 0 || udev.ui_alive == 0) 5233162Stoy continue; 5243162Stoy steal(udev.ui_driver, udrv); 5253162Stoy steal(udrv.ud_dname, two_char); 52618761Ssam sprintf(dr_name[udev.ui_dk], "%c%c%d", 52718761Ssam cp[0], cp[1], udev.ui_unit); 5283162Stoy } 5293162Stoy } 53010826Ssam #endif 531