+dointr(nintv)
+{
+ int nintr, inttotal;
+ long *intrcnt;
+ char *intrname, *malloc();
+
+ nintr = (nl[X_EINTRCNT].n_value - nl[X_INTRCNT].n_value) / sizeof(long);
+ intrcnt = (long *) malloc(nl[X_EINTRCNT].n_value -
+ nl[X_INTRCNT].n_value);
+ intrname = malloc(nl[X_EINTRNAMES].n_value - nl[X_INTRNAMES].n_value);
+ if (intrcnt == NULL || intrname == NULL) {
+ fprintf(stderr, "vmstat: out of memory\n");
+ exit(9);
+ }
+ lseek(mf, (long)nl[X_INTRCNT].n_value, L_SET);
+ read(mf, intrcnt, nintr * sizeof (long));
+ lseek(mf, (long)nl[X_INTRNAMES].n_value, L_SET);
+ read(mf, intrname, nl[X_EINTRNAMES].n_value - nl[X_INTRNAMES].n_value);
+ printf("interrupt total rate\n");
+ inttotal = 0;
+ while (nintr--) {
+ if (*intrcnt)
+ printf("%-12s %8ld %8ld\n", intrname,
+ *intrcnt, *intrcnt / nintv);
+ intrname += strlen(intrname) + 1;
+ inttotal += *intrcnt++;
+ }
+ printf("Total %8ld %8ld\n", inttotal, inttotal / nintv);
+}
+
+/*
+ * These names must be kept in sync with
+ * the types defined in <sys/malloc.h>.
+ */
+char *kmemnames[] = {
+ "free", /* 0 M_FREE */
+ "mbuf", /* 1 M_MBUF */
+ "devbuf", /* 2 M_DEVBUF */
+ "socket", /* 3 M_SOCKET */
+ "pcb", /* 4 M_PCB */
+ "routetbl", /* 5 M_RTABLE */
+ "hosttbl", /* 6 M_HTABLE */
+ "fragtbl", /* 7 M_FTABLE */
+ "zombie", /* 8 M_ZOMBIE */
+ "ifaddr", /* 9 M_IFADDR */
+ "soopts", /* 10 M_SOOPTS */
+ "soname", /* 11 M_SONAME */
+ "namei", /* 12 M_NAMEI */
+ "gprof", /* 13 M_GPROF */
+ "ioctlops", /* 14 M_IOCTLOPS */
+ "superblk", /* 15 M_SUPERBLK */
+ "cred", /* 16 M_CRED */
+ "pgrp", /* 17 M_PGRP */
+ "session", /* 18 M_SESSION */
+ "iov", /* 19 M_IOV */
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ "temp", /* 49 M_TEMP */
+};
+
+domem()
+{
+ struct kmemstats kmemstats[M_LAST];
+ struct kmembuckets buckets[MINBUCKET + 16];
+ register struct kmembuckets *kp;
+ register struct kmemstats *ks;
+ int i;
+
+ lseek(mf, (long)nl[X_KMEMBUCKETS].n_value, L_SET);
+ read(mf, buckets, sizeof buckets);
+ printf("Memory statistics by bucket size\n");
+ printf(" Size In Use Free Requests HighWater Couldfree\n");
+ for (i = MINBUCKET, kp = &buckets[i]; i < MINBUCKET + 16; i++, kp++) {
+ if (kp->kb_calls == 0)
+ continue;
+ printf("%8d%9d%7d%11d%8d%11d\n", 1 << i,
+ kp->kb_total - kp->kb_totalfree,
+ kp->kb_totalfree, kp->kb_calls,
+ kp->kb_highwat, kp->kb_couldfree);
+
+ }
+ lseek(mf, (long)nl[X_KMEMSTAT].n_value, L_SET);
+ read(mf, kmemstats, sizeof kmemstats);
+ printf("Memory statistics by type\n");
+ printf(" Type In Use MemUse HighUse Limit Requests %s\n",
+ "TypeLimit KernLimit");
+ for (i = 0, ks = &kmemstats[0]; i < M_LAST; i++, ks++) {
+ if (ks->ks_calls == 0)
+ continue;
+ printf("%10s%7d%8dK%9dK%6dK%9d%7d%10d\n",
+ kmemnames[i] ? kmemnames[i] : "undefined",
+ ks->ks_inuse, (ks->ks_memuse + 1023) / 1024,
+ (ks->ks_maxused + 1023) / 1024,
+ (ks->ks_limit + 1023) / 1024, ks->ks_calls,
+ ks->ks_limblocks, ks->ks_mapblocks);
+ }
+}
+
+#define steal(where, var) \
+ lseek(mf, where, L_SET); read(mf, &var, sizeof var);