nlist.c revision 1.28 1 1.28 simonb /* $NetBSD: nlist.c,v 1.28 2020/08/26 10:54:12 simonb Exp $ */
2 1.11 cgd
3 1.17 simonb /*
4 1.17 simonb * Copyright (c) 2000 The NetBSD Foundation, Inc.
5 1.17 simonb * All rights reserved.
6 1.17 simonb *
7 1.17 simonb * This code is derived from software contributed to The NetBSD Foundation
8 1.17 simonb * by Simon Burge.
9 1.17 simonb *
10 1.17 simonb * Redistribution and use in source and binary forms, with or without
11 1.17 simonb * modification, are permitted provided that the following conditions
12 1.17 simonb * are met:
13 1.17 simonb * 1. Redistributions of source code must retain the above copyright
14 1.17 simonb * notice, this list of conditions and the following disclaimer.
15 1.17 simonb * 2. Redistributions in binary form must reproduce the above copyright
16 1.17 simonb * notice, this list of conditions and the following disclaimer in the
17 1.17 simonb * documentation and/or other materials provided with the distribution.
18 1.17 simonb *
19 1.17 simonb * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 1.17 simonb * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 1.17 simonb * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 1.17 simonb * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 1.17 simonb * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 1.17 simonb * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 1.17 simonb * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 1.17 simonb * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 1.17 simonb * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 1.17 simonb * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 1.17 simonb * POSSIBILITY OF SUCH DAMAGE.
30 1.17 simonb */
31 1.17 simonb
32 1.17 simonb /*
33 1.7 cgd * Copyright (c) 1990, 1993, 1994
34 1.7 cgd * The Regents of the University of California. All rights reserved.
35 1.1 cgd *
36 1.1 cgd * Redistribution and use in source and binary forms, with or without
37 1.1 cgd * modification, are permitted provided that the following conditions
38 1.1 cgd * are met:
39 1.1 cgd * 1. Redistributions of source code must retain the above copyright
40 1.1 cgd * notice, this list of conditions and the following disclaimer.
41 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright
42 1.1 cgd * notice, this list of conditions and the following disclaimer in the
43 1.1 cgd * documentation and/or other materials provided with the distribution.
44 1.20 agc * 3. Neither the name of the University nor the names of its contributors
45 1.1 cgd * may be used to endorse or promote products derived from this software
46 1.1 cgd * without specific prior written permission.
47 1.1 cgd *
48 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
49 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
50 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
51 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
52 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
53 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
54 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
55 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
56 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
57 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
58 1.1 cgd * SUCH DAMAGE.
59 1.1 cgd */
60 1.1 cgd
61 1.12 christos #include <sys/cdefs.h>
62 1.1 cgd #ifndef lint
63 1.11 cgd #if 0
64 1.7 cgd static char sccsid[] = "@(#)nlist.c 8.4 (Berkeley) 4/2/94";
65 1.11 cgd #else
66 1.28 simonb __RCSID("$NetBSD: nlist.c,v 1.28 2020/08/26 10:54:12 simonb Exp $");
67 1.11 cgd #endif
68 1.1 cgd #endif /* not lint */
69 1.1 cgd
70 1.1 cgd #include <sys/param.h>
71 1.1 cgd #include <sys/time.h>
72 1.19 thorpej #include <sys/lwp.h>
73 1.1 cgd #include <sys/proc.h>
74 1.7 cgd #include <sys/resource.h>
75 1.16 simonb #include <sys/sysctl.h>
76 1.7 cgd
77 1.7 cgd #include <err.h>
78 1.7 cgd #include <errno.h>
79 1.7 cgd #include <kvm.h>
80 1.16 simonb #include <math.h>
81 1.1 cgd #include <nlist.h>
82 1.1 cgd #include <stdio.h>
83 1.1 cgd #include <string.h>
84 1.10 cgd #include <unistd.h>
85 1.1 cgd
86 1.7 cgd #include "ps.h"
87 1.7 cgd
88 1.1 cgd struct nlist psnl[] = {
89 1.25 christos { .n_name = "_fscale" },
90 1.1 cgd #define X_FSCALE 0
91 1.25 christos { .n_name = "_ccpu" },
92 1.1 cgd #define X_CCPU 1
93 1.25 christos { .n_name = "_physmem" },
94 1.14 is #define X_PHYSMEM 2
95 1.25 christos { .n_name = "_maxslp" },
96 1.18 matt #define X_MAXSLP 3
97 1.25 christos { .n_name = NULL }
98 1.1 cgd };
99 1.1 cgd
100 1.27 rin double log_ccpu; /* log of kernel _ccpu variable */
101 1.1 cgd int nlistread; /* if nlist already read. */
102 1.1 cgd int mempages; /* number of pages of phys. memory */
103 1.1 cgd int fscale; /* kernel _fscale variable */
104 1.18 matt int maxslp; /* kernel _maxslp variable */
105 1.18 matt int uspace; /* kernel USPACE value */
106 1.7 cgd
107 1.27 rin /* XXX Hopefully reasonable default */
108 1.27 rin #define MEMPAGES 0
109 1.27 rin #ifndef FSCALE
110 1.27 rin #define FSCALE (1 << 8)
111 1.27 rin #endif
112 1.27 rin #define LOG_CCPU (-1.0 / 20.0)
113 1.27 rin #ifndef MAXSLP
114 1.27 rin #define MAXSLP 20
115 1.27 rin #endif
116 1.28 simonb #define DEF_USPACE (getpagesize())
117 1.27 rin
118 1.23 simonb #define kread(x, v) \
119 1.7 cgd kvm_read(kd, psnl[x].n_value, (char *)&v, sizeof v) != sizeof(v)
120 1.1 cgd
121 1.27 rin void
122 1.22 simonb donlist(void)
123 1.1 cgd {
124 1.16 simonb fixpt_t xccpu;
125 1.1 cgd
126 1.1 cgd nlistread = 1;
127 1.27 rin
128 1.7 cgd if (kvm_nlist(kd, psnl)) {
129 1.1 cgd nlisterr(psnl);
130 1.1 cgd eval = 1;
131 1.27 rin fscale = FSCALE;
132 1.27 rin mempages = MEMPAGES;
133 1.27 rin log_ccpu = LOG_CCPU;
134 1.27 rin maxslp = MAXSLP;
135 1.27 rin return;
136 1.1 cgd }
137 1.27 rin
138 1.1 cgd if (kread(X_FSCALE, fscale)) {
139 1.7 cgd warnx("fscale: %s", kvm_geterr(kd));
140 1.27 rin eval = 1;
141 1.27 rin fscale = FSCALE;
142 1.1 cgd }
143 1.27 rin
144 1.14 is if (kread(X_PHYSMEM, mempages)) {
145 1.7 cgd warnx("avail_start: %s", kvm_geterr(kd));
146 1.27 rin eval = 1;
147 1.27 rin mempages = MEMPAGES;
148 1.1 cgd }
149 1.27 rin
150 1.16 simonb if (kread(X_CCPU, xccpu)) {
151 1.7 cgd warnx("ccpu: %s", kvm_geterr(kd));
152 1.27 rin eval = 1;
153 1.27 rin log_ccpu = LOG_CCPU;
154 1.27 rin } else
155 1.27 rin log_ccpu = log((double)xccpu / fscale);
156 1.27 rin
157 1.18 matt if (kread(X_MAXSLP, maxslp)) {
158 1.18 matt warnx("maxslp: %s", kvm_geterr(kd));
159 1.27 rin eval = 1;
160 1.27 rin maxslp = MAXSLP;
161 1.18 matt }
162 1.16 simonb }
163 1.16 simonb
164 1.27 rin void
165 1.22 simonb donlist_sysctl(void)
166 1.16 simonb {
167 1.16 simonb int mib[2];
168 1.16 simonb size_t size;
169 1.16 simonb fixpt_t xccpu;
170 1.24 dsl uint64_t memsize;
171 1.16 simonb
172 1.16 simonb nlistread = 1;
173 1.27 rin
174 1.27 rin mib[0] = CTL_KERN;
175 1.27 rin mib[1] = KERN_FSCALE;
176 1.27 rin size = sizeof(fscale);
177 1.27 rin if (sysctl(mib, 2, &fscale, &size, NULL, 0)) {
178 1.28 simonb warn("sysctl kern.fscale");
179 1.27 rin eval = 1;
180 1.27 rin fscale = FSCALE;
181 1.27 rin }
182 1.27 rin
183 1.16 simonb mib[0] = CTL_HW;
184 1.24 dsl mib[1] = HW_PHYSMEM64;
185 1.24 dsl size = sizeof(memsize);
186 1.27 rin if (sysctl(mib, 2, &memsize, &size, NULL, 0)) {
187 1.28 simonb warn("sysctl hw.avail_start");
188 1.27 rin eval = 1;
189 1.27 rin mempages = MEMPAGES;
190 1.27 rin } else
191 1.24 dsl mempages = memsize / getpagesize();
192 1.16 simonb
193 1.16 simonb mib[0] = CTL_KERN;
194 1.16 simonb mib[1] = KERN_CCPU;
195 1.16 simonb size = sizeof(xccpu);
196 1.27 rin if (sysctl(mib, 2, &xccpu, &size, NULL, 0)) {
197 1.28 simonb warn("sysctl kern.ccpu");
198 1.27 rin eval = 1;
199 1.27 rin log_ccpu = LOG_CCPU;
200 1.27 rin } else
201 1.27 rin log_ccpu = log((double)xccpu / fscale);
202 1.18 matt
203 1.18 matt mib[0] = CTL_VM;
204 1.18 matt mib[1] = VM_MAXSLP;
205 1.18 matt size = sizeof(maxslp);
206 1.27 rin if (sysctl(mib, 2, &maxslp, &size, NULL, 0)) {
207 1.28 simonb warn("sysctl vm.maxslp");
208 1.27 rin eval = 1;
209 1.18 matt maxslp = MAXSLP;
210 1.27 rin }
211 1.18 matt
212 1.18 matt mib[0] = CTL_VM;
213 1.18 matt mib[1] = VM_USPACE;
214 1.21 jrf size = sizeof(uspace);
215 1.27 rin if (sysctl(mib, 2, &uspace, &size, NULL, 0)) {
216 1.28 simonb warn("sysctl vm.uspace");
217 1.27 rin eval = 1;
218 1.28 simonb uspace = DEF_USPACE;
219 1.27 rin }
220 1.1 cgd }
221 1.1 cgd
222 1.7 cgd void
223 1.22 simonb nlisterr(struct nlist nl[])
224 1.1 cgd {
225 1.1 cgd int i;
226 1.1 cgd
227 1.7 cgd (void)fprintf(stderr, "ps: nlist: can't find following symbols:");
228 1.1 cgd for (i = 0; nl[i].n_name != NULL; i++)
229 1.1 cgd if (nl[i].n_value == 0)
230 1.7 cgd (void)fprintf(stderr, " %s", nl[i].n_name);
231 1.7 cgd (void)fprintf(stderr, "\n");
232 1.1 cgd }
233