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