init_sysctl.c revision 1.31.2.8 1 1.31.2.8 skrll /* $NetBSD: init_sysctl.c,v 1.31.2.8 2005/11/10 14:09:44 skrll Exp $ */
2 1.31.2.2 skrll
3 1.31.2.2 skrll /*-
4 1.31.2.2 skrll * Copyright (c) 2003 The NetBSD Foundation, Inc.
5 1.31.2.2 skrll * All rights reserved.
6 1.31.2.2 skrll *
7 1.31.2.2 skrll * This code is derived from software contributed to The NetBSD Foundation
8 1.31.2.2 skrll * by Andrew Brown.
9 1.31.2.2 skrll *
10 1.31.2.2 skrll * Redistribution and use in source and binary forms, with or without
11 1.31.2.2 skrll * modification, are permitted provided that the following conditions
12 1.31.2.2 skrll * are met:
13 1.31.2.2 skrll * 1. Redistributions of source code must retain the above copyright
14 1.31.2.2 skrll * notice, this list of conditions and the following disclaimer.
15 1.31.2.2 skrll * 2. Redistributions in binary form must reproduce the above copyright
16 1.31.2.2 skrll * notice, this list of conditions and the following disclaimer in the
17 1.31.2.2 skrll * documentation and/or other materials provided with the distribution.
18 1.31.2.2 skrll * 3. All advertising materials mentioning features or use of this software
19 1.31.2.2 skrll * must display the following acknowledgement:
20 1.31.2.2 skrll * This product includes software developed by the NetBSD
21 1.31.2.2 skrll * Foundation, Inc. and its contributors.
22 1.31.2.2 skrll * 4. Neither the name of The NetBSD Foundation nor the names of its
23 1.31.2.2 skrll * contributors may be used to endorse or promote products derived
24 1.31.2.2 skrll * from this software without specific prior written permission.
25 1.31.2.2 skrll *
26 1.31.2.2 skrll * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27 1.31.2.2 skrll * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28 1.31.2.2 skrll * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 1.31.2.2 skrll * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30 1.31.2.2 skrll * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 1.31.2.2 skrll * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 1.31.2.2 skrll * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 1.31.2.2 skrll * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 1.31.2.2 skrll * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 1.31.2.2 skrll * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 1.31.2.2 skrll * POSSIBILITY OF SUCH DAMAGE.
37 1.31.2.2 skrll */
38 1.31.2.2 skrll
39 1.31.2.2 skrll #include <sys/cdefs.h>
40 1.31.2.8 skrll __KERNEL_RCSID(0, "$NetBSD: init_sysctl.c,v 1.31.2.8 2005/11/10 14:09:44 skrll Exp $");
41 1.31.2.2 skrll
42 1.31.2.2 skrll #include "opt_sysv.h"
43 1.31.2.2 skrll #include "opt_multiprocessor.h"
44 1.31.2.2 skrll #include "opt_posix.h"
45 1.31.2.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.2 skrll struct timeval tv, delta;
1079 1.31.2.2 skrll int s, 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.2 skrll s = splclock();
1096 1.31.2.2 skrll tv = time;
1097 1.31.2.2 skrll splx(s);
1098 1.31.2.2 skrll delta.tv_sec = 60*(new_rtc_offset - rtc_offset);
1099 1.31.2.2 skrll delta.tv_usec = 0;
1100 1.31.2.2 skrll timeradd(&tv, &delta, &tv);
1101 1.31.2.2 skrll rtc_offset = new_rtc_offset;
1102 1.31.2.2 skrll settime(&tv);
1103 1.31.2.2 skrll
1104 1.31.2.2 skrll return (0);
1105 1.31.2.2 skrll }
1106 1.31.2.2 skrll
1107 1.31.2.2 skrll /*
1108 1.31.2.8 skrll * sysctl helper routine for kern.maxproc. ensures that the new
1109 1.31.2.2 skrll * values are not too low or too high.
1110 1.31.2.2 skrll */
1111 1.31.2.2 skrll static int
1112 1.31.2.2 skrll sysctl_kern_maxproc(SYSCTLFN_ARGS)
1113 1.31.2.2 skrll {
1114 1.31.2.2 skrll int error, nmaxproc;
1115 1.31.2.2 skrll struct sysctlnode node;
1116 1.31.2.2 skrll
1117 1.31.2.2 skrll nmaxproc = maxproc;
1118 1.31.2.2 skrll node = *rnode;
1119 1.31.2.2 skrll node.sysctl_data = &nmaxproc;
1120 1.31.2.2 skrll error = sysctl_lookup(SYSCTLFN_CALL(&node));
1121 1.31.2.2 skrll if (error || newp == NULL)
1122 1.31.2.2 skrll return (error);
1123 1.31.2.2 skrll
1124 1.31.2.2 skrll if (nmaxproc < 0 || nmaxproc >= PID_MAX)
1125 1.31.2.2 skrll return (EINVAL);
1126 1.31.2.2 skrll #ifdef __HAVE_CPU_MAXPROC
1127 1.31.2.2 skrll if (nmaxproc > cpu_maxproc())
1128 1.31.2.2 skrll return (EINVAL);
1129 1.31.2.2 skrll #endif
1130 1.31.2.2 skrll maxproc = nmaxproc;
1131 1.31.2.2 skrll
1132 1.31.2.2 skrll return (0);
1133 1.31.2.2 skrll }
1134 1.31.2.2 skrll
1135 1.31.2.2 skrll /*
1136 1.31.2.2 skrll * sysctl helper routine for kern.securelevel. ensures that the value
1137 1.31.2.2 skrll * only rises unless the caller has pid 1 (assumed to be init).
1138 1.31.2.2 skrll */
1139 1.31.2.2 skrll static int
1140 1.31.2.2 skrll sysctl_kern_securelevel(SYSCTLFN_ARGS)
1141 1.31.2.2 skrll {
1142 1.31.2.2 skrll int newsecurelevel, error;
1143 1.31.2.2 skrll struct sysctlnode node;
1144 1.31.2.2 skrll
1145 1.31.2.2 skrll newsecurelevel = securelevel;
1146 1.31.2.2 skrll node = *rnode;
1147 1.31.2.2 skrll node.sysctl_data = &newsecurelevel;
1148 1.31.2.2 skrll error = sysctl_lookup(SYSCTLFN_CALL(&node));
1149 1.31.2.2 skrll if (error || newp == NULL)
1150 1.31.2.2 skrll return (error);
1151 1.31.2.2 skrll
1152 1.31.2.2 skrll if (newsecurelevel < securelevel && l && l->l_proc->p_pid != 1)
1153 1.31.2.2 skrll return (EPERM);
1154 1.31.2.2 skrll securelevel = newsecurelevel;
1155 1.31.2.2 skrll
1156 1.31.2.2 skrll return (error);
1157 1.31.2.2 skrll }
1158 1.31.2.2 skrll
1159 1.31.2.2 skrll /*
1160 1.31.2.2 skrll * sysctl helper function for kern.hostid. the hostid is a long, but
1161 1.31.2.2 skrll * we export it as an int, so we need to give it a little help.
1162 1.31.2.2 skrll */
1163 1.31.2.2 skrll static int
1164 1.31.2.2 skrll sysctl_kern_hostid(SYSCTLFN_ARGS)
1165 1.31.2.2 skrll {
1166 1.31.2.2 skrll int error, inthostid;
1167 1.31.2.2 skrll struct sysctlnode node;
1168 1.31.2.2 skrll
1169 1.31.2.2 skrll inthostid = hostid; /* XXX assumes sizeof int <= sizeof long */
1170 1.31.2.2 skrll node = *rnode;
1171 1.31.2.2 skrll node.sysctl_data = &inthostid;
1172 1.31.2.2 skrll error = sysctl_lookup(SYSCTLFN_CALL(&node));
1173 1.31.2.2 skrll if (error || newp == NULL)
1174 1.31.2.2 skrll return (error);
1175 1.31.2.2 skrll
1176 1.31.2.2 skrll hostid = (unsigned)inthostid;
1177 1.31.2.2 skrll
1178 1.31.2.2 skrll return (0);
1179 1.31.2.2 skrll }
1180 1.31.2.2 skrll
1181 1.31.2.2 skrll /*
1182 1.31.2.2 skrll * sysctl helper function for kern.hostname and kern.domainnname.
1183 1.31.2.2 skrll * resets the relevant recorded length when the underlying name is
1184 1.31.2.2 skrll * changed.
1185 1.31.2.2 skrll */
1186 1.31.2.2 skrll static int
1187 1.31.2.2 skrll sysctl_setlen(SYSCTLFN_ARGS)
1188 1.31.2.2 skrll {
1189 1.31.2.2 skrll int error;
1190 1.31.2.2 skrll
1191 1.31.2.2 skrll error = sysctl_lookup(SYSCTLFN_CALL(rnode));
1192 1.31.2.2 skrll if (error || newp == NULL)
1193 1.31.2.2 skrll return (error);
1194 1.31.2.2 skrll
1195 1.31.2.2 skrll switch (rnode->sysctl_num) {
1196 1.31.2.2 skrll case KERN_HOSTNAME:
1197 1.31.2.2 skrll hostnamelen = strlen((const char*)rnode->sysctl_data);
1198 1.31.2.2 skrll break;
1199 1.31.2.2 skrll case KERN_DOMAINNAME:
1200 1.31.2.2 skrll domainnamelen = strlen((const char*)rnode->sysctl_data);
1201 1.31.2.2 skrll break;
1202 1.31.2.2 skrll }
1203 1.31.2.2 skrll
1204 1.31.2.2 skrll return (0);
1205 1.31.2.2 skrll }
1206 1.31.2.2 skrll
1207 1.31.2.2 skrll /*
1208 1.31.2.2 skrll * sysctl helper routine for kern.clockrate. assembles a struct on
1209 1.31.2.2 skrll * the fly to be returned to the caller.
1210 1.31.2.2 skrll */
1211 1.31.2.2 skrll static int
1212 1.31.2.2 skrll sysctl_kern_clockrate(SYSCTLFN_ARGS)
1213 1.31.2.2 skrll {
1214 1.31.2.2 skrll struct clockinfo clkinfo;
1215 1.31.2.2 skrll struct sysctlnode node;
1216 1.31.2.2 skrll
1217 1.31.2.2 skrll clkinfo.tick = tick;
1218 1.31.2.2 skrll clkinfo.tickadj = tickadj;
1219 1.31.2.2 skrll clkinfo.hz = hz;
1220 1.31.2.2 skrll clkinfo.profhz = profhz;
1221 1.31.2.2 skrll clkinfo.stathz = stathz ? stathz : hz;
1222 1.31.2.2 skrll
1223 1.31.2.2 skrll node = *rnode;
1224 1.31.2.2 skrll node.sysctl_data = &clkinfo;
1225 1.31.2.2 skrll return (sysctl_lookup(SYSCTLFN_CALL(&node)));
1226 1.31.2.2 skrll }
1227 1.31.2.2 skrll
1228 1.31.2.2 skrll
1229 1.31.2.2 skrll /*
1230 1.31.2.2 skrll * sysctl helper routine for kern.file pseudo-subtree.
1231 1.31.2.2 skrll */
1232 1.31.2.2 skrll static int
1233 1.31.2.2 skrll sysctl_kern_file(SYSCTLFN_ARGS)
1234 1.31.2.2 skrll {
1235 1.31.2.2 skrll int error;
1236 1.31.2.2 skrll size_t buflen;
1237 1.31.2.2 skrll struct file *fp;
1238 1.31.2.2 skrll char *start, *where;
1239 1.31.2.2 skrll
1240 1.31.2.2 skrll start = where = oldp;
1241 1.31.2.2 skrll buflen = *oldlenp;
1242 1.31.2.2 skrll if (where == NULL) {
1243 1.31.2.2 skrll /*
1244 1.31.2.2 skrll * overestimate by 10 files
1245 1.31.2.2 skrll */
1246 1.31.2.2 skrll *oldlenp = sizeof(filehead) + (nfiles + 10) * sizeof(struct file);
1247 1.31.2.2 skrll return (0);
1248 1.31.2.2 skrll }
1249 1.31.2.2 skrll
1250 1.31.2.2 skrll /*
1251 1.31.2.2 skrll * first copyout filehead
1252 1.31.2.2 skrll */
1253 1.31.2.2 skrll if (buflen < sizeof(filehead)) {
1254 1.31.2.2 skrll *oldlenp = 0;
1255 1.31.2.2 skrll return (0);
1256 1.31.2.2 skrll }
1257 1.31.2.2 skrll error = copyout(&filehead, where, sizeof(filehead));
1258 1.31.2.2 skrll if (error)
1259 1.31.2.2 skrll return (error);
1260 1.31.2.2 skrll buflen -= sizeof(filehead);
1261 1.31.2.2 skrll where += sizeof(filehead);
1262 1.31.2.2 skrll
1263 1.31.2.2 skrll /*
1264 1.31.2.2 skrll * followed by an array of file structures
1265 1.31.2.2 skrll */
1266 1.31.2.2 skrll LIST_FOREACH(fp, &filehead, f_list) {
1267 1.31.2.8 skrll if (CURTAIN(l->l_proc->p_ucred->cr_uid, fp->f_cred->cr_uid))
1268 1.31.2.8 skrll continue;
1269 1.31.2.2 skrll if (buflen < sizeof(struct file)) {
1270 1.31.2.2 skrll *oldlenp = where - start;
1271 1.31.2.2 skrll return (ENOMEM);
1272 1.31.2.2 skrll }
1273 1.31.2.2 skrll error = copyout(fp, where, sizeof(struct file));
1274 1.31.2.2 skrll if (error)
1275 1.31.2.2 skrll return (error);
1276 1.31.2.2 skrll buflen -= sizeof(struct file);
1277 1.31.2.2 skrll where += sizeof(struct file);
1278 1.31.2.2 skrll }
1279 1.31.2.2 skrll *oldlenp = where - start;
1280 1.31.2.2 skrll return (0);
1281 1.31.2.2 skrll }
1282 1.31.2.2 skrll
1283 1.31.2.2 skrll /*
1284 1.31.2.2 skrll * sysctl helper routine for kern.autonicetime and kern.autoniceval.
1285 1.31.2.2 skrll * asserts that the assigned value is in the correct range.
1286 1.31.2.2 skrll */
1287 1.31.2.2 skrll static int
1288 1.31.2.2 skrll sysctl_kern_autonice(SYSCTLFN_ARGS)
1289 1.31.2.2 skrll {
1290 1.31.2.2 skrll int error, t = 0;
1291 1.31.2.2 skrll struct sysctlnode node;
1292 1.31.2.2 skrll
1293 1.31.2.2 skrll node = *rnode;
1294 1.31.2.2 skrll t = *(int*)node.sysctl_data;
1295 1.31.2.2 skrll node.sysctl_data = &t;
1296 1.31.2.2 skrll error = sysctl_lookup(SYSCTLFN_CALL(&node));
1297 1.31.2.2 skrll if (error || newp == NULL)
1298 1.31.2.2 skrll return (error);
1299 1.31.2.2 skrll
1300 1.31.2.2 skrll switch (node.sysctl_num) {
1301 1.31.2.2 skrll case KERN_AUTONICETIME:
1302 1.31.2.2 skrll if (t >= 0)
1303 1.31.2.2 skrll autonicetime = t;
1304 1.31.2.2 skrll break;
1305 1.31.2.2 skrll case KERN_AUTONICEVAL:
1306 1.31.2.2 skrll if (t < PRIO_MIN)
1307 1.31.2.2 skrll t = PRIO_MIN;
1308 1.31.2.2 skrll else if (t > PRIO_MAX)
1309 1.31.2.2 skrll t = PRIO_MAX;
1310 1.31.2.2 skrll autoniceval = t;
1311 1.31.2.2 skrll break;
1312 1.31.2.2 skrll }
1313 1.31.2.2 skrll
1314 1.31.2.2 skrll return (0);
1315 1.31.2.2 skrll }
1316 1.31.2.2 skrll
1317 1.31.2.2 skrll /*
1318 1.31.2.2 skrll * sysctl helper routine for kern.msgbufsize and kern.msgbuf. for the
1319 1.31.2.2 skrll * former it merely checks the message buffer is set up. for the latter,
1320 1.31.2.2 skrll * it also copies out the data if necessary.
1321 1.31.2.2 skrll */
1322 1.31.2.2 skrll static int
1323 1.31.2.2 skrll sysctl_msgbuf(SYSCTLFN_ARGS)
1324 1.31.2.2 skrll {
1325 1.31.2.2 skrll char *where = oldp;
1326 1.31.2.2 skrll size_t len, maxlen;
1327 1.31.2.2 skrll long beg, end;
1328 1.31.2.2 skrll int error;
1329 1.31.2.2 skrll
1330 1.31.2.2 skrll if (!msgbufenabled || msgbufp->msg_magic != MSG_MAGIC) {
1331 1.31.2.2 skrll msgbufenabled = 0;
1332 1.31.2.2 skrll return (ENXIO);
1333 1.31.2.2 skrll }
1334 1.31.2.2 skrll
1335 1.31.2.2 skrll switch (rnode->sysctl_num) {
1336 1.31.2.2 skrll case KERN_MSGBUFSIZE: {
1337 1.31.2.2 skrll struct sysctlnode node = *rnode;
1338 1.31.2.2 skrll int msg_bufs = (int)msgbufp->msg_bufs;
1339 1.31.2.2 skrll node.sysctl_data = &msg_bufs;
1340 1.31.2.2 skrll return (sysctl_lookup(SYSCTLFN_CALL(&node)));
1341 1.31.2.2 skrll }
1342 1.31.2.2 skrll case KERN_MSGBUF:
1343 1.31.2.2 skrll break;
1344 1.31.2.2 skrll default:
1345 1.31.2.2 skrll return (EOPNOTSUPP);
1346 1.31.2.2 skrll }
1347 1.31.2.2 skrll
1348 1.31.2.2 skrll if (newp != NULL)
1349 1.31.2.2 skrll return (EPERM);
1350 1.31.2.2 skrll
1351 1.31.2.2 skrll if (oldp == NULL) {
1352 1.31.2.2 skrll /* always return full buffer size */
1353 1.31.2.2 skrll *oldlenp = msgbufp->msg_bufs;
1354 1.31.2.2 skrll return (0);
1355 1.31.2.2 skrll }
1356 1.31.2.2 skrll
1357 1.31.2.2 skrll error = 0;
1358 1.31.2.2 skrll maxlen = MIN(msgbufp->msg_bufs, *oldlenp);
1359 1.31.2.2 skrll
1360 1.31.2.2 skrll /*
1361 1.31.2.2 skrll * First, copy from the write pointer to the end of
1362 1.31.2.2 skrll * message buffer.
1363 1.31.2.2 skrll */
1364 1.31.2.2 skrll beg = msgbufp->msg_bufx;
1365 1.31.2.2 skrll end = msgbufp->msg_bufs;
1366 1.31.2.2 skrll while (maxlen > 0) {
1367 1.31.2.2 skrll len = MIN(end - beg, maxlen);
1368 1.31.2.2 skrll if (len == 0)
1369 1.31.2.2 skrll break;
1370 1.31.2.2 skrll error = copyout(&msgbufp->msg_bufc[beg], where, len);
1371 1.31.2.2 skrll if (error)
1372 1.31.2.2 skrll break;
1373 1.31.2.2 skrll where += len;
1374 1.31.2.2 skrll maxlen -= len;
1375 1.31.2.2 skrll
1376 1.31.2.2 skrll /*
1377 1.31.2.2 skrll * ... then, copy from the beginning of message buffer to
1378 1.31.2.2 skrll * the write pointer.
1379 1.31.2.2 skrll */
1380 1.31.2.2 skrll beg = 0;
1381 1.31.2.2 skrll end = msgbufp->msg_bufx;
1382 1.31.2.2 skrll }
1383 1.31.2.2 skrll
1384 1.31.2.2 skrll return (error);
1385 1.31.2.2 skrll }
1386 1.31.2.2 skrll
1387 1.31.2.2 skrll /*
1388 1.31.2.2 skrll * sysctl helper routine for kern.defcorename. in the case of a new
1389 1.31.2.2 skrll * string being assigned, check that it's not a zero-length string.
1390 1.31.2.2 skrll * (XXX the check in -current doesn't work, but do we really care?)
1391 1.31.2.2 skrll */
1392 1.31.2.2 skrll static int
1393 1.31.2.2 skrll sysctl_kern_defcorename(SYSCTLFN_ARGS)
1394 1.31.2.2 skrll {
1395 1.31.2.2 skrll int error;
1396 1.31.2.2 skrll char newcorename[MAXPATHLEN];
1397 1.31.2.2 skrll struct sysctlnode node;
1398 1.31.2.2 skrll
1399 1.31.2.2 skrll node = *rnode;
1400 1.31.2.2 skrll node.sysctl_data = &newcorename[0];
1401 1.31.2.2 skrll memcpy(node.sysctl_data, rnode->sysctl_data, MAXPATHLEN);
1402 1.31.2.2 skrll error = sysctl_lookup(SYSCTLFN_CALL(&node));
1403 1.31.2.2 skrll if (error || newp == NULL)
1404 1.31.2.2 skrll return (error);
1405 1.31.2.2 skrll
1406 1.31.2.2 skrll /*
1407 1.31.2.2 skrll * when sysctl_lookup() deals with a string, it's guaranteed
1408 1.31.2.2 skrll * to come back nul terminated. so there. :)
1409 1.31.2.2 skrll */
1410 1.31.2.2 skrll if (strlen(newcorename) == 0)
1411 1.31.2.2 skrll return (EINVAL);
1412 1.31.2.2 skrll
1413 1.31.2.2 skrll memcpy(rnode->sysctl_data, node.sysctl_data, MAXPATHLEN);
1414 1.31.2.2 skrll
1415 1.31.2.2 skrll return (0);
1416 1.31.2.2 skrll }
1417 1.31.2.2 skrll
1418 1.31.2.2 skrll /*
1419 1.31.2.2 skrll * sysctl helper routine for kern.cp_time node. adds up cpu time
1420 1.31.2.2 skrll * across all cpus.
1421 1.31.2.2 skrll */
1422 1.31.2.2 skrll static int
1423 1.31.2.2 skrll sysctl_kern_cptime(SYSCTLFN_ARGS)
1424 1.31.2.2 skrll {
1425 1.31.2.2 skrll struct sysctlnode node = *rnode;
1426 1.31.2.2 skrll
1427 1.31.2.2 skrll #ifndef MULTIPROCESSOR
1428 1.31.2.2 skrll
1429 1.31.2.2 skrll if (namelen == 1) {
1430 1.31.2.2 skrll if (name[0] != 0)
1431 1.31.2.2 skrll return (ENOENT);
1432 1.31.2.2 skrll /*
1433 1.31.2.2 skrll * you're allowed to ask for the zero'th processor
1434 1.31.2.2 skrll */
1435 1.31.2.2 skrll name++;
1436 1.31.2.2 skrll namelen--;
1437 1.31.2.2 skrll }
1438 1.31.2.2 skrll node.sysctl_data = curcpu()->ci_schedstate.spc_cp_time;
1439 1.31.2.2 skrll node.sysctl_size = sizeof(curcpu()->ci_schedstate.spc_cp_time);
1440 1.31.2.2 skrll return (sysctl_lookup(SYSCTLFN_CALL(&node)));
1441 1.31.2.2 skrll
1442 1.31.2.2 skrll #else /* MULTIPROCESSOR */
1443 1.31.2.2 skrll
1444 1.31.2.2 skrll u_int64_t *cp_time = NULL;
1445 1.31.2.2 skrll int error, n = sysctl_ncpus(), i;
1446 1.31.2.2 skrll struct cpu_info *ci;
1447 1.31.2.2 skrll CPU_INFO_ITERATOR cii;
1448 1.31.2.2 skrll
1449 1.31.2.2 skrll /*
1450 1.31.2.2 skrll * if you specifically pass a buffer that is the size of the
1451 1.31.2.2 skrll * sum, or if you are probing for the size, you get the "sum"
1452 1.31.2.2 skrll * of cp_time (and the size thereof) across all processors.
1453 1.31.2.2 skrll *
1454 1.31.2.2 skrll * alternately, you can pass an additional mib number and get
1455 1.31.2.2 skrll * cp_time for that particular processor.
1456 1.31.2.2 skrll */
1457 1.31.2.2 skrll switch (namelen) {
1458 1.31.2.2 skrll case 0:
1459 1.31.2.2 skrll if (*oldlenp == sizeof(u_int64_t) * CPUSTATES || oldp == NULL) {
1460 1.31.2.2 skrll node.sysctl_size = sizeof(u_int64_t) * CPUSTATES;
1461 1.31.2.2 skrll n = -1; /* SUM */
1462 1.31.2.2 skrll }
1463 1.31.2.2 skrll else {
1464 1.31.2.2 skrll node.sysctl_size = n * sizeof(u_int64_t) * CPUSTATES;
1465 1.31.2.2 skrll n = -2; /* ALL */
1466 1.31.2.2 skrll }
1467 1.31.2.2 skrll break;
1468 1.31.2.2 skrll case 1:
1469 1.31.2.2 skrll if (name[0] < 0 || name[0] >= n)
1470 1.31.2.2 skrll return (ENOENT); /* ENOSUCHPROCESSOR */
1471 1.31.2.2 skrll node.sysctl_size = sizeof(u_int64_t) * CPUSTATES;
1472 1.31.2.2 skrll n = name[0];
1473 1.31.2.2 skrll /*
1474 1.31.2.2 skrll * adjust these so that sysctl_lookup() will be happy
1475 1.31.2.2 skrll */
1476 1.31.2.2 skrll name++;
1477 1.31.2.2 skrll namelen--;
1478 1.31.2.2 skrll break;
1479 1.31.2.2 skrll default:
1480 1.31.2.2 skrll return (EINVAL);
1481 1.31.2.2 skrll }
1482 1.31.2.2 skrll
1483 1.31.2.2 skrll cp_time = malloc(node.sysctl_size, M_TEMP, M_WAITOK|M_CANFAIL);
1484 1.31.2.2 skrll if (cp_time == NULL)
1485 1.31.2.2 skrll return (ENOMEM);
1486 1.31.2.2 skrll node.sysctl_data = cp_time;
1487 1.31.2.2 skrll memset(cp_time, 0, node.sysctl_size);
1488 1.31.2.2 skrll
1489 1.31.2.2 skrll for (CPU_INFO_FOREACH(cii, ci)) {
1490 1.31.2.2 skrll if (n <= 0)
1491 1.31.2.2 skrll for (i = 0; i < CPUSTATES; i++)
1492 1.31.2.2 skrll cp_time[i] += ci->ci_schedstate.spc_cp_time[i];
1493 1.31.2.2 skrll /*
1494 1.31.2.2 skrll * if a specific processor was requested and we just
1495 1.31.2.2 skrll * did it, we're done here
1496 1.31.2.2 skrll */
1497 1.31.2.2 skrll if (n == 0)
1498 1.31.2.2 skrll break;
1499 1.31.2.2 skrll /*
1500 1.31.2.2 skrll * if doing "all", skip to next cp_time set for next processor
1501 1.31.2.2 skrll */
1502 1.31.2.2 skrll if (n == -2)
1503 1.31.2.2 skrll cp_time += CPUSTATES;
1504 1.31.2.2 skrll /*
1505 1.31.2.2 skrll * if we're doing a specific processor, we're one
1506 1.31.2.2 skrll * processor closer
1507 1.31.2.2 skrll */
1508 1.31.2.2 skrll if (n > 0)
1509 1.31.2.2 skrll n--;
1510 1.31.2.2 skrll }
1511 1.31.2.2 skrll
1512 1.31.2.2 skrll error = sysctl_lookup(SYSCTLFN_CALL(&node));
1513 1.31.2.2 skrll free(node.sysctl_data, M_TEMP);
1514 1.31.2.2 skrll return (error);
1515 1.31.2.2 skrll
1516 1.31.2.2 skrll #endif /* MULTIPROCESSOR */
1517 1.31.2.2 skrll }
1518 1.31.2.2 skrll
1519 1.31.2.2 skrll #if defined(SYSVMSG) || defined(SYSVSEM) || defined(SYSVSHM)
1520 1.31.2.2 skrll /*
1521 1.31.2.2 skrll * sysctl helper routine for kern.sysvipc_info subtree.
1522 1.31.2.2 skrll */
1523 1.31.2.2 skrll
1524 1.31.2.2 skrll #define FILL_PERM(src, dst) do { \
1525 1.31.2.2 skrll (dst)._key = (src)._key; \
1526 1.31.2.2 skrll (dst).uid = (src).uid; \
1527 1.31.2.2 skrll (dst).gid = (src).gid; \
1528 1.31.2.2 skrll (dst).cuid = (src).cuid; \
1529 1.31.2.2 skrll (dst).cgid = (src).cgid; \
1530 1.31.2.2 skrll (dst).mode = (src).mode; \
1531 1.31.2.2 skrll (dst)._seq = (src)._seq; \
1532 1.31.2.2 skrll } while (/*CONSTCOND*/ 0);
1533 1.31.2.2 skrll #define FILL_MSG(src, dst) do { \
1534 1.31.2.2 skrll FILL_PERM((src).msg_perm, (dst).msg_perm); \
1535 1.31.2.2 skrll (dst).msg_qnum = (src).msg_qnum; \
1536 1.31.2.2 skrll (dst).msg_qbytes = (src).msg_qbytes; \
1537 1.31.2.2 skrll (dst)._msg_cbytes = (src)._msg_cbytes; \
1538 1.31.2.2 skrll (dst).msg_lspid = (src).msg_lspid; \
1539 1.31.2.2 skrll (dst).msg_lrpid = (src).msg_lrpid; \
1540 1.31.2.2 skrll (dst).msg_stime = (src).msg_stime; \
1541 1.31.2.2 skrll (dst).msg_rtime = (src).msg_rtime; \
1542 1.31.2.2 skrll (dst).msg_ctime = (src).msg_ctime; \
1543 1.31.2.2 skrll } while (/*CONSTCOND*/ 0)
1544 1.31.2.2 skrll #define FILL_SEM(src, dst) do { \
1545 1.31.2.2 skrll FILL_PERM((src).sem_perm, (dst).sem_perm); \
1546 1.31.2.2 skrll (dst).sem_nsems = (src).sem_nsems; \
1547 1.31.2.2 skrll (dst).sem_otime = (src).sem_otime; \
1548 1.31.2.2 skrll (dst).sem_ctime = (src).sem_ctime; \
1549 1.31.2.2 skrll } while (/*CONSTCOND*/ 0)
1550 1.31.2.2 skrll #define FILL_SHM(src, dst) do { \
1551 1.31.2.2 skrll FILL_PERM((src).shm_perm, (dst).shm_perm); \
1552 1.31.2.2 skrll (dst).shm_segsz = (src).shm_segsz; \
1553 1.31.2.2 skrll (dst).shm_lpid = (src).shm_lpid; \
1554 1.31.2.2 skrll (dst).shm_cpid = (src).shm_cpid; \
1555 1.31.2.2 skrll (dst).shm_atime = (src).shm_atime; \
1556 1.31.2.2 skrll (dst).shm_dtime = (src).shm_dtime; \
1557 1.31.2.2 skrll (dst).shm_ctime = (src).shm_ctime; \
1558 1.31.2.2 skrll (dst).shm_nattch = (src).shm_nattch; \
1559 1.31.2.2 skrll } while (/*CONSTCOND*/ 0)
1560 1.31.2.2 skrll
1561 1.31.2.2 skrll static int
1562 1.31.2.2 skrll sysctl_kern_sysvipc(SYSCTLFN_ARGS)
1563 1.31.2.2 skrll {
1564 1.31.2.2 skrll void *where = oldp;
1565 1.31.2.2 skrll size_t *sizep = oldlenp;
1566 1.31.2.2 skrll #ifdef SYSVMSG
1567 1.31.2.2 skrll struct msg_sysctl_info *msgsi = NULL;
1568 1.31.2.2 skrll #endif
1569 1.31.2.2 skrll #ifdef SYSVSEM
1570 1.31.2.2 skrll struct sem_sysctl_info *semsi = NULL;
1571 1.31.2.2 skrll #endif
1572 1.31.2.2 skrll #ifdef SYSVSHM
1573 1.31.2.2 skrll struct shm_sysctl_info *shmsi = NULL;
1574 1.31.2.2 skrll #endif
1575 1.31.2.2 skrll size_t infosize, dssize, tsize, buflen;
1576 1.31.2.8 skrll void *bf = NULL;
1577 1.31.2.2 skrll char *start;
1578 1.31.2.2 skrll int32_t nds;
1579 1.31.2.2 skrll int i, error, ret;
1580 1.31.2.2 skrll
1581 1.31.2.2 skrll if (namelen != 1)
1582 1.31.2.2 skrll return (EINVAL);
1583 1.31.2.2 skrll
1584 1.31.2.2 skrll start = where;
1585 1.31.2.2 skrll buflen = *sizep;
1586 1.31.2.2 skrll
1587 1.31.2.2 skrll switch (*name) {
1588 1.31.2.2 skrll case KERN_SYSVIPC_MSG_INFO:
1589 1.31.2.2 skrll #ifdef SYSVMSG
1590 1.31.2.2 skrll infosize = sizeof(msgsi->msginfo);
1591 1.31.2.2 skrll nds = msginfo.msgmni;
1592 1.31.2.2 skrll dssize = sizeof(msgsi->msgids[0]);
1593 1.31.2.2 skrll break;
1594 1.31.2.2 skrll #else
1595 1.31.2.2 skrll return (EINVAL);
1596 1.31.2.2 skrll #endif
1597 1.31.2.2 skrll case KERN_SYSVIPC_SEM_INFO:
1598 1.31.2.2 skrll #ifdef SYSVSEM
1599 1.31.2.2 skrll infosize = sizeof(semsi->seminfo);
1600 1.31.2.2 skrll nds = seminfo.semmni;
1601 1.31.2.2 skrll dssize = sizeof(semsi->semids[0]);
1602 1.31.2.2 skrll break;
1603 1.31.2.2 skrll #else
1604 1.31.2.2 skrll return (EINVAL);
1605 1.31.2.2 skrll #endif
1606 1.31.2.2 skrll case KERN_SYSVIPC_SHM_INFO:
1607 1.31.2.2 skrll #ifdef SYSVSHM
1608 1.31.2.2 skrll infosize = sizeof(shmsi->shminfo);
1609 1.31.2.2 skrll nds = shminfo.shmmni;
1610 1.31.2.2 skrll dssize = sizeof(shmsi->shmids[0]);
1611 1.31.2.2 skrll break;
1612 1.31.2.2 skrll #else
1613 1.31.2.2 skrll return (EINVAL);
1614 1.31.2.2 skrll #endif
1615 1.31.2.2 skrll default:
1616 1.31.2.2 skrll return (EINVAL);
1617 1.31.2.2 skrll }
1618 1.31.2.2 skrll /*
1619 1.31.2.2 skrll * Round infosize to 64 bit boundary if requesting more than just
1620 1.31.2.2 skrll * the info structure or getting the total data size.
1621 1.31.2.2 skrll */
1622 1.31.2.2 skrll if (where == NULL || *sizep > infosize)
1623 1.31.2.2 skrll infosize = ((infosize + 7) / 8) * 8;
1624 1.31.2.2 skrll tsize = infosize + nds * dssize;
1625 1.31.2.2 skrll
1626 1.31.2.2 skrll /* Return just the total size required. */
1627 1.31.2.2 skrll if (where == NULL) {
1628 1.31.2.2 skrll *sizep = tsize;
1629 1.31.2.2 skrll return (0);
1630 1.31.2.2 skrll }
1631 1.31.2.2 skrll
1632 1.31.2.2 skrll /* Not enough room for even the info struct. */
1633 1.31.2.2 skrll if (buflen < infosize) {
1634 1.31.2.2 skrll *sizep = 0;
1635 1.31.2.2 skrll return (ENOMEM);
1636 1.31.2.2 skrll }
1637 1.31.2.8 skrll bf = malloc(min(tsize, buflen), M_TEMP, M_WAITOK);
1638 1.31.2.8 skrll memset(bf, 0, min(tsize, buflen));
1639 1.31.2.2 skrll
1640 1.31.2.2 skrll switch (*name) {
1641 1.31.2.2 skrll #ifdef SYSVMSG
1642 1.31.2.2 skrll case KERN_SYSVIPC_MSG_INFO:
1643 1.31.2.8 skrll msgsi = (struct msg_sysctl_info *)bf;
1644 1.31.2.2 skrll msgsi->msginfo = msginfo;
1645 1.31.2.2 skrll break;
1646 1.31.2.2 skrll #endif
1647 1.31.2.2 skrll #ifdef SYSVSEM
1648 1.31.2.2 skrll case KERN_SYSVIPC_SEM_INFO:
1649 1.31.2.8 skrll semsi = (struct sem_sysctl_info *)bf;
1650 1.31.2.2 skrll semsi->seminfo = seminfo;
1651 1.31.2.2 skrll break;
1652 1.31.2.2 skrll #endif
1653 1.31.2.2 skrll #ifdef SYSVSHM
1654 1.31.2.2 skrll case KERN_SYSVIPC_SHM_INFO:
1655 1.31.2.8 skrll shmsi = (struct shm_sysctl_info *)bf;
1656 1.31.2.2 skrll shmsi->shminfo = shminfo;
1657 1.31.2.2 skrll break;
1658 1.31.2.2 skrll #endif
1659 1.31.2.2 skrll }
1660 1.31.2.2 skrll buflen -= infosize;
1661 1.31.2.2 skrll
1662 1.31.2.2 skrll ret = 0;
1663 1.31.2.2 skrll if (buflen > 0) {
1664 1.31.2.2 skrll /* Fill in the IPC data structures. */
1665 1.31.2.2 skrll for (i = 0; i < nds; i++) {
1666 1.31.2.2 skrll if (buflen < dssize) {
1667 1.31.2.2 skrll ret = ENOMEM;
1668 1.31.2.2 skrll break;
1669 1.31.2.2 skrll }
1670 1.31.2.2 skrll switch (*name) {
1671 1.31.2.2 skrll #ifdef SYSVMSG
1672 1.31.2.2 skrll case KERN_SYSVIPC_MSG_INFO:
1673 1.31.2.2 skrll FILL_MSG(msqids[i], msgsi->msgids[i]);
1674 1.31.2.2 skrll break;
1675 1.31.2.2 skrll #endif
1676 1.31.2.2 skrll #ifdef SYSVSEM
1677 1.31.2.2 skrll case KERN_SYSVIPC_SEM_INFO:
1678 1.31.2.2 skrll FILL_SEM(sema[i], semsi->semids[i]);
1679 1.31.2.2 skrll break;
1680 1.31.2.2 skrll #endif
1681 1.31.2.2 skrll #ifdef SYSVSHM
1682 1.31.2.2 skrll case KERN_SYSVIPC_SHM_INFO:
1683 1.31.2.2 skrll FILL_SHM(shmsegs[i], shmsi->shmids[i]);
1684 1.31.2.2 skrll break;
1685 1.31.2.2 skrll #endif
1686 1.31.2.2 skrll }
1687 1.31.2.2 skrll buflen -= dssize;
1688 1.31.2.2 skrll }
1689 1.31.2.2 skrll }
1690 1.31.2.2 skrll *sizep -= buflen;
1691 1.31.2.8 skrll error = copyout(bf, start, *sizep);
1692 1.31.2.2 skrll /* If copyout succeeded, use return code set earlier. */
1693 1.31.2.2 skrll if (error == 0)
1694 1.31.2.2 skrll error = ret;
1695 1.31.2.8 skrll if (bf)
1696 1.31.2.8 skrll free(bf, M_TEMP);
1697 1.31.2.2 skrll return (error);
1698 1.31.2.2 skrll }
1699 1.31.2.2 skrll
1700 1.31.2.2 skrll #undef FILL_PERM
1701 1.31.2.2 skrll #undef FILL_MSG
1702 1.31.2.2 skrll #undef FILL_SEM
1703 1.31.2.2 skrll #undef FILL_SHM
1704 1.31.2.2 skrll
1705 1.31.2.2 skrll #endif /* defined(SYSVMSG) || defined(SYSVSEM) || defined(SYSVSHM) */
1706 1.31.2.2 skrll
1707 1.31.2.2 skrll #if NPTY > 0
1708 1.31.2.2 skrll /*
1709 1.31.2.2 skrll * sysctl helper routine for kern.maxptys. ensures that any new value
1710 1.31.2.2 skrll * is acceptable to the pty subsystem.
1711 1.31.2.2 skrll */
1712 1.31.2.2 skrll static int
1713 1.31.2.2 skrll sysctl_kern_maxptys(SYSCTLFN_ARGS)
1714 1.31.2.2 skrll {
1715 1.31.2.2 skrll int pty_maxptys(int, int); /* defined in kern/tty_pty.c */
1716 1.31.2.8 skrll int error, xmax;
1717 1.31.2.2 skrll struct sysctlnode node;
1718 1.31.2.2 skrll
1719 1.31.2.2 skrll /* get current value of maxptys */
1720 1.31.2.8 skrll xmax = pty_maxptys(0, 0);
1721 1.31.2.2 skrll
1722 1.31.2.2 skrll node = *rnode;
1723 1.31.2.8 skrll node.sysctl_data = &xmax;
1724 1.31.2.2 skrll error = sysctl_lookup(SYSCTLFN_CALL(&node));
1725 1.31.2.2 skrll if (error || newp == NULL)
1726 1.31.2.2 skrll return (error);
1727 1.31.2.6 skrll
1728 1.31.2.8 skrll if (xmax != pty_maxptys(xmax, 1))
1729 1.31.2.2 skrll return (EINVAL);
1730 1.31.2.2 skrll
1731 1.31.2.2 skrll return (0);
1732 1.31.2.2 skrll }
1733 1.31.2.2 skrll #endif /* NPTY > 0 */
1734 1.31.2.2 skrll
1735 1.31.2.2 skrll /*
1736 1.31.2.2 skrll * sysctl helper routine for kern.sbmax. basically just ensures that
1737 1.31.2.2 skrll * any new value is not too small.
1738 1.31.2.2 skrll */
1739 1.31.2.2 skrll static int
1740 1.31.2.2 skrll sysctl_kern_sbmax(SYSCTLFN_ARGS)
1741 1.31.2.2 skrll {
1742 1.31.2.2 skrll int error, new_sbmax;
1743 1.31.2.2 skrll struct sysctlnode node;
1744 1.31.2.2 skrll
1745 1.31.2.2 skrll new_sbmax = sb_max;
1746 1.31.2.2 skrll node = *rnode;
1747 1.31.2.2 skrll node.sysctl_data = &new_sbmax;
1748 1.31.2.2 skrll error = sysctl_lookup(SYSCTLFN_CALL(&node));
1749 1.31.2.2 skrll if (error || newp == NULL)
1750 1.31.2.2 skrll return (error);
1751 1.31.2.2 skrll
1752 1.31.2.2 skrll error = sb_max_set(new_sbmax);
1753 1.31.2.2 skrll
1754 1.31.2.2 skrll return (error);
1755 1.31.2.2 skrll }
1756 1.31.2.2 skrll
1757 1.31.2.2 skrll /*
1758 1.31.2.2 skrll * sysctl helper routine for kern.urandom node. picks a random number
1759 1.31.2.2 skrll * for you.
1760 1.31.2.2 skrll */
1761 1.31.2.2 skrll static int
1762 1.31.2.2 skrll sysctl_kern_urnd(SYSCTLFN_ARGS)
1763 1.31.2.2 skrll {
1764 1.31.2.2 skrll #if NRND > 0
1765 1.31.2.2 skrll int v;
1766 1.31.2.2 skrll
1767 1.31.2.2 skrll if (rnd_extract_data(&v, sizeof(v), RND_EXTRACT_ANY) == sizeof(v)) {
1768 1.31.2.2 skrll struct sysctlnode node = *rnode;
1769 1.31.2.2 skrll node.sysctl_data = &v;
1770 1.31.2.2 skrll return (sysctl_lookup(SYSCTLFN_CALL(&node)));
1771 1.31.2.2 skrll }
1772 1.31.2.2 skrll else
1773 1.31.2.2 skrll return (EIO); /*XXX*/
1774 1.31.2.2 skrll #else
1775 1.31.2.2 skrll return (EOPNOTSUPP);
1776 1.31.2.2 skrll #endif
1777 1.31.2.2 skrll }
1778 1.31.2.2 skrll
1779 1.31.2.2 skrll /*
1780 1.31.2.2 skrll * sysctl helper routine to do kern.lwp.* work.
1781 1.31.2.2 skrll */
1782 1.31.2.2 skrll static int
1783 1.31.2.2 skrll sysctl_kern_lwp(SYSCTLFN_ARGS)
1784 1.31.2.2 skrll {
1785 1.31.2.2 skrll struct kinfo_lwp klwp;
1786 1.31.2.2 skrll struct proc *p;
1787 1.31.2.2 skrll struct lwp *l2;
1788 1.31.2.2 skrll char *where, *dp;
1789 1.31.2.2 skrll int pid, elem_size, elem_count;
1790 1.31.2.2 skrll int buflen, needed, error;
1791 1.31.2.2 skrll
1792 1.31.2.2 skrll if (namelen == 1 && name[0] == CTL_QUERY)
1793 1.31.2.2 skrll return (sysctl_query(SYSCTLFN_CALL(rnode)));
1794 1.31.2.2 skrll
1795 1.31.2.2 skrll dp = where = oldp;
1796 1.31.2.2 skrll buflen = where != NULL ? *oldlenp : 0;
1797 1.31.2.2 skrll error = needed = 0;
1798 1.31.2.2 skrll
1799 1.31.2.2 skrll if (newp != NULL || namelen != 3)
1800 1.31.2.2 skrll return (EINVAL);
1801 1.31.2.2 skrll pid = name[0];
1802 1.31.2.2 skrll elem_size = name[1];
1803 1.31.2.2 skrll elem_count = name[2];
1804 1.31.2.2 skrll
1805 1.31.2.2 skrll p = pfind(pid);
1806 1.31.2.2 skrll if (p == NULL)
1807 1.31.2.2 skrll return (ESRCH);
1808 1.31.2.2 skrll LIST_FOREACH(l2, &p->p_lwps, l_sibling) {
1809 1.31.2.2 skrll if (buflen >= elem_size && elem_count > 0) {
1810 1.31.2.2 skrll fill_lwp(l2, &klwp);
1811 1.31.2.2 skrll /*
1812 1.31.2.2 skrll * Copy out elem_size, but not larger than
1813 1.31.2.2 skrll * the size of a struct kinfo_proc2.
1814 1.31.2.2 skrll */
1815 1.31.2.2 skrll error = copyout(&klwp, dp,
1816 1.31.2.2 skrll min(sizeof(klwp), elem_size));
1817 1.31.2.2 skrll if (error)
1818 1.31.2.2 skrll goto cleanup;
1819 1.31.2.2 skrll dp += elem_size;
1820 1.31.2.2 skrll buflen -= elem_size;
1821 1.31.2.2 skrll elem_count--;
1822 1.31.2.2 skrll }
1823 1.31.2.2 skrll needed += elem_size;
1824 1.31.2.2 skrll }
1825 1.31.2.2 skrll
1826 1.31.2.2 skrll if (where != NULL) {
1827 1.31.2.2 skrll *oldlenp = dp - where;
1828 1.31.2.2 skrll if (needed > *oldlenp)
1829 1.31.2.2 skrll return (ENOMEM);
1830 1.31.2.2 skrll } else {
1831 1.31.2.2 skrll needed += KERN_LWPSLOP;
1832 1.31.2.2 skrll *oldlenp = needed;
1833 1.31.2.2 skrll }
1834 1.31.2.2 skrll return (0);
1835 1.31.2.2 skrll cleanup:
1836 1.31.2.2 skrll return (error);
1837 1.31.2.2 skrll }
1838 1.31.2.2 skrll
1839 1.31.2.2 skrll /*
1840 1.31.2.2 skrll * sysctl helper routine for kern.forkfsleep node. ensures that the
1841 1.31.2.2 skrll * given value is not too large or two small, and is at least one
1842 1.31.2.2 skrll * timer tick if not zero.
1843 1.31.2.2 skrll */
1844 1.31.2.2 skrll static int
1845 1.31.2.2 skrll sysctl_kern_forkfsleep(SYSCTLFN_ARGS)
1846 1.31.2.2 skrll {
1847 1.31.2.2 skrll /* userland sees value in ms, internally is in ticks */
1848 1.31.2.2 skrll extern int forkfsleep; /* defined in kern/kern_fork.c */
1849 1.31.2.2 skrll int error, timo, lsleep;
1850 1.31.2.2 skrll struct sysctlnode node;
1851 1.31.2.2 skrll
1852 1.31.2.2 skrll lsleep = forkfsleep * 1000 / hz;
1853 1.31.2.2 skrll node = *rnode;
1854 1.31.2.2 skrll node.sysctl_data = &lsleep;
1855 1.31.2.2 skrll error = sysctl_lookup(SYSCTLFN_CALL(&node));
1856 1.31.2.2 skrll if (error || newp == NULL)
1857 1.31.2.2 skrll return (error);
1858 1.31.2.2 skrll
1859 1.31.2.2 skrll /* refuse negative values, and overly 'long time' */
1860 1.31.2.2 skrll if (lsleep < 0 || lsleep > MAXSLP * 1000)
1861 1.31.2.2 skrll return (EINVAL);
1862 1.31.2.2 skrll
1863 1.31.2.2 skrll timo = mstohz(lsleep);
1864 1.31.2.2 skrll
1865 1.31.2.2 skrll /* if the interval is >0 ms && <1 tick, use 1 tick */
1866 1.31.2.2 skrll if (lsleep != 0 && timo == 0)
1867 1.31.2.2 skrll forkfsleep = 1;
1868 1.31.2.2 skrll else
1869 1.31.2.2 skrll forkfsleep = timo;
1870 1.31.2.2 skrll
1871 1.31.2.2 skrll return (0);
1872 1.31.2.2 skrll }
1873 1.31.2.2 skrll
1874 1.31.2.2 skrll /*
1875 1.31.2.2 skrll * sysctl helper routine for kern.root_partition
1876 1.31.2.2 skrll */
1877 1.31.2.2 skrll static int
1878 1.31.2.2 skrll sysctl_kern_root_partition(SYSCTLFN_ARGS)
1879 1.31.2.2 skrll {
1880 1.31.2.2 skrll int rootpart = DISKPART(rootdev);
1881 1.31.2.2 skrll struct sysctlnode node = *rnode;
1882 1.31.2.2 skrll
1883 1.31.2.2 skrll node.sysctl_data = &rootpart;
1884 1.31.2.2 skrll return (sysctl_lookup(SYSCTLFN_CALL(&node)));
1885 1.31.2.2 skrll }
1886 1.31.2.2 skrll
1887 1.31.2.2 skrll /*
1888 1.31.2.2 skrll * sysctl helper function for kern.drivers
1889 1.31.2.2 skrll */
1890 1.31.2.2 skrll static int
1891 1.31.2.2 skrll sysctl_kern_drivers(SYSCTLFN_ARGS)
1892 1.31.2.2 skrll {
1893 1.31.2.2 skrll int error;
1894 1.31.2.2 skrll size_t buflen;
1895 1.31.2.2 skrll struct kinfo_drivers kd;
1896 1.31.2.2 skrll char *start, *where;
1897 1.31.2.2 skrll const char *dname;
1898 1.31.2.2 skrll int i;
1899 1.31.2.2 skrll extern struct devsw_conv *devsw_conv;
1900 1.31.2.2 skrll extern int max_devsw_convs;
1901 1.31.2.2 skrll
1902 1.31.2.2 skrll if (newp != NULL || namelen != 0)
1903 1.31.2.2 skrll return (EINVAL);
1904 1.31.2.2 skrll
1905 1.31.2.2 skrll start = where = oldp;
1906 1.31.2.2 skrll buflen = *oldlenp;
1907 1.31.2.2 skrll if (where == NULL) {
1908 1.31.2.2 skrll *oldlenp = max_devsw_convs * sizeof kd;
1909 1.31.2.2 skrll return 0;
1910 1.31.2.2 skrll }
1911 1.31.2.2 skrll
1912 1.31.2.2 skrll /*
1913 1.31.2.2 skrll * An array of kinfo_drivers structures
1914 1.31.2.2 skrll */
1915 1.31.2.2 skrll error = 0;
1916 1.31.2.2 skrll for (i = 0; i < max_devsw_convs; i++) {
1917 1.31.2.2 skrll dname = devsw_conv[i].d_name;
1918 1.31.2.2 skrll if (dname == NULL)
1919 1.31.2.2 skrll continue;
1920 1.31.2.2 skrll if (buflen < sizeof kd) {
1921 1.31.2.2 skrll error = ENOMEM;
1922 1.31.2.2 skrll break;
1923 1.31.2.2 skrll }
1924 1.31.2.2 skrll memset(&kd, 0, sizeof(kd));
1925 1.31.2.2 skrll kd.d_bmajor = devsw_conv[i].d_bmajor;
1926 1.31.2.2 skrll kd.d_cmajor = devsw_conv[i].d_cmajor;
1927 1.31.2.2 skrll strlcpy(kd.d_name, dname, sizeof kd.d_name);
1928 1.31.2.2 skrll error = copyout(&kd, where, sizeof kd);
1929 1.31.2.2 skrll if (error != 0)
1930 1.31.2.2 skrll break;
1931 1.31.2.2 skrll buflen -= sizeof kd;
1932 1.31.2.2 skrll where += sizeof kd;
1933 1.31.2.2 skrll }
1934 1.31.2.2 skrll *oldlenp = where - start;
1935 1.31.2.2 skrll return error;
1936 1.31.2.2 skrll }
1937 1.31.2.2 skrll
1938 1.31.2.7 skrll /*
1939 1.31.2.7 skrll * sysctl helper function for kern.file2
1940 1.31.2.7 skrll */
1941 1.31.2.7 skrll static int
1942 1.31.2.7 skrll sysctl_kern_file2(SYSCTLFN_ARGS)
1943 1.31.2.7 skrll {
1944 1.31.2.7 skrll struct proc *p;
1945 1.31.2.7 skrll struct file *fp;
1946 1.31.2.7 skrll struct filedesc *fd;
1947 1.31.2.7 skrll struct kinfo_file kf;
1948 1.31.2.7 skrll char *dp;
1949 1.31.2.7 skrll u_int i, op;
1950 1.31.2.7 skrll size_t len, needed, elem_size, out_size;
1951 1.31.2.7 skrll int error, arg, elem_count;
1952 1.31.2.7 skrll
1953 1.31.2.7 skrll if (namelen == 1 && name[0] == CTL_QUERY)
1954 1.31.2.7 skrll return (sysctl_query(SYSCTLFN_CALL(rnode)));
1955 1.31.2.7 skrll
1956 1.31.2.7 skrll if (namelen != 4)
1957 1.31.2.7 skrll return (EINVAL);
1958 1.31.2.7 skrll
1959 1.31.2.7 skrll error = 0;
1960 1.31.2.7 skrll dp = oldp;
1961 1.31.2.7 skrll len = (oldp != NULL) ? *oldlenp : 0;
1962 1.31.2.7 skrll op = name[0];
1963 1.31.2.7 skrll arg = name[1];
1964 1.31.2.7 skrll elem_size = name[2];
1965 1.31.2.7 skrll elem_count = name[3];
1966 1.31.2.7 skrll out_size = MIN(sizeof(kf), elem_size);
1967 1.31.2.7 skrll needed = 0;
1968 1.31.2.7 skrll
1969 1.31.2.7 skrll if (elem_size < 1 || elem_count < 0)
1970 1.31.2.7 skrll return (EINVAL);
1971 1.31.2.7 skrll
1972 1.31.2.7 skrll switch (op) {
1973 1.31.2.7 skrll case KERN_FILE_BYFILE:
1974 1.31.2.7 skrll /*
1975 1.31.2.7 skrll * doesn't use arg so it must be zero
1976 1.31.2.7 skrll */
1977 1.31.2.7 skrll if (arg != 0)
1978 1.31.2.7 skrll return (EINVAL);
1979 1.31.2.7 skrll LIST_FOREACH(fp, &filehead, f_list) {
1980 1.31.2.8 skrll if (CURTAIN(l->l_proc->p_ucred->cr_uid,
1981 1.31.2.8 skrll fp->f_cred->cr_uid))
1982 1.31.2.8 skrll continue;
1983 1.31.2.7 skrll if (len >= elem_size && elem_count > 0) {
1984 1.31.2.7 skrll fill_file(&kf, fp, NULL, 0);
1985 1.31.2.7 skrll error = copyout(&kf, dp, out_size);
1986 1.31.2.7 skrll if (error)
1987 1.31.2.7 skrll break;
1988 1.31.2.7 skrll dp += elem_size;
1989 1.31.2.7 skrll len -= elem_size;
1990 1.31.2.7 skrll }
1991 1.31.2.7 skrll if (elem_count > 0) {
1992 1.31.2.7 skrll needed += elem_size;
1993 1.31.2.7 skrll if (elem_count != INT_MAX)
1994 1.31.2.7 skrll elem_count--;
1995 1.31.2.7 skrll }
1996 1.31.2.7 skrll }
1997 1.31.2.7 skrll break;
1998 1.31.2.7 skrll case KERN_FILE_BYPID:
1999 1.31.2.7 skrll if (arg < -1)
2000 1.31.2.7 skrll /* -1 means all processes */
2001 1.31.2.7 skrll return (EINVAL);
2002 1.31.2.7 skrll proclist_lock_read();
2003 1.31.2.7 skrll PROCLIST_FOREACH(p, &allproc) {
2004 1.31.2.7 skrll if (p->p_stat == SIDL)
2005 1.31.2.7 skrll /* skip embryonic processes */
2006 1.31.2.7 skrll continue;
2007 1.31.2.8 skrll if (CURTAIN(l->l_proc->p_ucred->cr_uid,
2008 1.31.2.8 skrll p->p_ucred->cr_uid))
2009 1.31.2.8 skrll continue;
2010 1.31.2.7 skrll if (arg > 0 && p->p_pid != arg)
2011 1.31.2.7 skrll /* pick only the one we want */
2012 1.31.2.7 skrll /* XXX want 0 to mean "kernel files" */
2013 1.31.2.7 skrll continue;
2014 1.31.2.7 skrll fd = p->p_fd;
2015 1.31.2.7 skrll for (i = 0; i < fd->fd_nfiles; i++) {
2016 1.31.2.7 skrll fp = fd->fd_ofiles[i];
2017 1.31.2.7 skrll if (fp == NULL || !FILE_IS_USABLE(fp))
2018 1.31.2.7 skrll continue;
2019 1.31.2.7 skrll if (len >= elem_size && elem_count > 0) {
2020 1.31.2.7 skrll fill_file(&kf, fd->fd_ofiles[i],
2021 1.31.2.7 skrll p, i);
2022 1.31.2.7 skrll error = copyout(&kf, dp, out_size);
2023 1.31.2.7 skrll if (error)
2024 1.31.2.7 skrll break;
2025 1.31.2.7 skrll dp += elem_size;
2026 1.31.2.7 skrll len -= elem_size;
2027 1.31.2.7 skrll }
2028 1.31.2.7 skrll if (elem_count > 0) {
2029 1.31.2.7 skrll needed += elem_size;
2030 1.31.2.7 skrll if (elem_count != INT_MAX)
2031 1.31.2.7 skrll elem_count--;
2032 1.31.2.7 skrll }
2033 1.31.2.7 skrll }
2034 1.31.2.7 skrll }
2035 1.31.2.7 skrll proclist_unlock_read();
2036 1.31.2.7 skrll break;
2037 1.31.2.7 skrll default:
2038 1.31.2.7 skrll return (EINVAL);
2039 1.31.2.7 skrll }
2040 1.31.2.7 skrll
2041 1.31.2.7 skrll if (oldp == NULL)
2042 1.31.2.7 skrll needed += KERN_FILESLOP * elem_size;
2043 1.31.2.7 skrll *oldlenp = needed;
2044 1.31.2.7 skrll
2045 1.31.2.7 skrll return (error);
2046 1.31.2.7 skrll }
2047 1.31.2.7 skrll
2048 1.31.2.7 skrll static void
2049 1.31.2.7 skrll fill_file(struct kinfo_file *kp, const struct file *fp, struct proc *p, int i)
2050 1.31.2.7 skrll {
2051 1.31.2.7 skrll
2052 1.31.2.7 skrll memset(kp, 0, sizeof(*kp));
2053 1.31.2.7 skrll
2054 1.31.2.7 skrll kp->ki_fileaddr = PTRTOUINT64(fp);
2055 1.31.2.7 skrll kp->ki_flag = fp->f_flag;
2056 1.31.2.7 skrll kp->ki_iflags = fp->f_iflags;
2057 1.31.2.7 skrll kp->ki_ftype = fp->f_type;
2058 1.31.2.7 skrll kp->ki_count = fp->f_count;
2059 1.31.2.7 skrll kp->ki_msgcount = fp->f_msgcount;
2060 1.31.2.7 skrll kp->ki_usecount = fp->f_usecount;
2061 1.31.2.7 skrll kp->ki_fucred = PTRTOUINT64(fp->f_cred);
2062 1.31.2.7 skrll kp->ki_fuid = fp->f_cred->cr_uid;
2063 1.31.2.7 skrll kp->ki_fgid = fp->f_cred->cr_gid;
2064 1.31.2.7 skrll kp->ki_fops = PTRTOUINT64(fp->f_ops);
2065 1.31.2.7 skrll kp->ki_foffset = fp->f_offset;
2066 1.31.2.7 skrll kp->ki_fdata = PTRTOUINT64(fp->f_data);
2067 1.31.2.7 skrll
2068 1.31.2.7 skrll /* vnode information to glue this file to something */
2069 1.31.2.7 skrll if (fp->f_type == DTYPE_VNODE) {
2070 1.31.2.7 skrll struct vnode *vp = (struct vnode *)fp->f_data;
2071 1.31.2.7 skrll
2072 1.31.2.7 skrll kp->ki_vun = PTRTOUINT64(vp->v_un.vu_socket);
2073 1.31.2.7 skrll kp->ki_vsize = vp->v_size;
2074 1.31.2.7 skrll kp->ki_vtype = vp->v_type;
2075 1.31.2.7 skrll kp->ki_vtag = vp->v_tag;
2076 1.31.2.7 skrll kp->ki_vdata = PTRTOUINT64(vp->v_data);
2077 1.31.2.7 skrll }
2078 1.31.2.7 skrll
2079 1.31.2.7 skrll /* process information when retrieved via KERN_FILE_BYPID */
2080 1.31.2.7 skrll if (p) {
2081 1.31.2.7 skrll kp->ki_pid = p->p_pid;
2082 1.31.2.7 skrll kp->ki_fd = i;
2083 1.31.2.7 skrll kp->ki_ofileflags = p->p_fd->fd_ofileflags[i];
2084 1.31.2.7 skrll }
2085 1.31.2.7 skrll }
2086 1.31.2.7 skrll
2087 1.31.2.2 skrll static int
2088 1.31.2.2 skrll sysctl_doeproc(SYSCTLFN_ARGS)
2089 1.31.2.2 skrll {
2090 1.31.2.2 skrll struct eproc eproc;
2091 1.31.2.2 skrll struct kinfo_proc2 kproc2;
2092 1.31.2.2 skrll struct kinfo_proc *dp;
2093 1.31.2.2 skrll struct proc *p;
2094 1.31.2.2 skrll const struct proclist_desc *pd;
2095 1.31.2.2 skrll char *where, *dp2;
2096 1.31.2.2 skrll int type, op, arg;
2097 1.31.2.2 skrll u_int elem_size, elem_count;
2098 1.31.2.2 skrll size_t buflen, needed;
2099 1.31.2.2 skrll int error;
2100 1.31.2.2 skrll
2101 1.31.2.2 skrll if (namelen == 1 && name[0] == CTL_QUERY)
2102 1.31.2.2 skrll return (sysctl_query(SYSCTLFN_CALL(rnode)));
2103 1.31.2.2 skrll
2104 1.31.2.2 skrll dp = oldp;
2105 1.31.2.2 skrll dp2 = where = oldp;
2106 1.31.2.2 skrll buflen = where != NULL ? *oldlenp : 0;
2107 1.31.2.2 skrll error = 0;
2108 1.31.2.2 skrll needed = 0;
2109 1.31.2.2 skrll type = rnode->sysctl_num;
2110 1.31.2.2 skrll
2111 1.31.2.2 skrll if (type == KERN_PROC) {
2112 1.31.2.2 skrll if (namelen != 2 && !(namelen == 1 && name[0] == KERN_PROC_ALL))
2113 1.31.2.2 skrll return (EINVAL);
2114 1.31.2.2 skrll op = name[0];
2115 1.31.2.2 skrll if (op != KERN_PROC_ALL)
2116 1.31.2.2 skrll arg = name[1];
2117 1.31.2.2 skrll else
2118 1.31.2.2 skrll arg = 0; /* Quell compiler warning */
2119 1.31.2.2 skrll elem_size = elem_count = 0; /* Ditto */
2120 1.31.2.2 skrll } else {
2121 1.31.2.2 skrll if (namelen != 4)
2122 1.31.2.2 skrll return (EINVAL);
2123 1.31.2.2 skrll op = name[0];
2124 1.31.2.2 skrll arg = name[1];
2125 1.31.2.2 skrll elem_size = name[2];
2126 1.31.2.2 skrll elem_count = name[3];
2127 1.31.2.2 skrll }
2128 1.31.2.2 skrll
2129 1.31.2.2 skrll proclist_lock_read();
2130 1.31.2.2 skrll
2131 1.31.2.2 skrll pd = proclists;
2132 1.31.2.2 skrll again:
2133 1.31.2.5 skrll PROCLIST_FOREACH(p, pd->pd_list) {
2134 1.31.2.2 skrll /*
2135 1.31.2.2 skrll * Skip embryonic processes.
2136 1.31.2.2 skrll */
2137 1.31.2.2 skrll if (p->p_stat == SIDL)
2138 1.31.2.2 skrll continue;
2139 1.31.2.8 skrll
2140 1.31.2.8 skrll if (CURTAIN(l->l_proc->p_ucred->cr_uid, p->p_ucred->cr_uid))
2141 1.31.2.8 skrll continue;
2142 1.31.2.8 skrll
2143 1.31.2.2 skrll /*
2144 1.31.2.2 skrll * TODO - make more efficient (see notes below).
2145 1.31.2.2 skrll * do by session.
2146 1.31.2.2 skrll */
2147 1.31.2.2 skrll switch (op) {
2148 1.31.2.2 skrll
2149 1.31.2.2 skrll case KERN_PROC_PID:
2150 1.31.2.2 skrll /* could do this with just a lookup */
2151 1.31.2.2 skrll if (p->p_pid != (pid_t)arg)
2152 1.31.2.2 skrll continue;
2153 1.31.2.2 skrll break;
2154 1.31.2.2 skrll
2155 1.31.2.2 skrll case KERN_PROC_PGRP:
2156 1.31.2.2 skrll /* could do this by traversing pgrp */
2157 1.31.2.2 skrll if (p->p_pgrp->pg_id != (pid_t)arg)
2158 1.31.2.2 skrll continue;
2159 1.31.2.2 skrll break;
2160 1.31.2.2 skrll
2161 1.31.2.2 skrll case KERN_PROC_SESSION:
2162 1.31.2.2 skrll if (p->p_session->s_sid != (pid_t)arg)
2163 1.31.2.2 skrll continue;
2164 1.31.2.2 skrll break;
2165 1.31.2.2 skrll
2166 1.31.2.2 skrll case KERN_PROC_TTY:
2167 1.31.2.2 skrll if (arg == (int) KERN_PROC_TTY_REVOKE) {
2168 1.31.2.2 skrll if ((p->p_flag & P_CONTROLT) == 0 ||
2169 1.31.2.2 skrll p->p_session->s_ttyp == NULL ||
2170 1.31.2.2 skrll p->p_session->s_ttyvp != NULL)
2171 1.31.2.2 skrll continue;
2172 1.31.2.2 skrll } else if ((p->p_flag & P_CONTROLT) == 0 ||
2173 1.31.2.2 skrll p->p_session->s_ttyp == NULL) {
2174 1.31.2.2 skrll if ((dev_t)arg != KERN_PROC_TTY_NODEV)
2175 1.31.2.2 skrll continue;
2176 1.31.2.2 skrll } else if (p->p_session->s_ttyp->t_dev != (dev_t)arg)
2177 1.31.2.2 skrll continue;
2178 1.31.2.2 skrll break;
2179 1.31.2.2 skrll
2180 1.31.2.2 skrll case KERN_PROC_UID:
2181 1.31.2.2 skrll if (p->p_ucred->cr_uid != (uid_t)arg)
2182 1.31.2.2 skrll continue;
2183 1.31.2.2 skrll break;
2184 1.31.2.2 skrll
2185 1.31.2.2 skrll case KERN_PROC_RUID:
2186 1.31.2.2 skrll if (p->p_cred->p_ruid != (uid_t)arg)
2187 1.31.2.2 skrll continue;
2188 1.31.2.2 skrll break;
2189 1.31.2.2 skrll
2190 1.31.2.2 skrll case KERN_PROC_GID:
2191 1.31.2.2 skrll if (p->p_ucred->cr_gid != (uid_t)arg)
2192 1.31.2.2 skrll continue;
2193 1.31.2.2 skrll break;
2194 1.31.2.2 skrll
2195 1.31.2.2 skrll case KERN_PROC_RGID:
2196 1.31.2.2 skrll if (p->p_cred->p_rgid != (uid_t)arg)
2197 1.31.2.2 skrll continue;
2198 1.31.2.2 skrll break;
2199 1.31.2.2 skrll
2200 1.31.2.2 skrll case KERN_PROC_ALL:
2201 1.31.2.2 skrll /* allow everything */
2202 1.31.2.2 skrll break;
2203 1.31.2.2 skrll
2204 1.31.2.2 skrll default:
2205 1.31.2.2 skrll error = EINVAL;
2206 1.31.2.2 skrll goto cleanup;
2207 1.31.2.2 skrll }
2208 1.31.2.2 skrll if (type == KERN_PROC) {
2209 1.31.2.2 skrll if (buflen >= sizeof(struct kinfo_proc)) {
2210 1.31.2.2 skrll fill_eproc(p, &eproc);
2211 1.31.2.2 skrll error = copyout(p, &dp->kp_proc,
2212 1.31.2.2 skrll sizeof(struct proc));
2213 1.31.2.2 skrll if (error)
2214 1.31.2.2 skrll goto cleanup;
2215 1.31.2.2 skrll error = copyout(&eproc, &dp->kp_eproc,
2216 1.31.2.2 skrll sizeof(eproc));
2217 1.31.2.2 skrll if (error)
2218 1.31.2.2 skrll goto cleanup;
2219 1.31.2.2 skrll dp++;
2220 1.31.2.2 skrll buflen -= sizeof(struct kinfo_proc);
2221 1.31.2.2 skrll }
2222 1.31.2.2 skrll needed += sizeof(struct kinfo_proc);
2223 1.31.2.2 skrll } else { /* KERN_PROC2 */
2224 1.31.2.2 skrll if (buflen >= elem_size && elem_count > 0) {
2225 1.31.2.2 skrll fill_kproc2(p, &kproc2);
2226 1.31.2.2 skrll /*
2227 1.31.2.2 skrll * Copy out elem_size, but not larger than
2228 1.31.2.2 skrll * the size of a struct kinfo_proc2.
2229 1.31.2.2 skrll */
2230 1.31.2.2 skrll error = copyout(&kproc2, dp2,
2231 1.31.2.2 skrll min(sizeof(kproc2), elem_size));
2232 1.31.2.2 skrll if (error)
2233 1.31.2.2 skrll goto cleanup;
2234 1.31.2.2 skrll dp2 += elem_size;
2235 1.31.2.2 skrll buflen -= elem_size;
2236 1.31.2.2 skrll elem_count--;
2237 1.31.2.2 skrll }
2238 1.31.2.2 skrll needed += elem_size;
2239 1.31.2.2 skrll }
2240 1.31.2.2 skrll }
2241 1.31.2.2 skrll pd++;
2242 1.31.2.2 skrll if (pd->pd_list != NULL)
2243 1.31.2.2 skrll goto again;
2244 1.31.2.2 skrll proclist_unlock_read();
2245 1.31.2.2 skrll
2246 1.31.2.2 skrll if (where != NULL) {
2247 1.31.2.2 skrll if (type == KERN_PROC)
2248 1.31.2.2 skrll *oldlenp = (char *)dp - where;
2249 1.31.2.2 skrll else
2250 1.31.2.2 skrll *oldlenp = dp2 - where;
2251 1.31.2.2 skrll if (needed > *oldlenp)
2252 1.31.2.2 skrll return (ENOMEM);
2253 1.31.2.2 skrll } else {
2254 1.31.2.2 skrll needed += KERN_PROCSLOP;
2255 1.31.2.2 skrll *oldlenp = needed;
2256 1.31.2.2 skrll }
2257 1.31.2.2 skrll return (0);
2258 1.31.2.2 skrll cleanup:
2259 1.31.2.2 skrll proclist_unlock_read();
2260 1.31.2.2 skrll return (error);
2261 1.31.2.2 skrll }
2262 1.31.2.2 skrll
2263 1.31.2.2 skrll /*
2264 1.31.2.2 skrll * sysctl helper routine for kern.proc_args pseudo-subtree.
2265 1.31.2.2 skrll */
2266 1.31.2.2 skrll static int
2267 1.31.2.2 skrll sysctl_kern_proc_args(SYSCTLFN_ARGS)
2268 1.31.2.2 skrll {
2269 1.31.2.2 skrll struct ps_strings pss;
2270 1.31.2.2 skrll struct proc *p, *up = l->l_proc;
2271 1.31.2.2 skrll size_t len, upper_bound, xlen, i;
2272 1.31.2.2 skrll struct uio auio;
2273 1.31.2.2 skrll struct iovec aiov;
2274 1.31.2.2 skrll vaddr_t argv;
2275 1.31.2.2 skrll pid_t pid;
2276 1.31.2.2 skrll int nargv, type, error;
2277 1.31.2.2 skrll char *arg;
2278 1.31.2.2 skrll char *tmp;
2279 1.31.2.8 skrll struct vmspace *vmspace;
2280 1.31.2.8 skrll vaddr_t psstr_addr;
2281 1.31.2.8 skrll vaddr_t offsetn;
2282 1.31.2.8 skrll vaddr_t offsetv;
2283 1.31.2.2 skrll
2284 1.31.2.2 skrll if (namelen == 1 && name[0] == CTL_QUERY)
2285 1.31.2.2 skrll return (sysctl_query(SYSCTLFN_CALL(rnode)));
2286 1.31.2.2 skrll
2287 1.31.2.2 skrll if (newp != NULL || namelen != 2)
2288 1.31.2.2 skrll return (EINVAL);
2289 1.31.2.2 skrll pid = name[0];
2290 1.31.2.2 skrll type = name[1];
2291 1.31.2.2 skrll
2292 1.31.2.2 skrll switch (type) {
2293 1.31.2.2 skrll case KERN_PROC_ARGV:
2294 1.31.2.2 skrll case KERN_PROC_NARGV:
2295 1.31.2.2 skrll case KERN_PROC_ENV:
2296 1.31.2.2 skrll case KERN_PROC_NENV:
2297 1.31.2.2 skrll /* ok */
2298 1.31.2.2 skrll break;
2299 1.31.2.2 skrll default:
2300 1.31.2.2 skrll return (EINVAL);
2301 1.31.2.2 skrll }
2302 1.31.2.2 skrll
2303 1.31.2.8 skrll proclist_lock_read();
2304 1.31.2.8 skrll
2305 1.31.2.2 skrll /* check pid */
2306 1.31.2.8 skrll if ((p = p_find(pid, PFIND_LOCKED)) == NULL) {
2307 1.31.2.8 skrll error = EINVAL;
2308 1.31.2.8 skrll goto out_locked;
2309 1.31.2.8 skrll }
2310 1.31.2.8 skrll
2311 1.31.2.8 skrll if (CURTAIN(l->l_proc->p_ucred->cr_uid, p->p_ucred->cr_uid)) {
2312 1.31.2.8 skrll error = EPERM;
2313 1.31.2.8 skrll goto out_locked;
2314 1.31.2.8 skrll }
2315 1.31.2.2 skrll
2316 1.31.2.2 skrll /* only root or same user change look at the environment */
2317 1.31.2.2 skrll if (type == KERN_PROC_ENV || type == KERN_PROC_NENV) {
2318 1.31.2.2 skrll if (up->p_ucred->cr_uid != 0) {
2319 1.31.2.2 skrll if (up->p_cred->p_ruid != p->p_cred->p_ruid ||
2320 1.31.2.8 skrll up->p_cred->p_ruid != p->p_cred->p_svuid) {
2321 1.31.2.8 skrll error = EPERM;
2322 1.31.2.8 skrll goto out_locked;
2323 1.31.2.8 skrll }
2324 1.31.2.2 skrll }
2325 1.31.2.2 skrll }
2326 1.31.2.2 skrll
2327 1.31.2.2 skrll if (oldp == NULL) {
2328 1.31.2.2 skrll if (type == KERN_PROC_NARGV || type == KERN_PROC_NENV)
2329 1.31.2.2 skrll *oldlenp = sizeof (int);
2330 1.31.2.2 skrll else
2331 1.31.2.2 skrll *oldlenp = ARG_MAX; /* XXX XXX XXX */
2332 1.31.2.8 skrll error = 0;
2333 1.31.2.8 skrll goto out_locked;
2334 1.31.2.2 skrll }
2335 1.31.2.2 skrll
2336 1.31.2.2 skrll /*
2337 1.31.2.2 skrll * Zombies don't have a stack, so we can't read their psstrings.
2338 1.31.2.2 skrll * System processes also don't have a user stack.
2339 1.31.2.2 skrll */
2340 1.31.2.8 skrll if (P_ZOMBIE(p) || (p->p_flag & P_SYSTEM) != 0) {
2341 1.31.2.8 skrll error = EINVAL;
2342 1.31.2.8 skrll goto out_locked;
2343 1.31.2.8 skrll }
2344 1.31.2.2 skrll
2345 1.31.2.2 skrll /*
2346 1.31.2.2 skrll * Lock the process down in memory.
2347 1.31.2.2 skrll */
2348 1.31.2.2 skrll /* XXXCDC: how should locking work here? */
2349 1.31.2.8 skrll if ((p->p_flag & P_WEXIT) || (p->p_vmspace->vm_refcnt < 1)) {
2350 1.31.2.8 skrll error = EFAULT;
2351 1.31.2.8 skrll goto out_locked;
2352 1.31.2.8 skrll }
2353 1.31.2.2 skrll
2354 1.31.2.8 skrll psstr_addr = (vaddr_t)p->p_psstr;
2355 1.31.2.8 skrll if (type == KERN_PROC_ARGV || type == KERN_PROC_NARGV) {
2356 1.31.2.8 skrll offsetn = p->p_psnargv;
2357 1.31.2.8 skrll offsetv = p->p_psargv;
2358 1.31.2.8 skrll } else {
2359 1.31.2.8 skrll offsetn = p->p_psnenv;
2360 1.31.2.8 skrll offsetv = p->p_psenv;
2361 1.31.2.8 skrll }
2362 1.31.2.8 skrll vmspace = p->p_vmspace;
2363 1.31.2.8 skrll vmspace->vm_refcnt++; /* XXX */
2364 1.31.2.8 skrll
2365 1.31.2.8 skrll proclist_unlock_read();
2366 1.31.2.2 skrll
2367 1.31.2.2 skrll /*
2368 1.31.2.2 skrll * Allocate a temporary buffer to hold the arguments.
2369 1.31.2.2 skrll */
2370 1.31.2.2 skrll arg = malloc(PAGE_SIZE, M_TEMP, M_WAITOK);
2371 1.31.2.2 skrll
2372 1.31.2.2 skrll /*
2373 1.31.2.2 skrll * Read in the ps_strings structure.
2374 1.31.2.2 skrll */
2375 1.31.2.2 skrll aiov.iov_base = &pss;
2376 1.31.2.2 skrll aiov.iov_len = sizeof(pss);
2377 1.31.2.2 skrll auio.uio_iov = &aiov;
2378 1.31.2.2 skrll auio.uio_iovcnt = 1;
2379 1.31.2.8 skrll auio.uio_offset = psstr_addr;
2380 1.31.2.2 skrll auio.uio_resid = sizeof(pss);
2381 1.31.2.2 skrll auio.uio_segflg = UIO_SYSSPACE;
2382 1.31.2.2 skrll auio.uio_rw = UIO_READ;
2383 1.31.2.4 skrll auio.uio_lwp = NULL;
2384 1.31.2.8 skrll error = uvm_io(&vmspace->vm_map, &auio);
2385 1.31.2.2 skrll if (error)
2386 1.31.2.2 skrll goto done;
2387 1.31.2.2 skrll
2388 1.31.2.8 skrll memcpy(&nargv, (char *)&pss + offsetn, sizeof(nargv));
2389 1.31.2.2 skrll if (type == KERN_PROC_NARGV || type == KERN_PROC_NENV) {
2390 1.31.2.2 skrll error = copyout(&nargv, oldp, sizeof(nargv));
2391 1.31.2.2 skrll *oldlenp = sizeof(nargv);
2392 1.31.2.2 skrll goto done;
2393 1.31.2.2 skrll }
2394 1.31.2.2 skrll /*
2395 1.31.2.2 skrll * Now read the address of the argument vector.
2396 1.31.2.2 skrll */
2397 1.31.2.2 skrll switch (type) {
2398 1.31.2.2 skrll case KERN_PROC_ARGV:
2399 1.31.2.2 skrll /* XXX compat32 stuff here */
2400 1.31.2.8 skrll /* FALLTHROUGH */
2401 1.31.2.2 skrll case KERN_PROC_ENV:
2402 1.31.2.8 skrll memcpy(&tmp, (char *)&pss + offsetv, sizeof(tmp));
2403 1.31.2.2 skrll break;
2404 1.31.2.2 skrll default:
2405 1.31.2.2 skrll return (EINVAL);
2406 1.31.2.2 skrll }
2407 1.31.2.2 skrll auio.uio_offset = (off_t)(unsigned long)tmp;
2408 1.31.2.2 skrll aiov.iov_base = &argv;
2409 1.31.2.2 skrll aiov.iov_len = sizeof(argv);
2410 1.31.2.2 skrll auio.uio_iov = &aiov;
2411 1.31.2.2 skrll auio.uio_iovcnt = 1;
2412 1.31.2.2 skrll auio.uio_resid = sizeof(argv);
2413 1.31.2.2 skrll auio.uio_segflg = UIO_SYSSPACE;
2414 1.31.2.2 skrll auio.uio_rw = UIO_READ;
2415 1.31.2.4 skrll auio.uio_lwp = NULL;
2416 1.31.2.8 skrll error = uvm_io(&vmspace->vm_map, &auio);
2417 1.31.2.2 skrll if (error)
2418 1.31.2.2 skrll goto done;
2419 1.31.2.2 skrll
2420 1.31.2.2 skrll /*
2421 1.31.2.2 skrll * Now copy in the actual argument vector, one page at a time,
2422 1.31.2.2 skrll * since we don't know how long the vector is (though, we do
2423 1.31.2.2 skrll * know how many NUL-terminated strings are in the vector).
2424 1.31.2.2 skrll */
2425 1.31.2.2 skrll len = 0;
2426 1.31.2.2 skrll upper_bound = *oldlenp;
2427 1.31.2.2 skrll for (; nargv != 0 && len < upper_bound; len += xlen) {
2428 1.31.2.2 skrll aiov.iov_base = arg;
2429 1.31.2.2 skrll aiov.iov_len = PAGE_SIZE;
2430 1.31.2.2 skrll auio.uio_iov = &aiov;
2431 1.31.2.2 skrll auio.uio_iovcnt = 1;
2432 1.31.2.2 skrll auio.uio_offset = argv + len;
2433 1.31.2.2 skrll xlen = PAGE_SIZE - ((argv + len) & PAGE_MASK);
2434 1.31.2.2 skrll auio.uio_resid = xlen;
2435 1.31.2.2 skrll auio.uio_segflg = UIO_SYSSPACE;
2436 1.31.2.2 skrll auio.uio_rw = UIO_READ;
2437 1.31.2.4 skrll auio.uio_lwp = NULL;
2438 1.31.2.8 skrll error = uvm_io(&vmspace->vm_map, &auio);
2439 1.31.2.2 skrll if (error)
2440 1.31.2.2 skrll goto done;
2441 1.31.2.2 skrll
2442 1.31.2.2 skrll for (i = 0; i < xlen && nargv != 0; i++) {
2443 1.31.2.2 skrll if (arg[i] == '\0')
2444 1.31.2.2 skrll nargv--; /* one full string */
2445 1.31.2.2 skrll }
2446 1.31.2.2 skrll
2447 1.31.2.2 skrll /*
2448 1.31.2.2 skrll * Make sure we don't copyout past the end of the user's
2449 1.31.2.2 skrll * buffer.
2450 1.31.2.2 skrll */
2451 1.31.2.2 skrll if (len + i > upper_bound)
2452 1.31.2.2 skrll i = upper_bound - len;
2453 1.31.2.2 skrll
2454 1.31.2.2 skrll error = copyout(arg, (char *)oldp + len, i);
2455 1.31.2.2 skrll if (error)
2456 1.31.2.2 skrll break;
2457 1.31.2.2 skrll
2458 1.31.2.2 skrll if (nargv == 0) {
2459 1.31.2.2 skrll len += i;
2460 1.31.2.2 skrll break;
2461 1.31.2.2 skrll }
2462 1.31.2.2 skrll }
2463 1.31.2.2 skrll *oldlenp = len;
2464 1.31.2.2 skrll
2465 1.31.2.2 skrll done:
2466 1.31.2.8 skrll uvmspace_free(vmspace);
2467 1.31.2.2 skrll
2468 1.31.2.2 skrll free(arg, M_TEMP);
2469 1.31.2.8 skrll return error;
2470 1.31.2.8 skrll
2471 1.31.2.8 skrll out_locked:
2472 1.31.2.8 skrll proclist_unlock_read();
2473 1.31.2.8 skrll return error;
2474 1.31.2.8 skrll }
2475 1.31.2.8 skrll
2476 1.31.2.8 skrll /*
2477 1.31.2.8 skrll * Sysctl helper routine for Verified Exec.
2478 1.31.2.8 skrll */
2479 1.31.2.8 skrll #ifdef VERIFIED_EXEC
2480 1.31.2.8 skrll static int
2481 1.31.2.8 skrll sysctl_kern_veriexec(SYSCTLFN_ARGS)
2482 1.31.2.8 skrll {
2483 1.31.2.8 skrll int newval, error;
2484 1.31.2.8 skrll int *var = NULL, raise_only = 0;
2485 1.31.2.8 skrll struct sysctlnode node;
2486 1.31.2.8 skrll
2487 1.31.2.8 skrll node = *rnode;
2488 1.31.2.8 skrll
2489 1.31.2.8 skrll switch (rnode->sysctl_num) {
2490 1.31.2.8 skrll case VERIEXEC_STRICT:
2491 1.31.2.8 skrll raise_only = 1;
2492 1.31.2.8 skrll var = &veriexec_strict;
2493 1.31.2.8 skrll break;
2494 1.31.2.8 skrll case VERIEXEC_ALGORITHMS:
2495 1.31.2.8 skrll node.sysctl_data = veriexec_fp_names;
2496 1.31.2.8 skrll node.sysctl_size = strlen(veriexec_fp_names) + 1;
2497 1.31.2.8 skrll return (sysctl_lookup(SYSCTLFN_CALL(&node)));
2498 1.31.2.8 skrll default:
2499 1.31.2.8 skrll return (EINVAL);
2500 1.31.2.8 skrll }
2501 1.31.2.8 skrll
2502 1.31.2.8 skrll newval = *var;
2503 1.31.2.8 skrll
2504 1.31.2.8 skrll node.sysctl_data = &newval;
2505 1.31.2.8 skrll error = sysctl_lookup(SYSCTLFN_CALL(&node));
2506 1.31.2.8 skrll if (error || newp == NULL) {
2507 1.31.2.8 skrll return (error);
2508 1.31.2.8 skrll }
2509 1.31.2.8 skrll
2510 1.31.2.8 skrll if (raise_only && (newval < *var))
2511 1.31.2.8 skrll return (EPERM);
2512 1.31.2.8 skrll
2513 1.31.2.8 skrll *var = newval;
2514 1.31.2.8 skrll
2515 1.31.2.2 skrll return (error);
2516 1.31.2.2 skrll }
2517 1.31.2.8 skrll #endif /* VERIFIED_EXEC */
2518 1.31.2.8 skrll
2519 1.31.2.8 skrll /*
2520 1.31.2.8 skrll * sysctl helper routine for kern.cp_id node. maps cpus to their
2521 1.31.2.8 skrll * cpuids.
2522 1.31.2.8 skrll */
2523 1.31.2.8 skrll static int
2524 1.31.2.8 skrll sysctl_kern_cpid(SYSCTLFN_ARGS)
2525 1.31.2.8 skrll {
2526 1.31.2.8 skrll struct sysctlnode node = *rnode;
2527 1.31.2.8 skrll
2528 1.31.2.8 skrll #ifndef MULTIPROCESSOR
2529 1.31.2.8 skrll u_int64_t id;
2530 1.31.2.8 skrll
2531 1.31.2.8 skrll if (namelen == 1) {
2532 1.31.2.8 skrll if (name[0] != 0)
2533 1.31.2.8 skrll return (ENOENT);
2534 1.31.2.8 skrll /*
2535 1.31.2.8 skrll * you're allowed to ask for the zero'th processor
2536 1.31.2.8 skrll */
2537 1.31.2.8 skrll name++;
2538 1.31.2.8 skrll namelen--;
2539 1.31.2.8 skrll }
2540 1.31.2.8 skrll node.sysctl_data = &id;
2541 1.31.2.8 skrll node.sysctl_size = sizeof(id);
2542 1.31.2.8 skrll id = cpu_number();
2543 1.31.2.8 skrll return (sysctl_lookup(SYSCTLFN_CALL(&node)));
2544 1.31.2.8 skrll
2545 1.31.2.8 skrll #else /* MULTIPROCESSOR */
2546 1.31.2.8 skrll u_int64_t *cp_id = NULL;
2547 1.31.2.8 skrll int error, n = sysctl_ncpus();
2548 1.31.2.8 skrll struct cpu_info *ci;
2549 1.31.2.8 skrll CPU_INFO_ITERATOR cii;
2550 1.31.2.8 skrll
2551 1.31.2.8 skrll /*
2552 1.31.2.8 skrll * here you may either retrieve a single cpu id or the whole
2553 1.31.2.8 skrll * set. the size you get back when probing depends on what
2554 1.31.2.8 skrll * you ask for.
2555 1.31.2.8 skrll */
2556 1.31.2.8 skrll switch (namelen) {
2557 1.31.2.8 skrll case 0:
2558 1.31.2.8 skrll node.sysctl_size = n * sizeof(u_int64_t);
2559 1.31.2.8 skrll n = -2; /* ALL */
2560 1.31.2.8 skrll break;
2561 1.31.2.8 skrll case 1:
2562 1.31.2.8 skrll if (name[0] < 0 || name[0] >= n)
2563 1.31.2.8 skrll return (ENOENT); /* ENOSUCHPROCESSOR */
2564 1.31.2.8 skrll node.sysctl_size = sizeof(u_int64_t);
2565 1.31.2.8 skrll n = name[0];
2566 1.31.2.8 skrll /*
2567 1.31.2.8 skrll * adjust these so that sysctl_lookup() will be happy
2568 1.31.2.8 skrll */
2569 1.31.2.8 skrll name++;
2570 1.31.2.8 skrll namelen--;
2571 1.31.2.8 skrll break;
2572 1.31.2.8 skrll default:
2573 1.31.2.8 skrll return (EINVAL);
2574 1.31.2.8 skrll }
2575 1.31.2.8 skrll
2576 1.31.2.8 skrll cp_id = malloc(node.sysctl_size, M_TEMP, M_WAITOK|M_CANFAIL);
2577 1.31.2.8 skrll if (cp_id == NULL)
2578 1.31.2.8 skrll return (ENOMEM);
2579 1.31.2.8 skrll node.sysctl_data = cp_id;
2580 1.31.2.8 skrll memset(cp_id, 0, node.sysctl_size);
2581 1.31.2.8 skrll
2582 1.31.2.8 skrll for (CPU_INFO_FOREACH(cii, ci)) {
2583 1.31.2.8 skrll if (n <= 0)
2584 1.31.2.8 skrll cp_id[0] = ci->ci_cpuid;
2585 1.31.2.8 skrll /*
2586 1.31.2.8 skrll * if a specific processor was requested and we just
2587 1.31.2.8 skrll * did it, we're done here
2588 1.31.2.8 skrll */
2589 1.31.2.8 skrll if (n == 0)
2590 1.31.2.8 skrll break;
2591 1.31.2.8 skrll /*
2592 1.31.2.8 skrll * if doing "all", skip to next cp_id slot for next processor
2593 1.31.2.8 skrll */
2594 1.31.2.8 skrll if (n == -2)
2595 1.31.2.8 skrll cp_id++;
2596 1.31.2.8 skrll /*
2597 1.31.2.8 skrll * if we're doing a specific processor, we're one
2598 1.31.2.8 skrll * processor closer
2599 1.31.2.8 skrll */
2600 1.31.2.8 skrll if (n > 0)
2601 1.31.2.8 skrll n--;
2602 1.31.2.8 skrll }
2603 1.31.2.8 skrll
2604 1.31.2.8 skrll error = sysctl_lookup(SYSCTLFN_CALL(&node));
2605 1.31.2.8 skrll free(node.sysctl_data, M_TEMP);
2606 1.31.2.8 skrll return (error);
2607 1.31.2.8 skrll
2608 1.31.2.8 skrll #endif /* MULTIPROCESSOR */
2609 1.31.2.8 skrll }
2610 1.31.2.2 skrll
2611 1.31.2.2 skrll /*
2612 1.31.2.2 skrll * sysctl helper routine for hw.usermem and hw.usermem64. values are
2613 1.31.2.2 skrll * calculate on the fly taking into account integer overflow and the
2614 1.31.2.2 skrll * current wired count.
2615 1.31.2.2 skrll */
2616 1.31.2.2 skrll static int
2617 1.31.2.2 skrll sysctl_hw_usermem(SYSCTLFN_ARGS)
2618 1.31.2.2 skrll {
2619 1.31.2.2 skrll u_int ui;
2620 1.31.2.2 skrll u_quad_t uq;
2621 1.31.2.2 skrll struct sysctlnode node;
2622 1.31.2.2 skrll
2623 1.31.2.2 skrll node = *rnode;
2624 1.31.2.2 skrll switch (rnode->sysctl_num) {
2625 1.31.2.2 skrll case HW_USERMEM:
2626 1.31.2.2 skrll if ((ui = physmem - uvmexp.wired) > (UINT_MAX / PAGE_SIZE))
2627 1.31.2.2 skrll ui = UINT_MAX;
2628 1.31.2.2 skrll else
2629 1.31.2.2 skrll ui *= PAGE_SIZE;
2630 1.31.2.2 skrll node.sysctl_data = &ui;
2631 1.31.2.2 skrll break;
2632 1.31.2.2 skrll case HW_USERMEM64:
2633 1.31.2.2 skrll uq = (u_quad_t)(physmem - uvmexp.wired) * PAGE_SIZE;
2634 1.31.2.2 skrll node.sysctl_data = &uq;
2635 1.31.2.2 skrll break;
2636 1.31.2.2 skrll default:
2637 1.31.2.2 skrll return (EINVAL);
2638 1.31.2.2 skrll }
2639 1.31.2.2 skrll
2640 1.31.2.2 skrll return (sysctl_lookup(SYSCTLFN_CALL(&node)));
2641 1.31.2.2 skrll }
2642 1.31.2.2 skrll
2643 1.31.2.2 skrll /*
2644 1.31.2.2 skrll * sysctl helper routine for kern.cnmagic node. pulls the old value
2645 1.31.2.2 skrll * out, encoded, and stuffs the new value in for decoding.
2646 1.31.2.2 skrll */
2647 1.31.2.2 skrll static int
2648 1.31.2.2 skrll sysctl_hw_cnmagic(SYSCTLFN_ARGS)
2649 1.31.2.2 skrll {
2650 1.31.2.2 skrll char magic[CNS_LEN];
2651 1.31.2.2 skrll int error;
2652 1.31.2.2 skrll struct sysctlnode node;
2653 1.31.2.2 skrll
2654 1.31.2.2 skrll if (oldp)
2655 1.31.2.2 skrll cn_get_magic(magic, CNS_LEN);
2656 1.31.2.2 skrll node = *rnode;
2657 1.31.2.2 skrll node.sysctl_data = &magic[0];
2658 1.31.2.2 skrll error = sysctl_lookup(SYSCTLFN_CALL(&node));
2659 1.31.2.2 skrll if (error || newp == NULL)
2660 1.31.2.2 skrll return (error);
2661 1.31.2.6 skrll
2662 1.31.2.2 skrll return (cn_set_magic(magic));
2663 1.31.2.2 skrll }
2664 1.31.2.2 skrll
2665 1.31.2.2 skrll static int
2666 1.31.2.2 skrll sysctl_hw_ncpu(SYSCTLFN_ARGS)
2667 1.31.2.2 skrll {
2668 1.31.2.2 skrll int ncpu;
2669 1.31.2.2 skrll struct sysctlnode node;
2670 1.31.2.2 skrll
2671 1.31.2.2 skrll ncpu = sysctl_ncpus();
2672 1.31.2.2 skrll node = *rnode;
2673 1.31.2.2 skrll node.sysctl_data = &ncpu;
2674 1.31.2.6 skrll
2675 1.31.2.2 skrll return (sysctl_lookup(SYSCTLFN_CALL(&node)));
2676 1.31.2.2 skrll }
2677 1.31.2.2 skrll
2678 1.31.2.2 skrll
2679 1.31.2.2 skrll /*
2680 1.31.2.2 skrll * ********************************************************************
2681 1.31.2.2 skrll * section 3: public helper routines that are used for more than one
2682 1.31.2.2 skrll * node
2683 1.31.2.2 skrll * ********************************************************************
2684 1.31.2.2 skrll */
2685 1.31.2.2 skrll
2686 1.31.2.2 skrll /*
2687 1.31.2.2 skrll * sysctl helper routine for the kern.root_device node and some ports'
2688 1.31.2.2 skrll * machdep.root_device nodes.
2689 1.31.2.2 skrll */
2690 1.31.2.2 skrll int
2691 1.31.2.2 skrll sysctl_root_device(SYSCTLFN_ARGS)
2692 1.31.2.2 skrll {
2693 1.31.2.2 skrll struct sysctlnode node;
2694 1.31.2.2 skrll
2695 1.31.2.2 skrll node = *rnode;
2696 1.31.2.2 skrll node.sysctl_data = root_device->dv_xname;
2697 1.31.2.2 skrll node.sysctl_size = strlen(root_device->dv_xname) + 1;
2698 1.31.2.2 skrll return (sysctl_lookup(SYSCTLFN_CALL(&node)));
2699 1.31.2.2 skrll }
2700 1.31.2.2 skrll
2701 1.31.2.2 skrll /*
2702 1.31.2.2 skrll * sysctl helper routine for kern.consdev, dependent on the current
2703 1.31.2.2 skrll * state of the console. also used for machdep.console_device on some
2704 1.31.2.2 skrll * ports.
2705 1.31.2.2 skrll */
2706 1.31.2.2 skrll int
2707 1.31.2.2 skrll sysctl_consdev(SYSCTLFN_ARGS)
2708 1.31.2.2 skrll {
2709 1.31.2.2 skrll dev_t consdev;
2710 1.31.2.2 skrll struct sysctlnode node;
2711 1.31.2.2 skrll
2712 1.31.2.2 skrll if (cn_tab != NULL)
2713 1.31.2.2 skrll consdev = cn_tab->cn_dev;
2714 1.31.2.2 skrll else
2715 1.31.2.2 skrll consdev = NODEV;
2716 1.31.2.2 skrll node = *rnode;
2717 1.31.2.2 skrll node.sysctl_data = &consdev;
2718 1.31.2.2 skrll node.sysctl_size = sizeof(consdev);
2719 1.31.2.2 skrll return (sysctl_lookup(SYSCTLFN_CALL(&node)));
2720 1.31.2.2 skrll }
2721 1.31.2.2 skrll
2722 1.31.2.2 skrll /*
2723 1.31.2.2 skrll * ********************************************************************
2724 1.31.2.2 skrll * section 4: support for some helpers
2725 1.31.2.2 skrll * ********************************************************************
2726 1.31.2.2 skrll */
2727 1.31.2.2 skrll
2728 1.31.2.2 skrll /*
2729 1.31.2.2 skrll * Fill in a kinfo_proc2 structure for the specified process.
2730 1.31.2.2 skrll */
2731 1.31.2.2 skrll static void
2732 1.31.2.2 skrll fill_kproc2(struct proc *p, struct kinfo_proc2 *ki)
2733 1.31.2.2 skrll {
2734 1.31.2.2 skrll struct tty *tp;
2735 1.31.2.2 skrll struct lwp *l;
2736 1.31.2.2 skrll struct timeval ut, st;
2737 1.31.2.2 skrll
2738 1.31.2.2 skrll memset(ki, 0, sizeof(*ki));
2739 1.31.2.2 skrll
2740 1.31.2.2 skrll ki->p_paddr = PTRTOUINT64(p);
2741 1.31.2.2 skrll ki->p_fd = PTRTOUINT64(p->p_fd);
2742 1.31.2.2 skrll ki->p_cwdi = PTRTOUINT64(p->p_cwdi);
2743 1.31.2.2 skrll ki->p_stats = PTRTOUINT64(p->p_stats);
2744 1.31.2.2 skrll ki->p_limit = PTRTOUINT64(p->p_limit);
2745 1.31.2.2 skrll ki->p_vmspace = PTRTOUINT64(p->p_vmspace);
2746 1.31.2.2 skrll ki->p_sigacts = PTRTOUINT64(p->p_sigacts);
2747 1.31.2.2 skrll ki->p_sess = PTRTOUINT64(p->p_session);
2748 1.31.2.2 skrll ki->p_tsess = 0; /* may be changed if controlling tty below */
2749 1.31.2.2 skrll ki->p_ru = PTRTOUINT64(p->p_ru);
2750 1.31.2.2 skrll
2751 1.31.2.2 skrll ki->p_eflag = 0;
2752 1.31.2.2 skrll ki->p_exitsig = p->p_exitsig;
2753 1.31.2.2 skrll ki->p_flag = p->p_flag;
2754 1.31.2.2 skrll
2755 1.31.2.2 skrll ki->p_pid = p->p_pid;
2756 1.31.2.2 skrll if (p->p_pptr)
2757 1.31.2.2 skrll ki->p_ppid = p->p_pptr->p_pid;
2758 1.31.2.2 skrll else
2759 1.31.2.2 skrll ki->p_ppid = 0;
2760 1.31.2.2 skrll ki->p_sid = p->p_session->s_sid;
2761 1.31.2.2 skrll ki->p__pgid = p->p_pgrp->pg_id;
2762 1.31.2.2 skrll
2763 1.31.2.2 skrll ki->p_tpgid = NO_PGID; /* may be changed if controlling tty below */
2764 1.31.2.2 skrll
2765 1.31.2.2 skrll ki->p_uid = p->p_ucred->cr_uid;
2766 1.31.2.2 skrll ki->p_ruid = p->p_cred->p_ruid;
2767 1.31.2.2 skrll ki->p_gid = p->p_ucred->cr_gid;
2768 1.31.2.2 skrll ki->p_rgid = p->p_cred->p_rgid;
2769 1.31.2.2 skrll ki->p_svuid = p->p_cred->p_svuid;
2770 1.31.2.2 skrll ki->p_svgid = p->p_cred->p_svgid;
2771 1.31.2.2 skrll
2772 1.31.2.2 skrll memcpy(ki->p_groups, p->p_cred->pc_ucred->cr_groups,
2773 1.31.2.2 skrll min(sizeof(ki->p_groups), sizeof(p->p_cred->pc_ucred->cr_groups)));
2774 1.31.2.2 skrll ki->p_ngroups = p->p_cred->pc_ucred->cr_ngroups;
2775 1.31.2.2 skrll
2776 1.31.2.2 skrll ki->p_jobc = p->p_pgrp->pg_jobc;
2777 1.31.2.2 skrll if ((p->p_flag & P_CONTROLT) && (tp = p->p_session->s_ttyp)) {
2778 1.31.2.2 skrll ki->p_tdev = tp->t_dev;
2779 1.31.2.2 skrll ki->p_tpgid = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PGID;
2780 1.31.2.2 skrll ki->p_tsess = PTRTOUINT64(tp->t_session);
2781 1.31.2.2 skrll } else {
2782 1.31.2.2 skrll ki->p_tdev = NODEV;
2783 1.31.2.2 skrll }
2784 1.31.2.2 skrll
2785 1.31.2.2 skrll ki->p_estcpu = p->p_estcpu;
2786 1.31.2.2 skrll ki->p_rtime_sec = p->p_rtime.tv_sec;
2787 1.31.2.2 skrll ki->p_rtime_usec = p->p_rtime.tv_usec;
2788 1.31.2.2 skrll ki->p_cpticks = p->p_cpticks;
2789 1.31.2.2 skrll ki->p_pctcpu = p->p_pctcpu;
2790 1.31.2.2 skrll
2791 1.31.2.2 skrll ki->p_uticks = p->p_uticks;
2792 1.31.2.2 skrll ki->p_sticks = p->p_sticks;
2793 1.31.2.2 skrll ki->p_iticks = p->p_iticks;
2794 1.31.2.2 skrll
2795 1.31.2.2 skrll ki->p_tracep = PTRTOUINT64(p->p_tracep);
2796 1.31.2.2 skrll ki->p_traceflag = p->p_traceflag;
2797 1.31.2.2 skrll
2798 1.31.2.2 skrll
2799 1.31.2.2 skrll memcpy(&ki->p_siglist, &p->p_sigctx.ps_siglist, sizeof(ki_sigset_t));
2800 1.31.2.2 skrll memcpy(&ki->p_sigmask, &p->p_sigctx.ps_sigmask, sizeof(ki_sigset_t));
2801 1.31.2.2 skrll memcpy(&ki->p_sigignore, &p->p_sigctx.ps_sigignore,sizeof(ki_sigset_t));
2802 1.31.2.2 skrll memcpy(&ki->p_sigcatch, &p->p_sigctx.ps_sigcatch, sizeof(ki_sigset_t));
2803 1.31.2.2 skrll
2804 1.31.2.2 skrll ki->p_stat = p->p_stat; /* Will likely be overridden by LWP status */
2805 1.31.2.2 skrll ki->p_realstat = p->p_stat;
2806 1.31.2.2 skrll ki->p_nice = p->p_nice;
2807 1.31.2.2 skrll
2808 1.31.2.2 skrll ki->p_xstat = p->p_xstat;
2809 1.31.2.2 skrll ki->p_acflag = p->p_acflag;
2810 1.31.2.2 skrll
2811 1.31.2.2 skrll strncpy(ki->p_comm, p->p_comm,
2812 1.31.2.2 skrll min(sizeof(ki->p_comm), sizeof(p->p_comm)));
2813 1.31.2.2 skrll
2814 1.31.2.2 skrll strncpy(ki->p_login, p->p_session->s_login,
2815 1.31.2.2 skrll min(sizeof ki->p_login - 1, sizeof p->p_session->s_login));
2816 1.31.2.2 skrll
2817 1.31.2.2 skrll ki->p_nlwps = p->p_nlwps;
2818 1.31.2.2 skrll ki->p_nrlwps = p->p_nrlwps;
2819 1.31.2.2 skrll ki->p_realflag = p->p_flag;
2820 1.31.2.2 skrll
2821 1.31.2.2 skrll if (p->p_stat == SIDL || P_ZOMBIE(p)) {
2822 1.31.2.2 skrll ki->p_vm_rssize = 0;
2823 1.31.2.2 skrll ki->p_vm_tsize = 0;
2824 1.31.2.2 skrll ki->p_vm_dsize = 0;
2825 1.31.2.2 skrll ki->p_vm_ssize = 0;
2826 1.31.2.2 skrll l = NULL;
2827 1.31.2.2 skrll } else {
2828 1.31.2.2 skrll struct vmspace *vm = p->p_vmspace;
2829 1.31.2.2 skrll
2830 1.31.2.2 skrll ki->p_vm_rssize = vm_resident_count(vm);
2831 1.31.2.2 skrll ki->p_vm_tsize = vm->vm_tsize;
2832 1.31.2.2 skrll ki->p_vm_dsize = vm->vm_dsize;
2833 1.31.2.2 skrll ki->p_vm_ssize = vm->vm_ssize;
2834 1.31.2.2 skrll
2835 1.31.2.2 skrll /* Pick a "representative" LWP */
2836 1.31.2.2 skrll l = proc_representative_lwp(p);
2837 1.31.2.2 skrll ki->p_forw = PTRTOUINT64(l->l_forw);
2838 1.31.2.2 skrll ki->p_back = PTRTOUINT64(l->l_back);
2839 1.31.2.2 skrll ki->p_addr = PTRTOUINT64(l->l_addr);
2840 1.31.2.2 skrll ki->p_stat = l->l_stat;
2841 1.31.2.2 skrll ki->p_flag |= l->l_flag;
2842 1.31.2.2 skrll ki->p_swtime = l->l_swtime;
2843 1.31.2.2 skrll ki->p_slptime = l->l_slptime;
2844 1.31.2.2 skrll if (l->l_stat == LSONPROC) {
2845 1.31.2.2 skrll KDASSERT(l->l_cpu != NULL);
2846 1.31.2.2 skrll ki->p_schedflags = l->l_cpu->ci_schedstate.spc_flags;
2847 1.31.2.2 skrll } else
2848 1.31.2.2 skrll ki->p_schedflags = 0;
2849 1.31.2.2 skrll ki->p_holdcnt = l->l_holdcnt;
2850 1.31.2.2 skrll ki->p_priority = l->l_priority;
2851 1.31.2.2 skrll ki->p_usrpri = l->l_usrpri;
2852 1.31.2.2 skrll if (l->l_wmesg)
2853 1.31.2.2 skrll strncpy(ki->p_wmesg, l->l_wmesg, sizeof(ki->p_wmesg));
2854 1.31.2.2 skrll ki->p_wchan = PTRTOUINT64(l->l_wchan);
2855 1.31.2.2 skrll
2856 1.31.2.2 skrll }
2857 1.31.2.2 skrll
2858 1.31.2.2 skrll if (p->p_session->s_ttyvp)
2859 1.31.2.2 skrll ki->p_eflag |= EPROC_CTTY;
2860 1.31.2.2 skrll if (SESS_LEADER(p))
2861 1.31.2.2 skrll ki->p_eflag |= EPROC_SLEADER;
2862 1.31.2.2 skrll
2863 1.31.2.2 skrll /* XXX Is this double check necessary? */
2864 1.31.2.2 skrll if (P_ZOMBIE(p)) {
2865 1.31.2.2 skrll ki->p_uvalid = 0;
2866 1.31.2.2 skrll } else {
2867 1.31.2.2 skrll ki->p_uvalid = 1;
2868 1.31.2.2 skrll
2869 1.31.2.2 skrll ki->p_ustart_sec = p->p_stats->p_start.tv_sec;
2870 1.31.2.2 skrll ki->p_ustart_usec = p->p_stats->p_start.tv_usec;
2871 1.31.2.2 skrll
2872 1.31.2.2 skrll calcru(p, &ut, &st, 0);
2873 1.31.2.2 skrll ki->p_uutime_sec = ut.tv_sec;
2874 1.31.2.2 skrll ki->p_uutime_usec = ut.tv_usec;
2875 1.31.2.2 skrll ki->p_ustime_sec = st.tv_sec;
2876 1.31.2.2 skrll ki->p_ustime_usec = st.tv_usec;
2877 1.31.2.2 skrll
2878 1.31.2.2 skrll ki->p_uru_maxrss = p->p_stats->p_ru.ru_maxrss;
2879 1.31.2.2 skrll ki->p_uru_ixrss = p->p_stats->p_ru.ru_ixrss;
2880 1.31.2.2 skrll ki->p_uru_idrss = p->p_stats->p_ru.ru_idrss;
2881 1.31.2.2 skrll ki->p_uru_isrss = p->p_stats->p_ru.ru_isrss;
2882 1.31.2.2 skrll ki->p_uru_minflt = p->p_stats->p_ru.ru_minflt;
2883 1.31.2.2 skrll ki->p_uru_majflt = p->p_stats->p_ru.ru_majflt;
2884 1.31.2.2 skrll ki->p_uru_nswap = p->p_stats->p_ru.ru_nswap;
2885 1.31.2.2 skrll ki->p_uru_inblock = p->p_stats->p_ru.ru_inblock;
2886 1.31.2.2 skrll ki->p_uru_oublock = p->p_stats->p_ru.ru_oublock;
2887 1.31.2.2 skrll ki->p_uru_msgsnd = p->p_stats->p_ru.ru_msgsnd;
2888 1.31.2.2 skrll ki->p_uru_msgrcv = p->p_stats->p_ru.ru_msgrcv;
2889 1.31.2.2 skrll ki->p_uru_nsignals = p->p_stats->p_ru.ru_nsignals;
2890 1.31.2.2 skrll ki->p_uru_nvcsw = p->p_stats->p_ru.ru_nvcsw;
2891 1.31.2.2 skrll ki->p_uru_nivcsw = p->p_stats->p_ru.ru_nivcsw;
2892 1.31.2.2 skrll
2893 1.31.2.2 skrll timeradd(&p->p_stats->p_cru.ru_utime,
2894 1.31.2.2 skrll &p->p_stats->p_cru.ru_stime, &ut);
2895 1.31.2.2 skrll ki->p_uctime_sec = ut.tv_sec;
2896 1.31.2.2 skrll ki->p_uctime_usec = ut.tv_usec;
2897 1.31.2.2 skrll }
2898 1.31.2.2 skrll #ifdef MULTIPROCESSOR
2899 1.31.2.2 skrll if (l && l->l_cpu != NULL)
2900 1.31.2.2 skrll ki->p_cpuid = l->l_cpu->ci_cpuid;
2901 1.31.2.2 skrll else
2902 1.31.2.2 skrll #endif
2903 1.31.2.2 skrll ki->p_cpuid = KI_NOCPU;
2904 1.31.2.2 skrll }
2905 1.31.2.2 skrll
2906 1.31.2.2 skrll /*
2907 1.31.2.2 skrll * Fill in a kinfo_lwp structure for the specified lwp.
2908 1.31.2.2 skrll */
2909 1.31.2.2 skrll static void
2910 1.31.2.2 skrll fill_lwp(struct lwp *l, struct kinfo_lwp *kl)
2911 1.31.2.2 skrll {
2912 1.31.2.2 skrll
2913 1.31.2.2 skrll kl->l_forw = PTRTOUINT64(l->l_forw);
2914 1.31.2.2 skrll kl->l_back = PTRTOUINT64(l->l_back);
2915 1.31.2.2 skrll kl->l_laddr = PTRTOUINT64(l);
2916 1.31.2.2 skrll kl->l_addr = PTRTOUINT64(l->l_addr);
2917 1.31.2.2 skrll kl->l_stat = l->l_stat;
2918 1.31.2.2 skrll kl->l_lid = l->l_lid;
2919 1.31.2.2 skrll kl->l_flag = l->l_flag;
2920 1.31.2.2 skrll
2921 1.31.2.2 skrll kl->l_swtime = l->l_swtime;
2922 1.31.2.2 skrll kl->l_slptime = l->l_slptime;
2923 1.31.2.2 skrll if (l->l_stat == LSONPROC) {
2924 1.31.2.2 skrll KDASSERT(l->l_cpu != NULL);
2925 1.31.2.2 skrll kl->l_schedflags = l->l_cpu->ci_schedstate.spc_flags;
2926 1.31.2.2 skrll } else
2927 1.31.2.2 skrll kl->l_schedflags = 0;
2928 1.31.2.2 skrll kl->l_holdcnt = l->l_holdcnt;
2929 1.31.2.2 skrll kl->l_priority = l->l_priority;
2930 1.31.2.2 skrll kl->l_usrpri = l->l_usrpri;
2931 1.31.2.2 skrll if (l->l_wmesg)
2932 1.31.2.2 skrll strncpy(kl->l_wmesg, l->l_wmesg, sizeof(kl->l_wmesg));
2933 1.31.2.2 skrll kl->l_wchan = PTRTOUINT64(l->l_wchan);
2934 1.31.2.2 skrll #ifdef MULTIPROCESSOR
2935 1.31.2.2 skrll if (l->l_cpu != NULL)
2936 1.31.2.2 skrll kl->l_cpuid = l->l_cpu->ci_cpuid;
2937 1.31.2.2 skrll else
2938 1.31.2.2 skrll #endif
2939 1.31.2.2 skrll kl->l_cpuid = KI_NOCPU;
2940 1.31.2.2 skrll }
2941 1.31.2.2 skrll
2942 1.31.2.2 skrll /*
2943 1.31.2.2 skrll * Fill in an eproc structure for the specified process.
2944 1.31.2.2 skrll */
2945 1.31.2.2 skrll void
2946 1.31.2.2 skrll fill_eproc(struct proc *p, struct eproc *ep)
2947 1.31.2.2 skrll {
2948 1.31.2.2 skrll struct tty *tp;
2949 1.31.2.2 skrll struct lwp *l;
2950 1.31.2.2 skrll
2951 1.31.2.2 skrll ep->e_paddr = p;
2952 1.31.2.2 skrll ep->e_sess = p->p_session;
2953 1.31.2.2 skrll ep->e_pcred = *p->p_cred;
2954 1.31.2.2 skrll ep->e_ucred = *p->p_ucred;
2955 1.31.2.2 skrll if (p->p_stat == SIDL || P_ZOMBIE(p)) {
2956 1.31.2.2 skrll ep->e_vm.vm_rssize = 0;
2957 1.31.2.2 skrll ep->e_vm.vm_tsize = 0;
2958 1.31.2.2 skrll ep->e_vm.vm_dsize = 0;
2959 1.31.2.2 skrll ep->e_vm.vm_ssize = 0;
2960 1.31.2.2 skrll /* ep->e_vm.vm_pmap = XXX; */
2961 1.31.2.2 skrll } else {
2962 1.31.2.2 skrll struct vmspace *vm = p->p_vmspace;
2963 1.31.2.2 skrll
2964 1.31.2.2 skrll ep->e_vm.vm_rssize = vm_resident_count(vm);
2965 1.31.2.2 skrll ep->e_vm.vm_tsize = vm->vm_tsize;
2966 1.31.2.2 skrll ep->e_vm.vm_dsize = vm->vm_dsize;
2967 1.31.2.2 skrll ep->e_vm.vm_ssize = vm->vm_ssize;
2968 1.31.2.2 skrll
2969 1.31.2.2 skrll /* Pick a "representative" LWP */
2970 1.31.2.2 skrll l = proc_representative_lwp(p);
2971 1.31.2.2 skrll
2972 1.31.2.2 skrll if (l->l_wmesg)
2973 1.31.2.2 skrll strncpy(ep->e_wmesg, l->l_wmesg, WMESGLEN);
2974 1.31.2.2 skrll }
2975 1.31.2.2 skrll if (p->p_pptr)
2976 1.31.2.2 skrll ep->e_ppid = p->p_pptr->p_pid;
2977 1.31.2.2 skrll else
2978 1.31.2.2 skrll ep->e_ppid = 0;
2979 1.31.2.2 skrll ep->e_pgid = p->p_pgrp->pg_id;
2980 1.31.2.2 skrll ep->e_sid = ep->e_sess->s_sid;
2981 1.31.2.2 skrll ep->e_jobc = p->p_pgrp->pg_jobc;
2982 1.31.2.2 skrll if ((p->p_flag & P_CONTROLT) &&
2983 1.31.2.2 skrll (tp = ep->e_sess->s_ttyp)) {
2984 1.31.2.2 skrll ep->e_tdev = tp->t_dev;
2985 1.31.2.2 skrll ep->e_tpgid = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PGID;
2986 1.31.2.2 skrll ep->e_tsess = tp->t_session;
2987 1.31.2.2 skrll } else
2988 1.31.2.2 skrll ep->e_tdev = NODEV;
2989 1.31.2.2 skrll
2990 1.31.2.2 skrll ep->e_xsize = ep->e_xrssize = 0;
2991 1.31.2.2 skrll ep->e_xccount = ep->e_xswrss = 0;
2992 1.31.2.2 skrll ep->e_flag = ep->e_sess->s_ttyvp ? EPROC_CTTY : 0;
2993 1.31.2.2 skrll if (SESS_LEADER(p))
2994 1.31.2.2 skrll ep->e_flag |= EPROC_SLEADER;
2995 1.31.2.2 skrll strncpy(ep->e_login, ep->e_sess->s_login, MAXLOGNAME);
2996 1.31.2.2 skrll }
2997