Blame


1 f0f4401f 2004-04-23 devnull #include <u.h>
2 fe8c925e 2005-07-21 devnull #include <kvm.h>
3 fe8c925e 2005-07-21 devnull #include <nlist.h>
4 fe8c925e 2005-07-21 devnull #include <sys/types.h>
5 fe8c925e 2005-07-21 devnull #include <sys/param.h>
6 fe8c925e 2005-07-21 devnull #include <sys/socket.h>
7 fe8c925e 2005-07-21 devnull #include <sys/sysctl.h>
8 fe8c925e 2005-07-21 devnull #include <sys/time.h>
9 fe8c925e 2005-07-21 devnull #include <sys/dkstat.h>
10 fe8c925e 2005-07-21 devnull #include <net/if.h>
11 fe8c925e 2005-07-21 devnull #include <machine/apmvar.h>
12 fe8c925e 2005-07-21 devnull #include <sys/ioctl.h>
13 fe8c925e 2005-07-21 devnull #include <uvm/uvm_param.h>
14 fe8c925e 2005-07-21 devnull #include <uvm/uvm_extern.h>
15 fe8c925e 2005-07-21 devnull #include <limits.h>
16 f0f4401f 2004-04-23 devnull #include <libc.h>
17 f0f4401f 2004-04-23 devnull #include <bio.h>
18 f0f4401f 2004-04-23 devnull #include "dat.h"
19 f0f4401f 2004-04-23 devnull
20 fe8c925e 2005-07-21 devnull void xapm(int);
21 fe8c925e 2005-07-21 devnull void xloadavg(int);
22 fe8c925e 2005-07-21 devnull void xcpu(int);
23 fe8c925e 2005-07-21 devnull void xswap(int);
24 fe8c925e 2005-07-21 devnull void xsysctl(int);
25 fe8c925e 2005-07-21 devnull void xnet(int);
26 fe8c925e 2005-07-21 devnull void xkvm(int);
27 fe8c925e 2005-07-21 devnull
28 fe8c925e 2005-07-21 devnull void (*statfn[])(int) =
29 f0f4401f 2004-04-23 devnull {
30 fe8c925e 2005-07-21 devnull xkvm,
31 fe8c925e 2005-07-21 devnull xapm,
32 fe8c925e 2005-07-21 devnull xloadavg,
33 fe8c925e 2005-07-21 devnull xcpu,
34 fe8c925e 2005-07-21 devnull xsysctl,
35 fe8c925e 2005-07-21 devnull xnet,
36 f0f4401f 2004-04-23 devnull 0
37 f0f4401f 2004-04-23 devnull };
38 f0f4401f 2004-04-23 devnull
39 fe8c925e 2005-07-21 devnull static kvm_t *kvm;
40 fe8c925e 2005-07-21 devnull
41 fe8c925e 2005-07-21 devnull static struct nlist nl[] = {
42 fe8c925e 2005-07-21 devnull { "_ifnet" },
43 fe8c925e 2005-07-21 devnull { "_cp_time" },
44 fe8c925e 2005-07-21 devnull { "" },
45 fe8c925e 2005-07-21 devnull };
46 fe8c925e 2005-07-21 devnull
47 fe8c925e 2005-07-21 devnull void
48 fe8c925e 2005-07-21 devnull xloadavg(int first)
49 fe8c925e 2005-07-21 devnull {
50 fe8c925e 2005-07-21 devnull double l[3];
51 fe8c925e 2005-07-21 devnull
52 fe8c925e 2005-07-21 devnull if(first)
53 fe8c925e 2005-07-21 devnull return;
54 fe8c925e 2005-07-21 devnull
55 fe8c925e 2005-07-21 devnull if(getloadavg(l, 3) < 0)
56 fe8c925e 2005-07-21 devnull return;
57 fe8c925e 2005-07-21 devnull Bprint(&bout, "load =%d 1000\n", (int)(l[0]*1000.0));
58 fe8c925e 2005-07-21 devnull }
59 fe8c925e 2005-07-21 devnull
60 fe8c925e 2005-07-21 devnull void
61 fe8c925e 2005-07-21 devnull xapm(int first)
62 fe8c925e 2005-07-21 devnull {
63 fe8c925e 2005-07-21 devnull static int fd;
64 fe8c925e 2005-07-21 devnull struct apm_power_info ai;
65 fe8c925e 2005-07-21 devnull
66 fe8c925e 2005-07-21 devnull if(first){
67 fe8c925e 2005-07-21 devnull fd = open("/dev/apm", OREAD);
68 fe8c925e 2005-07-21 devnull return;
69 fe8c925e 2005-07-21 devnull }
70 fe8c925e 2005-07-21 devnull
71 fe8c925e 2005-07-21 devnull if(ioctl(fd, APM_IOC_GETPOWER, &ai) < 0)
72 fe8c925e 2005-07-21 devnull return;
73 fe8c925e 2005-07-21 devnull
74 fe8c925e 2005-07-21 devnull if(ai.battery_life <= 100)
75 fe8c925e 2005-07-21 devnull Bprint(&bout, "battery =%d 100\n", ai.battery_life);
76 fe8c925e 2005-07-21 devnull }
77 fe8c925e 2005-07-21 devnull
78 fe8c925e 2005-07-21 devnull
79 fe8c925e 2005-07-21 devnull void
80 fe8c925e 2005-07-21 devnull kvminit(void)
81 fe8c925e 2005-07-21 devnull {
82 fe8c925e 2005-07-21 devnull char buf[_POSIX2_LINE_MAX];
83 fe8c925e 2005-07-21 devnull
84 fe8c925e 2005-07-21 devnull if(kvm)
85 fe8c925e 2005-07-21 devnull return;
86 fe8c925e 2005-07-21 devnull kvm = kvm_openfiles(nil, nil, nil, O_RDONLY, buf);
87 fe8c925e 2005-07-21 devnull if(kvm == nil) {
88 fe8c925e 2005-07-21 devnull fprint(2, "kvm open error\n%s", buf);
89 fe8c925e 2005-07-21 devnull return;
90 fe8c925e 2005-07-21 devnull }
91 fe8c925e 2005-07-21 devnull if(kvm_nlist(kvm, nl) < 0 || nl[0].n_type == 0){
92 fe8c925e 2005-07-21 devnull kvm = nil;
93 fe8c925e 2005-07-21 devnull return;
94 fe8c925e 2005-07-21 devnull }
95 fe8c925e 2005-07-21 devnull }
96 fe8c925e 2005-07-21 devnull
97 fe8c925e 2005-07-21 devnull void
98 fe8c925e 2005-07-21 devnull xkvm(int first)
99 fe8c925e 2005-07-21 devnull {
100 fe8c925e 2005-07-21 devnull if(first)
101 fe8c925e 2005-07-21 devnull kvminit();
102 fe8c925e 2005-07-21 devnull }
103 fe8c925e 2005-07-21 devnull
104 fe8c925e 2005-07-21 devnull int
105 fe8c925e 2005-07-21 devnull kread(ulong addr, char *buf, int size)
106 fe8c925e 2005-07-21 devnull {
107 fe8c925e 2005-07-21 devnull if(kvm_read(kvm, addr, buf, size) != size){
108 fe8c925e 2005-07-21 devnull memset(buf, 0, size);
109 fe8c925e 2005-07-21 devnull return -1;
110 fe8c925e 2005-07-21 devnull }
111 fe8c925e 2005-07-21 devnull return size;
112 fe8c925e 2005-07-21 devnull }
113 fe8c925e 2005-07-21 devnull
114 fe8c925e 2005-07-21 devnull void
115 fe8c925e 2005-07-21 devnull xnet(int first)
116 fe8c925e 2005-07-21 devnull {
117 fe8c925e 2005-07-21 devnull ulong out, in, outb, inb, err;
118 fe8c925e 2005-07-21 devnull static ulong ifnetaddr;
119 fe8c925e 2005-07-21 devnull ulong addr;
120 fe8c925e 2005-07-21 devnull struct ifnet ifnet;
121 fe8c925e 2005-07-21 devnull struct ifnet_head ifnethead;
122 fe8c925e 2005-07-21 devnull char name[16];
123 fe8c925e 2005-07-21 devnull
124 fe8c925e 2005-07-21 devnull if(first)
125 fe8c925e 2005-07-21 devnull return;
126 fe8c925e 2005-07-21 devnull
127 fe8c925e 2005-07-21 devnull if(ifnetaddr == 0){
128 fe8c925e 2005-07-21 devnull ifnetaddr = nl[0].n_value;
129 fe8c925e 2005-07-21 devnull if(ifnetaddr == 0)
130 fe8c925e 2005-07-21 devnull return;
131 fe8c925e 2005-07-21 devnull }
132 fe8c925e 2005-07-21 devnull
133 fe8c925e 2005-07-21 devnull if(kread(ifnetaddr, (char*)&ifnethead, sizeof ifnethead) < 0)
134 fe8c925e 2005-07-21 devnull return;
135 fe8c925e 2005-07-21 devnull
136 fe8c925e 2005-07-21 devnull out = in = outb = inb = err = 0;
137 fe8c925e 2005-07-21 devnull addr = (ulong)TAILQ_FIRST(&ifnethead);
138 fe8c925e 2005-07-21 devnull while(addr){
139 fe8c925e 2005-07-21 devnull if(kread(addr, (char*)&ifnet, sizeof ifnet) < 0
140 fe8c925e 2005-07-21 devnull || kread((ulong)ifnet.if_xname, name, 16) < 0)
141 fe8c925e 2005-07-21 devnull return;
142 fe8c925e 2005-07-21 devnull name[15] = 0;
143 fe8c925e 2005-07-21 devnull addr = (ulong)TAILQ_NEXT(&ifnet, if_list);
144 fe8c925e 2005-07-21 devnull out += ifnet.if_opackets;
145 fe8c925e 2005-07-21 devnull in += ifnet.if_ipackets;
146 fe8c925e 2005-07-21 devnull outb += ifnet.if_obytes;
147 fe8c925e 2005-07-21 devnull inb += ifnet.if_ibytes;
148 fe8c925e 2005-07-21 devnull err += ifnet.if_oerrors+ifnet.if_ierrors;
149 fe8c925e 2005-07-21 devnull }
150 fe8c925e 2005-07-21 devnull Bprint(&bout, "etherin %lud 1000\n", in);
151 fe8c925e 2005-07-21 devnull Bprint(&bout, "etherout %lud 1000\n", out);
152 fe8c925e 2005-07-21 devnull Bprint(&bout, "etherinb %lud 1000000\n", inb);
153 fe8c925e 2005-07-21 devnull Bprint(&bout, "etheroutb %lud 1000000\n", outb);
154 fe8c925e 2005-07-21 devnull Bprint(&bout, "ethererr %lud 1000\n", err);
155 fe8c925e 2005-07-21 devnull Bprint(&bout, "ether %lud 1000\n", in+out);
156 fe8c925e 2005-07-21 devnull Bprint(&bout, "etherb %lud 1000000\n", inb+outb);
157 fe8c925e 2005-07-21 devnull }
158 fe8c925e 2005-07-21 devnull
159 fe8c925e 2005-07-21 devnull void
160 fe8c925e 2005-07-21 devnull xcpu(int first)
161 fe8c925e 2005-07-21 devnull {
162 fe8c925e 2005-07-21 devnull static int stathz;
163 fe8c925e 2005-07-21 devnull ulong x[20];
164 fe8c925e 2005-07-21 devnull struct clockinfo *ci;
165 fe8c925e 2005-07-21 devnull int mib[2];
166 fe8c925e 2005-07-21 devnull int l;
167 fe8c925e 2005-07-21 devnull
168 fe8c925e 2005-07-21 devnull if(first){
169 fe8c925e 2005-07-21 devnull mib[0] = CTL_KERN;
170 fe8c925e 2005-07-21 devnull mib[1] = KERN_CLOCKRATE;
171 fe8c925e 2005-07-21 devnull l = sizeof(x);
172 fe8c925e 2005-07-21 devnull sysctl(mib, 2, (char *)&x, &l, nil, 0);
173 fe8c925e 2005-07-21 devnull x[l] = 0;
174 fe8c925e 2005-07-21 devnull if (l < sizeof(ci))
175 fe8c925e 2005-07-21 devnull stathz = 128;
176 fe8c925e 2005-07-21 devnull else{
177 fe8c925e 2005-07-21 devnull ci = (struct clockinfo*)x;
178 fe8c925e 2005-07-21 devnull stathz = ci->stathz;
179 fe8c925e 2005-07-21 devnull }
180 fe8c925e 2005-07-21 devnull return;
181 fe8c925e 2005-07-21 devnull }
182 fe8c925e 2005-07-21 devnull
183 fe8c925e 2005-07-21 devnull mib[0] = CTL_KERN;
184 fe8c925e 2005-07-21 devnull mib[1] = KERN_CPTIME;
185 fe8c925e 2005-07-21 devnull l = sizeof(x);
186 fe8c925e 2005-07-21 devnull sysctl(mib, 2, (char *)&x, &l, nil, 0);
187 fe8c925e 2005-07-21 devnull if (l < 5*sizeof(ulong))
188 fe8c925e 2005-07-21 devnull return;
189 fe8c925e 2005-07-21 devnull x[l] = 0;
190 fe8c925e 2005-07-21 devnull
191 fe8c925e 2005-07-21 devnull Bprint(&bout, "user %lud %d\n", x[CP_USER]+x[CP_NICE], stathz);
192 fe8c925e 2005-07-21 devnull Bprint(&bout, "sys %lud %d\n", x[CP_SYS], stathz);
193 fe8c925e 2005-07-21 devnull Bprint(&bout, "cpu %lud %d\n", x[CP_USER]+x[CP_NICE]+x[CP_SYS], stathz);
194 fe8c925e 2005-07-21 devnull Bprint(&bout, "idle %lud %d\n", x[CP_IDLE], stathz);
195 fe8c925e 2005-07-21 devnull }
196 fe8c925e 2005-07-21 devnull
197 fe8c925e 2005-07-21 devnull void
198 fe8c925e 2005-07-21 devnull xsysctl(int first)
199 fe8c925e 2005-07-21 devnull {
200 fe8c925e 2005-07-21 devnull struct uvmexp vm;
201 fe8c925e 2005-07-21 devnull static int pgsize;
202 fe8c925e 2005-07-21 devnull int mib[2];
203 fe8c925e 2005-07-21 devnull size_t l;
204 fe8c925e 2005-07-21 devnull
205 fe8c925e 2005-07-21 devnull l = sizeof(vm);
206 fe8c925e 2005-07-21 devnull mib[0] = CTL_VM;
207 fe8c925e 2005-07-21 devnull mib[1] = VM_UVMEXP;
208 fe8c925e 2005-07-21 devnull sysctl(mib, 2, &vm, &l, nil, 0);
209 fe8c925e 2005-07-21 devnull if (l < sizeof(vm))
210 fe8c925e 2005-07-21 devnull return;
211 fe8c925e 2005-07-21 devnull
212 fe8c925e 2005-07-21 devnull if (first)
213 fe8c925e 2005-07-21 devnull pgsize = vm.pagesize;
214 fe8c925e 2005-07-21 devnull
215 fe8c925e 2005-07-21 devnull Bprint(&bout, "mem =%lud %lud\n", vm.active*pgsize, vm.npages*pgsize);
216 fe8c925e 2005-07-21 devnull Bprint(&bout, "context %lud 1000\n", vm.swtch);
217 fe8c925e 2005-07-21 devnull Bprint(&bout, "syscall %lud 1000\n", vm.syscalls);
218 fe8c925e 2005-07-21 devnull Bprint(&bout, "intr %lud 1000\n", vm.intrs+vm.traps);
219 fe8c925e 2005-07-21 devnull Bprint(&bout, "fault %lud 1000\n", vm.faults);
220 fe8c925e 2005-07-21 devnull
221 fe8c925e 2005-07-21 devnull Bprint(&bout, "fork %ud 1000\n", vm.forks);
222 fe8c925e 2005-07-21 devnull Bprint(&bout, "swap =%lud %lud\n", vm.swpginuse*pgsize, vm.swpages*pgsize);
223 fe8c925e 2005-07-21 devnull }