+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", /* M_FREE */
+ "mbuf", /* M_MBUF */
+ "devbuf", /* M_DEVBUF */
+ "socket", /* M_SOCKET */
+ "pcb", /* M_PCB */
+ "routetbl", /* M_RTABLE */
+ "hosttbl", /* M_HTABLE */
+ "fragtbl", /* M_FTABLE */
+ "zombie", /* M_ZOMBIE */
+ "ifaddr", /* M_IFADDR */
+ "soopts", /* M_SOOPTS */
+ "soname", /* M_SONAME */
+ "namei", /* M_NAMEI */
+ "gprof", /* M_GPROF */
+ "ioctlops", /* M_IOCTLOPS */
+ "superblk", /* M_SUPERBLK */
+ "cred", /* M_CRED */
+ 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, 0, 0, 0,
+ "temp", /* 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);