init_sysctl.c revision 1.31.2.6 1 1.31.2.6 skrll /* $NetBSD: init_sysctl.c,v 1.31.2.6 2005/03/04 16:51:58 skrll Exp $ */
2 1.31.2.2 skrll
3 1.31.2.2 skrll /*-
4 1.31.2.2 skrll * Copyright (c) 2003 The NetBSD Foundation, Inc.
5 1.31.2.2 skrll * All rights reserved.
6 1.31.2.2 skrll *
7 1.31.2.2 skrll * This code is derived from software contributed to The NetBSD Foundation
8 1.31.2.2 skrll * by Andrew Brown.
9 1.31.2.2 skrll *
10 1.31.2.2 skrll * Redistribution and use in source and binary forms, with or without
11 1.31.2.2 skrll * modification, are permitted provided that the following conditions
12 1.31.2.2 skrll * are met:
13 1.31.2.2 skrll * 1. Redistributions of source code must retain the above copyright
14 1.31.2.2 skrll * notice, this list of conditions and the following disclaimer.
15 1.31.2.2 skrll * 2. Redistributions in binary form must reproduce the above copyright
16 1.31.2.2 skrll * notice, this list of conditions and the following disclaimer in the
17 1.31.2.2 skrll * documentation and/or other materials provided with the distribution.
18 1.31.2.2 skrll * 3. All advertising materials mentioning features or use of this software
19 1.31.2.2 skrll * must display the following acknowledgement:
20 1.31.2.2 skrll * This product includes software developed by the NetBSD
21 1.31.2.2 skrll * Foundation, Inc. and its contributors.
22 1.31.2.2 skrll * 4. Neither the name of The NetBSD Foundation nor the names of its
23 1.31.2.2 skrll * contributors may be used to endorse or promote products derived
24 1.31.2.2 skrll * from this software without specific prior written permission.
25 1.31.2.2 skrll *
26 1.31.2.2 skrll * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27 1.31.2.2 skrll * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28 1.31.2.2 skrll * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 1.31.2.2 skrll * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30 1.31.2.2 skrll * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 1.31.2.2 skrll * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 1.31.2.2 skrll * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 1.31.2.2 skrll * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 1.31.2.2 skrll * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 1.31.2.2 skrll * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 1.31.2.2 skrll * POSSIBILITY OF SUCH DAMAGE.
37 1.31.2.2 skrll */
38 1.31.2.2 skrll
39 1.31.2.2 skrll #include <sys/cdefs.h>
40 1.31.2.6 skrll __KERNEL_RCSID(0, "$NetBSD: init_sysctl.c,v 1.31.2.6 2005/03/04 16:51:58 skrll Exp $");
41 1.31.2.2 skrll
42 1.31.2.2 skrll #include "opt_sysv.h"
43 1.31.2.2 skrll #include "opt_multiprocessor.h"
44 1.31.2.2 skrll #include "opt_posix.h"
45 1.31.2.2 skrll #include "pty.h"
46 1.31.2.2 skrll #include "rnd.h"
47 1.31.2.2 skrll
48 1.31.2.2 skrll #include <sys/types.h>
49 1.31.2.2 skrll #include <sys/param.h>
50 1.31.2.2 skrll #include <sys/sysctl.h>
51 1.31.2.2 skrll #include <sys/errno.h>
52 1.31.2.2 skrll #include <sys/systm.h>
53 1.31.2.2 skrll #include <sys/kernel.h>
54 1.31.2.2 skrll #include <sys/unistd.h>
55 1.31.2.2 skrll #include <sys/disklabel.h>
56 1.31.2.2 skrll #include <sys/rnd.h>
57 1.31.2.2 skrll #include <sys/vnode.h>
58 1.31.2.2 skrll #include <sys/mount.h>
59 1.31.2.2 skrll #include <sys/namei.h>
60 1.31.2.2 skrll #include <sys/msgbuf.h>
61 1.31.2.2 skrll #include <dev/cons.h>
62 1.31.2.2 skrll #include <sys/socketvar.h>
63 1.31.2.2 skrll #include <sys/file.h>
64 1.31.2.2 skrll #include <sys/tty.h>
65 1.31.2.2 skrll #include <sys/malloc.h>
66 1.31.2.2 skrll #include <sys/resource.h>
67 1.31.2.2 skrll #include <sys/resourcevar.h>
68 1.31.2.2 skrll #include <sys/exec.h>
69 1.31.2.2 skrll #include <sys/conf.h>
70 1.31.2.2 skrll #include <sys/device.h>
71 1.31.2.2 skrll
72 1.31.2.2 skrll #if defined(SYSVMSG) || defined(SYSVSEM) || defined(SYSVSHM)
73 1.31.2.2 skrll #include <sys/ipc.h>
74 1.31.2.2 skrll #endif
75 1.31.2.2 skrll #ifdef SYSVMSG
76 1.31.2.2 skrll #include <sys/msg.h>
77 1.31.2.2 skrll #endif
78 1.31.2.2 skrll #ifdef SYSVSEM
79 1.31.2.2 skrll #include <sys/sem.h>
80 1.31.2.2 skrll #endif
81 1.31.2.2 skrll #ifdef SYSVSHM
82 1.31.2.2 skrll #include <sys/shm.h>
83 1.31.2.2 skrll #endif
84 1.31.2.2 skrll
85 1.31.2.2 skrll #include <machine/cpu.h>
86 1.31.2.2 skrll
87 1.31.2.2 skrll /*
88 1.31.2.2 skrll * try over estimating by 5 procs/lwps
89 1.31.2.2 skrll */
90 1.31.2.2 skrll #define KERN_PROCSLOP (5 * sizeof(struct kinfo_proc))
91 1.31.2.2 skrll #define KERN_LWPSLOP (5 * sizeof(struct kinfo_lwp))
92 1.31.2.2 skrll
93 1.31.2.2 skrll #ifndef MULTIPROCESSOR
94 1.31.2.2 skrll #define sysctl_ncpus() (1)
95 1.31.2.2 skrll #else /* MULTIPROCESSOR */
96 1.31.2.2 skrll #ifndef CPU_INFO_FOREACH
97 1.31.2.2 skrll #define CPU_INFO_ITERATOR int
98 1.31.2.2 skrll #define CPU_INFO_FOREACH(cii, ci) cii = 0, ci = curcpu(); ci != NULL; ci = NULL
99 1.31.2.2 skrll #endif
100 1.31.2.2 skrll static int
101 1.31.2.2 skrll sysctl_ncpus(void)
102 1.31.2.2 skrll {
103 1.31.2.2 skrll struct cpu_info *ci;
104 1.31.2.2 skrll CPU_INFO_ITERATOR cii;
105 1.31.2.2 skrll
106 1.31.2.2 skrll int ncpus = 0;
107 1.31.2.2 skrll for (CPU_INFO_FOREACH(cii, ci))
108 1.31.2.2 skrll ncpus++;
109 1.31.2.2 skrll return (ncpus);
110 1.31.2.2 skrll }
111 1.31.2.2 skrll #endif /* MULTIPROCESSOR */
112 1.31.2.2 skrll
113 1.31.2.2 skrll static int sysctl_kern_maxvnodes(SYSCTLFN_PROTO);
114 1.31.2.2 skrll static int sysctl_kern_rtc_offset(SYSCTLFN_PROTO);
115 1.31.2.2 skrll static int sysctl_kern_maxproc(SYSCTLFN_PROTO);
116 1.31.2.2 skrll static int sysctl_kern_securelevel(SYSCTLFN_PROTO);
117 1.31.2.2 skrll static int sysctl_kern_hostid(SYSCTLFN_PROTO);
118 1.31.2.2 skrll static int sysctl_setlen(SYSCTLFN_PROTO);
119 1.31.2.2 skrll static int sysctl_kern_clockrate(SYSCTLFN_PROTO);
120 1.31.2.2 skrll static int sysctl_kern_file(SYSCTLFN_PROTO);
121 1.31.2.2 skrll static int sysctl_kern_autonice(SYSCTLFN_PROTO);
122 1.31.2.2 skrll static int sysctl_msgbuf(SYSCTLFN_PROTO);
123 1.31.2.2 skrll static int sysctl_kern_defcorename(SYSCTLFN_PROTO);
124 1.31.2.2 skrll static int sysctl_kern_cptime(SYSCTLFN_PROTO);
125 1.31.2.2 skrll #if defined(SYSVMSG) || defined(SYSVSEM) || defined(SYSVSHM)
126 1.31.2.2 skrll static int sysctl_kern_sysvipc(SYSCTLFN_PROTO);
127 1.31.2.2 skrll #endif /* defined(SYSVMSG) || defined(SYSVSEM) || defined(SYSVSHM) */
128 1.31.2.2 skrll #if NPTY > 0
129 1.31.2.2 skrll static int sysctl_kern_maxptys(SYSCTLFN_PROTO);
130 1.31.2.2 skrll #endif /* NPTY > 0 */
131 1.31.2.2 skrll static int sysctl_kern_sbmax(SYSCTLFN_PROTO);
132 1.31.2.2 skrll static int sysctl_kern_urnd(SYSCTLFN_PROTO);
133 1.31.2.2 skrll static int sysctl_kern_lwp(SYSCTLFN_PROTO);
134 1.31.2.2 skrll static int sysctl_kern_forkfsleep(SYSCTLFN_PROTO);
135 1.31.2.2 skrll static int sysctl_kern_root_partition(SYSCTLFN_PROTO);
136 1.31.2.2 skrll static int sysctl_kern_drivers(SYSCTLFN_PROTO);
137 1.31.2.2 skrll static int sysctl_doeproc(SYSCTLFN_PROTO);
138 1.31.2.2 skrll static int sysctl_kern_proc_args(SYSCTLFN_PROTO);
139 1.31.2.2 skrll static int sysctl_hw_usermem(SYSCTLFN_PROTO);
140 1.31.2.2 skrll static int sysctl_hw_cnmagic(SYSCTLFN_PROTO);
141 1.31.2.2 skrll static int sysctl_hw_ncpu(SYSCTLFN_PROTO);
142 1.31.2.2 skrll
143 1.31.2.2 skrll static void fill_kproc2(struct proc *, struct kinfo_proc2 *);
144 1.31.2.2 skrll static void fill_lwp(struct lwp *l, struct kinfo_lwp *kl);
145 1.31.2.2 skrll
146 1.31.2.2 skrll /*
147 1.31.2.2 skrll * ********************************************************************
148 1.31.2.2 skrll * section 1: setup routines
149 1.31.2.2 skrll * ********************************************************************
150 1.31.2.2 skrll * these functions are stuffed into a link set for sysctl setup
151 1.31.2.2 skrll * functions. they're never called or referenced from anywhere else.
152 1.31.2.2 skrll * ********************************************************************
153 1.31.2.2 skrll */
154 1.31.2.2 skrll
155 1.31.2.2 skrll /*
156 1.31.2.2 skrll * sets up the base nodes...
157 1.31.2.2 skrll */
158 1.31.2.2 skrll SYSCTL_SETUP(sysctl_root_setup, "sysctl base setup")
159 1.31.2.2 skrll {
160 1.31.2.2 skrll
161 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
162 1.31.2.2 skrll CTLFLAG_PERMANENT,
163 1.31.2.2 skrll CTLTYPE_NODE, "kern",
164 1.31.2.2 skrll SYSCTL_DESCR("High kernel"),
165 1.31.2.2 skrll NULL, 0, NULL, 0,
166 1.31.2.2 skrll CTL_KERN, CTL_EOL);
167 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
168 1.31.2.2 skrll CTLFLAG_PERMANENT,
169 1.31.2.2 skrll CTLTYPE_NODE, "vm",
170 1.31.2.2 skrll SYSCTL_DESCR("Virtual memory"),
171 1.31.2.2 skrll NULL, 0, NULL, 0,
172 1.31.2.2 skrll CTL_VM, CTL_EOL);
173 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
174 1.31.2.2 skrll CTLFLAG_PERMANENT,
175 1.31.2.2 skrll CTLTYPE_NODE, "vfs",
176 1.31.2.2 skrll SYSCTL_DESCR("Filesystem"),
177 1.31.2.2 skrll NULL, 0, NULL, 0,
178 1.31.2.2 skrll CTL_VFS, CTL_EOL);
179 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
180 1.31.2.2 skrll CTLFLAG_PERMANENT,
181 1.31.2.2 skrll CTLTYPE_NODE, "net",
182 1.31.2.2 skrll SYSCTL_DESCR("Networking"),
183 1.31.2.2 skrll NULL, 0, NULL, 0,
184 1.31.2.2 skrll CTL_NET, CTL_EOL);
185 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
186 1.31.2.2 skrll CTLFLAG_PERMANENT,
187 1.31.2.2 skrll CTLTYPE_NODE, "debug",
188 1.31.2.2 skrll SYSCTL_DESCR("Debugging"),
189 1.31.2.2 skrll NULL, 0, NULL, 0,
190 1.31.2.2 skrll CTL_DEBUG, CTL_EOL);
191 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
192 1.31.2.2 skrll CTLFLAG_PERMANENT,
193 1.31.2.2 skrll CTLTYPE_NODE, "hw",
194 1.31.2.2 skrll SYSCTL_DESCR("Generic CPU, I/O"),
195 1.31.2.2 skrll NULL, 0, NULL, 0,
196 1.31.2.2 skrll CTL_HW, CTL_EOL);
197 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
198 1.31.2.2 skrll CTLFLAG_PERMANENT,
199 1.31.2.2 skrll CTLTYPE_NODE, "machdep",
200 1.31.2.2 skrll SYSCTL_DESCR("Machine dependent"),
201 1.31.2.2 skrll NULL, 0, NULL, 0,
202 1.31.2.2 skrll CTL_MACHDEP, CTL_EOL);
203 1.31.2.2 skrll /*
204 1.31.2.2 skrll * this node is inserted so that the sysctl nodes in libc can
205 1.31.2.2 skrll * operate.
206 1.31.2.2 skrll */
207 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
208 1.31.2.2 skrll CTLFLAG_PERMANENT,
209 1.31.2.2 skrll CTLTYPE_NODE, "user",
210 1.31.2.2 skrll SYSCTL_DESCR("User-level"),
211 1.31.2.2 skrll NULL, 0, NULL, 0,
212 1.31.2.2 skrll CTL_USER, CTL_EOL);
213 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
214 1.31.2.2 skrll CTLFLAG_PERMANENT,
215 1.31.2.2 skrll CTLTYPE_NODE, "ddb",
216 1.31.2.2 skrll SYSCTL_DESCR("In-kernel debugger"),
217 1.31.2.2 skrll NULL, 0, NULL, 0,
218 1.31.2.2 skrll CTL_DDB, CTL_EOL);
219 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
220 1.31.2.2 skrll CTLFLAG_PERMANENT,
221 1.31.2.2 skrll CTLTYPE_NODE, "proc",
222 1.31.2.2 skrll SYSCTL_DESCR("Per-process"),
223 1.31.2.2 skrll NULL, 0, NULL, 0,
224 1.31.2.2 skrll CTL_PROC, CTL_EOL);
225 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
226 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
227 1.31.2.2 skrll CTLTYPE_NODE, "vendor",
228 1.31.2.2 skrll SYSCTL_DESCR("Vendor specific"),
229 1.31.2.2 skrll NULL, 0, NULL, 0,
230 1.31.2.2 skrll CTL_VENDOR, CTL_EOL);
231 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
232 1.31.2.2 skrll CTLFLAG_PERMANENT,
233 1.31.2.2 skrll CTLTYPE_NODE, "emul",
234 1.31.2.2 skrll SYSCTL_DESCR("Emulation settings"),
235 1.31.2.2 skrll NULL, 0, NULL, 0,
236 1.31.2.2 skrll CTL_EMUL, CTL_EOL);
237 1.31.2.2 skrll }
238 1.31.2.2 skrll
239 1.31.2.2 skrll /*
240 1.31.2.2 skrll * this setup routine is a replacement for kern_sysctl()
241 1.31.2.2 skrll */
242 1.31.2.2 skrll SYSCTL_SETUP(sysctl_kern_setup, "sysctl kern subtree setup")
243 1.31.2.2 skrll {
244 1.31.2.2 skrll extern int kern_logsigexit; /* defined in kern/kern_sig.c */
245 1.31.2.2 skrll extern fixpt_t ccpu; /* defined in kern/kern_synch.c */
246 1.31.2.2 skrll extern int dumponpanic; /* defined in kern/subr_prf.c */
247 1.31.2.2 skrll
248 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
249 1.31.2.2 skrll CTLFLAG_PERMANENT,
250 1.31.2.2 skrll CTLTYPE_NODE, "kern", NULL,
251 1.31.2.2 skrll NULL, 0, NULL, 0,
252 1.31.2.2 skrll CTL_KERN, CTL_EOL);
253 1.31.2.2 skrll
254 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
255 1.31.2.2 skrll CTLFLAG_PERMANENT,
256 1.31.2.2 skrll CTLTYPE_STRING, "ostype",
257 1.31.2.2 skrll SYSCTL_DESCR("Operating system type"),
258 1.31.2.2 skrll NULL, 0, &ostype, 0,
259 1.31.2.2 skrll CTL_KERN, KERN_OSTYPE, CTL_EOL);
260 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
261 1.31.2.2 skrll CTLFLAG_PERMANENT,
262 1.31.2.2 skrll CTLTYPE_STRING, "osrelease",
263 1.31.2.2 skrll SYSCTL_DESCR("Operating system release"),
264 1.31.2.2 skrll NULL, 0, &osrelease, 0,
265 1.31.2.2 skrll CTL_KERN, KERN_OSRELEASE, CTL_EOL);
266 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
267 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
268 1.31.2.2 skrll CTLTYPE_INT, "osrevision",
269 1.31.2.2 skrll SYSCTL_DESCR("Operating system revision"),
270 1.31.2.2 skrll NULL, __NetBSD_Version__, NULL, 0,
271 1.31.2.2 skrll CTL_KERN, KERN_OSREV, CTL_EOL);
272 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
273 1.31.2.2 skrll CTLFLAG_PERMANENT,
274 1.31.2.2 skrll CTLTYPE_STRING, "version",
275 1.31.2.2 skrll SYSCTL_DESCR("Kernel version"),
276 1.31.2.2 skrll NULL, 0, &version, 0,
277 1.31.2.2 skrll CTL_KERN, KERN_VERSION, CTL_EOL);
278 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
279 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
280 1.31.2.2 skrll CTLTYPE_INT, "maxvnodes",
281 1.31.2.2 skrll SYSCTL_DESCR("Maximum number of vnodes"),
282 1.31.2.2 skrll sysctl_kern_maxvnodes, 0, NULL, 0,
283 1.31.2.2 skrll CTL_KERN, KERN_MAXVNODES, CTL_EOL);
284 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
285 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
286 1.31.2.2 skrll CTLTYPE_INT, "maxproc",
287 1.31.2.2 skrll SYSCTL_DESCR("Maximum number of simultaneous processes"),
288 1.31.2.2 skrll sysctl_kern_maxproc, 0, NULL, 0,
289 1.31.2.2 skrll CTL_KERN, KERN_MAXPROC, CTL_EOL);
290 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
291 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
292 1.31.2.2 skrll CTLTYPE_INT, "maxfiles",
293 1.31.2.2 skrll SYSCTL_DESCR("Maximum number of open files"),
294 1.31.2.2 skrll NULL, 0, &maxfiles, 0,
295 1.31.2.2 skrll CTL_KERN, KERN_MAXFILES, CTL_EOL);
296 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
297 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
298 1.31.2.2 skrll CTLTYPE_INT, "argmax",
299 1.31.2.2 skrll SYSCTL_DESCR("Maximum number of bytes of arguments to "
300 1.31.2.2 skrll "execve(2)"),
301 1.31.2.2 skrll NULL, ARG_MAX, NULL, 0,
302 1.31.2.2 skrll CTL_KERN, KERN_ARGMAX, CTL_EOL);
303 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
304 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
305 1.31.2.2 skrll CTLTYPE_INT, "securelevel",
306 1.31.2.2 skrll SYSCTL_DESCR("System security level"),
307 1.31.2.2 skrll sysctl_kern_securelevel, 0, &securelevel, 0,
308 1.31.2.2 skrll CTL_KERN, KERN_SECURELVL, CTL_EOL);
309 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
310 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
311 1.31.2.2 skrll CTLTYPE_STRING, "hostname",
312 1.31.2.2 skrll SYSCTL_DESCR("System hostname"),
313 1.31.2.2 skrll sysctl_setlen, 0, &hostname, MAXHOSTNAMELEN,
314 1.31.2.2 skrll CTL_KERN, KERN_HOSTNAME, CTL_EOL);
315 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
316 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_READWRITE|CTLFLAG_HEX,
317 1.31.2.2 skrll CTLTYPE_INT, "hostid",
318 1.31.2.2 skrll SYSCTL_DESCR("System host ID number"),
319 1.31.2.2 skrll sysctl_kern_hostid, 0, NULL, 0,
320 1.31.2.2 skrll CTL_KERN, KERN_HOSTID, CTL_EOL);
321 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
322 1.31.2.2 skrll CTLFLAG_PERMANENT,
323 1.31.2.2 skrll CTLTYPE_STRUCT, "clockrate",
324 1.31.2.2 skrll SYSCTL_DESCR("Kernel clock rates"),
325 1.31.2.2 skrll sysctl_kern_clockrate, 0, NULL,
326 1.31.2.2 skrll sizeof(struct clockinfo),
327 1.31.2.2 skrll CTL_KERN, KERN_CLOCKRATE, CTL_EOL);
328 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
329 1.31.2.2 skrll CTLFLAG_PERMANENT,
330 1.31.2.2 skrll CTLTYPE_STRUCT, "vnode",
331 1.31.2.2 skrll SYSCTL_DESCR("System vnode table"),
332 1.31.2.2 skrll sysctl_kern_vnode, 0, NULL, 0,
333 1.31.2.2 skrll CTL_KERN, KERN_VNODE, CTL_EOL);
334 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
335 1.31.2.2 skrll CTLFLAG_PERMANENT,
336 1.31.2.2 skrll CTLTYPE_STRUCT, "file",
337 1.31.2.2 skrll SYSCTL_DESCR("System open file table"),
338 1.31.2.2 skrll sysctl_kern_file, 0, NULL, 0,
339 1.31.2.2 skrll CTL_KERN, KERN_FILE, CTL_EOL);
340 1.31.2.2 skrll #ifndef GPROF
341 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
342 1.31.2.2 skrll CTLFLAG_PERMANENT,
343 1.31.2.2 skrll CTLTYPE_NODE, "profiling",
344 1.31.2.2 skrll SYSCTL_DESCR("Profiling information (not available)"),
345 1.31.2.2 skrll sysctl_notavail, 0, NULL, 0,
346 1.31.2.2 skrll CTL_KERN, KERN_PROF, CTL_EOL);
347 1.31.2.2 skrll #endif
348 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
349 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
350 1.31.2.2 skrll CTLTYPE_INT, "posix1version",
351 1.31.2.2 skrll SYSCTL_DESCR("Version of ISO/IEC 9945 (POSIX 1003.1) "
352 1.31.2.2 skrll "with which the operating system attempts "
353 1.31.2.2 skrll "to comply"),
354 1.31.2.2 skrll NULL, _POSIX_VERSION, NULL, 0,
355 1.31.2.2 skrll CTL_KERN, KERN_POSIX1, CTL_EOL);
356 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
357 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
358 1.31.2.2 skrll CTLTYPE_INT, "ngroups",
359 1.31.2.2 skrll SYSCTL_DESCR("Maximum number of supplemental groups"),
360 1.31.2.2 skrll NULL, NGROUPS_MAX, NULL, 0,
361 1.31.2.2 skrll CTL_KERN, KERN_NGROUPS, CTL_EOL);
362 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
363 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
364 1.31.2.2 skrll CTLTYPE_INT, "job_control",
365 1.31.2.2 skrll SYSCTL_DESCR("Whether job control is available"),
366 1.31.2.2 skrll NULL, 1, NULL, 0,
367 1.31.2.2 skrll CTL_KERN, KERN_JOB_CONTROL, CTL_EOL);
368 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
369 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
370 1.31.2.2 skrll CTLTYPE_INT, "saved_ids",
371 1.31.2.2 skrll SYSCTL_DESCR("Whether saved set-group/user ID is "
372 1.31.2.2 skrll "available"), NULL,
373 1.31.2.2 skrll #ifdef _POSIX_SAVED_IDS
374 1.31.2.2 skrll 1,
375 1.31.2.2 skrll #else /* _POSIX_SAVED_IDS */
376 1.31.2.2 skrll 0,
377 1.31.2.2 skrll #endif /* _POSIX_SAVED_IDS */
378 1.31.2.2 skrll NULL, 0, CTL_KERN, KERN_SAVED_IDS, CTL_EOL);
379 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
380 1.31.2.2 skrll CTLFLAG_PERMANENT,
381 1.31.2.2 skrll CTLTYPE_STRUCT, "boottime",
382 1.31.2.2 skrll SYSCTL_DESCR("System boot time"),
383 1.31.2.2 skrll NULL, 0, &boottime, sizeof(boottime),
384 1.31.2.2 skrll CTL_KERN, KERN_BOOTTIME, CTL_EOL);
385 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
386 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
387 1.31.2.2 skrll CTLTYPE_STRING, "domainname",
388 1.31.2.2 skrll SYSCTL_DESCR("YP domain name"),
389 1.31.2.2 skrll sysctl_setlen, 0, &domainname, MAXHOSTNAMELEN,
390 1.31.2.2 skrll CTL_KERN, KERN_DOMAINNAME, CTL_EOL);
391 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
392 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
393 1.31.2.2 skrll CTLTYPE_INT, "maxpartitions",
394 1.31.2.2 skrll SYSCTL_DESCR("Maximum number of partitions allowed per "
395 1.31.2.2 skrll "disk"),
396 1.31.2.2 skrll NULL, MAXPARTITIONS, NULL, 0,
397 1.31.2.2 skrll CTL_KERN, KERN_MAXPARTITIONS, CTL_EOL);
398 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
399 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
400 1.31.2.2 skrll CTLTYPE_INT, "rawpartition",
401 1.31.2.2 skrll SYSCTL_DESCR("Raw partition of a disk"),
402 1.31.2.2 skrll NULL, RAW_PART, NULL, 0,
403 1.31.2.2 skrll CTL_KERN, KERN_RAWPARTITION, CTL_EOL);
404 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
405 1.31.2.2 skrll CTLFLAG_PERMANENT,
406 1.31.2.2 skrll CTLTYPE_STRUCT, "timex", NULL,
407 1.31.2.2 skrll sysctl_notavail, 0, NULL, 0,
408 1.31.2.2 skrll CTL_KERN, KERN_TIMEX, CTL_EOL);
409 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
410 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
411 1.31.2.2 skrll CTLTYPE_INT, "autonicetime",
412 1.31.2.2 skrll SYSCTL_DESCR("CPU clock seconds before non-root "
413 1.31.2.2 skrll "process priority is lowered"),
414 1.31.2.2 skrll sysctl_kern_autonice, 0, &autonicetime, 0,
415 1.31.2.2 skrll CTL_KERN, KERN_AUTONICETIME, CTL_EOL);
416 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
417 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
418 1.31.2.2 skrll CTLTYPE_INT, "autoniceval",
419 1.31.2.2 skrll SYSCTL_DESCR("Automatic reniced non-root process "
420 1.31.2.2 skrll "priority"),
421 1.31.2.2 skrll sysctl_kern_autonice, 0, &autoniceval, 0,
422 1.31.2.2 skrll CTL_KERN, KERN_AUTONICEVAL, CTL_EOL);
423 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
424 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
425 1.31.2.2 skrll CTLTYPE_INT, "rtc_offset",
426 1.31.2.2 skrll SYSCTL_DESCR("Offset of real time clock from UTC in "
427 1.31.2.2 skrll "minutes"),
428 1.31.2.2 skrll sysctl_kern_rtc_offset, 0, &rtc_offset, 0,
429 1.31.2.2 skrll CTL_KERN, KERN_RTC_OFFSET, CTL_EOL);
430 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
431 1.31.2.2 skrll CTLFLAG_PERMANENT,
432 1.31.2.2 skrll CTLTYPE_STRING, "root_device",
433 1.31.2.2 skrll SYSCTL_DESCR("Name of the root device"),
434 1.31.2.2 skrll sysctl_root_device, 0, NULL, 0,
435 1.31.2.2 skrll CTL_KERN, KERN_ROOT_DEVICE, CTL_EOL);
436 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
437 1.31.2.2 skrll CTLFLAG_PERMANENT,
438 1.31.2.2 skrll CTLTYPE_INT, "msgbufsize",
439 1.31.2.2 skrll SYSCTL_DESCR("Size of the kernel message buffer"),
440 1.31.2.2 skrll sysctl_msgbuf, 0, NULL, 0,
441 1.31.2.2 skrll CTL_KERN, KERN_MSGBUFSIZE, CTL_EOL);
442 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
443 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
444 1.31.2.2 skrll CTLTYPE_INT, "fsync",
445 1.31.2.2 skrll SYSCTL_DESCR("Whether the POSIX 1003.1b File "
446 1.31.2.2 skrll "Synchronization Option is available on "
447 1.31.2.2 skrll "this system"),
448 1.31.2.2 skrll NULL, 1, NULL, 0,
449 1.31.2.2 skrll CTL_KERN, KERN_FSYNC, CTL_EOL);
450 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
451 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
452 1.31.2.2 skrll CTLTYPE_INT, "sysvmsg",
453 1.31.2.2 skrll SYSCTL_DESCR("System V style message support available"),
454 1.31.2.2 skrll NULL,
455 1.31.2.2 skrll #ifdef SYSVMSG
456 1.31.2.2 skrll 1,
457 1.31.2.2 skrll #else /* SYSVMSG */
458 1.31.2.2 skrll 0,
459 1.31.2.2 skrll #endif /* SYSVMSG */
460 1.31.2.2 skrll NULL, 0, CTL_KERN, KERN_SYSVMSG, CTL_EOL);
461 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
462 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
463 1.31.2.2 skrll CTLTYPE_INT, "sysvsem",
464 1.31.2.2 skrll SYSCTL_DESCR("System V style semaphore support "
465 1.31.2.2 skrll "available"), NULL,
466 1.31.2.2 skrll #ifdef SYSVSEM
467 1.31.2.2 skrll 1,
468 1.31.2.2 skrll #else /* SYSVSEM */
469 1.31.2.2 skrll 0,
470 1.31.2.2 skrll #endif /* SYSVSEM */
471 1.31.2.2 skrll NULL, 0, CTL_KERN, KERN_SYSVSEM, CTL_EOL);
472 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
473 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
474 1.31.2.2 skrll CTLTYPE_INT, "sysvshm",
475 1.31.2.2 skrll SYSCTL_DESCR("System V style shared memory support "
476 1.31.2.2 skrll "available"), NULL,
477 1.31.2.2 skrll #ifdef SYSVSHM
478 1.31.2.2 skrll 1,
479 1.31.2.2 skrll #else /* SYSVSHM */
480 1.31.2.2 skrll 0,
481 1.31.2.2 skrll #endif /* SYSVSHM */
482 1.31.2.2 skrll NULL, 0, CTL_KERN, KERN_SYSVSHM, CTL_EOL);
483 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
484 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
485 1.31.2.2 skrll CTLTYPE_INT, "synchronized_io",
486 1.31.2.2 skrll SYSCTL_DESCR("Whether the POSIX 1003.1b Synchronized "
487 1.31.2.2 skrll "I/O Option is available on this system"),
488 1.31.2.2 skrll NULL, 1, NULL, 0,
489 1.31.2.2 skrll CTL_KERN, KERN_SYNCHRONIZED_IO, CTL_EOL);
490 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
491 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
492 1.31.2.2 skrll CTLTYPE_INT, "iov_max",
493 1.31.2.2 skrll SYSCTL_DESCR("Maximum number of iovec structures per "
494 1.31.2.2 skrll "process"),
495 1.31.2.2 skrll NULL, IOV_MAX, NULL, 0,
496 1.31.2.2 skrll CTL_KERN, KERN_IOV_MAX, CTL_EOL);
497 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
498 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
499 1.31.2.2 skrll CTLTYPE_INT, "mapped_files",
500 1.31.2.2 skrll SYSCTL_DESCR("Whether the POSIX 1003.1b Memory Mapped "
501 1.31.2.2 skrll "Files Option is available on this system"),
502 1.31.2.2 skrll NULL, 1, NULL, 0,
503 1.31.2.2 skrll CTL_KERN, KERN_MAPPED_FILES, CTL_EOL);
504 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
505 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
506 1.31.2.2 skrll CTLTYPE_INT, "memlock",
507 1.31.2.2 skrll SYSCTL_DESCR("Whether the POSIX 1003.1b Process Memory "
508 1.31.2.2 skrll "Locking Option is available on this "
509 1.31.2.2 skrll "system"),
510 1.31.2.2 skrll NULL, 1, NULL, 0,
511 1.31.2.2 skrll CTL_KERN, KERN_MEMLOCK, CTL_EOL);
512 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
513 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
514 1.31.2.2 skrll CTLTYPE_INT, "memlock_range",
515 1.31.2.2 skrll SYSCTL_DESCR("Whether the POSIX 1003.1b Range Memory "
516 1.31.2.2 skrll "Locking Option is available on this "
517 1.31.2.2 skrll "system"),
518 1.31.2.2 skrll NULL, 1, NULL, 0,
519 1.31.2.2 skrll CTL_KERN, KERN_MEMLOCK_RANGE, CTL_EOL);
520 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
521 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
522 1.31.2.2 skrll CTLTYPE_INT, "memory_protection",
523 1.31.2.2 skrll SYSCTL_DESCR("Whether the POSIX 1003.1b Memory "
524 1.31.2.2 skrll "Protection Option is available on this "
525 1.31.2.2 skrll "system"),
526 1.31.2.2 skrll NULL, 1, NULL, 0,
527 1.31.2.2 skrll CTL_KERN, KERN_MEMORY_PROTECTION, CTL_EOL);
528 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
529 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
530 1.31.2.2 skrll CTLTYPE_INT, "login_name_max",
531 1.31.2.2 skrll SYSCTL_DESCR("Maximum login name length"),
532 1.31.2.2 skrll NULL, LOGIN_NAME_MAX, NULL, 0,
533 1.31.2.2 skrll CTL_KERN, KERN_LOGIN_NAME_MAX, CTL_EOL);
534 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
535 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
536 1.31.2.2 skrll CTLTYPE_STRING, "defcorename",
537 1.31.2.2 skrll SYSCTL_DESCR("Default core file name"),
538 1.31.2.2 skrll sysctl_kern_defcorename, 0, defcorename, MAXPATHLEN,
539 1.31.2.2 skrll CTL_KERN, KERN_DEFCORENAME, CTL_EOL);
540 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
541 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
542 1.31.2.2 skrll CTLTYPE_INT, "logsigexit",
543 1.31.2.2 skrll SYSCTL_DESCR("Log process exit when caused by signals"),
544 1.31.2.2 skrll NULL, 0, &kern_logsigexit, 0,
545 1.31.2.2 skrll CTL_KERN, KERN_LOGSIGEXIT, CTL_EOL);
546 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
547 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
548 1.31.2.2 skrll CTLTYPE_INT, "fscale",
549 1.31.2.2 skrll SYSCTL_DESCR("Kernel fixed-point scale factor"),
550 1.31.2.2 skrll NULL, FSCALE, NULL, 0,
551 1.31.2.2 skrll CTL_KERN, KERN_FSCALE, CTL_EOL);
552 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
553 1.31.2.2 skrll CTLFLAG_PERMANENT,
554 1.31.2.2 skrll CTLTYPE_INT, "ccpu",
555 1.31.2.2 skrll SYSCTL_DESCR("Scheduler exponential decay value"),
556 1.31.2.2 skrll NULL, 0, &ccpu, 0,
557 1.31.2.2 skrll CTL_KERN, KERN_CCPU, CTL_EOL);
558 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
559 1.31.2.2 skrll CTLFLAG_PERMANENT,
560 1.31.2.2 skrll CTLTYPE_STRUCT, "cp_time",
561 1.31.2.2 skrll SYSCTL_DESCR("Clock ticks spent in different CPU states"),
562 1.31.2.2 skrll sysctl_kern_cptime, 0, NULL, 0,
563 1.31.2.2 skrll CTL_KERN, KERN_CP_TIME, CTL_EOL);
564 1.31.2.2 skrll #if defined(SYSVMSG) || defined(SYSVSEM) || defined(SYSVSHM)
565 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
566 1.31.2.2 skrll CTLFLAG_PERMANENT,
567 1.31.2.2 skrll CTLTYPE_STRUCT, "sysvipc_info",
568 1.31.2.2 skrll SYSCTL_DESCR("System V style IPC information"),
569 1.31.2.2 skrll sysctl_kern_sysvipc, 0, NULL, 0,
570 1.31.2.2 skrll CTL_KERN, KERN_SYSVIPC_INFO, CTL_EOL);
571 1.31.2.2 skrll #endif /* SYSVMSG || SYSVSEM || SYSVSHM */
572 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
573 1.31.2.2 skrll CTLFLAG_PERMANENT,
574 1.31.2.2 skrll CTLTYPE_INT, "msgbuf",
575 1.31.2.2 skrll SYSCTL_DESCR("Kernel message buffer"),
576 1.31.2.2 skrll sysctl_msgbuf, 0, NULL, 0,
577 1.31.2.2 skrll CTL_KERN, KERN_MSGBUF, CTL_EOL);
578 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
579 1.31.2.2 skrll CTLFLAG_PERMANENT,
580 1.31.2.2 skrll CTLTYPE_STRUCT, "consdev",
581 1.31.2.2 skrll SYSCTL_DESCR("Console device"),
582 1.31.2.2 skrll sysctl_consdev, 0, NULL, sizeof(dev_t),
583 1.31.2.2 skrll CTL_KERN, KERN_CONSDEV, CTL_EOL);
584 1.31.2.2 skrll #if NPTY > 0
585 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
586 1.31.2.2 skrll CTLFLAG_PERMANENT,
587 1.31.2.2 skrll CTLTYPE_INT, "maxptys",
588 1.31.2.2 skrll SYSCTL_DESCR("Maximum number of pseudo-ttys"),
589 1.31.2.2 skrll sysctl_kern_maxptys, 0, NULL, 0,
590 1.31.2.2 skrll CTL_KERN, KERN_MAXPTYS, CTL_EOL);
591 1.31.2.2 skrll #endif /* NPTY > 0 */
592 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
593 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
594 1.31.2.2 skrll CTLTYPE_INT, "maxphys",
595 1.31.2.2 skrll SYSCTL_DESCR("Maximum raw I/O transfer size"),
596 1.31.2.2 skrll NULL, MAXPHYS, NULL, 0,
597 1.31.2.2 skrll CTL_KERN, KERN_MAXPHYS, CTL_EOL);
598 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
599 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
600 1.31.2.2 skrll CTLTYPE_INT, "sbmax",
601 1.31.2.2 skrll SYSCTL_DESCR("Maximum socket buffer size"),
602 1.31.2.2 skrll sysctl_kern_sbmax, 0, NULL, 0,
603 1.31.2.2 skrll CTL_KERN, KERN_SBMAX, CTL_EOL);
604 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
605 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
606 1.31.2.2 skrll CTLTYPE_INT, "monotonic_clock",
607 1.31.2.2 skrll SYSCTL_DESCR("Implementation version of the POSIX "
608 1.31.2.2 skrll "1003.1b Monotonic Clock Option"),
609 1.31.2.2 skrll /* XXX _POSIX_VERSION */
610 1.31.2.2 skrll NULL, _POSIX_MONOTONIC_CLOCK, NULL, 0,
611 1.31.2.2 skrll CTL_KERN, KERN_MONOTONIC_CLOCK, CTL_EOL);
612 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
613 1.31.2.2 skrll CTLFLAG_PERMANENT,
614 1.31.2.2 skrll CTLTYPE_INT, "urandom",
615 1.31.2.2 skrll SYSCTL_DESCR("Random integer value"),
616 1.31.2.2 skrll sysctl_kern_urnd, 0, NULL, 0,
617 1.31.2.2 skrll CTL_KERN, KERN_URND, CTL_EOL);
618 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
619 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
620 1.31.2.2 skrll CTLTYPE_INT, "labelsector",
621 1.31.2.2 skrll SYSCTL_DESCR("Sector number containing the disklabel"),
622 1.31.2.2 skrll NULL, LABELSECTOR, NULL, 0,
623 1.31.2.2 skrll CTL_KERN, KERN_LABELSECTOR, CTL_EOL);
624 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
625 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
626 1.31.2.2 skrll CTLTYPE_INT, "labeloffset",
627 1.31.2.2 skrll SYSCTL_DESCR("Offset of the disklabel within the "
628 1.31.2.2 skrll "sector"),
629 1.31.2.2 skrll NULL, LABELOFFSET, NULL, 0,
630 1.31.2.2 skrll CTL_KERN, KERN_LABELOFFSET, CTL_EOL);
631 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
632 1.31.2.2 skrll CTLFLAG_PERMANENT,
633 1.31.2.2 skrll CTLTYPE_NODE, "lwp",
634 1.31.2.2 skrll SYSCTL_DESCR("System-wide LWP information"),
635 1.31.2.2 skrll sysctl_kern_lwp, 0, NULL, 0,
636 1.31.2.2 skrll CTL_KERN, KERN_LWP, CTL_EOL);
637 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
638 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
639 1.31.2.2 skrll CTLTYPE_INT, "forkfsleep",
640 1.31.2.2 skrll SYSCTL_DESCR("Milliseconds to sleep on fork failure due "
641 1.31.2.2 skrll "to process limits"),
642 1.31.2.2 skrll sysctl_kern_forkfsleep, 0, NULL, 0,
643 1.31.2.2 skrll CTL_KERN, KERN_FORKFSLEEP, CTL_EOL);
644 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
645 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
646 1.31.2.2 skrll CTLTYPE_INT, "posix_threads",
647 1.31.2.2 skrll SYSCTL_DESCR("Version of IEEE Std 1003.1 and its "
648 1.31.2.2 skrll "Threads option to which the system "
649 1.31.2.2 skrll "attempts to conform"),
650 1.31.2.2 skrll /* XXX _POSIX_VERSION */
651 1.31.2.2 skrll NULL, _POSIX_THREADS, NULL, 0,
652 1.31.2.2 skrll CTL_KERN, KERN_POSIX_THREADS, CTL_EOL);
653 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
654 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
655 1.31.2.2 skrll CTLTYPE_INT, "posix_semaphores",
656 1.31.2.2 skrll SYSCTL_DESCR("Version of IEEE Std 1003.1 and its "
657 1.31.2.2 skrll "Semaphores option to which the system "
658 1.31.2.2 skrll "attempts to conform"), NULL,
659 1.31.2.2 skrll #ifdef P1003_1B_SEMAPHORE
660 1.31.2.2 skrll 200112,
661 1.31.2.2 skrll #else /* P1003_1B_SEMAPHORE */
662 1.31.2.2 skrll 0,
663 1.31.2.2 skrll #endif /* P1003_1B_SEMAPHORE */
664 1.31.2.2 skrll NULL, 0, CTL_KERN, KERN_POSIX_SEMAPHORES, CTL_EOL);
665 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
666 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
667 1.31.2.2 skrll CTLTYPE_INT, "posix_barriers",
668 1.31.2.2 skrll SYSCTL_DESCR("Version of IEEE Std 1003.1 and its "
669 1.31.2.2 skrll "Barriers option to which the system "
670 1.31.2.2 skrll "attempts to conform"),
671 1.31.2.2 skrll /* XXX _POSIX_VERSION */
672 1.31.2.2 skrll NULL, _POSIX_BARRIERS, NULL, 0,
673 1.31.2.2 skrll CTL_KERN, KERN_POSIX_BARRIERS, CTL_EOL);
674 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
675 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
676 1.31.2.2 skrll CTLTYPE_INT, "posix_timers",
677 1.31.2.2 skrll SYSCTL_DESCR("Version of IEEE Std 1003.1 and its "
678 1.31.2.2 skrll "Timers option to which the system "
679 1.31.2.2 skrll "attempts to conform"),
680 1.31.2.2 skrll /* XXX _POSIX_VERSION */
681 1.31.2.2 skrll NULL, _POSIX_TIMERS, NULL, 0,
682 1.31.2.2 skrll CTL_KERN, KERN_POSIX_TIMERS, CTL_EOL);
683 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
684 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
685 1.31.2.2 skrll CTLTYPE_INT, "posix_spin_locks",
686 1.31.2.2 skrll SYSCTL_DESCR("Version of IEEE Std 1003.1 and its Spin "
687 1.31.2.2 skrll "Locks option to which the system attempts "
688 1.31.2.2 skrll "to conform"),
689 1.31.2.2 skrll /* XXX _POSIX_VERSION */
690 1.31.2.2 skrll NULL, _POSIX_SPIN_LOCKS, NULL, 0,
691 1.31.2.2 skrll CTL_KERN, KERN_POSIX_SPIN_LOCKS, CTL_EOL);
692 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
693 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
694 1.31.2.2 skrll CTLTYPE_INT, "posix_reader_writer_locks",
695 1.31.2.2 skrll SYSCTL_DESCR("Version of IEEE Std 1003.1 and its "
696 1.31.2.2 skrll "Read-Write Locks option to which the "
697 1.31.2.2 skrll "system attempts to conform"),
698 1.31.2.2 skrll /* XXX _POSIX_VERSION */
699 1.31.2.2 skrll NULL, _POSIX_READER_WRITER_LOCKS, NULL, 0,
700 1.31.2.2 skrll CTL_KERN, KERN_POSIX_READER_WRITER_LOCKS, CTL_EOL);
701 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
702 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
703 1.31.2.2 skrll CTLTYPE_INT, "dump_on_panic",
704 1.31.2.2 skrll SYSCTL_DESCR("Perform a crash dump on system panic"),
705 1.31.2.2 skrll NULL, 0, &dumponpanic, 0,
706 1.31.2.2 skrll CTL_KERN, KERN_DUMP_ON_PANIC, CTL_EOL);
707 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
708 1.31.2.2 skrll CTLFLAG_PERMANENT,
709 1.31.2.2 skrll CTLTYPE_INT, "root_partition",
710 1.31.2.2 skrll SYSCTL_DESCR("Root partition on the root device"),
711 1.31.2.2 skrll sysctl_kern_root_partition, 0, NULL, 0,
712 1.31.2.2 skrll CTL_KERN, KERN_ROOT_PARTITION, CTL_EOL);
713 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
714 1.31.2.2 skrll CTLFLAG_PERMANENT,
715 1.31.2.2 skrll CTLTYPE_STRUCT, "drivers",
716 1.31.2.2 skrll SYSCTL_DESCR("List of all drivers with block and "
717 1.31.2.2 skrll "character device numbers"),
718 1.31.2.2 skrll sysctl_kern_drivers, 0, NULL, 0,
719 1.31.2.2 skrll CTL_KERN, KERN_DRIVERS, CTL_EOL);
720 1.31.2.2 skrll }
721 1.31.2.2 skrll
722 1.31.2.2 skrll SYSCTL_SETUP(sysctl_kern_proc_setup,
723 1.31.2.2 skrll "sysctl kern.proc/proc2/proc_args subtree setup")
724 1.31.2.2 skrll {
725 1.31.2.2 skrll
726 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
727 1.31.2.2 skrll CTLFLAG_PERMANENT,
728 1.31.2.2 skrll CTLTYPE_NODE, "kern", NULL,
729 1.31.2.2 skrll NULL, 0, NULL, 0,
730 1.31.2.2 skrll CTL_KERN, CTL_EOL);
731 1.31.2.2 skrll
732 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
733 1.31.2.2 skrll CTLFLAG_PERMANENT,
734 1.31.2.2 skrll CTLTYPE_NODE, "proc",
735 1.31.2.2 skrll SYSCTL_DESCR("System-wide process information"),
736 1.31.2.2 skrll sysctl_doeproc, 0, NULL, 0,
737 1.31.2.2 skrll CTL_KERN, KERN_PROC, CTL_EOL);
738 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
739 1.31.2.2 skrll CTLFLAG_PERMANENT,
740 1.31.2.2 skrll CTLTYPE_NODE, "proc2",
741 1.31.2.2 skrll SYSCTL_DESCR("Machine-independent process information"),
742 1.31.2.2 skrll sysctl_doeproc, 0, NULL, 0,
743 1.31.2.2 skrll CTL_KERN, KERN_PROC2, CTL_EOL);
744 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
745 1.31.2.2 skrll CTLFLAG_PERMANENT,
746 1.31.2.2 skrll CTLTYPE_NODE, "proc_args",
747 1.31.2.2 skrll SYSCTL_DESCR("Process argument information"),
748 1.31.2.2 skrll sysctl_kern_proc_args, 0, NULL, 0,
749 1.31.2.2 skrll CTL_KERN, KERN_PROC_ARGS, CTL_EOL);
750 1.31.2.2 skrll
751 1.31.2.2 skrll /*
752 1.31.2.2 skrll "nodes" under these:
753 1.31.2.2 skrll
754 1.31.2.2 skrll KERN_PROC_ALL
755 1.31.2.2 skrll KERN_PROC_PID pid
756 1.31.2.2 skrll KERN_PROC_PGRP pgrp
757 1.31.2.2 skrll KERN_PROC_SESSION sess
758 1.31.2.2 skrll KERN_PROC_TTY tty
759 1.31.2.2 skrll KERN_PROC_UID uid
760 1.31.2.2 skrll KERN_PROC_RUID uid
761 1.31.2.2 skrll KERN_PROC_GID gid
762 1.31.2.2 skrll KERN_PROC_RGID gid
763 1.31.2.2 skrll
764 1.31.2.2 skrll all in all, probably not worth the effort...
765 1.31.2.2 skrll */
766 1.31.2.2 skrll }
767 1.31.2.2 skrll
768 1.31.2.2 skrll SYSCTL_SETUP(sysctl_hw_setup, "sysctl hw subtree setup")
769 1.31.2.2 skrll {
770 1.31.2.2 skrll u_int u;
771 1.31.2.2 skrll u_quad_t q;
772 1.31.2.2 skrll
773 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
774 1.31.2.2 skrll CTLFLAG_PERMANENT,
775 1.31.2.2 skrll CTLTYPE_NODE, "hw", NULL,
776 1.31.2.2 skrll NULL, 0, NULL, 0,
777 1.31.2.2 skrll CTL_HW, CTL_EOL);
778 1.31.2.2 skrll
779 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
780 1.31.2.2 skrll CTLFLAG_PERMANENT,
781 1.31.2.2 skrll CTLTYPE_STRING, "machine",
782 1.31.2.2 skrll SYSCTL_DESCR("Machine class"),
783 1.31.2.2 skrll NULL, 0, machine, 0,
784 1.31.2.2 skrll CTL_HW, HW_MACHINE, CTL_EOL);
785 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
786 1.31.2.2 skrll CTLFLAG_PERMANENT,
787 1.31.2.2 skrll CTLTYPE_STRING, "model",
788 1.31.2.2 skrll SYSCTL_DESCR("Machine model"),
789 1.31.2.2 skrll NULL, 0, cpu_model, 0,
790 1.31.2.2 skrll CTL_HW, HW_MODEL, CTL_EOL);
791 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
792 1.31.2.2 skrll CTLFLAG_PERMANENT,
793 1.31.2.2 skrll CTLTYPE_INT, "ncpu",
794 1.31.2.2 skrll SYSCTL_DESCR("Number of active CPUs"),
795 1.31.2.2 skrll sysctl_hw_ncpu, 0, NULL, 0,
796 1.31.2.2 skrll CTL_HW, HW_NCPU, CTL_EOL);
797 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
798 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
799 1.31.2.2 skrll CTLTYPE_INT, "byteorder",
800 1.31.2.2 skrll SYSCTL_DESCR("System byte order"),
801 1.31.2.2 skrll NULL, BYTE_ORDER, NULL, 0,
802 1.31.2.2 skrll CTL_HW, HW_BYTEORDER, CTL_EOL);
803 1.31.2.2 skrll u = ((u_int)physmem > (UINT_MAX / PAGE_SIZE)) ?
804 1.31.2.2 skrll UINT_MAX : physmem * PAGE_SIZE;
805 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
806 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
807 1.31.2.2 skrll CTLTYPE_INT, "physmem",
808 1.31.2.2 skrll SYSCTL_DESCR("Bytes of physical memory"),
809 1.31.2.2 skrll NULL, u, NULL, 0,
810 1.31.2.2 skrll CTL_HW, HW_PHYSMEM, CTL_EOL);
811 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
812 1.31.2.2 skrll CTLFLAG_PERMANENT,
813 1.31.2.2 skrll CTLTYPE_INT, "usermem",
814 1.31.2.2 skrll SYSCTL_DESCR("Bytes of non-kernel memory"),
815 1.31.2.2 skrll sysctl_hw_usermem, 0, NULL, 0,
816 1.31.2.2 skrll CTL_HW, HW_USERMEM, CTL_EOL);
817 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
818 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
819 1.31.2.2 skrll CTLTYPE_INT, "pagesize",
820 1.31.2.2 skrll SYSCTL_DESCR("Software page size"),
821 1.31.2.2 skrll NULL, PAGE_SIZE, NULL, 0,
822 1.31.2.2 skrll CTL_HW, HW_PAGESIZE, CTL_EOL);
823 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
824 1.31.2.2 skrll CTLFLAG_PERMANENT,
825 1.31.2.2 skrll CTLTYPE_STRING, "disknames",
826 1.31.2.2 skrll SYSCTL_DESCR("List of disk devices present"),
827 1.31.2.2 skrll sysctl_hw_disknames, 0, NULL, 0,
828 1.31.2.2 skrll CTL_HW, HW_DISKNAMES, CTL_EOL);
829 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
830 1.31.2.2 skrll CTLFLAG_PERMANENT,
831 1.31.2.2 skrll CTLTYPE_STRUCT, "diskstats",
832 1.31.2.2 skrll SYSCTL_DESCR("Statistics on disk operation"),
833 1.31.2.2 skrll sysctl_hw_diskstats, 0, NULL, 0,
834 1.31.2.2 skrll CTL_HW, HW_DISKSTATS, CTL_EOL);
835 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
836 1.31.2.2 skrll CTLFLAG_PERMANENT,
837 1.31.2.2 skrll CTLTYPE_STRING, "machine_arch",
838 1.31.2.2 skrll SYSCTL_DESCR("Machine CPU class"),
839 1.31.2.2 skrll NULL, 0, machine_arch, 0,
840 1.31.2.2 skrll CTL_HW, HW_MACHINE_ARCH, CTL_EOL);
841 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
842 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
843 1.31.2.2 skrll CTLTYPE_INT, "alignbytes",
844 1.31.2.2 skrll SYSCTL_DESCR("Alignment constraint for all possible "
845 1.31.2.2 skrll "data types"),
846 1.31.2.2 skrll NULL, ALIGNBYTES, NULL, 0,
847 1.31.2.2 skrll CTL_HW, HW_ALIGNBYTES, CTL_EOL);
848 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
849 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_READWRITE|CTLFLAG_HEX,
850 1.31.2.2 skrll CTLTYPE_STRING, "cnmagic",
851 1.31.2.2 skrll SYSCTL_DESCR("Console magic key sequence"),
852 1.31.2.2 skrll sysctl_hw_cnmagic, 0, NULL, CNS_LEN,
853 1.31.2.2 skrll CTL_HW, HW_CNMAGIC, CTL_EOL);
854 1.31.2.2 skrll q = (u_quad_t)physmem * PAGE_SIZE;
855 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
856 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
857 1.31.2.2 skrll CTLTYPE_QUAD, "physmem64",
858 1.31.2.2 skrll SYSCTL_DESCR("Bytes of physical memory"),
859 1.31.2.2 skrll NULL, q, NULL, 0,
860 1.31.2.2 skrll CTL_HW, HW_PHYSMEM64, CTL_EOL);
861 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
862 1.31.2.2 skrll CTLFLAG_PERMANENT,
863 1.31.2.2 skrll CTLTYPE_QUAD, "usermem64",
864 1.31.2.2 skrll SYSCTL_DESCR("Bytes of non-kernel memory"),
865 1.31.2.2 skrll sysctl_hw_usermem, 0, NULL, 0,
866 1.31.2.2 skrll CTL_HW, HW_USERMEM64, CTL_EOL);
867 1.31.2.2 skrll }
868 1.31.2.2 skrll
869 1.31.2.2 skrll #ifdef DEBUG
870 1.31.2.2 skrll /*
871 1.31.2.2 skrll * Debugging related system variables.
872 1.31.2.2 skrll */
873 1.31.2.2 skrll struct ctldebug /* debug0, */ /* debug1, */ debug2, debug3, debug4;
874 1.31.2.2 skrll struct ctldebug debug5, debug6, debug7, debug8, debug9;
875 1.31.2.2 skrll struct ctldebug debug10, debug11, debug12, debug13, debug14;
876 1.31.2.2 skrll struct ctldebug debug15, debug16, debug17, debug18, debug19;
877 1.31.2.2 skrll static struct ctldebug *debugvars[CTL_DEBUG_MAXID] = {
878 1.31.2.2 skrll &debug0, &debug1, &debug2, &debug3, &debug4,
879 1.31.2.2 skrll &debug5, &debug6, &debug7, &debug8, &debug9,
880 1.31.2.2 skrll &debug10, &debug11, &debug12, &debug13, &debug14,
881 1.31.2.2 skrll &debug15, &debug16, &debug17, &debug18, &debug19,
882 1.31.2.2 skrll };
883 1.31.2.2 skrll
884 1.31.2.2 skrll /*
885 1.31.2.2 skrll * this setup routine is a replacement for debug_sysctl()
886 1.31.2.2 skrll *
887 1.31.2.2 skrll * note that it creates several nodes per defined debug variable
888 1.31.2.2 skrll */
889 1.31.2.2 skrll SYSCTL_SETUP(sysctl_debug_setup, "sysctl debug subtree setup")
890 1.31.2.2 skrll {
891 1.31.2.2 skrll struct ctldebug *cdp;
892 1.31.2.2 skrll char nodename[20];
893 1.31.2.2 skrll int i;
894 1.31.2.2 skrll
895 1.31.2.2 skrll /*
896 1.31.2.2 skrll * two ways here:
897 1.31.2.2 skrll *
898 1.31.2.2 skrll * the "old" way (debug.name -> value) which was emulated by
899 1.31.2.2 skrll * the sysctl(8) binary
900 1.31.2.2 skrll *
901 1.31.2.2 skrll * the new way, which the sysctl(8) binary was actually using
902 1.31.2.2 skrll
903 1.31.2.2 skrll node debug
904 1.31.2.2 skrll node debug.0
905 1.31.2.2 skrll string debug.0.name
906 1.31.2.2 skrll int debug.0.value
907 1.31.2.2 skrll int debug.name
908 1.31.2.2 skrll
909 1.31.2.2 skrll */
910 1.31.2.2 skrll
911 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
912 1.31.2.2 skrll CTLFLAG_PERMANENT,
913 1.31.2.2 skrll CTLTYPE_NODE, "debug", NULL,
914 1.31.2.2 skrll NULL, 0, NULL, 0,
915 1.31.2.2 skrll CTL_DEBUG, CTL_EOL);
916 1.31.2.2 skrll
917 1.31.2.2 skrll for (i = 0; i < CTL_DEBUG_MAXID; i++) {
918 1.31.2.2 skrll cdp = debugvars[i];
919 1.31.2.2 skrll if (cdp->debugname == NULL || cdp->debugvar == NULL)
920 1.31.2.2 skrll continue;
921 1.31.2.2 skrll
922 1.31.2.2 skrll snprintf(nodename, sizeof(nodename), "debug%d", i);
923 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
924 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_HIDDEN,
925 1.31.2.2 skrll CTLTYPE_NODE, nodename, NULL,
926 1.31.2.2 skrll NULL, 0, NULL, 0,
927 1.31.2.2 skrll CTL_DEBUG, i, CTL_EOL);
928 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
929 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_HIDDEN,
930 1.31.2.2 skrll CTLTYPE_STRING, "name", NULL,
931 1.31.2.2 skrll NULL, 0, cdp->debugname, 0,
932 1.31.2.2 skrll CTL_DEBUG, i, CTL_DEBUG_NAME, CTL_EOL);
933 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
934 1.31.2.2 skrll CTLFLAG_PERMANENT|CTLFLAG_HIDDEN,
935 1.31.2.2 skrll CTLTYPE_INT, "value", NULL,
936 1.31.2.2 skrll NULL, 0, cdp->debugvar, 0,
937 1.31.2.2 skrll CTL_DEBUG, i, CTL_DEBUG_VALUE, CTL_EOL);
938 1.31.2.2 skrll sysctl_createv(clog, 0, NULL, NULL,
939 1.31.2.2 skrll CTLFLAG_PERMANENT,
940 1.31.2.2 skrll CTLTYPE_INT, cdp->debugname, NULL,
941 1.31.2.2 skrll NULL, 0, cdp->debugvar, 0,
942 1.31.2.2 skrll CTL_DEBUG, CTL_CREATE, CTL_EOL);
943 1.31.2.2 skrll }
944 1.31.2.2 skrll }
945 1.31.2.2 skrll #endif /* DEBUG */
946 1.31.2.2 skrll
947 1.31.2.2 skrll /*
948 1.31.2.2 skrll * ********************************************************************
949 1.31.2.2 skrll * section 2: private node-specific helper routines.
950 1.31.2.2 skrll * ********************************************************************
951 1.31.2.2 skrll */
952 1.31.2.2 skrll
953 1.31.2.2 skrll /*
954 1.31.2.2 skrll * sysctl helper routine for kern.maxvnodes. drain vnodes if
955 1.31.2.2 skrll * new value is lower than desiredvnodes and then calls reinit
956 1.31.2.2 skrll * routines that needs to adjust to the new value.
957 1.31.2.2 skrll */
958 1.31.2.2 skrll static int
959 1.31.2.2 skrll sysctl_kern_maxvnodes(SYSCTLFN_ARGS)
960 1.31.2.2 skrll {
961 1.31.2.2 skrll int error, new_vnodes, old_vnodes;
962 1.31.2.2 skrll struct sysctlnode node;
963 1.31.2.2 skrll
964 1.31.2.2 skrll new_vnodes = desiredvnodes;
965 1.31.2.2 skrll node = *rnode;
966 1.31.2.2 skrll node.sysctl_data = &new_vnodes;
967 1.31.2.2 skrll error = sysctl_lookup(SYSCTLFN_CALL(&node));
968 1.31.2.2 skrll if (error || newp == NULL)
969 1.31.2.2 skrll return (error);
970 1.31.2.2 skrll
971 1.31.2.2 skrll old_vnodes = desiredvnodes;
972 1.31.2.2 skrll desiredvnodes = new_vnodes;
973 1.31.2.2 skrll if (new_vnodes < old_vnodes) {
974 1.31.2.4 skrll error = vfs_drainvnodes(new_vnodes, l);
975 1.31.2.2 skrll if (error) {
976 1.31.2.2 skrll desiredvnodes = old_vnodes;
977 1.31.2.2 skrll return (error);
978 1.31.2.2 skrll }
979 1.31.2.2 skrll }
980 1.31.2.2 skrll vfs_reinit();
981 1.31.2.2 skrll nchreinit();
982 1.31.2.2 skrll
983 1.31.2.2 skrll return (0);
984 1.31.2.2 skrll }
985 1.31.2.2 skrll
986 1.31.2.2 skrll /*
987 1.31.2.2 skrll * sysctl helper routine for rtc_offset - set time after changes
988 1.31.2.2 skrll */
989 1.31.2.2 skrll static int
990 1.31.2.2 skrll sysctl_kern_rtc_offset(SYSCTLFN_ARGS)
991 1.31.2.2 skrll {
992 1.31.2.2 skrll struct timeval tv, delta;
993 1.31.2.2 skrll int s, error, new_rtc_offset;
994 1.31.2.2 skrll struct sysctlnode node;
995 1.31.2.2 skrll
996 1.31.2.2 skrll new_rtc_offset = rtc_offset;
997 1.31.2.2 skrll node = *rnode;
998 1.31.2.2 skrll node.sysctl_data = &new_rtc_offset;
999 1.31.2.2 skrll error = sysctl_lookup(SYSCTLFN_CALL(&node));
1000 1.31.2.2 skrll if (error || newp == NULL)
1001 1.31.2.2 skrll return (error);
1002 1.31.2.2 skrll
1003 1.31.2.2 skrll if (securelevel > 0)
1004 1.31.2.2 skrll return (EPERM);
1005 1.31.2.2 skrll if (rtc_offset == new_rtc_offset)
1006 1.31.2.2 skrll return (0);
1007 1.31.2.2 skrll
1008 1.31.2.2 skrll /* if we change the offset, adjust the time */
1009 1.31.2.2 skrll s = splclock();
1010 1.31.2.2 skrll tv = time;
1011 1.31.2.2 skrll splx(s);
1012 1.31.2.2 skrll delta.tv_sec = 60*(new_rtc_offset - rtc_offset);
1013 1.31.2.2 skrll delta.tv_usec = 0;
1014 1.31.2.2 skrll timeradd(&tv, &delta, &tv);
1015 1.31.2.2 skrll rtc_offset = new_rtc_offset;
1016 1.31.2.2 skrll settime(&tv);
1017 1.31.2.2 skrll
1018 1.31.2.2 skrll return (0);
1019 1.31.2.2 skrll }
1020 1.31.2.2 skrll
1021 1.31.2.2 skrll /*
1022 1.31.2.2 skrll * sysctl helper routine for kern.maxvnodes. ensures that the new
1023 1.31.2.2 skrll * values are not too low or too high.
1024 1.31.2.2 skrll */
1025 1.31.2.2 skrll static int
1026 1.31.2.2 skrll sysctl_kern_maxproc(SYSCTLFN_ARGS)
1027 1.31.2.2 skrll {
1028 1.31.2.2 skrll int error, nmaxproc;
1029 1.31.2.2 skrll struct sysctlnode node;
1030 1.31.2.2 skrll
1031 1.31.2.2 skrll nmaxproc = maxproc;
1032 1.31.2.2 skrll node = *rnode;
1033 1.31.2.2 skrll node.sysctl_data = &nmaxproc;
1034 1.31.2.2 skrll error = sysctl_lookup(SYSCTLFN_CALL(&node));
1035 1.31.2.2 skrll if (error || newp == NULL)
1036 1.31.2.2 skrll return (error);
1037 1.31.2.2 skrll
1038 1.31.2.2 skrll if (nmaxproc < 0 || nmaxproc >= PID_MAX)
1039 1.31.2.2 skrll return (EINVAL);
1040 1.31.2.2 skrll #ifdef __HAVE_CPU_MAXPROC
1041 1.31.2.2 skrll if (nmaxproc > cpu_maxproc())
1042 1.31.2.2 skrll return (EINVAL);
1043 1.31.2.2 skrll #endif
1044 1.31.2.2 skrll maxproc = nmaxproc;
1045 1.31.2.2 skrll
1046 1.31.2.2 skrll return (0);
1047 1.31.2.2 skrll }
1048 1.31.2.2 skrll
1049 1.31.2.2 skrll /*
1050 1.31.2.2 skrll * sysctl helper routine for kern.securelevel. ensures that the value
1051 1.31.2.2 skrll * only rises unless the caller has pid 1 (assumed to be init).
1052 1.31.2.2 skrll */
1053 1.31.2.2 skrll static int
1054 1.31.2.2 skrll sysctl_kern_securelevel(SYSCTLFN_ARGS)
1055 1.31.2.2 skrll {
1056 1.31.2.2 skrll int newsecurelevel, error;
1057 1.31.2.2 skrll struct sysctlnode node;
1058 1.31.2.2 skrll
1059 1.31.2.2 skrll newsecurelevel = securelevel;
1060 1.31.2.2 skrll node = *rnode;
1061 1.31.2.2 skrll node.sysctl_data = &newsecurelevel;
1062 1.31.2.2 skrll error = sysctl_lookup(SYSCTLFN_CALL(&node));
1063 1.31.2.2 skrll if (error || newp == NULL)
1064 1.31.2.2 skrll return (error);
1065 1.31.2.2 skrll
1066 1.31.2.2 skrll if (newsecurelevel < securelevel && l && l->l_proc->p_pid != 1)
1067 1.31.2.2 skrll return (EPERM);
1068 1.31.2.2 skrll securelevel = newsecurelevel;
1069 1.31.2.2 skrll
1070 1.31.2.2 skrll return (error);
1071 1.31.2.2 skrll }
1072 1.31.2.2 skrll
1073 1.31.2.2 skrll /*
1074 1.31.2.2 skrll * sysctl helper function for kern.hostid. the hostid is a long, but
1075 1.31.2.2 skrll * we export it as an int, so we need to give it a little help.
1076 1.31.2.2 skrll */
1077 1.31.2.2 skrll static int
1078 1.31.2.2 skrll sysctl_kern_hostid(SYSCTLFN_ARGS)
1079 1.31.2.2 skrll {
1080 1.31.2.2 skrll int error, inthostid;
1081 1.31.2.2 skrll struct sysctlnode node;
1082 1.31.2.2 skrll
1083 1.31.2.2 skrll inthostid = hostid; /* XXX assumes sizeof int <= sizeof long */
1084 1.31.2.2 skrll node = *rnode;
1085 1.31.2.2 skrll node.sysctl_data = &inthostid;
1086 1.31.2.2 skrll error = sysctl_lookup(SYSCTLFN_CALL(&node));
1087 1.31.2.2 skrll if (error || newp == NULL)
1088 1.31.2.2 skrll return (error);
1089 1.31.2.2 skrll
1090 1.31.2.2 skrll hostid = (unsigned)inthostid;
1091 1.31.2.2 skrll
1092 1.31.2.2 skrll return (0);
1093 1.31.2.2 skrll }
1094 1.31.2.2 skrll
1095 1.31.2.2 skrll /*
1096 1.31.2.2 skrll * sysctl helper function for kern.hostname and kern.domainnname.
1097 1.31.2.2 skrll * resets the relevant recorded length when the underlying name is
1098 1.31.2.2 skrll * changed.
1099 1.31.2.2 skrll */
1100 1.31.2.2 skrll static int
1101 1.31.2.2 skrll sysctl_setlen(SYSCTLFN_ARGS)
1102 1.31.2.2 skrll {
1103 1.31.2.2 skrll int error;
1104 1.31.2.2 skrll
1105 1.31.2.2 skrll error = sysctl_lookup(SYSCTLFN_CALL(rnode));
1106 1.31.2.2 skrll if (error || newp == NULL)
1107 1.31.2.2 skrll return (error);
1108 1.31.2.2 skrll
1109 1.31.2.2 skrll switch (rnode->sysctl_num) {
1110 1.31.2.2 skrll case KERN_HOSTNAME:
1111 1.31.2.2 skrll hostnamelen = strlen((const char*)rnode->sysctl_data);
1112 1.31.2.2 skrll break;
1113 1.31.2.2 skrll case KERN_DOMAINNAME:
1114 1.31.2.2 skrll domainnamelen = strlen((const char*)rnode->sysctl_data);
1115 1.31.2.2 skrll break;
1116 1.31.2.2 skrll }
1117 1.31.2.2 skrll
1118 1.31.2.2 skrll return (0);
1119 1.31.2.2 skrll }
1120 1.31.2.2 skrll
1121 1.31.2.2 skrll /*
1122 1.31.2.2 skrll * sysctl helper routine for kern.clockrate. assembles a struct on
1123 1.31.2.2 skrll * the fly to be returned to the caller.
1124 1.31.2.2 skrll */
1125 1.31.2.2 skrll static int
1126 1.31.2.2 skrll sysctl_kern_clockrate(SYSCTLFN_ARGS)
1127 1.31.2.2 skrll {
1128 1.31.2.2 skrll struct clockinfo clkinfo;
1129 1.31.2.2 skrll struct sysctlnode node;
1130 1.31.2.2 skrll
1131 1.31.2.2 skrll clkinfo.tick = tick;
1132 1.31.2.2 skrll clkinfo.tickadj = tickadj;
1133 1.31.2.2 skrll clkinfo.hz = hz;
1134 1.31.2.2 skrll clkinfo.profhz = profhz;
1135 1.31.2.2 skrll clkinfo.stathz = stathz ? stathz : hz;
1136 1.31.2.2 skrll
1137 1.31.2.2 skrll node = *rnode;
1138 1.31.2.2 skrll node.sysctl_data = &clkinfo;
1139 1.31.2.2 skrll return (sysctl_lookup(SYSCTLFN_CALL(&node)));
1140 1.31.2.2 skrll }
1141 1.31.2.2 skrll
1142 1.31.2.2 skrll
1143 1.31.2.2 skrll /*
1144 1.31.2.2 skrll * sysctl helper routine for kern.file pseudo-subtree.
1145 1.31.2.2 skrll */
1146 1.31.2.2 skrll static int
1147 1.31.2.2 skrll sysctl_kern_file(SYSCTLFN_ARGS)
1148 1.31.2.2 skrll {
1149 1.31.2.2 skrll int error;
1150 1.31.2.2 skrll size_t buflen;
1151 1.31.2.2 skrll struct file *fp;
1152 1.31.2.2 skrll char *start, *where;
1153 1.31.2.2 skrll
1154 1.31.2.2 skrll start = where = oldp;
1155 1.31.2.2 skrll buflen = *oldlenp;
1156 1.31.2.2 skrll if (where == NULL) {
1157 1.31.2.2 skrll /*
1158 1.31.2.2 skrll * overestimate by 10 files
1159 1.31.2.2 skrll */
1160 1.31.2.2 skrll *oldlenp = sizeof(filehead) + (nfiles + 10) * sizeof(struct file);
1161 1.31.2.2 skrll return (0);
1162 1.31.2.2 skrll }
1163 1.31.2.2 skrll
1164 1.31.2.2 skrll /*
1165 1.31.2.2 skrll * first copyout filehead
1166 1.31.2.2 skrll */
1167 1.31.2.2 skrll if (buflen < sizeof(filehead)) {
1168 1.31.2.2 skrll *oldlenp = 0;
1169 1.31.2.2 skrll return (0);
1170 1.31.2.2 skrll }
1171 1.31.2.2 skrll error = copyout(&filehead, where, sizeof(filehead));
1172 1.31.2.2 skrll if (error)
1173 1.31.2.2 skrll return (error);
1174 1.31.2.2 skrll buflen -= sizeof(filehead);
1175 1.31.2.2 skrll where += sizeof(filehead);
1176 1.31.2.2 skrll
1177 1.31.2.2 skrll /*
1178 1.31.2.2 skrll * followed by an array of file structures
1179 1.31.2.2 skrll */
1180 1.31.2.2 skrll LIST_FOREACH(fp, &filehead, f_list) {
1181 1.31.2.2 skrll if (buflen < sizeof(struct file)) {
1182 1.31.2.2 skrll *oldlenp = where - start;
1183 1.31.2.2 skrll return (ENOMEM);
1184 1.31.2.2 skrll }
1185 1.31.2.2 skrll error = copyout(fp, where, sizeof(struct file));
1186 1.31.2.2 skrll if (error)
1187 1.31.2.2 skrll return (error);
1188 1.31.2.2 skrll buflen -= sizeof(struct file);
1189 1.31.2.2 skrll where += sizeof(struct file);
1190 1.31.2.2 skrll }
1191 1.31.2.2 skrll *oldlenp = where - start;
1192 1.31.2.2 skrll return (0);
1193 1.31.2.2 skrll }
1194 1.31.2.2 skrll
1195 1.31.2.2 skrll /*
1196 1.31.2.2 skrll * sysctl helper routine for kern.autonicetime and kern.autoniceval.
1197 1.31.2.2 skrll * asserts that the assigned value is in the correct range.
1198 1.31.2.2 skrll */
1199 1.31.2.2 skrll static int
1200 1.31.2.2 skrll sysctl_kern_autonice(SYSCTLFN_ARGS)
1201 1.31.2.2 skrll {
1202 1.31.2.2 skrll int error, t = 0;
1203 1.31.2.2 skrll struct sysctlnode node;
1204 1.31.2.2 skrll
1205 1.31.2.2 skrll node = *rnode;
1206 1.31.2.2 skrll t = *(int*)node.sysctl_data;
1207 1.31.2.2 skrll node.sysctl_data = &t;
1208 1.31.2.2 skrll error = sysctl_lookup(SYSCTLFN_CALL(&node));
1209 1.31.2.2 skrll if (error || newp == NULL)
1210 1.31.2.2 skrll return (error);
1211 1.31.2.2 skrll
1212 1.31.2.2 skrll switch (node.sysctl_num) {
1213 1.31.2.2 skrll case KERN_AUTONICETIME:
1214 1.31.2.2 skrll if (t >= 0)
1215 1.31.2.2 skrll autonicetime = t;
1216 1.31.2.2 skrll break;
1217 1.31.2.2 skrll case KERN_AUTONICEVAL:
1218 1.31.2.2 skrll if (t < PRIO_MIN)
1219 1.31.2.2 skrll t = PRIO_MIN;
1220 1.31.2.2 skrll else if (t > PRIO_MAX)
1221 1.31.2.2 skrll t = PRIO_MAX;
1222 1.31.2.2 skrll autoniceval = t;
1223 1.31.2.2 skrll break;
1224 1.31.2.2 skrll }
1225 1.31.2.2 skrll
1226 1.31.2.2 skrll return (0);
1227 1.31.2.2 skrll }
1228 1.31.2.2 skrll
1229 1.31.2.2 skrll /*
1230 1.31.2.2 skrll * sysctl helper routine for kern.msgbufsize and kern.msgbuf. for the
1231 1.31.2.2 skrll * former it merely checks the message buffer is set up. for the latter,
1232 1.31.2.2 skrll * it also copies out the data if necessary.
1233 1.31.2.2 skrll */
1234 1.31.2.2 skrll static int
1235 1.31.2.2 skrll sysctl_msgbuf(SYSCTLFN_ARGS)
1236 1.31.2.2 skrll {
1237 1.31.2.2 skrll char *where = oldp;
1238 1.31.2.2 skrll size_t len, maxlen;
1239 1.31.2.2 skrll long beg, end;
1240 1.31.2.2 skrll int error;
1241 1.31.2.2 skrll
1242 1.31.2.2 skrll if (!msgbufenabled || msgbufp->msg_magic != MSG_MAGIC) {
1243 1.31.2.2 skrll msgbufenabled = 0;
1244 1.31.2.2 skrll return (ENXIO);
1245 1.31.2.2 skrll }
1246 1.31.2.2 skrll
1247 1.31.2.2 skrll switch (rnode->sysctl_num) {
1248 1.31.2.2 skrll case KERN_MSGBUFSIZE: {
1249 1.31.2.2 skrll struct sysctlnode node = *rnode;
1250 1.31.2.2 skrll int msg_bufs = (int)msgbufp->msg_bufs;
1251 1.31.2.2 skrll node.sysctl_data = &msg_bufs;
1252 1.31.2.2 skrll return (sysctl_lookup(SYSCTLFN_CALL(&node)));
1253 1.31.2.2 skrll }
1254 1.31.2.2 skrll case KERN_MSGBUF:
1255 1.31.2.2 skrll break;
1256 1.31.2.2 skrll default:
1257 1.31.2.2 skrll return (EOPNOTSUPP);
1258 1.31.2.2 skrll }
1259 1.31.2.2 skrll
1260 1.31.2.2 skrll if (newp != NULL)
1261 1.31.2.2 skrll return (EPERM);
1262 1.31.2.2 skrll
1263 1.31.2.2 skrll if (oldp == NULL) {
1264 1.31.2.2 skrll /* always return full buffer size */
1265 1.31.2.2 skrll *oldlenp = msgbufp->msg_bufs;
1266 1.31.2.2 skrll return (0);
1267 1.31.2.2 skrll }
1268 1.31.2.2 skrll
1269 1.31.2.2 skrll error = 0;
1270 1.31.2.2 skrll maxlen = MIN(msgbufp->msg_bufs, *oldlenp);
1271 1.31.2.2 skrll
1272 1.31.2.2 skrll /*
1273 1.31.2.2 skrll * First, copy from the write pointer to the end of
1274 1.31.2.2 skrll * message buffer.
1275 1.31.2.2 skrll */
1276 1.31.2.2 skrll beg = msgbufp->msg_bufx;
1277 1.31.2.2 skrll end = msgbufp->msg_bufs;
1278 1.31.2.2 skrll while (maxlen > 0) {
1279 1.31.2.2 skrll len = MIN(end - beg, maxlen);
1280 1.31.2.2 skrll if (len == 0)
1281 1.31.2.2 skrll break;
1282 1.31.2.2 skrll error = copyout(&msgbufp->msg_bufc[beg], where, len);
1283 1.31.2.2 skrll if (error)
1284 1.31.2.2 skrll break;
1285 1.31.2.2 skrll where += len;
1286 1.31.2.2 skrll maxlen -= len;
1287 1.31.2.2 skrll
1288 1.31.2.2 skrll /*
1289 1.31.2.2 skrll * ... then, copy from the beginning of message buffer to
1290 1.31.2.2 skrll * the write pointer.
1291 1.31.2.2 skrll */
1292 1.31.2.2 skrll beg = 0;
1293 1.31.2.2 skrll end = msgbufp->msg_bufx;
1294 1.31.2.2 skrll }
1295 1.31.2.2 skrll
1296 1.31.2.2 skrll return (error);
1297 1.31.2.2 skrll }
1298 1.31.2.2 skrll
1299 1.31.2.2 skrll /*
1300 1.31.2.2 skrll * sysctl helper routine for kern.defcorename. in the case of a new
1301 1.31.2.2 skrll * string being assigned, check that it's not a zero-length string.
1302 1.31.2.2 skrll * (XXX the check in -current doesn't work, but do we really care?)
1303 1.31.2.2 skrll */
1304 1.31.2.2 skrll static int
1305 1.31.2.2 skrll sysctl_kern_defcorename(SYSCTLFN_ARGS)
1306 1.31.2.2 skrll {
1307 1.31.2.2 skrll int error;
1308 1.31.2.2 skrll char newcorename[MAXPATHLEN];
1309 1.31.2.2 skrll struct sysctlnode node;
1310 1.31.2.2 skrll
1311 1.31.2.2 skrll node = *rnode;
1312 1.31.2.2 skrll node.sysctl_data = &newcorename[0];
1313 1.31.2.2 skrll memcpy(node.sysctl_data, rnode->sysctl_data, MAXPATHLEN);
1314 1.31.2.2 skrll error = sysctl_lookup(SYSCTLFN_CALL(&node));
1315 1.31.2.2 skrll if (error || newp == NULL)
1316 1.31.2.2 skrll return (error);
1317 1.31.2.2 skrll
1318 1.31.2.2 skrll /*
1319 1.31.2.2 skrll * when sysctl_lookup() deals with a string, it's guaranteed
1320 1.31.2.2 skrll * to come back nul terminated. so there. :)
1321 1.31.2.2 skrll */
1322 1.31.2.2 skrll if (strlen(newcorename) == 0)
1323 1.31.2.2 skrll return (EINVAL);
1324 1.31.2.2 skrll
1325 1.31.2.2 skrll memcpy(rnode->sysctl_data, node.sysctl_data, MAXPATHLEN);
1326 1.31.2.2 skrll
1327 1.31.2.2 skrll return (0);
1328 1.31.2.2 skrll }
1329 1.31.2.2 skrll
1330 1.31.2.2 skrll /*
1331 1.31.2.2 skrll * sysctl helper routine for kern.cp_time node. adds up cpu time
1332 1.31.2.2 skrll * across all cpus.
1333 1.31.2.2 skrll */
1334 1.31.2.2 skrll static int
1335 1.31.2.2 skrll sysctl_kern_cptime(SYSCTLFN_ARGS)
1336 1.31.2.2 skrll {
1337 1.31.2.2 skrll struct sysctlnode node = *rnode;
1338 1.31.2.2 skrll
1339 1.31.2.2 skrll #ifndef MULTIPROCESSOR
1340 1.31.2.2 skrll
1341 1.31.2.2 skrll if (namelen == 1) {
1342 1.31.2.2 skrll if (name[0] != 0)
1343 1.31.2.2 skrll return (ENOENT);
1344 1.31.2.2 skrll /*
1345 1.31.2.2 skrll * you're allowed to ask for the zero'th processor
1346 1.31.2.2 skrll */
1347 1.31.2.2 skrll name++;
1348 1.31.2.2 skrll namelen--;
1349 1.31.2.2 skrll }
1350 1.31.2.2 skrll node.sysctl_data = curcpu()->ci_schedstate.spc_cp_time;
1351 1.31.2.2 skrll node.sysctl_size = sizeof(curcpu()->ci_schedstate.spc_cp_time);
1352 1.31.2.2 skrll return (sysctl_lookup(SYSCTLFN_CALL(&node)));
1353 1.31.2.2 skrll
1354 1.31.2.2 skrll #else /* MULTIPROCESSOR */
1355 1.31.2.2 skrll
1356 1.31.2.2 skrll u_int64_t *cp_time = NULL;
1357 1.31.2.2 skrll int error, n = sysctl_ncpus(), i;
1358 1.31.2.2 skrll struct cpu_info *ci;
1359 1.31.2.2 skrll CPU_INFO_ITERATOR cii;
1360 1.31.2.2 skrll
1361 1.31.2.2 skrll /*
1362 1.31.2.2 skrll * if you specifically pass a buffer that is the size of the
1363 1.31.2.2 skrll * sum, or if you are probing for the size, you get the "sum"
1364 1.31.2.2 skrll * of cp_time (and the size thereof) across all processors.
1365 1.31.2.2 skrll *
1366 1.31.2.2 skrll * alternately, you can pass an additional mib number and get
1367 1.31.2.2 skrll * cp_time for that particular processor.
1368 1.31.2.2 skrll */
1369 1.31.2.2 skrll switch (namelen) {
1370 1.31.2.2 skrll case 0:
1371 1.31.2.2 skrll if (*oldlenp == sizeof(u_int64_t) * CPUSTATES || oldp == NULL) {
1372 1.31.2.2 skrll node.sysctl_size = sizeof(u_int64_t) * CPUSTATES;
1373 1.31.2.2 skrll n = -1; /* SUM */
1374 1.31.2.2 skrll }
1375 1.31.2.2 skrll else {
1376 1.31.2.2 skrll node.sysctl_size = n * sizeof(u_int64_t) * CPUSTATES;
1377 1.31.2.2 skrll n = -2; /* ALL */
1378 1.31.2.2 skrll }
1379 1.31.2.2 skrll break;
1380 1.31.2.2 skrll case 1:
1381 1.31.2.2 skrll if (name[0] < 0 || name[0] >= n)
1382 1.31.2.2 skrll return (ENOENT); /* ENOSUCHPROCESSOR */
1383 1.31.2.2 skrll node.sysctl_size = sizeof(u_int64_t) * CPUSTATES;
1384 1.31.2.2 skrll n = name[0];
1385 1.31.2.2 skrll /*
1386 1.31.2.2 skrll * adjust these so that sysctl_lookup() will be happy
1387 1.31.2.2 skrll */
1388 1.31.2.2 skrll name++;
1389 1.31.2.2 skrll namelen--;
1390 1.31.2.2 skrll break;
1391 1.31.2.2 skrll default:
1392 1.31.2.2 skrll return (EINVAL);
1393 1.31.2.2 skrll }
1394 1.31.2.2 skrll
1395 1.31.2.2 skrll cp_time = malloc(node.sysctl_size, M_TEMP, M_WAITOK|M_CANFAIL);
1396 1.31.2.2 skrll if (cp_time == NULL)
1397 1.31.2.2 skrll return (ENOMEM);
1398 1.31.2.2 skrll node.sysctl_data = cp_time;
1399 1.31.2.2 skrll memset(cp_time, 0, node.sysctl_size);
1400 1.31.2.2 skrll
1401 1.31.2.2 skrll for (CPU_INFO_FOREACH(cii, ci)) {
1402 1.31.2.2 skrll if (n <= 0)
1403 1.31.2.2 skrll for (i = 0; i < CPUSTATES; i++)
1404 1.31.2.2 skrll cp_time[i] += ci->ci_schedstate.spc_cp_time[i];
1405 1.31.2.2 skrll /*
1406 1.31.2.2 skrll * if a specific processor was requested and we just
1407 1.31.2.2 skrll * did it, we're done here
1408 1.31.2.2 skrll */
1409 1.31.2.2 skrll if (n == 0)
1410 1.31.2.2 skrll break;
1411 1.31.2.2 skrll /*
1412 1.31.2.2 skrll * if doing "all", skip to next cp_time set for next processor
1413 1.31.2.2 skrll */
1414 1.31.2.2 skrll if (n == -2)
1415 1.31.2.2 skrll cp_time += CPUSTATES;
1416 1.31.2.2 skrll /*
1417 1.31.2.2 skrll * if we're doing a specific processor, we're one
1418 1.31.2.2 skrll * processor closer
1419 1.31.2.2 skrll */
1420 1.31.2.2 skrll if (n > 0)
1421 1.31.2.2 skrll n--;
1422 1.31.2.2 skrll }
1423 1.31.2.2 skrll
1424 1.31.2.2 skrll error = sysctl_lookup(SYSCTLFN_CALL(&node));
1425 1.31.2.2 skrll free(node.sysctl_data, M_TEMP);
1426 1.31.2.2 skrll return (error);
1427 1.31.2.2 skrll
1428 1.31.2.2 skrll #endif /* MULTIPROCESSOR */
1429 1.31.2.2 skrll }
1430 1.31.2.2 skrll
1431 1.31.2.2 skrll #if defined(SYSVMSG) || defined(SYSVSEM) || defined(SYSVSHM)
1432 1.31.2.2 skrll /*
1433 1.31.2.2 skrll * sysctl helper routine for kern.sysvipc_info subtree.
1434 1.31.2.2 skrll */
1435 1.31.2.2 skrll
1436 1.31.2.2 skrll #define FILL_PERM(src, dst) do { \
1437 1.31.2.2 skrll (dst)._key = (src)._key; \
1438 1.31.2.2 skrll (dst).uid = (src).uid; \
1439 1.31.2.2 skrll (dst).gid = (src).gid; \
1440 1.31.2.2 skrll (dst).cuid = (src).cuid; \
1441 1.31.2.2 skrll (dst).cgid = (src).cgid; \
1442 1.31.2.2 skrll (dst).mode = (src).mode; \
1443 1.31.2.2 skrll (dst)._seq = (src)._seq; \
1444 1.31.2.2 skrll } while (/*CONSTCOND*/ 0);
1445 1.31.2.2 skrll #define FILL_MSG(src, dst) do { \
1446 1.31.2.2 skrll FILL_PERM((src).msg_perm, (dst).msg_perm); \
1447 1.31.2.2 skrll (dst).msg_qnum = (src).msg_qnum; \
1448 1.31.2.2 skrll (dst).msg_qbytes = (src).msg_qbytes; \
1449 1.31.2.2 skrll (dst)._msg_cbytes = (src)._msg_cbytes; \
1450 1.31.2.2 skrll (dst).msg_lspid = (src).msg_lspid; \
1451 1.31.2.2 skrll (dst).msg_lrpid = (src).msg_lrpid; \
1452 1.31.2.2 skrll (dst).msg_stime = (src).msg_stime; \
1453 1.31.2.2 skrll (dst).msg_rtime = (src).msg_rtime; \
1454 1.31.2.2 skrll (dst).msg_ctime = (src).msg_ctime; \
1455 1.31.2.2 skrll } while (/*CONSTCOND*/ 0)
1456 1.31.2.2 skrll #define FILL_SEM(src, dst) do { \
1457 1.31.2.2 skrll FILL_PERM((src).sem_perm, (dst).sem_perm); \
1458 1.31.2.2 skrll (dst).sem_nsems = (src).sem_nsems; \
1459 1.31.2.2 skrll (dst).sem_otime = (src).sem_otime; \
1460 1.31.2.2 skrll (dst).sem_ctime = (src).sem_ctime; \
1461 1.31.2.2 skrll } while (/*CONSTCOND*/ 0)
1462 1.31.2.2 skrll #define FILL_SHM(src, dst) do { \
1463 1.31.2.2 skrll FILL_PERM((src).shm_perm, (dst).shm_perm); \
1464 1.31.2.2 skrll (dst).shm_segsz = (src).shm_segsz; \
1465 1.31.2.2 skrll (dst).shm_lpid = (src).shm_lpid; \
1466 1.31.2.2 skrll (dst).shm_cpid = (src).shm_cpid; \
1467 1.31.2.2 skrll (dst).shm_atime = (src).shm_atime; \
1468 1.31.2.2 skrll (dst).shm_dtime = (src).shm_dtime; \
1469 1.31.2.2 skrll (dst).shm_ctime = (src).shm_ctime; \
1470 1.31.2.2 skrll (dst).shm_nattch = (src).shm_nattch; \
1471 1.31.2.2 skrll } while (/*CONSTCOND*/ 0)
1472 1.31.2.2 skrll
1473 1.31.2.2 skrll static int
1474 1.31.2.2 skrll sysctl_kern_sysvipc(SYSCTLFN_ARGS)
1475 1.31.2.2 skrll {
1476 1.31.2.2 skrll void *where = oldp;
1477 1.31.2.2 skrll size_t *sizep = oldlenp;
1478 1.31.2.2 skrll #ifdef SYSVMSG
1479 1.31.2.2 skrll struct msg_sysctl_info *msgsi = NULL;
1480 1.31.2.2 skrll #endif
1481 1.31.2.2 skrll #ifdef SYSVSEM
1482 1.31.2.2 skrll struct sem_sysctl_info *semsi = NULL;
1483 1.31.2.2 skrll #endif
1484 1.31.2.2 skrll #ifdef SYSVSHM
1485 1.31.2.2 skrll struct shm_sysctl_info *shmsi = NULL;
1486 1.31.2.2 skrll #endif
1487 1.31.2.2 skrll size_t infosize, dssize, tsize, buflen;
1488 1.31.2.2 skrll void *buf = NULL;
1489 1.31.2.2 skrll char *start;
1490 1.31.2.2 skrll int32_t nds;
1491 1.31.2.2 skrll int i, error, ret;
1492 1.31.2.2 skrll
1493 1.31.2.2 skrll if (namelen != 1)
1494 1.31.2.2 skrll return (EINVAL);
1495 1.31.2.2 skrll
1496 1.31.2.2 skrll start = where;
1497 1.31.2.2 skrll buflen = *sizep;
1498 1.31.2.2 skrll
1499 1.31.2.2 skrll switch (*name) {
1500 1.31.2.2 skrll case KERN_SYSVIPC_MSG_INFO:
1501 1.31.2.2 skrll #ifdef SYSVMSG
1502 1.31.2.2 skrll infosize = sizeof(msgsi->msginfo);
1503 1.31.2.2 skrll nds = msginfo.msgmni;
1504 1.31.2.2 skrll dssize = sizeof(msgsi->msgids[0]);
1505 1.31.2.2 skrll break;
1506 1.31.2.2 skrll #else
1507 1.31.2.2 skrll return (EINVAL);
1508 1.31.2.2 skrll #endif
1509 1.31.2.2 skrll case KERN_SYSVIPC_SEM_INFO:
1510 1.31.2.2 skrll #ifdef SYSVSEM
1511 1.31.2.2 skrll infosize = sizeof(semsi->seminfo);
1512 1.31.2.2 skrll nds = seminfo.semmni;
1513 1.31.2.2 skrll dssize = sizeof(semsi->semids[0]);
1514 1.31.2.2 skrll break;
1515 1.31.2.2 skrll #else
1516 1.31.2.2 skrll return (EINVAL);
1517 1.31.2.2 skrll #endif
1518 1.31.2.2 skrll case KERN_SYSVIPC_SHM_INFO:
1519 1.31.2.2 skrll #ifdef SYSVSHM
1520 1.31.2.2 skrll infosize = sizeof(shmsi->shminfo);
1521 1.31.2.2 skrll nds = shminfo.shmmni;
1522 1.31.2.2 skrll dssize = sizeof(shmsi->shmids[0]);
1523 1.31.2.2 skrll break;
1524 1.31.2.2 skrll #else
1525 1.31.2.2 skrll return (EINVAL);
1526 1.31.2.2 skrll #endif
1527 1.31.2.2 skrll default:
1528 1.31.2.2 skrll return (EINVAL);
1529 1.31.2.2 skrll }
1530 1.31.2.2 skrll /*
1531 1.31.2.2 skrll * Round infosize to 64 bit boundary if requesting more than just
1532 1.31.2.2 skrll * the info structure or getting the total data size.
1533 1.31.2.2 skrll */
1534 1.31.2.2 skrll if (where == NULL || *sizep > infosize)
1535 1.31.2.2 skrll infosize = ((infosize + 7) / 8) * 8;
1536 1.31.2.2 skrll tsize = infosize + nds * dssize;
1537 1.31.2.2 skrll
1538 1.31.2.2 skrll /* Return just the total size required. */
1539 1.31.2.2 skrll if (where == NULL) {
1540 1.31.2.2 skrll *sizep = tsize;
1541 1.31.2.2 skrll return (0);
1542 1.31.2.2 skrll }
1543 1.31.2.2 skrll
1544 1.31.2.2 skrll /* Not enough room for even the info struct. */
1545 1.31.2.2 skrll if (buflen < infosize) {
1546 1.31.2.2 skrll *sizep = 0;
1547 1.31.2.2 skrll return (ENOMEM);
1548 1.31.2.2 skrll }
1549 1.31.2.2 skrll buf = malloc(min(tsize, buflen), M_TEMP, M_WAITOK);
1550 1.31.2.2 skrll memset(buf, 0, min(tsize, buflen));
1551 1.31.2.2 skrll
1552 1.31.2.2 skrll switch (*name) {
1553 1.31.2.2 skrll #ifdef SYSVMSG
1554 1.31.2.2 skrll case KERN_SYSVIPC_MSG_INFO:
1555 1.31.2.2 skrll msgsi = (struct msg_sysctl_info *)buf;
1556 1.31.2.2 skrll msgsi->msginfo = msginfo;
1557 1.31.2.2 skrll break;
1558 1.31.2.2 skrll #endif
1559 1.31.2.2 skrll #ifdef SYSVSEM
1560 1.31.2.2 skrll case KERN_SYSVIPC_SEM_INFO:
1561 1.31.2.2 skrll semsi = (struct sem_sysctl_info *)buf;
1562 1.31.2.2 skrll semsi->seminfo = seminfo;
1563 1.31.2.2 skrll break;
1564 1.31.2.2 skrll #endif
1565 1.31.2.2 skrll #ifdef SYSVSHM
1566 1.31.2.2 skrll case KERN_SYSVIPC_SHM_INFO:
1567 1.31.2.2 skrll shmsi = (struct shm_sysctl_info *)buf;
1568 1.31.2.2 skrll shmsi->shminfo = shminfo;
1569 1.31.2.2 skrll break;
1570 1.31.2.2 skrll #endif
1571 1.31.2.2 skrll }
1572 1.31.2.2 skrll buflen -= infosize;
1573 1.31.2.2 skrll
1574 1.31.2.2 skrll ret = 0;
1575 1.31.2.2 skrll if (buflen > 0) {
1576 1.31.2.2 skrll /* Fill in the IPC data structures. */
1577 1.31.2.2 skrll for (i = 0; i < nds; i++) {
1578 1.31.2.2 skrll if (buflen < dssize) {
1579 1.31.2.2 skrll ret = ENOMEM;
1580 1.31.2.2 skrll break;
1581 1.31.2.2 skrll }
1582 1.31.2.2 skrll switch (*name) {
1583 1.31.2.2 skrll #ifdef SYSVMSG
1584 1.31.2.2 skrll case KERN_SYSVIPC_MSG_INFO:
1585 1.31.2.2 skrll FILL_MSG(msqids[i], msgsi->msgids[i]);
1586 1.31.2.2 skrll break;
1587 1.31.2.2 skrll #endif
1588 1.31.2.2 skrll #ifdef SYSVSEM
1589 1.31.2.2 skrll case KERN_SYSVIPC_SEM_INFO:
1590 1.31.2.2 skrll FILL_SEM(sema[i], semsi->semids[i]);
1591 1.31.2.2 skrll break;
1592 1.31.2.2 skrll #endif
1593 1.31.2.2 skrll #ifdef SYSVSHM
1594 1.31.2.2 skrll case KERN_SYSVIPC_SHM_INFO:
1595 1.31.2.2 skrll FILL_SHM(shmsegs[i], shmsi->shmids[i]);
1596 1.31.2.2 skrll break;
1597 1.31.2.2 skrll #endif
1598 1.31.2.2 skrll }
1599 1.31.2.2 skrll buflen -= dssize;
1600 1.31.2.2 skrll }
1601 1.31.2.2 skrll }
1602 1.31.2.2 skrll *sizep -= buflen;
1603 1.31.2.2 skrll error = copyout(buf, start, *sizep);
1604 1.31.2.2 skrll /* If copyout succeeded, use return code set earlier. */
1605 1.31.2.2 skrll if (error == 0)
1606 1.31.2.2 skrll error = ret;
1607 1.31.2.2 skrll if (buf)
1608 1.31.2.2 skrll free(buf, M_TEMP);
1609 1.31.2.2 skrll return (error);
1610 1.31.2.2 skrll }
1611 1.31.2.2 skrll
1612 1.31.2.2 skrll #undef FILL_PERM
1613 1.31.2.2 skrll #undef FILL_MSG
1614 1.31.2.2 skrll #undef FILL_SEM
1615 1.31.2.2 skrll #undef FILL_SHM
1616 1.31.2.2 skrll
1617 1.31.2.2 skrll #endif /* defined(SYSVMSG) || defined(SYSVSEM) || defined(SYSVSHM) */
1618 1.31.2.2 skrll
1619 1.31.2.2 skrll #if NPTY > 0
1620 1.31.2.2 skrll /*
1621 1.31.2.2 skrll * sysctl helper routine for kern.maxptys. ensures that any new value
1622 1.31.2.2 skrll * is acceptable to the pty subsystem.
1623 1.31.2.2 skrll */
1624 1.31.2.2 skrll static int
1625 1.31.2.2 skrll sysctl_kern_maxptys(SYSCTLFN_ARGS)
1626 1.31.2.2 skrll {
1627 1.31.2.2 skrll int pty_maxptys(int, int); /* defined in kern/tty_pty.c */
1628 1.31.2.2 skrll int error, max;
1629 1.31.2.2 skrll struct sysctlnode node;
1630 1.31.2.2 skrll
1631 1.31.2.2 skrll /* get current value of maxptys */
1632 1.31.2.2 skrll max = pty_maxptys(0, 0);
1633 1.31.2.2 skrll
1634 1.31.2.2 skrll node = *rnode;
1635 1.31.2.2 skrll node.sysctl_data = &max;
1636 1.31.2.2 skrll error = sysctl_lookup(SYSCTLFN_CALL(&node));
1637 1.31.2.2 skrll if (error || newp == NULL)
1638 1.31.2.2 skrll return (error);
1639 1.31.2.6 skrll
1640 1.31.2.2 skrll if (max != pty_maxptys(max, 1))
1641 1.31.2.2 skrll return (EINVAL);
1642 1.31.2.2 skrll
1643 1.31.2.2 skrll return (0);
1644 1.31.2.2 skrll }
1645 1.31.2.2 skrll #endif /* NPTY > 0 */
1646 1.31.2.2 skrll
1647 1.31.2.2 skrll /*
1648 1.31.2.2 skrll * sysctl helper routine for kern.sbmax. basically just ensures that
1649 1.31.2.2 skrll * any new value is not too small.
1650 1.31.2.2 skrll */
1651 1.31.2.2 skrll static int
1652 1.31.2.2 skrll sysctl_kern_sbmax(SYSCTLFN_ARGS)
1653 1.31.2.2 skrll {
1654 1.31.2.2 skrll int error, new_sbmax;
1655 1.31.2.2 skrll struct sysctlnode node;
1656 1.31.2.2 skrll
1657 1.31.2.2 skrll new_sbmax = sb_max;
1658 1.31.2.2 skrll node = *rnode;
1659 1.31.2.2 skrll node.sysctl_data = &new_sbmax;
1660 1.31.2.2 skrll error = sysctl_lookup(SYSCTLFN_CALL(&node));
1661 1.31.2.2 skrll if (error || newp == NULL)
1662 1.31.2.2 skrll return (error);
1663 1.31.2.2 skrll
1664 1.31.2.2 skrll error = sb_max_set(new_sbmax);
1665 1.31.2.2 skrll
1666 1.31.2.2 skrll return (error);
1667 1.31.2.2 skrll }
1668 1.31.2.2 skrll
1669 1.31.2.2 skrll /*
1670 1.31.2.2 skrll * sysctl helper routine for kern.urandom node. picks a random number
1671 1.31.2.2 skrll * for you.
1672 1.31.2.2 skrll */
1673 1.31.2.2 skrll static int
1674 1.31.2.2 skrll sysctl_kern_urnd(SYSCTLFN_ARGS)
1675 1.31.2.2 skrll {
1676 1.31.2.2 skrll #if NRND > 0
1677 1.31.2.2 skrll int v;
1678 1.31.2.2 skrll
1679 1.31.2.2 skrll if (rnd_extract_data(&v, sizeof(v), RND_EXTRACT_ANY) == sizeof(v)) {
1680 1.31.2.2 skrll struct sysctlnode node = *rnode;
1681 1.31.2.2 skrll node.sysctl_data = &v;
1682 1.31.2.2 skrll return (sysctl_lookup(SYSCTLFN_CALL(&node)));
1683 1.31.2.2 skrll }
1684 1.31.2.2 skrll else
1685 1.31.2.2 skrll return (EIO); /*XXX*/
1686 1.31.2.2 skrll #else
1687 1.31.2.2 skrll return (EOPNOTSUPP);
1688 1.31.2.2 skrll #endif
1689 1.31.2.2 skrll }
1690 1.31.2.2 skrll
1691 1.31.2.2 skrll /*
1692 1.31.2.2 skrll * sysctl helper routine to do kern.lwp.* work.
1693 1.31.2.2 skrll */
1694 1.31.2.2 skrll static int
1695 1.31.2.2 skrll sysctl_kern_lwp(SYSCTLFN_ARGS)
1696 1.31.2.2 skrll {
1697 1.31.2.2 skrll struct kinfo_lwp klwp;
1698 1.31.2.2 skrll struct proc *p;
1699 1.31.2.2 skrll struct lwp *l2;
1700 1.31.2.2 skrll char *where, *dp;
1701 1.31.2.2 skrll int pid, elem_size, elem_count;
1702 1.31.2.2 skrll int buflen, needed, error;
1703 1.31.2.2 skrll
1704 1.31.2.2 skrll if (namelen == 1 && name[0] == CTL_QUERY)
1705 1.31.2.2 skrll return (sysctl_query(SYSCTLFN_CALL(rnode)));
1706 1.31.2.2 skrll
1707 1.31.2.2 skrll dp = where = oldp;
1708 1.31.2.2 skrll buflen = where != NULL ? *oldlenp : 0;
1709 1.31.2.2 skrll error = needed = 0;
1710 1.31.2.2 skrll
1711 1.31.2.2 skrll if (newp != NULL || namelen != 3)
1712 1.31.2.2 skrll return (EINVAL);
1713 1.31.2.2 skrll pid = name[0];
1714 1.31.2.2 skrll elem_size = name[1];
1715 1.31.2.2 skrll elem_count = name[2];
1716 1.31.2.2 skrll
1717 1.31.2.2 skrll p = pfind(pid);
1718 1.31.2.2 skrll if (p == NULL)
1719 1.31.2.2 skrll return (ESRCH);
1720 1.31.2.2 skrll LIST_FOREACH(l2, &p->p_lwps, l_sibling) {
1721 1.31.2.2 skrll if (buflen >= elem_size && elem_count > 0) {
1722 1.31.2.2 skrll fill_lwp(l2, &klwp);
1723 1.31.2.2 skrll /*
1724 1.31.2.2 skrll * Copy out elem_size, but not larger than
1725 1.31.2.2 skrll * the size of a struct kinfo_proc2.
1726 1.31.2.2 skrll */
1727 1.31.2.2 skrll error = copyout(&klwp, dp,
1728 1.31.2.2 skrll min(sizeof(klwp), elem_size));
1729 1.31.2.2 skrll if (error)
1730 1.31.2.2 skrll goto cleanup;
1731 1.31.2.2 skrll dp += elem_size;
1732 1.31.2.2 skrll buflen -= elem_size;
1733 1.31.2.2 skrll elem_count--;
1734 1.31.2.2 skrll }
1735 1.31.2.2 skrll needed += elem_size;
1736 1.31.2.2 skrll }
1737 1.31.2.2 skrll
1738 1.31.2.2 skrll if (where != NULL) {
1739 1.31.2.2 skrll *oldlenp = dp - where;
1740 1.31.2.2 skrll if (needed > *oldlenp)
1741 1.31.2.2 skrll return (ENOMEM);
1742 1.31.2.2 skrll } else {
1743 1.31.2.2 skrll needed += KERN_LWPSLOP;
1744 1.31.2.2 skrll *oldlenp = needed;
1745 1.31.2.2 skrll }
1746 1.31.2.2 skrll return (0);
1747 1.31.2.2 skrll cleanup:
1748 1.31.2.2 skrll return (error);
1749 1.31.2.2 skrll }
1750 1.31.2.2 skrll
1751 1.31.2.2 skrll /*
1752 1.31.2.2 skrll * sysctl helper routine for kern.forkfsleep node. ensures that the
1753 1.31.2.2 skrll * given value is not too large or two small, and is at least one
1754 1.31.2.2 skrll * timer tick if not zero.
1755 1.31.2.2 skrll */
1756 1.31.2.2 skrll static int
1757 1.31.2.2 skrll sysctl_kern_forkfsleep(SYSCTLFN_ARGS)
1758 1.31.2.2 skrll {
1759 1.31.2.2 skrll /* userland sees value in ms, internally is in ticks */
1760 1.31.2.2 skrll extern int forkfsleep; /* defined in kern/kern_fork.c */
1761 1.31.2.2 skrll int error, timo, lsleep;
1762 1.31.2.2 skrll struct sysctlnode node;
1763 1.31.2.2 skrll
1764 1.31.2.2 skrll lsleep = forkfsleep * 1000 / hz;
1765 1.31.2.2 skrll node = *rnode;
1766 1.31.2.2 skrll node.sysctl_data = &lsleep;
1767 1.31.2.2 skrll error = sysctl_lookup(SYSCTLFN_CALL(&node));
1768 1.31.2.2 skrll if (error || newp == NULL)
1769 1.31.2.2 skrll return (error);
1770 1.31.2.2 skrll
1771 1.31.2.2 skrll /* refuse negative values, and overly 'long time' */
1772 1.31.2.2 skrll if (lsleep < 0 || lsleep > MAXSLP * 1000)
1773 1.31.2.2 skrll return (EINVAL);
1774 1.31.2.2 skrll
1775 1.31.2.2 skrll timo = mstohz(lsleep);
1776 1.31.2.2 skrll
1777 1.31.2.2 skrll /* if the interval is >0 ms && <1 tick, use 1 tick */
1778 1.31.2.2 skrll if (lsleep != 0 && timo == 0)
1779 1.31.2.2 skrll forkfsleep = 1;
1780 1.31.2.2 skrll else
1781 1.31.2.2 skrll forkfsleep = timo;
1782 1.31.2.2 skrll
1783 1.31.2.2 skrll return (0);
1784 1.31.2.2 skrll }
1785 1.31.2.2 skrll
1786 1.31.2.2 skrll /*
1787 1.31.2.2 skrll * sysctl helper routine for kern.root_partition
1788 1.31.2.2 skrll */
1789 1.31.2.2 skrll static int
1790 1.31.2.2 skrll sysctl_kern_root_partition(SYSCTLFN_ARGS)
1791 1.31.2.2 skrll {
1792 1.31.2.2 skrll int rootpart = DISKPART(rootdev);
1793 1.31.2.2 skrll struct sysctlnode node = *rnode;
1794 1.31.2.2 skrll
1795 1.31.2.2 skrll node.sysctl_data = &rootpart;
1796 1.31.2.2 skrll return (sysctl_lookup(SYSCTLFN_CALL(&node)));
1797 1.31.2.2 skrll }
1798 1.31.2.2 skrll
1799 1.31.2.2 skrll /*
1800 1.31.2.2 skrll * sysctl helper function for kern.drivers
1801 1.31.2.2 skrll */
1802 1.31.2.2 skrll static int
1803 1.31.2.2 skrll sysctl_kern_drivers(SYSCTLFN_ARGS)
1804 1.31.2.2 skrll {
1805 1.31.2.2 skrll int error;
1806 1.31.2.2 skrll size_t buflen;
1807 1.31.2.2 skrll struct kinfo_drivers kd;
1808 1.31.2.2 skrll char *start, *where;
1809 1.31.2.2 skrll const char *dname;
1810 1.31.2.2 skrll int i;
1811 1.31.2.2 skrll extern struct devsw_conv *devsw_conv;
1812 1.31.2.2 skrll extern int max_devsw_convs;
1813 1.31.2.2 skrll
1814 1.31.2.2 skrll if (newp != NULL || namelen != 0)
1815 1.31.2.2 skrll return (EINVAL);
1816 1.31.2.2 skrll
1817 1.31.2.2 skrll start = where = oldp;
1818 1.31.2.2 skrll buflen = *oldlenp;
1819 1.31.2.2 skrll if (where == NULL) {
1820 1.31.2.2 skrll *oldlenp = max_devsw_convs * sizeof kd;
1821 1.31.2.2 skrll return 0;
1822 1.31.2.2 skrll }
1823 1.31.2.2 skrll
1824 1.31.2.2 skrll /*
1825 1.31.2.2 skrll * An array of kinfo_drivers structures
1826 1.31.2.2 skrll */
1827 1.31.2.2 skrll error = 0;
1828 1.31.2.2 skrll for (i = 0; i < max_devsw_convs; i++) {
1829 1.31.2.2 skrll dname = devsw_conv[i].d_name;
1830 1.31.2.2 skrll if (dname == NULL)
1831 1.31.2.2 skrll continue;
1832 1.31.2.2 skrll if (buflen < sizeof kd) {
1833 1.31.2.2 skrll error = ENOMEM;
1834 1.31.2.2 skrll break;
1835 1.31.2.2 skrll }
1836 1.31.2.2 skrll memset(&kd, 0, sizeof(kd));
1837 1.31.2.2 skrll kd.d_bmajor = devsw_conv[i].d_bmajor;
1838 1.31.2.2 skrll kd.d_cmajor = devsw_conv[i].d_cmajor;
1839 1.31.2.2 skrll strlcpy(kd.d_name, dname, sizeof kd.d_name);
1840 1.31.2.2 skrll error = copyout(&kd, where, sizeof kd);
1841 1.31.2.2 skrll if (error != 0)
1842 1.31.2.2 skrll break;
1843 1.31.2.2 skrll buflen -= sizeof kd;
1844 1.31.2.2 skrll where += sizeof kd;
1845 1.31.2.2 skrll }
1846 1.31.2.2 skrll *oldlenp = where - start;
1847 1.31.2.2 skrll return error;
1848 1.31.2.2 skrll }
1849 1.31.2.2 skrll
1850 1.31.2.2 skrll static int
1851 1.31.2.2 skrll sysctl_doeproc(SYSCTLFN_ARGS)
1852 1.31.2.2 skrll {
1853 1.31.2.2 skrll struct eproc eproc;
1854 1.31.2.2 skrll struct kinfo_proc2 kproc2;
1855 1.31.2.2 skrll struct kinfo_proc *dp;
1856 1.31.2.2 skrll struct proc *p;
1857 1.31.2.2 skrll const struct proclist_desc *pd;
1858 1.31.2.2 skrll char *where, *dp2;
1859 1.31.2.2 skrll int type, op, arg;
1860 1.31.2.2 skrll u_int elem_size, elem_count;
1861 1.31.2.2 skrll size_t buflen, needed;
1862 1.31.2.2 skrll int error;
1863 1.31.2.2 skrll
1864 1.31.2.2 skrll if (namelen == 1 && name[0] == CTL_QUERY)
1865 1.31.2.2 skrll return (sysctl_query(SYSCTLFN_CALL(rnode)));
1866 1.31.2.2 skrll
1867 1.31.2.2 skrll dp = oldp;
1868 1.31.2.2 skrll dp2 = where = oldp;
1869 1.31.2.2 skrll buflen = where != NULL ? *oldlenp : 0;
1870 1.31.2.2 skrll error = 0;
1871 1.31.2.2 skrll needed = 0;
1872 1.31.2.2 skrll type = rnode->sysctl_num;
1873 1.31.2.2 skrll
1874 1.31.2.2 skrll if (type == KERN_PROC) {
1875 1.31.2.2 skrll if (namelen != 2 && !(namelen == 1 && name[0] == KERN_PROC_ALL))
1876 1.31.2.2 skrll return (EINVAL);
1877 1.31.2.2 skrll op = name[0];
1878 1.31.2.2 skrll if (op != KERN_PROC_ALL)
1879 1.31.2.2 skrll arg = name[1];
1880 1.31.2.2 skrll else
1881 1.31.2.2 skrll arg = 0; /* Quell compiler warning */
1882 1.31.2.2 skrll elem_size = elem_count = 0; /* Ditto */
1883 1.31.2.2 skrll } else {
1884 1.31.2.2 skrll if (namelen != 4)
1885 1.31.2.2 skrll return (EINVAL);
1886 1.31.2.2 skrll op = name[0];
1887 1.31.2.2 skrll arg = name[1];
1888 1.31.2.2 skrll elem_size = name[2];
1889 1.31.2.2 skrll elem_count = name[3];
1890 1.31.2.2 skrll }
1891 1.31.2.2 skrll
1892 1.31.2.2 skrll proclist_lock_read();
1893 1.31.2.2 skrll
1894 1.31.2.2 skrll pd = proclists;
1895 1.31.2.2 skrll again:
1896 1.31.2.5 skrll PROCLIST_FOREACH(p, pd->pd_list) {
1897 1.31.2.2 skrll /*
1898 1.31.2.2 skrll * Skip embryonic processes.
1899 1.31.2.2 skrll */
1900 1.31.2.2 skrll if (p->p_stat == SIDL)
1901 1.31.2.2 skrll continue;
1902 1.31.2.2 skrll /*
1903 1.31.2.2 skrll * TODO - make more efficient (see notes below).
1904 1.31.2.2 skrll * do by session.
1905 1.31.2.2 skrll */
1906 1.31.2.2 skrll switch (op) {
1907 1.31.2.2 skrll
1908 1.31.2.2 skrll case KERN_PROC_PID:
1909 1.31.2.2 skrll /* could do this with just a lookup */
1910 1.31.2.2 skrll if (p->p_pid != (pid_t)arg)
1911 1.31.2.2 skrll continue;
1912 1.31.2.2 skrll break;
1913 1.31.2.2 skrll
1914 1.31.2.2 skrll case KERN_PROC_PGRP:
1915 1.31.2.2 skrll /* could do this by traversing pgrp */
1916 1.31.2.2 skrll if (p->p_pgrp->pg_id != (pid_t)arg)
1917 1.31.2.2 skrll continue;
1918 1.31.2.2 skrll break;
1919 1.31.2.2 skrll
1920 1.31.2.2 skrll case KERN_PROC_SESSION:
1921 1.31.2.2 skrll if (p->p_session->s_sid != (pid_t)arg)
1922 1.31.2.2 skrll continue;
1923 1.31.2.2 skrll break;
1924 1.31.2.2 skrll
1925 1.31.2.2 skrll case KERN_PROC_TTY:
1926 1.31.2.2 skrll if (arg == (int) KERN_PROC_TTY_REVOKE) {
1927 1.31.2.2 skrll if ((p->p_flag & P_CONTROLT) == 0 ||
1928 1.31.2.2 skrll p->p_session->s_ttyp == NULL ||
1929 1.31.2.2 skrll p->p_session->s_ttyvp != NULL)
1930 1.31.2.2 skrll continue;
1931 1.31.2.2 skrll } else if ((p->p_flag & P_CONTROLT) == 0 ||
1932 1.31.2.2 skrll p->p_session->s_ttyp == NULL) {
1933 1.31.2.2 skrll if ((dev_t)arg != KERN_PROC_TTY_NODEV)
1934 1.31.2.2 skrll continue;
1935 1.31.2.2 skrll } else if (p->p_session->s_ttyp->t_dev != (dev_t)arg)
1936 1.31.2.2 skrll continue;
1937 1.31.2.2 skrll break;
1938 1.31.2.2 skrll
1939 1.31.2.2 skrll case KERN_PROC_UID:
1940 1.31.2.2 skrll if (p->p_ucred->cr_uid != (uid_t)arg)
1941 1.31.2.2 skrll continue;
1942 1.31.2.2 skrll break;
1943 1.31.2.2 skrll
1944 1.31.2.2 skrll case KERN_PROC_RUID:
1945 1.31.2.2 skrll if (p->p_cred->p_ruid != (uid_t)arg)
1946 1.31.2.2 skrll continue;
1947 1.31.2.2 skrll break;
1948 1.31.2.2 skrll
1949 1.31.2.2 skrll case KERN_PROC_GID:
1950 1.31.2.2 skrll if (p->p_ucred->cr_gid != (uid_t)arg)
1951 1.31.2.2 skrll continue;
1952 1.31.2.2 skrll break;
1953 1.31.2.2 skrll
1954 1.31.2.2 skrll case KERN_PROC_RGID:
1955 1.31.2.2 skrll if (p->p_cred->p_rgid != (uid_t)arg)
1956 1.31.2.2 skrll continue;
1957 1.31.2.2 skrll break;
1958 1.31.2.2 skrll
1959 1.31.2.2 skrll case KERN_PROC_ALL:
1960 1.31.2.2 skrll /* allow everything */
1961 1.31.2.2 skrll break;
1962 1.31.2.2 skrll
1963 1.31.2.2 skrll default:
1964 1.31.2.2 skrll error = EINVAL;
1965 1.31.2.2 skrll goto cleanup;
1966 1.31.2.2 skrll }
1967 1.31.2.2 skrll if (type == KERN_PROC) {
1968 1.31.2.2 skrll if (buflen >= sizeof(struct kinfo_proc)) {
1969 1.31.2.2 skrll fill_eproc(p, &eproc);
1970 1.31.2.2 skrll error = copyout(p, &dp->kp_proc,
1971 1.31.2.2 skrll sizeof(struct proc));
1972 1.31.2.2 skrll if (error)
1973 1.31.2.2 skrll goto cleanup;
1974 1.31.2.2 skrll error = copyout(&eproc, &dp->kp_eproc,
1975 1.31.2.2 skrll sizeof(eproc));
1976 1.31.2.2 skrll if (error)
1977 1.31.2.2 skrll goto cleanup;
1978 1.31.2.2 skrll dp++;
1979 1.31.2.2 skrll buflen -= sizeof(struct kinfo_proc);
1980 1.31.2.2 skrll }
1981 1.31.2.2 skrll needed += sizeof(struct kinfo_proc);
1982 1.31.2.2 skrll } else { /* KERN_PROC2 */
1983 1.31.2.2 skrll if (buflen >= elem_size && elem_count > 0) {
1984 1.31.2.2 skrll fill_kproc2(p, &kproc2);
1985 1.31.2.2 skrll /*
1986 1.31.2.2 skrll * Copy out elem_size, but not larger than
1987 1.31.2.2 skrll * the size of a struct kinfo_proc2.
1988 1.31.2.2 skrll */
1989 1.31.2.2 skrll error = copyout(&kproc2, dp2,
1990 1.31.2.2 skrll min(sizeof(kproc2), elem_size));
1991 1.31.2.2 skrll if (error)
1992 1.31.2.2 skrll goto cleanup;
1993 1.31.2.2 skrll dp2 += elem_size;
1994 1.31.2.2 skrll buflen -= elem_size;
1995 1.31.2.2 skrll elem_count--;
1996 1.31.2.2 skrll }
1997 1.31.2.2 skrll needed += elem_size;
1998 1.31.2.2 skrll }
1999 1.31.2.2 skrll }
2000 1.31.2.2 skrll pd++;
2001 1.31.2.2 skrll if (pd->pd_list != NULL)
2002 1.31.2.2 skrll goto again;
2003 1.31.2.2 skrll proclist_unlock_read();
2004 1.31.2.2 skrll
2005 1.31.2.2 skrll if (where != NULL) {
2006 1.31.2.2 skrll if (type == KERN_PROC)
2007 1.31.2.2 skrll *oldlenp = (char *)dp - where;
2008 1.31.2.2 skrll else
2009 1.31.2.2 skrll *oldlenp = dp2 - where;
2010 1.31.2.2 skrll if (needed > *oldlenp)
2011 1.31.2.2 skrll return (ENOMEM);
2012 1.31.2.2 skrll } else {
2013 1.31.2.2 skrll needed += KERN_PROCSLOP;
2014 1.31.2.2 skrll *oldlenp = needed;
2015 1.31.2.2 skrll }
2016 1.31.2.2 skrll return (0);
2017 1.31.2.2 skrll cleanup:
2018 1.31.2.2 skrll proclist_unlock_read();
2019 1.31.2.2 skrll return (error);
2020 1.31.2.2 skrll }
2021 1.31.2.2 skrll
2022 1.31.2.2 skrll /*
2023 1.31.2.2 skrll * sysctl helper routine for kern.proc_args pseudo-subtree.
2024 1.31.2.2 skrll */
2025 1.31.2.2 skrll static int
2026 1.31.2.2 skrll sysctl_kern_proc_args(SYSCTLFN_ARGS)
2027 1.31.2.2 skrll {
2028 1.31.2.2 skrll struct ps_strings pss;
2029 1.31.2.2 skrll struct proc *p, *up = l->l_proc;
2030 1.31.2.2 skrll size_t len, upper_bound, xlen, i;
2031 1.31.2.2 skrll struct uio auio;
2032 1.31.2.2 skrll struct iovec aiov;
2033 1.31.2.2 skrll vaddr_t argv;
2034 1.31.2.2 skrll pid_t pid;
2035 1.31.2.2 skrll int nargv, type, error;
2036 1.31.2.2 skrll char *arg;
2037 1.31.2.2 skrll char *tmp;
2038 1.31.2.2 skrll
2039 1.31.2.2 skrll if (namelen == 1 && name[0] == CTL_QUERY)
2040 1.31.2.2 skrll return (sysctl_query(SYSCTLFN_CALL(rnode)));
2041 1.31.2.2 skrll
2042 1.31.2.2 skrll if (newp != NULL || namelen != 2)
2043 1.31.2.2 skrll return (EINVAL);
2044 1.31.2.2 skrll pid = name[0];
2045 1.31.2.2 skrll type = name[1];
2046 1.31.2.2 skrll
2047 1.31.2.2 skrll switch (type) {
2048 1.31.2.2 skrll case KERN_PROC_ARGV:
2049 1.31.2.2 skrll case KERN_PROC_NARGV:
2050 1.31.2.2 skrll case KERN_PROC_ENV:
2051 1.31.2.2 skrll case KERN_PROC_NENV:
2052 1.31.2.2 skrll /* ok */
2053 1.31.2.2 skrll break;
2054 1.31.2.2 skrll default:
2055 1.31.2.2 skrll return (EINVAL);
2056 1.31.2.2 skrll }
2057 1.31.2.2 skrll
2058 1.31.2.2 skrll /* check pid */
2059 1.31.2.2 skrll if ((p = pfind(pid)) == NULL)
2060 1.31.2.2 skrll return (EINVAL);
2061 1.31.2.2 skrll
2062 1.31.2.2 skrll /* only root or same user change look at the environment */
2063 1.31.2.2 skrll if (type == KERN_PROC_ENV || type == KERN_PROC_NENV) {
2064 1.31.2.2 skrll if (up->p_ucred->cr_uid != 0) {
2065 1.31.2.2 skrll if (up->p_cred->p_ruid != p->p_cred->p_ruid ||
2066 1.31.2.2 skrll up->p_cred->p_ruid != p->p_cred->p_svuid)
2067 1.31.2.2 skrll return (EPERM);
2068 1.31.2.2 skrll }
2069 1.31.2.2 skrll }
2070 1.31.2.2 skrll
2071 1.31.2.2 skrll if (oldp == NULL) {
2072 1.31.2.2 skrll if (type == KERN_PROC_NARGV || type == KERN_PROC_NENV)
2073 1.31.2.2 skrll *oldlenp = sizeof (int);
2074 1.31.2.2 skrll else
2075 1.31.2.2 skrll *oldlenp = ARG_MAX; /* XXX XXX XXX */
2076 1.31.2.2 skrll return (0);
2077 1.31.2.2 skrll }
2078 1.31.2.2 skrll
2079 1.31.2.2 skrll /*
2080 1.31.2.2 skrll * Zombies don't have a stack, so we can't read their psstrings.
2081 1.31.2.2 skrll * System processes also don't have a user stack.
2082 1.31.2.2 skrll */
2083 1.31.2.2 skrll if (P_ZOMBIE(p) || (p->p_flag & P_SYSTEM) != 0)
2084 1.31.2.2 skrll return (EINVAL);
2085 1.31.2.2 skrll
2086 1.31.2.2 skrll /*
2087 1.31.2.2 skrll * Lock the process down in memory.
2088 1.31.2.2 skrll */
2089 1.31.2.2 skrll /* XXXCDC: how should locking work here? */
2090 1.31.2.2 skrll if ((p->p_flag & P_WEXIT) || (p->p_vmspace->vm_refcnt < 1))
2091 1.31.2.2 skrll return (EFAULT);
2092 1.31.2.2 skrll
2093 1.31.2.2 skrll p->p_vmspace->vm_refcnt++; /* XXX */
2094 1.31.2.2 skrll
2095 1.31.2.2 skrll /*
2096 1.31.2.2 skrll * Allocate a temporary buffer to hold the arguments.
2097 1.31.2.2 skrll */
2098 1.31.2.2 skrll arg = malloc(PAGE_SIZE, M_TEMP, M_WAITOK);
2099 1.31.2.2 skrll
2100 1.31.2.2 skrll /*
2101 1.31.2.2 skrll * Read in the ps_strings structure.
2102 1.31.2.2 skrll */
2103 1.31.2.2 skrll aiov.iov_base = &pss;
2104 1.31.2.2 skrll aiov.iov_len = sizeof(pss);
2105 1.31.2.2 skrll auio.uio_iov = &aiov;
2106 1.31.2.2 skrll auio.uio_iovcnt = 1;
2107 1.31.2.2 skrll auio.uio_offset = (vaddr_t)p->p_psstr;
2108 1.31.2.2 skrll auio.uio_resid = sizeof(pss);
2109 1.31.2.2 skrll auio.uio_segflg = UIO_SYSSPACE;
2110 1.31.2.2 skrll auio.uio_rw = UIO_READ;
2111 1.31.2.4 skrll auio.uio_lwp = NULL;
2112 1.31.2.2 skrll error = uvm_io(&p->p_vmspace->vm_map, &auio);
2113 1.31.2.2 skrll if (error)
2114 1.31.2.2 skrll goto done;
2115 1.31.2.2 skrll
2116 1.31.2.2 skrll if (type == KERN_PROC_ARGV || type == KERN_PROC_NARGV)
2117 1.31.2.2 skrll memcpy(&nargv, (char *)&pss + p->p_psnargv, sizeof(nargv));
2118 1.31.2.2 skrll else
2119 1.31.2.2 skrll memcpy(&nargv, (char *)&pss + p->p_psnenv, sizeof(nargv));
2120 1.31.2.2 skrll if (type == KERN_PROC_NARGV || type == KERN_PROC_NENV) {
2121 1.31.2.2 skrll error = copyout(&nargv, oldp, sizeof(nargv));
2122 1.31.2.2 skrll *oldlenp = sizeof(nargv);
2123 1.31.2.2 skrll goto done;
2124 1.31.2.2 skrll }
2125 1.31.2.2 skrll /*
2126 1.31.2.2 skrll * Now read the address of the argument vector.
2127 1.31.2.2 skrll */
2128 1.31.2.2 skrll switch (type) {
2129 1.31.2.2 skrll case KERN_PROC_ARGV:
2130 1.31.2.2 skrll /* XXX compat32 stuff here */
2131 1.31.2.2 skrll memcpy(&tmp, (char *)&pss + p->p_psargv, sizeof(tmp));
2132 1.31.2.2 skrll break;
2133 1.31.2.2 skrll case KERN_PROC_ENV:
2134 1.31.2.2 skrll memcpy(&tmp, (char *)&pss + p->p_psenv, sizeof(tmp));
2135 1.31.2.2 skrll break;
2136 1.31.2.2 skrll default:
2137 1.31.2.2 skrll return (EINVAL);
2138 1.31.2.2 skrll }
2139 1.31.2.2 skrll auio.uio_offset = (off_t)(unsigned long)tmp;
2140 1.31.2.2 skrll aiov.iov_base = &argv;
2141 1.31.2.2 skrll aiov.iov_len = sizeof(argv);
2142 1.31.2.2 skrll auio.uio_iov = &aiov;
2143 1.31.2.2 skrll auio.uio_iovcnt = 1;
2144 1.31.2.2 skrll auio.uio_resid = sizeof(argv);
2145 1.31.2.2 skrll auio.uio_segflg = UIO_SYSSPACE;
2146 1.31.2.2 skrll auio.uio_rw = UIO_READ;
2147 1.31.2.4 skrll auio.uio_lwp = NULL;
2148 1.31.2.2 skrll error = uvm_io(&p->p_vmspace->vm_map, &auio);
2149 1.31.2.2 skrll if (error)
2150 1.31.2.2 skrll goto done;
2151 1.31.2.2 skrll
2152 1.31.2.2 skrll /*
2153 1.31.2.2 skrll * Now copy in the actual argument vector, one page at a time,
2154 1.31.2.2 skrll * since we don't know how long the vector is (though, we do
2155 1.31.2.2 skrll * know how many NUL-terminated strings are in the vector).
2156 1.31.2.2 skrll */
2157 1.31.2.2 skrll len = 0;
2158 1.31.2.2 skrll upper_bound = *oldlenp;
2159 1.31.2.2 skrll for (; nargv != 0 && len < upper_bound; len += xlen) {
2160 1.31.2.2 skrll aiov.iov_base = arg;
2161 1.31.2.2 skrll aiov.iov_len = PAGE_SIZE;
2162 1.31.2.2 skrll auio.uio_iov = &aiov;
2163 1.31.2.2 skrll auio.uio_iovcnt = 1;
2164 1.31.2.2 skrll auio.uio_offset = argv + len;
2165 1.31.2.2 skrll xlen = PAGE_SIZE - ((argv + len) & PAGE_MASK);
2166 1.31.2.2 skrll auio.uio_resid = xlen;
2167 1.31.2.2 skrll auio.uio_segflg = UIO_SYSSPACE;
2168 1.31.2.2 skrll auio.uio_rw = UIO_READ;
2169 1.31.2.4 skrll auio.uio_lwp = NULL;
2170 1.31.2.2 skrll error = uvm_io(&p->p_vmspace->vm_map, &auio);
2171 1.31.2.2 skrll if (error)
2172 1.31.2.2 skrll goto done;
2173 1.31.2.2 skrll
2174 1.31.2.2 skrll for (i = 0; i < xlen && nargv != 0; i++) {
2175 1.31.2.2 skrll if (arg[i] == '\0')
2176 1.31.2.2 skrll nargv--; /* one full string */
2177 1.31.2.2 skrll }
2178 1.31.2.2 skrll
2179 1.31.2.2 skrll /*
2180 1.31.2.2 skrll * Make sure we don't copyout past the end of the user's
2181 1.31.2.2 skrll * buffer.
2182 1.31.2.2 skrll */
2183 1.31.2.2 skrll if (len + i > upper_bound)
2184 1.31.2.2 skrll i = upper_bound - len;
2185 1.31.2.2 skrll
2186 1.31.2.2 skrll error = copyout(arg, (char *)oldp + len, i);
2187 1.31.2.2 skrll if (error)
2188 1.31.2.2 skrll break;
2189 1.31.2.2 skrll
2190 1.31.2.2 skrll if (nargv == 0) {
2191 1.31.2.2 skrll len += i;
2192 1.31.2.2 skrll break;
2193 1.31.2.2 skrll }
2194 1.31.2.2 skrll }
2195 1.31.2.2 skrll *oldlenp = len;
2196 1.31.2.2 skrll
2197 1.31.2.2 skrll done:
2198 1.31.2.2 skrll uvmspace_free(p->p_vmspace);
2199 1.31.2.2 skrll
2200 1.31.2.2 skrll free(arg, M_TEMP);
2201 1.31.2.2 skrll return (error);
2202 1.31.2.2 skrll }
2203 1.31.2.2 skrll
2204 1.31.2.2 skrll /*
2205 1.31.2.2 skrll * sysctl helper routine for hw.usermem and hw.usermem64. values are
2206 1.31.2.2 skrll * calculate on the fly taking into account integer overflow and the
2207 1.31.2.2 skrll * current wired count.
2208 1.31.2.2 skrll */
2209 1.31.2.2 skrll static int
2210 1.31.2.2 skrll sysctl_hw_usermem(SYSCTLFN_ARGS)
2211 1.31.2.2 skrll {
2212 1.31.2.2 skrll u_int ui;
2213 1.31.2.2 skrll u_quad_t uq;
2214 1.31.2.2 skrll struct sysctlnode node;
2215 1.31.2.2 skrll
2216 1.31.2.2 skrll node = *rnode;
2217 1.31.2.2 skrll switch (rnode->sysctl_num) {
2218 1.31.2.2 skrll case HW_USERMEM:
2219 1.31.2.2 skrll if ((ui = physmem - uvmexp.wired) > (UINT_MAX / PAGE_SIZE))
2220 1.31.2.2 skrll ui = UINT_MAX;
2221 1.31.2.2 skrll else
2222 1.31.2.2 skrll ui *= PAGE_SIZE;
2223 1.31.2.2 skrll node.sysctl_data = &ui;
2224 1.31.2.2 skrll break;
2225 1.31.2.2 skrll case HW_USERMEM64:
2226 1.31.2.2 skrll uq = (u_quad_t)(physmem - uvmexp.wired) * PAGE_SIZE;
2227 1.31.2.2 skrll node.sysctl_data = &uq;
2228 1.31.2.2 skrll break;
2229 1.31.2.2 skrll default:
2230 1.31.2.2 skrll return (EINVAL);
2231 1.31.2.2 skrll }
2232 1.31.2.2 skrll
2233 1.31.2.2 skrll return (sysctl_lookup(SYSCTLFN_CALL(&node)));
2234 1.31.2.2 skrll }
2235 1.31.2.2 skrll
2236 1.31.2.2 skrll /*
2237 1.31.2.2 skrll * sysctl helper routine for kern.cnmagic node. pulls the old value
2238 1.31.2.2 skrll * out, encoded, and stuffs the new value in for decoding.
2239 1.31.2.2 skrll */
2240 1.31.2.2 skrll static int
2241 1.31.2.2 skrll sysctl_hw_cnmagic(SYSCTLFN_ARGS)
2242 1.31.2.2 skrll {
2243 1.31.2.2 skrll char magic[CNS_LEN];
2244 1.31.2.2 skrll int error;
2245 1.31.2.2 skrll struct sysctlnode node;
2246 1.31.2.2 skrll
2247 1.31.2.2 skrll if (oldp)
2248 1.31.2.2 skrll cn_get_magic(magic, CNS_LEN);
2249 1.31.2.2 skrll node = *rnode;
2250 1.31.2.2 skrll node.sysctl_data = &magic[0];
2251 1.31.2.2 skrll error = sysctl_lookup(SYSCTLFN_CALL(&node));
2252 1.31.2.2 skrll if (error || newp == NULL)
2253 1.31.2.2 skrll return (error);
2254 1.31.2.6 skrll
2255 1.31.2.2 skrll return (cn_set_magic(magic));
2256 1.31.2.2 skrll }
2257 1.31.2.2 skrll
2258 1.31.2.2 skrll static int
2259 1.31.2.2 skrll sysctl_hw_ncpu(SYSCTLFN_ARGS)
2260 1.31.2.2 skrll {
2261 1.31.2.2 skrll int ncpu;
2262 1.31.2.2 skrll struct sysctlnode node;
2263 1.31.2.2 skrll
2264 1.31.2.2 skrll ncpu = sysctl_ncpus();
2265 1.31.2.2 skrll node = *rnode;
2266 1.31.2.2 skrll node.sysctl_data = &ncpu;
2267 1.31.2.6 skrll
2268 1.31.2.2 skrll return (sysctl_lookup(SYSCTLFN_CALL(&node)));
2269 1.31.2.2 skrll }
2270 1.31.2.2 skrll
2271 1.31.2.2 skrll
2272 1.31.2.2 skrll /*
2273 1.31.2.2 skrll * ********************************************************************
2274 1.31.2.2 skrll * section 3: public helper routines that are used for more than one
2275 1.31.2.2 skrll * node
2276 1.31.2.2 skrll * ********************************************************************
2277 1.31.2.2 skrll */
2278 1.31.2.2 skrll
2279 1.31.2.2 skrll /*
2280 1.31.2.2 skrll * sysctl helper routine for the kern.root_device node and some ports'
2281 1.31.2.2 skrll * machdep.root_device nodes.
2282 1.31.2.2 skrll */
2283 1.31.2.2 skrll int
2284 1.31.2.2 skrll sysctl_root_device(SYSCTLFN_ARGS)
2285 1.31.2.2 skrll {
2286 1.31.2.2 skrll struct sysctlnode node;
2287 1.31.2.2 skrll
2288 1.31.2.2 skrll node = *rnode;
2289 1.31.2.2 skrll node.sysctl_data = root_device->dv_xname;
2290 1.31.2.2 skrll node.sysctl_size = strlen(root_device->dv_xname) + 1;
2291 1.31.2.2 skrll return (sysctl_lookup(SYSCTLFN_CALL(&node)));
2292 1.31.2.2 skrll }
2293 1.31.2.2 skrll
2294 1.31.2.2 skrll /*
2295 1.31.2.2 skrll * sysctl helper routine for kern.consdev, dependent on the current
2296 1.31.2.2 skrll * state of the console. also used for machdep.console_device on some
2297 1.31.2.2 skrll * ports.
2298 1.31.2.2 skrll */
2299 1.31.2.2 skrll int
2300 1.31.2.2 skrll sysctl_consdev(SYSCTLFN_ARGS)
2301 1.31.2.2 skrll {
2302 1.31.2.2 skrll dev_t consdev;
2303 1.31.2.2 skrll struct sysctlnode node;
2304 1.31.2.2 skrll
2305 1.31.2.2 skrll if (cn_tab != NULL)
2306 1.31.2.2 skrll consdev = cn_tab->cn_dev;
2307 1.31.2.2 skrll else
2308 1.31.2.2 skrll consdev = NODEV;
2309 1.31.2.2 skrll node = *rnode;
2310 1.31.2.2 skrll node.sysctl_data = &consdev;
2311 1.31.2.2 skrll node.sysctl_size = sizeof(consdev);
2312 1.31.2.2 skrll return (sysctl_lookup(SYSCTLFN_CALL(&node)));
2313 1.31.2.2 skrll }
2314 1.31.2.2 skrll
2315 1.31.2.2 skrll /*
2316 1.31.2.2 skrll * ********************************************************************
2317 1.31.2.2 skrll * section 4: support for some helpers
2318 1.31.2.2 skrll * ********************************************************************
2319 1.31.2.2 skrll */
2320 1.31.2.2 skrll
2321 1.31.2.2 skrll /*
2322 1.31.2.2 skrll * Fill in a kinfo_proc2 structure for the specified process.
2323 1.31.2.2 skrll */
2324 1.31.2.2 skrll static void
2325 1.31.2.2 skrll fill_kproc2(struct proc *p, struct kinfo_proc2 *ki)
2326 1.31.2.2 skrll {
2327 1.31.2.2 skrll struct tty *tp;
2328 1.31.2.2 skrll struct lwp *l;
2329 1.31.2.2 skrll struct timeval ut, st;
2330 1.31.2.2 skrll
2331 1.31.2.2 skrll memset(ki, 0, sizeof(*ki));
2332 1.31.2.2 skrll
2333 1.31.2.2 skrll ki->p_paddr = PTRTOUINT64(p);
2334 1.31.2.2 skrll ki->p_fd = PTRTOUINT64(p->p_fd);
2335 1.31.2.2 skrll ki->p_cwdi = PTRTOUINT64(p->p_cwdi);
2336 1.31.2.2 skrll ki->p_stats = PTRTOUINT64(p->p_stats);
2337 1.31.2.2 skrll ki->p_limit = PTRTOUINT64(p->p_limit);
2338 1.31.2.2 skrll ki->p_vmspace = PTRTOUINT64(p->p_vmspace);
2339 1.31.2.2 skrll ki->p_sigacts = PTRTOUINT64(p->p_sigacts);
2340 1.31.2.2 skrll ki->p_sess = PTRTOUINT64(p->p_session);
2341 1.31.2.2 skrll ki->p_tsess = 0; /* may be changed if controlling tty below */
2342 1.31.2.2 skrll ki->p_ru = PTRTOUINT64(p->p_ru);
2343 1.31.2.2 skrll
2344 1.31.2.2 skrll ki->p_eflag = 0;
2345 1.31.2.2 skrll ki->p_exitsig = p->p_exitsig;
2346 1.31.2.2 skrll ki->p_flag = p->p_flag;
2347 1.31.2.2 skrll
2348 1.31.2.2 skrll ki->p_pid = p->p_pid;
2349 1.31.2.2 skrll if (p->p_pptr)
2350 1.31.2.2 skrll ki->p_ppid = p->p_pptr->p_pid;
2351 1.31.2.2 skrll else
2352 1.31.2.2 skrll ki->p_ppid = 0;
2353 1.31.2.2 skrll ki->p_sid = p->p_session->s_sid;
2354 1.31.2.2 skrll ki->p__pgid = p->p_pgrp->pg_id;
2355 1.31.2.2 skrll
2356 1.31.2.2 skrll ki->p_tpgid = NO_PGID; /* may be changed if controlling tty below */
2357 1.31.2.2 skrll
2358 1.31.2.2 skrll ki->p_uid = p->p_ucred->cr_uid;
2359 1.31.2.2 skrll ki->p_ruid = p->p_cred->p_ruid;
2360 1.31.2.2 skrll ki->p_gid = p->p_ucred->cr_gid;
2361 1.31.2.2 skrll ki->p_rgid = p->p_cred->p_rgid;
2362 1.31.2.2 skrll ki->p_svuid = p->p_cred->p_svuid;
2363 1.31.2.2 skrll ki->p_svgid = p->p_cred->p_svgid;
2364 1.31.2.2 skrll
2365 1.31.2.2 skrll memcpy(ki->p_groups, p->p_cred->pc_ucred->cr_groups,
2366 1.31.2.2 skrll min(sizeof(ki->p_groups), sizeof(p->p_cred->pc_ucred->cr_groups)));
2367 1.31.2.2 skrll ki->p_ngroups = p->p_cred->pc_ucred->cr_ngroups;
2368 1.31.2.2 skrll
2369 1.31.2.2 skrll ki->p_jobc = p->p_pgrp->pg_jobc;
2370 1.31.2.2 skrll if ((p->p_flag & P_CONTROLT) && (tp = p->p_session->s_ttyp)) {
2371 1.31.2.2 skrll ki->p_tdev = tp->t_dev;
2372 1.31.2.2 skrll ki->p_tpgid = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PGID;
2373 1.31.2.2 skrll ki->p_tsess = PTRTOUINT64(tp->t_session);
2374 1.31.2.2 skrll } else {
2375 1.31.2.2 skrll ki->p_tdev = NODEV;
2376 1.31.2.2 skrll }
2377 1.31.2.2 skrll
2378 1.31.2.2 skrll ki->p_estcpu = p->p_estcpu;
2379 1.31.2.2 skrll ki->p_rtime_sec = p->p_rtime.tv_sec;
2380 1.31.2.2 skrll ki->p_rtime_usec = p->p_rtime.tv_usec;
2381 1.31.2.2 skrll ki->p_cpticks = p->p_cpticks;
2382 1.31.2.2 skrll ki->p_pctcpu = p->p_pctcpu;
2383 1.31.2.2 skrll
2384 1.31.2.2 skrll ki->p_uticks = p->p_uticks;
2385 1.31.2.2 skrll ki->p_sticks = p->p_sticks;
2386 1.31.2.2 skrll ki->p_iticks = p->p_iticks;
2387 1.31.2.2 skrll
2388 1.31.2.2 skrll ki->p_tracep = PTRTOUINT64(p->p_tracep);
2389 1.31.2.2 skrll ki->p_traceflag = p->p_traceflag;
2390 1.31.2.2 skrll
2391 1.31.2.2 skrll
2392 1.31.2.2 skrll memcpy(&ki->p_siglist, &p->p_sigctx.ps_siglist, sizeof(ki_sigset_t));
2393 1.31.2.2 skrll memcpy(&ki->p_sigmask, &p->p_sigctx.ps_sigmask, sizeof(ki_sigset_t));
2394 1.31.2.2 skrll memcpy(&ki->p_sigignore, &p->p_sigctx.ps_sigignore,sizeof(ki_sigset_t));
2395 1.31.2.2 skrll memcpy(&ki->p_sigcatch, &p->p_sigctx.ps_sigcatch, sizeof(ki_sigset_t));
2396 1.31.2.2 skrll
2397 1.31.2.2 skrll ki->p_stat = p->p_stat; /* Will likely be overridden by LWP status */
2398 1.31.2.2 skrll ki->p_realstat = p->p_stat;
2399 1.31.2.2 skrll ki->p_nice = p->p_nice;
2400 1.31.2.2 skrll
2401 1.31.2.2 skrll ki->p_xstat = p->p_xstat;
2402 1.31.2.2 skrll ki->p_acflag = p->p_acflag;
2403 1.31.2.2 skrll
2404 1.31.2.2 skrll strncpy(ki->p_comm, p->p_comm,
2405 1.31.2.2 skrll min(sizeof(ki->p_comm), sizeof(p->p_comm)));
2406 1.31.2.2 skrll
2407 1.31.2.2 skrll strncpy(ki->p_login, p->p_session->s_login,
2408 1.31.2.2 skrll min(sizeof ki->p_login - 1, sizeof p->p_session->s_login));
2409 1.31.2.2 skrll
2410 1.31.2.2 skrll ki->p_nlwps = p->p_nlwps;
2411 1.31.2.2 skrll ki->p_nrlwps = p->p_nrlwps;
2412 1.31.2.2 skrll ki->p_realflag = p->p_flag;
2413 1.31.2.2 skrll
2414 1.31.2.2 skrll if (p->p_stat == SIDL || P_ZOMBIE(p)) {
2415 1.31.2.2 skrll ki->p_vm_rssize = 0;
2416 1.31.2.2 skrll ki->p_vm_tsize = 0;
2417 1.31.2.2 skrll ki->p_vm_dsize = 0;
2418 1.31.2.2 skrll ki->p_vm_ssize = 0;
2419 1.31.2.2 skrll l = NULL;
2420 1.31.2.2 skrll } else {
2421 1.31.2.2 skrll struct vmspace *vm = p->p_vmspace;
2422 1.31.2.2 skrll
2423 1.31.2.2 skrll ki->p_vm_rssize = vm_resident_count(vm);
2424 1.31.2.2 skrll ki->p_vm_tsize = vm->vm_tsize;
2425 1.31.2.2 skrll ki->p_vm_dsize = vm->vm_dsize;
2426 1.31.2.2 skrll ki->p_vm_ssize = vm->vm_ssize;
2427 1.31.2.2 skrll
2428 1.31.2.2 skrll /* Pick a "representative" LWP */
2429 1.31.2.2 skrll l = proc_representative_lwp(p);
2430 1.31.2.2 skrll ki->p_forw = PTRTOUINT64(l->l_forw);
2431 1.31.2.2 skrll ki->p_back = PTRTOUINT64(l->l_back);
2432 1.31.2.2 skrll ki->p_addr = PTRTOUINT64(l->l_addr);
2433 1.31.2.2 skrll ki->p_stat = l->l_stat;
2434 1.31.2.2 skrll ki->p_flag |= l->l_flag;
2435 1.31.2.2 skrll ki->p_swtime = l->l_swtime;
2436 1.31.2.2 skrll ki->p_slptime = l->l_slptime;
2437 1.31.2.2 skrll if (l->l_stat == LSONPROC) {
2438 1.31.2.2 skrll KDASSERT(l->l_cpu != NULL);
2439 1.31.2.2 skrll ki->p_schedflags = l->l_cpu->ci_schedstate.spc_flags;
2440 1.31.2.2 skrll } else
2441 1.31.2.2 skrll ki->p_schedflags = 0;
2442 1.31.2.2 skrll ki->p_holdcnt = l->l_holdcnt;
2443 1.31.2.2 skrll ki->p_priority = l->l_priority;
2444 1.31.2.2 skrll ki->p_usrpri = l->l_usrpri;
2445 1.31.2.2 skrll if (l->l_wmesg)
2446 1.31.2.2 skrll strncpy(ki->p_wmesg, l->l_wmesg, sizeof(ki->p_wmesg));
2447 1.31.2.2 skrll ki->p_wchan = PTRTOUINT64(l->l_wchan);
2448 1.31.2.2 skrll
2449 1.31.2.2 skrll }
2450 1.31.2.2 skrll
2451 1.31.2.2 skrll if (p->p_session->s_ttyvp)
2452 1.31.2.2 skrll ki->p_eflag |= EPROC_CTTY;
2453 1.31.2.2 skrll if (SESS_LEADER(p))
2454 1.31.2.2 skrll ki->p_eflag |= EPROC_SLEADER;
2455 1.31.2.2 skrll
2456 1.31.2.2 skrll /* XXX Is this double check necessary? */
2457 1.31.2.2 skrll if (P_ZOMBIE(p)) {
2458 1.31.2.2 skrll ki->p_uvalid = 0;
2459 1.31.2.2 skrll } else {
2460 1.31.2.2 skrll ki->p_uvalid = 1;
2461 1.31.2.2 skrll
2462 1.31.2.2 skrll ki->p_ustart_sec = p->p_stats->p_start.tv_sec;
2463 1.31.2.2 skrll ki->p_ustart_usec = p->p_stats->p_start.tv_usec;
2464 1.31.2.2 skrll
2465 1.31.2.2 skrll calcru(p, &ut, &st, 0);
2466 1.31.2.2 skrll ki->p_uutime_sec = ut.tv_sec;
2467 1.31.2.2 skrll ki->p_uutime_usec = ut.tv_usec;
2468 1.31.2.2 skrll ki->p_ustime_sec = st.tv_sec;
2469 1.31.2.2 skrll ki->p_ustime_usec = st.tv_usec;
2470 1.31.2.2 skrll
2471 1.31.2.2 skrll ki->p_uru_maxrss = p->p_stats->p_ru.ru_maxrss;
2472 1.31.2.2 skrll ki->p_uru_ixrss = p->p_stats->p_ru.ru_ixrss;
2473 1.31.2.2 skrll ki->p_uru_idrss = p->p_stats->p_ru.ru_idrss;
2474 1.31.2.2 skrll ki->p_uru_isrss = p->p_stats->p_ru.ru_isrss;
2475 1.31.2.2 skrll ki->p_uru_minflt = p->p_stats->p_ru.ru_minflt;
2476 1.31.2.2 skrll ki->p_uru_majflt = p->p_stats->p_ru.ru_majflt;
2477 1.31.2.2 skrll ki->p_uru_nswap = p->p_stats->p_ru.ru_nswap;
2478 1.31.2.2 skrll ki->p_uru_inblock = p->p_stats->p_ru.ru_inblock;
2479 1.31.2.2 skrll ki->p_uru_oublock = p->p_stats->p_ru.ru_oublock;
2480 1.31.2.2 skrll ki->p_uru_msgsnd = p->p_stats->p_ru.ru_msgsnd;
2481 1.31.2.2 skrll ki->p_uru_msgrcv = p->p_stats->p_ru.ru_msgrcv;
2482 1.31.2.2 skrll ki->p_uru_nsignals = p->p_stats->p_ru.ru_nsignals;
2483 1.31.2.2 skrll ki->p_uru_nvcsw = p->p_stats->p_ru.ru_nvcsw;
2484 1.31.2.2 skrll ki->p_uru_nivcsw = p->p_stats->p_ru.ru_nivcsw;
2485 1.31.2.2 skrll
2486 1.31.2.2 skrll timeradd(&p->p_stats->p_cru.ru_utime,
2487 1.31.2.2 skrll &p->p_stats->p_cru.ru_stime, &ut);
2488 1.31.2.2 skrll ki->p_uctime_sec = ut.tv_sec;
2489 1.31.2.2 skrll ki->p_uctime_usec = ut.tv_usec;
2490 1.31.2.2 skrll }
2491 1.31.2.2 skrll #ifdef MULTIPROCESSOR
2492 1.31.2.2 skrll if (l && l->l_cpu != NULL)
2493 1.31.2.2 skrll ki->p_cpuid = l->l_cpu->ci_cpuid;
2494 1.31.2.2 skrll else
2495 1.31.2.2 skrll #endif
2496 1.31.2.2 skrll ki->p_cpuid = KI_NOCPU;
2497 1.31.2.2 skrll }
2498 1.31.2.2 skrll
2499 1.31.2.2 skrll /*
2500 1.31.2.2 skrll * Fill in a kinfo_lwp structure for the specified lwp.
2501 1.31.2.2 skrll */
2502 1.31.2.2 skrll static void
2503 1.31.2.2 skrll fill_lwp(struct lwp *l, struct kinfo_lwp *kl)
2504 1.31.2.2 skrll {
2505 1.31.2.2 skrll
2506 1.31.2.2 skrll kl->l_forw = PTRTOUINT64(l->l_forw);
2507 1.31.2.2 skrll kl->l_back = PTRTOUINT64(l->l_back);
2508 1.31.2.2 skrll kl->l_laddr = PTRTOUINT64(l);
2509 1.31.2.2 skrll kl->l_addr = PTRTOUINT64(l->l_addr);
2510 1.31.2.2 skrll kl->l_stat = l->l_stat;
2511 1.31.2.2 skrll kl->l_lid = l->l_lid;
2512 1.31.2.2 skrll kl->l_flag = l->l_flag;
2513 1.31.2.2 skrll
2514 1.31.2.2 skrll kl->l_swtime = l->l_swtime;
2515 1.31.2.2 skrll kl->l_slptime = l->l_slptime;
2516 1.31.2.2 skrll if (l->l_stat == LSONPROC) {
2517 1.31.2.2 skrll KDASSERT(l->l_cpu != NULL);
2518 1.31.2.2 skrll kl->l_schedflags = l->l_cpu->ci_schedstate.spc_flags;
2519 1.31.2.2 skrll } else
2520 1.31.2.2 skrll kl->l_schedflags = 0;
2521 1.31.2.2 skrll kl->l_holdcnt = l->l_holdcnt;
2522 1.31.2.2 skrll kl->l_priority = l->l_priority;
2523 1.31.2.2 skrll kl->l_usrpri = l->l_usrpri;
2524 1.31.2.2 skrll if (l->l_wmesg)
2525 1.31.2.2 skrll strncpy(kl->l_wmesg, l->l_wmesg, sizeof(kl->l_wmesg));
2526 1.31.2.2 skrll kl->l_wchan = PTRTOUINT64(l->l_wchan);
2527 1.31.2.2 skrll #ifdef MULTIPROCESSOR
2528 1.31.2.2 skrll if (l->l_cpu != NULL)
2529 1.31.2.2 skrll kl->l_cpuid = l->l_cpu->ci_cpuid;
2530 1.31.2.2 skrll else
2531 1.31.2.2 skrll #endif
2532 1.31.2.2 skrll kl->l_cpuid = KI_NOCPU;
2533 1.31.2.2 skrll }
2534 1.31.2.2 skrll
2535 1.31.2.2 skrll /*
2536 1.31.2.2 skrll * Fill in an eproc structure for the specified process.
2537 1.31.2.2 skrll */
2538 1.31.2.2 skrll void
2539 1.31.2.2 skrll fill_eproc(struct proc *p, struct eproc *ep)
2540 1.31.2.2 skrll {
2541 1.31.2.2 skrll struct tty *tp;
2542 1.31.2.2 skrll struct lwp *l;
2543 1.31.2.2 skrll
2544 1.31.2.2 skrll ep->e_paddr = p;
2545 1.31.2.2 skrll ep->e_sess = p->p_session;
2546 1.31.2.2 skrll ep->e_pcred = *p->p_cred;
2547 1.31.2.2 skrll ep->e_ucred = *p->p_ucred;
2548 1.31.2.2 skrll if (p->p_stat == SIDL || P_ZOMBIE(p)) {
2549 1.31.2.2 skrll ep->e_vm.vm_rssize = 0;
2550 1.31.2.2 skrll ep->e_vm.vm_tsize = 0;
2551 1.31.2.2 skrll ep->e_vm.vm_dsize = 0;
2552 1.31.2.2 skrll ep->e_vm.vm_ssize = 0;
2553 1.31.2.2 skrll /* ep->e_vm.vm_pmap = XXX; */
2554 1.31.2.2 skrll } else {
2555 1.31.2.2 skrll struct vmspace *vm = p->p_vmspace;
2556 1.31.2.2 skrll
2557 1.31.2.2 skrll ep->e_vm.vm_rssize = vm_resident_count(vm);
2558 1.31.2.2 skrll ep->e_vm.vm_tsize = vm->vm_tsize;
2559 1.31.2.2 skrll ep->e_vm.vm_dsize = vm->vm_dsize;
2560 1.31.2.2 skrll ep->e_vm.vm_ssize = vm->vm_ssize;
2561 1.31.2.2 skrll
2562 1.31.2.2 skrll /* Pick a "representative" LWP */
2563 1.31.2.2 skrll l = proc_representative_lwp(p);
2564 1.31.2.2 skrll
2565 1.31.2.2 skrll if (l->l_wmesg)
2566 1.31.2.2 skrll strncpy(ep->e_wmesg, l->l_wmesg, WMESGLEN);
2567 1.31.2.2 skrll }
2568 1.31.2.2 skrll if (p->p_pptr)
2569 1.31.2.2 skrll ep->e_ppid = p->p_pptr->p_pid;
2570 1.31.2.2 skrll else
2571 1.31.2.2 skrll ep->e_ppid = 0;
2572 1.31.2.2 skrll ep->e_pgid = p->p_pgrp->pg_id;
2573 1.31.2.2 skrll ep->e_sid = ep->e_sess->s_sid;
2574 1.31.2.2 skrll ep->e_jobc = p->p_pgrp->pg_jobc;
2575 1.31.2.2 skrll if ((p->p_flag & P_CONTROLT) &&
2576 1.31.2.2 skrll (tp = ep->e_sess->s_ttyp)) {
2577 1.31.2.2 skrll ep->e_tdev = tp->t_dev;
2578 1.31.2.2 skrll ep->e_tpgid = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PGID;
2579 1.31.2.2 skrll ep->e_tsess = tp->t_session;
2580 1.31.2.2 skrll } else
2581 1.31.2.2 skrll ep->e_tdev = NODEV;
2582 1.31.2.2 skrll
2583 1.31.2.2 skrll ep->e_xsize = ep->e_xrssize = 0;
2584 1.31.2.2 skrll ep->e_xccount = ep->e_xswrss = 0;
2585 1.31.2.2 skrll ep->e_flag = ep->e_sess->s_ttyvp ? EPROC_CTTY : 0;
2586 1.31.2.2 skrll if (SESS_LEADER(p))
2587 1.31.2.2 skrll ep->e_flag |= EPROC_SLEADER;
2588 1.31.2.2 skrll strncpy(ep->e_login, ep->e_sess->s_login, MAXLOGNAME);
2589 1.31.2.2 skrll }
2590