1 #define _KERNEL_STRUCTURES
3 #include <sys/sysctl.h>
4 #include <sys/vmmeter.h>
20 #define DRAW_ROW(n, y, w, fmt, args...) \
22 mvprintw(y, n, fmt, w, args); \
27 static int vmm_fetched;
28 static struct vmmeter *vmm_cur, *vmm_prev;
29 static struct kinfo_cputime *vmm_cptime_cur, *vmm_cptime_prev;
37 for (i = 0; i < vmm_ncpus; ++i) {
38 struct vmmeter *vmm = &vmm_cur[i];
42 snprintf(buf, sizeof(buf), "vm.cpu%d.vmmeter", i);
43 if (sysctlbyname(buf, vmm, &sz, NULL, 0))
44 err(1, "sysctlbyname(cpu%d)", i);
46 vmm->v_intr -= (vmm->v_timer + vmm->v_ipi);
49 sz = vmm_ncpus * sizeof(struct kinfo_cputime);
50 if (sysctlbyname("kern.cputime", vmm_cptime_cur, &sz, NULL, 0))
51 err(1, "kern.cputime");
68 for (i = 0; i < vmm_ncpus; ++i) {
69 struct kinfo_cputime d;
70 uint64_t cp_total = 0;
72 n = X_START + CPU_LABEL_W;
74 #define D(idx, field) \
75 (vmm_cur[idx].field - vmm_prev[idx].field) / (u_int)naptime
77 DRAW_ROW(n, CPU_START + i, 6, "%*u", D(i, v_timer));
78 DRAW_ROW(n, CPU_START + i, 8, "%*u", D(i, v_ipi));
79 DRAW_ROW(n, CPU_START + i, 8, "%*u", D(i, v_intr));
83 #define CPUD(dif, idx, field) \
85 dif.cp_##field = vmm_cptime_cur[idx].cp_##field - \
86 vmm_cptime_prev[idx].cp_##field; \
87 cp_total += dif.cp_##field; \
90 #define CPUV(dif, field) \
91 (dif.cp_##field * 100.0) / cp_total
102 DRAW_ROW(n, CPU_START + i, 7, "%*.1f", CPUV(d, user));
103 DRAW_ROW(n, CPU_START + i, 7, "%*.1f", CPUV(d, nice));
104 DRAW_ROW(n, CPU_START + i, 7, "%*.1f", CPUV(d, sys));
105 DRAW_ROW(n, CPU_START + i, 7, "%*.1f", CPUV(d, intr));
106 DRAW_ROW(n, CPU_START + i, 7, "%*.1f", CPUV(d, idle));
118 memcpy(vmm_prev, vmm_cur, sizeof(struct vmmeter) * vmm_ncpus);
119 memcpy(vmm_cptime_prev, vmm_cptime_cur,
120 sizeof(struct kinfo_cputime) * vmm_ncpus);
131 n = X_START + CPU_LABEL_W;
133 DRAW_ROW(n, 0, 6, "%*s", "timer");
134 DRAW_ROW(n, 0, 8, "%*s", "ipi");
135 DRAW_ROW(n, 0, 8, "%*s", "extint");
136 DRAW_ROW(n, 0, 7, "%*s", "user%");
137 DRAW_ROW(n, 0, 7, "%*s", "nice%");
138 DRAW_ROW(n, 0, 7, "%*s", "sys%");
139 DRAW_ROW(n, 0, 7, "%*s", "intr%");
140 DRAW_ROW(n, 0, 7, "%*s", "idle%");
142 for (i = 0; i < vmm_ncpus; ++i)
143 mvprintw(CPU_START + i, X_START, "cpu%d", i);
149 if (kinfo_get_cpus(&vmm_ncpus))
150 err(1, "kinfo_get_cpus");
152 vmm_cur = calloc(vmm_ncpus, sizeof(*vmm_cur));
154 err(1, "calloc vmm_cur");
156 vmm_prev = calloc(vmm_ncpus, sizeof(*vmm_prev));
157 if (vmm_prev == NULL)
158 err(1, "calloc vmm_prev");
160 vmm_cptime_cur = calloc(vmm_ncpus, sizeof(*vmm_cptime_cur));
161 if (vmm_cptime_cur == NULL)
162 err(1, "calloc vmm_cptime_cur");
164 vmm_cptime_prev = calloc(vmm_ncpus, sizeof(*vmm_cptime_prev));
165 if (vmm_cptime_prev == NULL)
166 err(1, "calloc vmm_cptime_prev");
178 if (vmm_prev != NULL)
181 if (vmm_cptime_cur != NULL)
182 free(vmm_cptime_cur);
183 if (vmm_cptime_prev != NULL)
184 free(vmm_cptime_prev);