xref: /original-bsd/bin/ps/nlist.c (revision 731b2947)
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