19b414a1dSbostic /*-
2*731b2947Spendry * Copyright (c) 1990, 1993, 1994
306194916Sbostic * The Regents of the University of California. All rights reserved.
49b414a1dSbostic *
59b414a1dSbostic * %sccs.include.redist.c%
69b414a1dSbostic */
79b414a1dSbostic
89b414a1dSbostic #ifndef lint
9*731b2947Spendry static char sccsid[] = "@(#)nlist.c 8.4 (Berkeley) 04/02/94";
109b414a1dSbostic #endif /* not lint */
119b414a1dSbostic
12dfb5273bSkarels #include <sys/param.h>
13dfb5273bSkarels #include <sys/time.h>
14dfb5273bSkarels #include <sys/proc.h>
1508b8aa43Sbostic #include <sys/resource.h>
16cf8e1bdcSbostic
17cf8e1bdcSbostic #include <err.h>
189b414a1dSbostic #include <errno.h>
19cf8e1bdcSbostic #include <kvm.h>
20cf8e1bdcSbostic #include <nlist.h>
219b414a1dSbostic #include <stdio.h>
2298d0b374Sbostic #include <string.h>
23cf8e1bdcSbostic
2408b8aa43Sbostic #include "ps.h"
259b414a1dSbostic
263fc01fceSbostic #ifdef P_PPWAIT
27dfb5273bSkarels #define NEWVM
28dfb5273bSkarels #endif
29dfb5273bSkarels
309b414a1dSbostic struct nlist psnl[] = {
319b414a1dSbostic {"_fscale"},
32dfb5273bSkarels #define X_FSCALE 0
339b414a1dSbostic {"_ccpu"},
34dfb5273bSkarels #define X_CCPU 1
35dfb5273bSkarels #ifdef NEWVM
36dfb5273bSkarels {"_avail_start"},
37dfb5273bSkarels #define X_AVAILSTART 2
38dfb5273bSkarels {"_avail_end"},
39dfb5273bSkarels #define X_AVAILEND 3
40dfb5273bSkarels #else
41dfb5273bSkarels {"_ecmx"},
42dfb5273bSkarels #define X_ECMX 2
43dfb5273bSkarels #endif
449b414a1dSbostic {NULL}
459b414a1dSbostic };
469b414a1dSbostic
479b414a1dSbostic fixpt_t ccpu; /* kernel _ccpu variable */
489b414a1dSbostic int nlistread; /* if nlist already read. */
49dfb5273bSkarels int mempages; /* number of pages of phys. memory */
509b414a1dSbostic int fscale; /* kernel _fscale variable */
519b414a1dSbostic
5246c67fbfSmckusick extern kvm_t *kd;
5346c67fbfSmckusick
549b414a1dSbostic #define kread(x, v) \
5546c67fbfSmckusick kvm_read(kd, psnl[x].n_value, (char *)&v, sizeof v) != sizeof(v)
569b414a1dSbostic
5708b8aa43Sbostic int
donlist()589b414a1dSbostic donlist()
599b414a1dSbostic {
609b414a1dSbostic int rval;
61dfb5273bSkarels #ifdef NEWVM
62dfb5273bSkarels int tmp;
63dfb5273bSkarels #endif
649b414a1dSbostic
659b414a1dSbostic rval = 0;
669b414a1dSbostic nlistread = 1;
6746c67fbfSmckusick if (kvm_nlist(kd, psnl)) {
68a93a0e5cSmarc nlisterr(psnl);
699b414a1dSbostic eval = 1;
709b414a1dSbostic return (1);
719b414a1dSbostic }
729b414a1dSbostic if (kread(X_FSCALE, fscale)) {
73cf8e1bdcSbostic warnx("fscale: %s", kvm_geterr(kd));
749b414a1dSbostic eval = rval = 1;
759b414a1dSbostic }
76dfb5273bSkarels #ifdef NEWVM
77dfb5273bSkarels if (kread(X_AVAILEND, mempages)) {
78cf8e1bdcSbostic warnx("avail_start: %s", kvm_geterr(kd));
79dfb5273bSkarels eval = rval = 1;
80dfb5273bSkarels }
81dfb5273bSkarels if (kread(X_AVAILSTART, tmp)) {
82cf8e1bdcSbostic warnx("avail_end: %s", kvm_geterr(kd));
83dfb5273bSkarels eval = rval = 1;
84dfb5273bSkarels }
85dfb5273bSkarels mempages -= tmp;
86dfb5273bSkarels #else
87dfb5273bSkarels if (kread(X_ECMX, mempages)) {
88cf8e1bdcSbostic warnx("ecmx: %s", kvm_geterr(kd));
899b414a1dSbostic eval = rval = 1;
909b414a1dSbostic }
91dfb5273bSkarels #endif
929b414a1dSbostic if (kread(X_CCPU, ccpu)) {
93cf8e1bdcSbostic warnx("ccpu: %s", kvm_geterr(kd));
949b414a1dSbostic eval = rval = 1;
959b414a1dSbostic }
969b414a1dSbostic return (rval);
979b414a1dSbostic }
98a93a0e5cSmarc
9908b8aa43Sbostic void
nlisterr(nl)100a93a0e5cSmarc nlisterr(nl)
101a93a0e5cSmarc struct nlist nl[];
102a93a0e5cSmarc {
103a93a0e5cSmarc int i;
104a93a0e5cSmarc
10508b8aa43Sbostic (void)fprintf(stderr, "ps: nlist: can't find following symbols:");
106a93a0e5cSmarc for (i = 0; nl[i].n_name != NULL; i++)
107a93a0e5cSmarc if (nl[i].n_value == 0)
10808b8aa43Sbostic (void)fprintf(stderr, " %s", nl[i].n_name);
10908b8aa43Sbostic (void)fprintf(stderr, "\n");
110a93a0e5cSmarc }
111