Commit | Line | Data |
---|---|---|
fd57c467 | 1 | /*- |
3253af67 KB |
2 | * Copyright (c) 1990, 1993 |
3 | * The Regents of the University of California. All rights reserved. | |
fd57c467 KB |
4 | * |
5 | * %sccs.include.redist.c% | |
6 | */ | |
7 | ||
8 | #ifndef lint | |
fa2ed2fe | 9 | static char sccsid[] = "@(#)print.c 8.2 (Berkeley) %G%"; |
fd57c467 KB |
10 | #endif /* not lint */ |
11 | ||
fd57c467 KB |
12 | #include <sys/param.h> |
13 | #include <sys/time.h> | |
14 | #include <sys/resource.h> | |
15 | #include <sys/proc.h> | |
16 | #include <sys/stat.h> | |
fd57c467 | 17 | |
1d2a7f51 MK |
18 | #ifdef SPPWAIT |
19 | #define NEWVM | |
20 | #endif | |
21 | ||
22 | #ifdef NEWVM | |
1d2a7f51 | 23 | #include <sys/ucred.h> |
92043c14 KB |
24 | #include <sys/sysctl.h> |
25 | #include <vm/vm.h> | |
1d2a7f51 MK |
26 | #else |
27 | #include <machine/pte.h> | |
28 | #include <sys/vmparam.h> | |
29 | #include <sys/vm.h> | |
30 | #endif | |
31 | ||
92043c14 KB |
32 | #include <err.h> |
33 | #include <math.h> | |
34 | #include <nlist.h> | |
35 | #include <stddef.h> | |
36 | #include <stdio.h> | |
37 | #include <stdlib.h> | |
38 | #include <string.h> | |
39 | #include <tzfile.h> | |
40 | ||
41 | #include "ps.h" | |
42 | ||
8faab6ff KB |
43 | static void printval __P((char*, struct var *)); |
44 | ||
45 | void | |
fd57c467 KB |
46 | printheader() |
47 | { | |
48 | register VAR *v; | |
b595f31e | 49 | register struct varent *vent; |
fd57c467 | 50 | |
b595f31e MT |
51 | for (vent = vhead; vent; vent = vent->next) { |
52 | v = vent->var; | |
fd57c467 | 53 | if (v->flag & LJUST) { |
b595f31e | 54 | if (vent->next == NULL) /* last one */ |
8faab6ff | 55 | (void)printf("%s", v->header); |
fd57c467 | 56 | else |
8faab6ff | 57 | (void)printf("%-*s", v->width, v->header); |
fd57c467 | 58 | } else |
8faab6ff | 59 | (void)printf("%*s", v->width, v->header); |
b595f31e | 60 | if (vent->next != NULL) |
8faab6ff | 61 | (void)putchar(' '); |
fd57c467 | 62 | } |
8faab6ff | 63 | (void)putchar('\n'); |
fd57c467 KB |
64 | } |
65 | ||
8faab6ff KB |
66 | void |
67 | command(k, ve) | |
fd57c467 | 68 | KINFO *k; |
8faab6ff | 69 | VARENT *ve; |
fd57c467 KB |
70 | { |
71 | extern int termwidth, totwidth; | |
8faab6ff | 72 | VAR *v; |
fd57c467 | 73 | |
8faab6ff KB |
74 | v = ve->var; |
75 | if (ve->next == NULL) { | |
fd57c467 | 76 | /* last field */ |
967726ab KM |
77 | if (termwidth == UNLIMITED) { |
78 | if (k->ki_env) | |
8faab6ff KB |
79 | (void)printf("%s ", k->ki_env); |
80 | (void)printf("%s", k->ki_args); | |
967726ab | 81 | } else { |
fd57c467 | 82 | register int left = termwidth - (totwidth - v->width); |
967726ab | 83 | register char *cp; |
fd57c467 KB |
84 | |
85 | if (left < 1) /* already wrapped, just use std width */ | |
86 | left = v->width; | |
967726ab KM |
87 | cp = k->ki_env; |
88 | if (cp != 0) { | |
89 | while (--left >= 0 && *cp) | |
8faab6ff | 90 | (void)putchar(*cp++); |
967726ab KM |
91 | if (--left >= 0) |
92 | putchar(' '); | |
93 | } | |
94 | cp = k->ki_args; | |
fd57c467 | 95 | while (--left >= 0 && *cp) |
8faab6ff | 96 | (void)putchar(*cp++); |
fd57c467 KB |
97 | } |
98 | } else | |
967726ab | 99 | /* XXX env? */ |
8faab6ff | 100 | (void)printf("%-*.*s", v->width, v->width, k->ki_args); |
fd57c467 KB |
101 | } |
102 | ||
8faab6ff KB |
103 | void |
104 | ucomm(k, ve) | |
fd57c467 | 105 | KINFO *k; |
8faab6ff | 106 | VARENT *ve; |
fd57c467 | 107 | { |
8faab6ff KB |
108 | VAR *v; |
109 | ||
110 | v = ve->var; | |
111 | (void)printf("%-*s", v->width, KI_PROC(k)->p_comm); | |
fd57c467 KB |
112 | } |
113 | ||
8faab6ff KB |
114 | void |
115 | logname(k, ve) | |
fd57c467 | 116 | KINFO *k; |
8faab6ff | 117 | VARENT *ve; |
fd57c467 | 118 | { |
8faab6ff KB |
119 | VAR *v; |
120 | ||
121 | v = ve->var; | |
1d2a7f51 | 122 | #ifndef NEWVM |
8faab6ff | 123 | (void)printf("%-*s", v->width, KI_PROC(k)->p_logname); |
1d2a7f51 | 124 | #else /* NEWVM */ |
8faab6ff | 125 | (void)printf("%-*s", v->width, KI_EPROC(k)->e_login); |
1d2a7f51 | 126 | #endif /* NEWVM */ |
fd57c467 KB |
127 | } |
128 | ||
8faab6ff KB |
129 | void |
130 | state(k, ve) | |
fd57c467 | 131 | KINFO *k; |
8faab6ff | 132 | VARENT *ve; |
fd57c467 | 133 | { |
8faab6ff KB |
134 | register struct proc *p; |
135 | register int flag; | |
136 | register char *cp; | |
137 | VAR *v; | |
fd57c467 | 138 | char buf[16]; |
8faab6ff KB |
139 | |
140 | v = ve->var; | |
141 | p = KI_PROC(k); | |
142 | flag = p->p_flag; | |
143 | cp = buf; | |
fd57c467 KB |
144 | |
145 | switch (p->p_stat) { | |
146 | ||
147 | case SSTOP: | |
148 | *cp = 'T'; | |
149 | break; | |
150 | ||
151 | case SSLEEP: | |
152 | if (flag & SSINTR) /* interuptable (long) */ | |
153 | *cp = p->p_slptime >= MAXSLP ? 'I' : 'S'; | |
154 | else | |
06bdd538 | 155 | *cp = 'D'; |
fd57c467 KB |
156 | break; |
157 | ||
158 | case SRUN: | |
159 | case SIDL: | |
160 | *cp = 'R'; | |
161 | break; | |
162 | ||
163 | case SZOMB: | |
164 | *cp = 'Z'; | |
165 | break; | |
166 | ||
167 | default: | |
168 | *cp = '?'; | |
169 | } | |
170 | cp++; | |
171 | if (flag & SLOAD) { | |
1d2a7f51 | 172 | #ifndef NEWVM |
fd57c467 KB |
173 | if (p->p_rssize > p->p_maxrss) |
174 | *cp++ = '>'; | |
1d2a7f51 | 175 | #endif |
fd57c467 KB |
176 | } else |
177 | *cp++ = 'W'; | |
178 | if (p->p_nice < NZERO) | |
179 | *cp++ = '<'; | |
180 | else if (p->p_nice > NZERO) | |
181 | *cp++ = 'N'; | |
dfc2fdfb | 182 | #ifndef NEWVM |
fd57c467 KB |
183 | if (flag & SUANOM) |
184 | *cp++ = 'A'; | |
185 | else if (flag & SSEQL) | |
186 | *cp++ = 'S'; | |
dfc2fdfb | 187 | #endif |
fd57c467 KB |
188 | if (flag & STRC) |
189 | *cp++ = 'X'; | |
1d2a7f51 | 190 | if (flag & SWEXIT && p->p_stat != SZOMB) |
fd57c467 | 191 | *cp++ = 'E'; |
1d2a7f51 MK |
192 | #ifdef NEWVM |
193 | if (flag & SPPWAIT) | |
194 | #else | |
fd57c467 | 195 | if (flag & SVFORK) |
1d2a7f51 | 196 | #endif |
fd57c467 | 197 | *cp++ = 'V'; |
dfc2fdfb MK |
198 | #ifdef NEWVM |
199 | if (flag & (SSYS|SLOCK|SKEEP|SPHYSIO)) | |
200 | #else | |
fd57c467 | 201 | if (flag & (SSYS|SLOCK|SULOCK|SKEEP|SPHYSIO)) |
dfc2fdfb | 202 | #endif |
fd57c467 | 203 | *cp++ = 'L'; |
967726ab | 204 | if (KI_EPROC(k)->e_flag & EPROC_SLEADER) |
fd57c467 | 205 | *cp++ = 's'; |
967726ab | 206 | if ((flag & SCTTY) && KI_EPROC(k)->e_pgid == KI_EPROC(k)->e_tpgid) |
fd57c467 KB |
207 | *cp++ = '+'; |
208 | *cp = '\0'; | |
8faab6ff | 209 | (void)printf("%-*s", v->width, buf); |
fd57c467 KB |
210 | } |
211 | ||
8faab6ff KB |
212 | void |
213 | pri(k, ve) | |
fd57c467 | 214 | KINFO *k; |
8faab6ff | 215 | VARENT *ve; |
fd57c467 | 216 | { |
8faab6ff KB |
217 | VAR *v; |
218 | ||
219 | v = ve->var; | |
fa2ed2fe | 220 | (void)printf("%*d", v->width, KI_PROC(k)->p_priority - PZERO); |
fd57c467 KB |
221 | } |
222 | ||
8faab6ff KB |
223 | void |
224 | uname(k, ve) | |
fd57c467 | 225 | KINFO *k; |
8faab6ff | 226 | VARENT *ve; |
fd57c467 | 227 | { |
8faab6ff KB |
228 | VAR *v; |
229 | ||
230 | v = ve->var; | |
1d2a7f51 | 231 | #ifndef NEWVM |
92043c14 KB |
232 | (void)printf("%-*s", |
233 | (int)v->width, user_from_uid(KI_PROC(k)->p_uid, 0)); | |
234 | #else | |
235 | (void)printf("%-*s", | |
236 | (int)v->width, user_from_uid(KI_EPROC(k)->e_ucred.cr_uid, 0)); | |
237 | #endif | |
fd57c467 KB |
238 | } |
239 | ||
8faab6ff KB |
240 | void |
241 | runame(k, ve) | |
fd57c467 | 242 | KINFO *k; |
8faab6ff | 243 | VARENT *ve; |
fd57c467 | 244 | { |
8faab6ff KB |
245 | VAR *v; |
246 | ||
247 | v = ve->var; | |
1d2a7f51 | 248 | #ifndef NEWVM |
92043c14 KB |
249 | (void)printf("%-*s", |
250 | (int)v->width, user_from_uid(KI_PROC(k)->p_ruid, 0)); | |
251 | #else | |
252 | (void)printf("%-*s", | |
253 | (int)v->width, user_from_uid(KI_EPROC(k)->e_pcred.p_ruid, 0)); | |
254 | #endif | |
fd57c467 KB |
255 | } |
256 | ||
8faab6ff KB |
257 | void |
258 | tdev(k, ve) | |
fd57c467 | 259 | KINFO *k; |
8faab6ff | 260 | VARENT *ve; |
fd57c467 | 261 | { |
8faab6ff KB |
262 | VAR *v; |
263 | dev_t dev; | |
264 | char buff[16]; | |
fd57c467 | 265 | |
8faab6ff KB |
266 | v = ve->var; |
267 | dev = KI_EPROC(k)->e_tdev; | |
fd57c467 | 268 | if (dev == NODEV) |
8faab6ff | 269 | (void)printf("%*s", v->width, "??"); |
fd57c467 | 270 | else { |
8faab6ff KB |
271 | (void)snprintf(buff, sizeof(buff), |
272 | "%d/%d", major(dev), minor(dev)); | |
273 | (void)printf("%*s", v->width, buff); | |
fd57c467 KB |
274 | } |
275 | } | |
276 | ||
8faab6ff KB |
277 | void |
278 | tname(k, ve) | |
fd57c467 | 279 | KINFO *k; |
8faab6ff | 280 | VARENT *ve; |
fd57c467 | 281 | { |
8faab6ff | 282 | VAR *v; |
fd57c467 | 283 | dev_t dev; |
8faab6ff | 284 | char *ttname; |
fd57c467 | 285 | |
8faab6ff | 286 | v = ve->var; |
967726ab | 287 | dev = KI_EPROC(k)->e_tdev; |
fd57c467 | 288 | if (dev == NODEV || (ttname = devname(dev, S_IFCHR)) == NULL) |
8faab6ff | 289 | (void)printf("%-*s", v->width, "??"); |
fd57c467 KB |
290 | else { |
291 | if (strncmp(ttname, "tty", 3) == 0) | |
292 | ttname += 3; | |
8faab6ff | 293 | (void)printf("%*.*s%c", v->width-1, v->width-1, ttname, |
967726ab | 294 | KI_EPROC(k)->e_flag & EPROC_CTTY ? ' ' : '-'); |
fd57c467 KB |
295 | } |
296 | } | |
297 | ||
8faab6ff KB |
298 | void |
299 | longtname(k, ve) | |
fd57c467 | 300 | KINFO *k; |
8faab6ff | 301 | VARENT *ve; |
fd57c467 | 302 | { |
8faab6ff | 303 | VAR *v; |
fd57c467 | 304 | dev_t dev; |
8faab6ff KB |
305 | char *ttname; |
306 | ||
307 | v = ve->var; | |
967726ab | 308 | dev = KI_EPROC(k)->e_tdev; |
fd57c467 | 309 | if (dev == NODEV || (ttname = devname(dev, S_IFCHR)) == NULL) |
8faab6ff | 310 | (void)printf("%-*s", v->width, "??"); |
fd57c467 | 311 | else |
8faab6ff | 312 | (void)printf("%-*s", v->width, ttname); |
fd57c467 KB |
313 | } |
314 | ||
8faab6ff KB |
315 | void |
316 | started(k, ve) | |
fd57c467 | 317 | KINFO *k; |
8faab6ff | 318 | VARENT *ve; |
fd57c467 | 319 | { |
8faab6ff | 320 | VAR *v; |
fd57c467 KB |
321 | static time_t now; |
322 | struct tm *tp; | |
323 | char buf[100]; | |
324 | ||
8faab6ff | 325 | v = ve->var; |
967726ab | 326 | if (!k->ki_u.u_valid) { |
8faab6ff | 327 | (void)printf("%-*s", v->width, "-"); |
fd57c467 KB |
328 | return; |
329 | } | |
330 | ||
967726ab | 331 | tp = localtime(&k->ki_u.u_start.tv_sec); |
fd57c467 KB |
332 | if (!now) |
333 | (void)time(&now); | |
967726ab | 334 | if (now - k->ki_u.u_start.tv_sec < 24 * SECSPERHOUR) { |
be84eea2 | 335 | static char fmt[] = "%l:@M%p"; |
3be22949 | 336 | fmt[3] = '%'; /* I *hate* SCCS... */ |
8faab6ff | 337 | (void)strftime(buf, sizeof(buf) - 1, fmt, tp); |
967726ab | 338 | } else if (now - k->ki_u.u_start.tv_sec < 7 * SECSPERDAY) { |
be84eea2 | 339 | static char fmt[] = "%a@I%p"; |
3be22949 | 340 | fmt[2] = '%'; /* I *hate* SCCS... */ |
8faab6ff | 341 | (void)strftime(buf, sizeof(buf) - 1, fmt, tp); |
3be22949 | 342 | } else |
8faab6ff KB |
343 | (void)strftime(buf, sizeof(buf) - 1, "%e%b%y", tp); |
344 | (void)printf("%-*s", v->width, buf); | |
fd57c467 KB |
345 | } |
346 | ||
8faab6ff KB |
347 | void |
348 | lstarted(k, ve) | |
fd57c467 | 349 | KINFO *k; |
8faab6ff | 350 | VARENT *ve; |
fd57c467 | 351 | { |
8faab6ff | 352 | VAR *v; |
fd57c467 KB |
353 | char buf[100]; |
354 | ||
8faab6ff | 355 | v = ve->var; |
967726ab | 356 | if (!k->ki_u.u_valid) { |
8faab6ff | 357 | (void)printf("%-*s", v->width, "-"); |
fd57c467 KB |
358 | return; |
359 | } | |
8faab6ff | 360 | (void)strftime(buf, sizeof(buf) -1, "%C", |
967726ab | 361 | localtime(&k->ki_u.u_start.tv_sec)); |
8faab6ff | 362 | (void)printf("%-*s", v->width, buf); |
fd57c467 KB |
363 | } |
364 | ||
8faab6ff KB |
365 | void |
366 | wchan(k, ve) | |
fd57c467 | 367 | KINFO *k; |
8faab6ff | 368 | VARENT *ve; |
fd57c467 | 369 | { |
8faab6ff KB |
370 | VAR *v; |
371 | ||
372 | v = ve->var; | |
967726ab KM |
373 | if (KI_PROC(k)->p_wchan) { |
374 | if (KI_PROC(k)->p_wmesg) | |
8faab6ff | 375 | (void)printf("%-*.*s", v->width, v->width, |
967726ab | 376 | KI_EPROC(k)->e_wmesg); |
fd57c467 | 377 | else |
8faab6ff | 378 | (void)printf("%-*x", v->width, |
967726ab | 379 | (int)KI_PROC(k)->p_wchan &~ KERNBASE); |
fd57c467 | 380 | } else |
8faab6ff | 381 | (void)printf("%-*s", v->width, "-"); |
fd57c467 KB |
382 | } |
383 | ||
384 | #define pgtok(a) (((a)*NBPG)/1024) | |
385 | ||
8faab6ff KB |
386 | void |
387 | vsize(k, ve) | |
fd57c467 | 388 | KINFO *k; |
8faab6ff | 389 | VARENT *ve; |
fd57c467 | 390 | { |
8faab6ff KB |
391 | VAR *v; |
392 | ||
393 | v = ve->var; | |
394 | (void)printf("%*d", v->width, | |
1d2a7f51 | 395 | #ifndef NEWVM |
967726ab | 396 | pgtok(KI_PROC(k)->p_dsize + KI_PROC(k)->p_ssize + KI_EPROC(k)->e_xsize)); |
1d2a7f51 | 397 | #else /* NEWVM */ |
967726ab KM |
398 | pgtok(KI_EPROC(k)->e_vm.vm_dsize + KI_EPROC(k)->e_vm.vm_ssize + |
399 | KI_EPROC(k)->e_vm.vm_tsize)); | |
1d2a7f51 | 400 | #endif /* NEWVM */ |
fd57c467 KB |
401 | } |
402 | ||
8faab6ff KB |
403 | void |
404 | rssize(k, ve) | |
fd57c467 | 405 | KINFO *k; |
8faab6ff | 406 | VARENT *ve; |
fd57c467 | 407 | { |
8faab6ff KB |
408 | VAR *v; |
409 | ||
410 | v = ve->var; | |
1d2a7f51 | 411 | #ifndef NEWVM |
8faab6ff | 412 | (void)printf("%*d", v->width, |
967726ab KM |
413 | pgtok(KI_PROC(k)->p_rssize + (KI_EPROC(k)->e_xccount ? |
414 | (KI_EPROC(k)->e_xrssize / KI_EPROC(k)->e_xccount) : 0))); | |
1d2a7f51 MK |
415 | #else /* NEWVM */ |
416 | /* XXX don't have info about shared */ | |
8faab6ff | 417 | (void)printf("%*d", v->width, pgtok(KI_EPROC(k)->e_vm.vm_rssize)); |
1d2a7f51 | 418 | #endif /* NEWVM */ |
fd57c467 KB |
419 | } |
420 | ||
8faab6ff KB |
421 | void |
422 | p_rssize(k, ve) /* doesn't account for text */ | |
fd57c467 | 423 | KINFO *k; |
8faab6ff | 424 | VARENT *ve; |
fd57c467 | 425 | { |
8faab6ff KB |
426 | VAR *v; |
427 | ||
428 | v = ve->var; | |
1d2a7f51 | 429 | #ifndef NEWVM |
8faab6ff | 430 | (void)printf("%*d", v->width, pgtok(KI_PROC(k)->p_rssize)); |
1d2a7f51 | 431 | #else /* NEWVM */ |
8faab6ff | 432 | (void)printf("%*d", v->width, pgtok(KI_EPROC(k)->e_vm.vm_rssize)); |
1d2a7f51 | 433 | #endif /* NEWVM */ |
fd57c467 KB |
434 | } |
435 | ||
8faab6ff KB |
436 | void |
437 | cputime(k, ve) | |
fd57c467 | 438 | KINFO *k; |
8faab6ff | 439 | VARENT *ve; |
fd57c467 KB |
440 | { |
441 | extern int sumrusage; | |
8faab6ff | 442 | VAR *v; |
fd57c467 KB |
443 | long secs; |
444 | long psecs; /* "parts" of a second. first micro, then centi */ | |
445 | char obuff[128]; | |
446 | ||
8faab6ff | 447 | v = ve->var; |
967726ab | 448 | if (KI_PROC(k)->p_stat == SZOMB || !k->ki_u.u_valid) { |
fd57c467 KB |
449 | secs = 0; |
450 | psecs = 0; | |
451 | } else { | |
9e6d0323 CT |
452 | /* |
453 | * This counts time spent handling interrupts. We could | |
454 | * fix this, but it is not 100% trivial (and interrupt | |
455 | * time fractions only work on the sparc anyway). XXX | |
456 | */ | |
457 | secs = KI_PROC(k)->p_rtime.tv_sec; | |
458 | psecs = KI_PROC(k)->p_rtime.tv_usec; | |
fd57c467 | 459 | if (sumrusage) { |
967726ab KM |
460 | secs += k->ki_u.u_cru.ru_utime.tv_sec + |
461 | k->ki_u.u_cru.ru_stime.tv_sec; | |
462 | psecs += k->ki_u.u_cru.ru_utime.tv_usec + | |
463 | k->ki_u.u_cru.ru_stime.tv_usec; | |
fd57c467 KB |
464 | } |
465 | /* | |
466 | * round and scale to 100's | |
467 | */ | |
468 | psecs = (psecs + 5000) / 10000; | |
6728dbc4 KB |
469 | secs += psecs / 100; |
470 | psecs = psecs % 100; | |
fd57c467 | 471 | } |
8faab6ff KB |
472 | (void)snprintf(obuff, sizeof(obuff), |
473 | "%3ld:%02ld.%02ld", secs/60, secs%60, psecs); | |
474 | (void)printf("%*s", v->width, obuff); | |
fd57c467 KB |
475 | } |
476 | ||
477 | double | |
478 | getpcpu(k) | |
479 | KINFO *k; | |
480 | { | |
481 | extern fixpt_t ccpu; | |
482 | extern int fscale, nlistread, rawcpu; | |
483 | struct proc *p; | |
484 | static int failure; | |
485 | ||
486 | if (!nlistread) | |
487 | failure = donlist(); | |
488 | if (failure) | |
489 | return (0.0); | |
490 | ||
967726ab | 491 | p = KI_PROC(k); |
fd57c467 KB |
492 | #define fxtofl(fixpt) ((double)(fixpt) / fscale) |
493 | ||
494 | /* XXX - I don't like this */ | |
fa2ed2fe | 495 | if (p->p_swtime == 0 || (p->p_flag & SLOAD) == 0) |
fd57c467 KB |
496 | return (0.0); |
497 | if (rawcpu) | |
498 | return (100.0 * fxtofl(p->p_pctcpu)); | |
499 | return (100.0 * fxtofl(p->p_pctcpu) / | |
fa2ed2fe | 500 | (1.0 - exp(p->p_swtime * log(fxtofl(ccpu))))); |
fd57c467 KB |
501 | } |
502 | ||
8faab6ff KB |
503 | void |
504 | pcpu(k, ve) | |
fd57c467 | 505 | KINFO *k; |
8faab6ff | 506 | VARENT *ve; |
fd57c467 | 507 | { |
8faab6ff KB |
508 | VAR *v; |
509 | ||
510 | v = ve->var; | |
511 | (void)printf("%*.1f", v->width, getpcpu(k)); | |
fd57c467 KB |
512 | } |
513 | ||
514 | double | |
515 | getpmem(k) | |
516 | KINFO *k; | |
517 | { | |
6e7a85b8 | 518 | extern int mempages, nlistread; |
fd57c467 KB |
519 | static int failure; |
520 | struct proc *p; | |
521 | struct eproc *e; | |
522 | double fracmem; | |
523 | int szptudot; | |
524 | ||
525 | if (!nlistread) | |
526 | failure = donlist(); | |
527 | if (failure) | |
528 | return (0.0); | |
529 | ||
967726ab KM |
530 | p = KI_PROC(k); |
531 | e = KI_EPROC(k); | |
fd57c467 KB |
532 | if ((p->p_flag & SLOAD) == 0) |
533 | return (0.0); | |
1d2a7f51 | 534 | #ifndef NEWVM |
fd57c467 | 535 | szptudot = UPAGES + clrnd(ctopt(p->p_dsize + p->p_ssize + e->e_xsize)); |
6e7a85b8 | 536 | fracmem = ((float)p->p_rssize + szptudot)/CLSIZE/mempages; |
fd57c467 | 537 | if (p->p_textp && e->e_xccount) |
6e7a85b8 | 538 | fracmem += ((float)e->e_xrssize)/CLSIZE/e->e_xccount/mempages; |
1d2a7f51 MK |
539 | #else /* NEWVM */ |
540 | /* XXX want pmap ptpages, segtab, etc. (per architecture) */ | |
541 | szptudot = UPAGES; | |
542 | /* XXX don't have info about shared */ | |
6e7a85b8 | 543 | fracmem = ((float)e->e_vm.vm_rssize + szptudot)/CLSIZE/mempages; |
1d2a7f51 | 544 | #endif /* NEWVM */ |
fd57c467 KB |
545 | return (100.0 * fracmem); |
546 | } | |
547 | ||
8faab6ff KB |
548 | void |
549 | pmem(k, ve) | |
fd57c467 | 550 | KINFO *k; |
8faab6ff | 551 | VARENT *ve; |
fd57c467 | 552 | { |
8faab6ff KB |
553 | VAR *v; |
554 | ||
555 | v = ve->var; | |
556 | (void)printf("%*.1f", v->width, getpmem(k)); | |
fd57c467 KB |
557 | } |
558 | ||
8faab6ff KB |
559 | void |
560 | pagein(k, ve) | |
fd57c467 | 561 | KINFO *k; |
8faab6ff | 562 | VARENT *ve; |
fd57c467 | 563 | { |
8faab6ff KB |
564 | VAR *v; |
565 | ||
566 | v = ve->var; | |
567 | (void)printf("%*d", v->width, | |
568 | k->ki_u.u_valid ? k->ki_u.u_ru.ru_majflt : 0); | |
fd57c467 KB |
569 | } |
570 | ||
8faab6ff KB |
571 | void |
572 | maxrss(k, ve) | |
fd57c467 | 573 | KINFO *k; |
8faab6ff | 574 | VARENT *ve; |
fd57c467 | 575 | { |
8faab6ff KB |
576 | VAR *v; |
577 | ||
578 | v = ve->var; | |
1d2a7f51 | 579 | #ifndef NEWVM /* not yet */ |
967726ab | 580 | if (KI_PROC(k)->p_maxrss != (RLIM_INFINITY/NBPG)) |
8faab6ff | 581 | (void)printf("%*d", v->width, pgtok(KI_PROC(k)->p_maxrss)); |
fd57c467 | 582 | else |
1d2a7f51 | 583 | #endif /* NEWVM */ |
8faab6ff | 584 | (void)printf("%*s", v->width, "-"); |
fd57c467 KB |
585 | } |
586 | ||
8faab6ff KB |
587 | void |
588 | tsize(k, ve) | |
fd57c467 | 589 | KINFO *k; |
8faab6ff | 590 | VARENT *ve; |
fd57c467 | 591 | { |
8faab6ff KB |
592 | VAR *v; |
593 | ||
594 | v = ve->var; | |
1d2a7f51 | 595 | #ifndef NEWVM |
8faab6ff | 596 | (void)printf("%*d", v->width, pgtok(KI_EPROC(k)->e_xsize)); |
1d2a7f51 | 597 | #else /* NEWVM */ |
8faab6ff | 598 | (void)printf("%*d", v->width, pgtok(KI_EPROC(k)->e_vm.vm_tsize)); |
1d2a7f51 | 599 | #endif /* NEWVM */ |
fd57c467 KB |
600 | } |
601 | ||
1d2a7f51 | 602 | #ifndef NEWVM |
8faab6ff KB |
603 | void |
604 | trss(k, ve) | |
fd57c467 | 605 | KINFO *k; |
8faab6ff | 606 | VARENT *ve; |
fd57c467 | 607 | { |
8faab6ff KB |
608 | VAR *v; |
609 | ||
610 | v = ve->var; | |
611 | (void)printf("%*d", v->width, pgtok(KI_EPROC(k)->e_xrssize)); | |
fd57c467 | 612 | } |
1d2a7f51 | 613 | #endif /* NEWVM */ |
fd57c467 KB |
614 | |
615 | /* | |
616 | * Generic output routines. Print fields from various prototype | |
617 | * structures. | |
618 | */ | |
8faab6ff KB |
619 | void |
620 | pvar(k, ve) | |
fd57c467 | 621 | KINFO *k; |
8faab6ff | 622 | VARENT *ve; |
fd57c467 | 623 | { |
8faab6ff KB |
624 | VAR *v; |
625 | ||
626 | v = ve->var; | |
967726ab | 627 | printval((char *)((char *)KI_PROC(k) + v->off), v); |
fd57c467 KB |
628 | } |
629 | ||
8faab6ff KB |
630 | void |
631 | evar(k, ve) | |
fd57c467 | 632 | KINFO *k; |
8faab6ff | 633 | VARENT *ve; |
fd57c467 | 634 | { |
8faab6ff KB |
635 | VAR *v; |
636 | ||
637 | v = ve->var; | |
967726ab | 638 | printval((char *)((char *)KI_EPROC(k) + v->off), v); |
fd57c467 KB |
639 | } |
640 | ||
8faab6ff KB |
641 | void |
642 | uvar(k, ve) | |
fd57c467 | 643 | KINFO *k; |
8faab6ff | 644 | VARENT *ve; |
fd57c467 | 645 | { |
8faab6ff KB |
646 | VAR *v; |
647 | ||
648 | v = ve->var; | |
967726ab KM |
649 | if (k->ki_u.u_valid) |
650 | printval((char *)((char *)&k->ki_u + v->off), v); | |
fd57c467 | 651 | else |
8faab6ff | 652 | (void)printf("%*s", v->width, "-"); |
fd57c467 KB |
653 | } |
654 | ||
8faab6ff KB |
655 | void |
656 | rvar(k, ve) | |
fd57c467 | 657 | KINFO *k; |
8faab6ff | 658 | VARENT *ve; |
fd57c467 | 659 | { |
8faab6ff KB |
660 | VAR *v; |
661 | ||
662 | v = ve->var; | |
967726ab KM |
663 | if (k->ki_u.u_valid) |
664 | printval((char *)((char *)(&k->ki_u.u_ru) + v->off), v); | |
fd57c467 | 665 | else |
8faab6ff | 666 | (void)printf("%*s", v->width, "-"); |
fd57c467 KB |
667 | } |
668 | ||
8faab6ff | 669 | static void |
fd57c467 KB |
670 | printval(bp, v) |
671 | char *bp; | |
672 | VAR *v; | |
673 | { | |
674 | static char ofmt[32] = "%"; | |
8faab6ff | 675 | register char *fcp, *cp; |
fd57c467 | 676 | |
8faab6ff KB |
677 | cp = ofmt + 1; |
678 | fcp = v->fmt; | |
fd57c467 KB |
679 | if (v->flag & LJUST) |
680 | *cp++ = '-'; | |
681 | *cp++ = '*'; | |
682 | while (*cp++ = *fcp++); | |
683 | ||
684 | switch (v->type) { | |
685 | case CHAR: | |
8faab6ff | 686 | (void)printf(ofmt, v->width, *(char *)bp); |
fd57c467 KB |
687 | break; |
688 | case UCHAR: | |
8faab6ff | 689 | (void)printf(ofmt, v->width, *(u_char *)bp); |
fd57c467 KB |
690 | break; |
691 | case SHORT: | |
8faab6ff | 692 | (void)printf(ofmt, v->width, *(short *)bp); |
fd57c467 KB |
693 | break; |
694 | case USHORT: | |
8faab6ff | 695 | (void)printf(ofmt, v->width, *(u_short *)bp); |
fd57c467 KB |
696 | break; |
697 | case LONG: | |
8faab6ff | 698 | (void)printf(ofmt, v->width, *(long *)bp); |
fd57c467 KB |
699 | break; |
700 | case ULONG: | |
8faab6ff | 701 | (void)printf(ofmt, v->width, *(u_long *)bp); |
fd57c467 KB |
702 | break; |
703 | case KPTR: | |
8faab6ff | 704 | (void)printf(ofmt, v->width, *(u_long *)bp &~ KERNBASE); |
fd57c467 KB |
705 | break; |
706 | default: | |
92043c14 | 707 | errx(1, "unknown type %d", v->type); |
fd57c467 KB |
708 | } |
709 | } |