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