xref: /openbsd-src/sys/kern/kern_sysctl.c (revision 8550894424f8a4aa4aafb6cd57229dd6ed7cd9dd)
1 /*	$OpenBSD: kern_sysctl.c,v 1.411 2023/01/22 12:05:44 mvs Exp $	*/
2 /*	$NetBSD: kern_sysctl.c,v 1.17 1996/05/20 17:49:05 mrg Exp $	*/
3 
4 /*-
5  * Copyright (c) 1982, 1986, 1989, 1993
6  *	The Regents of the University of California.  All rights reserved.
7  *
8  * This code is derived from software contributed to Berkeley by
9  * Mike Karels at Berkeley Software Design, Inc.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  * 3. Neither the name of the University nor the names of its contributors
20  *    may be used to endorse or promote products derived from this software
21  *    without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  *
35  *	@(#)kern_sysctl.c	8.4 (Berkeley) 4/14/94
36  */
37 
38 /*
39  * sysctl system call.
40  */
41 
42 #include <sys/param.h>
43 #include <sys/systm.h>
44 #include <sys/kernel.h>
45 #include <sys/malloc.h>
46 #include <sys/pool.h>
47 #include <sys/proc.h>
48 #include <sys/resourcevar.h>
49 #include <sys/signalvar.h>
50 #include <sys/fcntl.h>
51 #include <sys/file.h>
52 #include <sys/filedesc.h>
53 #include <sys/vnode.h>
54 #include <sys/unistd.h>
55 #include <sys/buf.h>
56 #include <sys/clockintr.h>
57 #include <sys/tty.h>
58 #include <sys/disklabel.h>
59 #include <sys/disk.h>
60 #include <sys/sysctl.h>
61 #include <sys/msgbuf.h>
62 #include <sys/vmmeter.h>
63 #include <sys/namei.h>
64 #include <sys/exec.h>
65 #include <sys/mbuf.h>
66 #include <sys/percpu.h>
67 #include <sys/sensors.h>
68 #include <sys/pipe.h>
69 #include <sys/eventvar.h>
70 #include <sys/socketvar.h>
71 #include <sys/socket.h>
72 #include <sys/domain.h>
73 #include <sys/protosw.h>
74 #include <sys/pledge.h>
75 #include <sys/timetc.h>
76 #include <sys/evcount.h>
77 #include <sys/un.h>
78 #include <sys/unpcb.h>
79 #include <sys/sched.h>
80 #include <sys/mount.h>
81 #include <sys/syscallargs.h>
82 #include <sys/wait.h>
83 #include <sys/witness.h>
84 
85 #include <uvm/uvm_extern.h>
86 
87 #include <dev/cons.h>
88 
89 #include <net/route.h>
90 #include <netinet/in.h>
91 #include <netinet/ip.h>
92 #include <netinet/ip_var.h>
93 #include <netinet/in_pcb.h>
94 #include <netinet/ip6.h>
95 #include <netinet/tcp.h>
96 #include <netinet/tcp_timer.h>
97 #include <netinet/tcp_var.h>
98 #include <netinet/udp.h>
99 #include <netinet/udp_var.h>
100 #include <netinet6/ip6_var.h>
101 
102 #ifdef DDB
103 #include <ddb/db_var.h>
104 #endif
105 
106 #ifdef SYSVMSG
107 #include <sys/msg.h>
108 #endif
109 #ifdef SYSVSEM
110 #include <sys/sem.h>
111 #endif
112 #ifdef SYSVSHM
113 #include <sys/shm.h>
114 #endif
115 
116 #include "audio.h"
117 #include "dt.h"
118 #include "pf.h"
119 #include "video.h"
120 
121 extern struct forkstat forkstat;
122 extern struct nchstats nchstats;
123 extern int fscale;
124 extern fixpt_t ccpu;
125 extern long numvnodes;
126 extern int allowdt;
127 extern int audio_record_enable;
128 extern int video_record_enable;
129 extern int autoconf_serial;
130 
131 int allowkmem;
132 
133 int sysctl_diskinit(int, struct proc *);
134 int sysctl_proc_args(int *, u_int, void *, size_t *, struct proc *);
135 int sysctl_proc_cwd(int *, u_int, void *, size_t *, struct proc *);
136 int sysctl_proc_nobroadcastkill(int *, u_int, void *, size_t, void *, size_t *,
137 	struct proc *);
138 int sysctl_proc_vmmap(int *, u_int, void *, size_t *, struct proc *);
139 int sysctl_intrcnt(int *, u_int, void *, size_t *);
140 int sysctl_sensors(int *, u_int, void *, size_t *, void *, size_t);
141 int sysctl_cptime2(int *, u_int, void *, size_t *, void *, size_t);
142 int sysctl_audio(int *, u_int, void *, size_t *, void *, size_t);
143 int sysctl_video(int *, u_int, void *, size_t *, void *, size_t);
144 int sysctl_cpustats(int *, u_int, void *, size_t *, void *, size_t);
145 int sysctl_utc_offset(void *, size_t *, void *, size_t);
146 
147 void fill_file(struct kinfo_file *, struct file *, struct filedesc *, int,
148     struct vnode *, struct process *, struct proc *, struct socket *, int);
149 void fill_kproc(struct process *, struct kinfo_proc *, struct proc *, int);
150 
151 int (*cpu_cpuspeed)(int *);
152 
153 /*
154  * Lock to avoid too many processes vslocking a large amount of memory
155  * at the same time.
156  */
157 struct rwlock sysctl_lock = RWLOCK_INITIALIZER("sysctllk");
158 struct rwlock sysctl_disklock = RWLOCK_INITIALIZER("sysctldlk");
159 
160 int
161 sys_sysctl(struct proc *p, void *v, register_t *retval)
162 {
163 	struct sys_sysctl_args /* {
164 		syscallarg(const int *) name;
165 		syscallarg(u_int) namelen;
166 		syscallarg(void *) old;
167 		syscallarg(size_t *) oldlenp;
168 		syscallarg(void *) new;
169 		syscallarg(size_t) newlen;
170 	} */ *uap = v;
171 	int error, dolock = 1;
172 	size_t savelen = 0, oldlen = 0;
173 	sysctlfn *fn;
174 	int name[CTL_MAXNAME];
175 
176 	if (SCARG(uap, new) != NULL &&
177 	    (error = suser(p)))
178 		return (error);
179 	/*
180 	 * all top-level sysctl names are non-terminal
181 	 */
182 	if (SCARG(uap, namelen) > CTL_MAXNAME || SCARG(uap, namelen) < 2)
183 		return (EINVAL);
184 	error = copyin(SCARG(uap, name), name,
185 		       SCARG(uap, namelen) * sizeof(int));
186 	if (error)
187 		return (error);
188 
189 	error = pledge_sysctl(p, SCARG(uap, namelen),
190 	    name, SCARG(uap, new));
191 	if (error)
192 		return (error);
193 
194 	switch (name[0]) {
195 	case CTL_KERN:
196 		fn = kern_sysctl;
197 		break;
198 	case CTL_HW:
199 		fn = hw_sysctl;
200 		break;
201 	case CTL_VM:
202 		fn = uvm_sysctl;
203 		break;
204 	case CTL_NET:
205 		fn = net_sysctl;
206 		break;
207 	case CTL_FS:
208 		fn = fs_sysctl;
209 		break;
210 	case CTL_VFS:
211 		fn = vfs_sysctl;
212 		break;
213 	case CTL_MACHDEP:
214 		fn = cpu_sysctl;
215 		break;
216 #ifdef DEBUG_SYSCTL
217 	case CTL_DEBUG:
218 		fn = debug_sysctl;
219 		break;
220 #endif
221 #ifdef DDB
222 	case CTL_DDB:
223 		fn = ddb_sysctl;
224 		break;
225 #endif
226 	default:
227 		return (EOPNOTSUPP);
228 	}
229 
230 	if (SCARG(uap, oldlenp) &&
231 	    (error = copyin(SCARG(uap, oldlenp), &oldlen, sizeof(oldlen))))
232 		return (error);
233 	if (SCARG(uap, old) != NULL) {
234 		if ((error = rw_enter(&sysctl_lock, RW_WRITE|RW_INTR)) != 0)
235 			return (error);
236 		if (dolock) {
237 			if (atop(oldlen) > uvmexp.wiredmax - uvmexp.wired) {
238 				rw_exit_write(&sysctl_lock);
239 				return (ENOMEM);
240 			}
241 			error = uvm_vslock(p, SCARG(uap, old), oldlen,
242 			    PROT_READ | PROT_WRITE);
243 			if (error) {
244 				rw_exit_write(&sysctl_lock);
245 				return (error);
246 			}
247 		}
248 		savelen = oldlen;
249 	}
250 	error = (*fn)(&name[1], SCARG(uap, namelen) - 1, SCARG(uap, old),
251 	    &oldlen, SCARG(uap, new), SCARG(uap, newlen), p);
252 	if (SCARG(uap, old) != NULL) {
253 		if (dolock)
254 			uvm_vsunlock(p, SCARG(uap, old), savelen);
255 		rw_exit_write(&sysctl_lock);
256 	}
257 	if (error)
258 		return (error);
259 	if (SCARG(uap, oldlenp))
260 		error = copyout(&oldlen, SCARG(uap, oldlenp), sizeof(oldlen));
261 	return (error);
262 }
263 
264 /*
265  * Attributes stored in the kernel.
266  */
267 char hostname[MAXHOSTNAMELEN];
268 int hostnamelen;
269 char domainname[MAXHOSTNAMELEN];
270 int domainnamelen;
271 long hostid;
272 char *disknames = NULL;
273 size_t disknameslen;
274 struct diskstats *diskstats = NULL;
275 size_t diskstatslen;
276 int securelevel;
277 
278 /* morally const values reported by sysctl_bounded_arr */
279 static int arg_max = ARG_MAX;
280 static int openbsd = OpenBSD;
281 static int posix_version = _POSIX_VERSION;
282 static int ngroups_max = NGROUPS_MAX;
283 static int int_zero = 0;
284 static int int_one = 1;
285 static int maxpartitions = MAXPARTITIONS;
286 static int raw_part = RAW_PART;
287 
288 extern int somaxconn, sominconn;
289 extern int nosuidcoredump;
290 extern int maxlocksperuid;
291 extern int uvm_wxabort;
292 extern int global_ptrace;
293 
294 const struct sysctl_bounded_args kern_vars[] = {
295 	{KERN_OSREV, &openbsd, SYSCTL_INT_READONLY},
296 	{KERN_MAXVNODES, &maxvnodes, 0, INT_MAX},
297 	{KERN_MAXPROC, &maxprocess, 0, INT_MAX},
298 	{KERN_MAXFILES, &maxfiles, 0, INT_MAX},
299 	{KERN_NFILES, &numfiles, SYSCTL_INT_READONLY},
300 	{KERN_TTYCOUNT, &tty_count, SYSCTL_INT_READONLY},
301 	{KERN_ARGMAX, &arg_max, SYSCTL_INT_READONLY},
302 	{KERN_POSIX1, &posix_version, SYSCTL_INT_READONLY},
303 	{KERN_NGROUPS, &ngroups_max, SYSCTL_INT_READONLY},
304 	{KERN_JOB_CONTROL, &int_one, SYSCTL_INT_READONLY},
305 	{KERN_SAVED_IDS, &int_one, SYSCTL_INT_READONLY},
306 	{KERN_MAXPARTITIONS, &maxpartitions, SYSCTL_INT_READONLY},
307 	{KERN_RAWPARTITION, &raw_part, SYSCTL_INT_READONLY},
308 	{KERN_MAXTHREAD, &maxthread, 0, INT_MAX},
309 	{KERN_NTHREADS, &nthreads, SYSCTL_INT_READONLY},
310 	{KERN_SOMAXCONN, &somaxconn, 0, SHRT_MAX},
311 	{KERN_SOMINCONN, &sominconn, 0, SHRT_MAX},
312 	{KERN_NOSUIDCOREDUMP, &nosuidcoredump, 0, 3},
313 	{KERN_FSYNC, &int_one, SYSCTL_INT_READONLY},
314 	{KERN_SYSVMSG,
315 #ifdef SYSVMSG
316 	 &int_one,
317 #else
318 	 &int_zero,
319 #endif
320 	 SYSCTL_INT_READONLY},
321 	{KERN_SYSVSEM,
322 #ifdef SYSVSEM
323 	 &int_one,
324 #else
325 	 &int_zero,
326 #endif
327 	 SYSCTL_INT_READONLY},
328 	{KERN_SYSVSHM,
329 #ifdef SYSVSHM
330 	 &int_one,
331 #else
332 	 &int_zero,
333 #endif
334 	 SYSCTL_INT_READONLY},
335 	{KERN_FSCALE, &fscale, SYSCTL_INT_READONLY},
336 	{KERN_CCPU, &ccpu, SYSCTL_INT_READONLY},
337 	{KERN_NPROCS, &nprocesses, SYSCTL_INT_READONLY},
338 	{KERN_SPLASSERT, &splassert_ctl, 0, 3},
339 	{KERN_MAXLOCKSPERUID, &maxlocksperuid, 0, INT_MAX},
340 	{KERN_WXABORT, &uvm_wxabort, 0, 1},
341 	{KERN_NETLIVELOCKS, &int_zero, SYSCTL_INT_READONLY},
342 #ifdef PTRACE
343 	{KERN_GLOBAL_PTRACE, &global_ptrace, 0, 1},
344 #endif
345 	{KERN_AUTOCONF_SERIAL, &autoconf_serial, SYSCTL_INT_READONLY},
346 };
347 
348 int
349 kern_sysctl_dirs(int top_name, int *name, u_int namelen,
350     void *oldp, size_t *oldlenp, void *newp, size_t newlen, struct proc *p)
351 {
352 	switch (top_name) {
353 #ifndef SMALL_KERNEL
354 	case KERN_PROC:
355 		return (sysctl_doproc(name, namelen, oldp, oldlenp));
356 	case KERN_PROC_ARGS:
357 		return (sysctl_proc_args(name, namelen, oldp, oldlenp, p));
358 	case KERN_PROC_CWD:
359 		return (sysctl_proc_cwd(name, namelen, oldp, oldlenp, p));
360 	case KERN_PROC_NOBROADCASTKILL:
361 		return (sysctl_proc_nobroadcastkill(name, namelen,
362 		     newp, newlen, oldp, oldlenp, p));
363 	case KERN_PROC_VMMAP:
364 		return (sysctl_proc_vmmap(name, namelen, oldp, oldlenp, p));
365 	case KERN_FILE:
366 		return (sysctl_file(name, namelen, oldp, oldlenp, p));
367 #endif
368 #if defined(GPROF) || defined(DDBPROF)
369 	case KERN_PROF:
370 		return (sysctl_doprof(name, namelen, oldp, oldlenp,
371 		    newp, newlen));
372 #endif
373 	case KERN_MALLOCSTATS:
374 		return (sysctl_malloc(name, namelen, oldp, oldlenp,
375 		    newp, newlen, p));
376 	case KERN_TTY:
377 		return (sysctl_tty(name, namelen, oldp, oldlenp,
378 		    newp, newlen));
379 	case KERN_POOL:
380 		return (sysctl_dopool(name, namelen, oldp, oldlenp));
381 #if defined(SYSVMSG) || defined(SYSVSEM) || defined(SYSVSHM)
382 	case KERN_SYSVIPC_INFO:
383 		return (sysctl_sysvipc(name, namelen, oldp, oldlenp));
384 #endif
385 #ifdef SYSVSEM
386 	case KERN_SEMINFO:
387 		return (sysctl_sysvsem(name, namelen, oldp, oldlenp,
388 		    newp, newlen));
389 #endif
390 #ifdef SYSVSHM
391 	case KERN_SHMINFO:
392 		return (sysctl_sysvshm(name, namelen, oldp, oldlenp,
393 		    newp, newlen));
394 #endif
395 #ifndef SMALL_KERNEL
396 	case KERN_INTRCNT:
397 		return (sysctl_intrcnt(name, namelen, oldp, oldlenp));
398 	case KERN_WATCHDOG:
399 		return (sysctl_wdog(name, namelen, oldp, oldlenp,
400 		    newp, newlen));
401 #endif
402 #ifndef SMALL_KERNEL
403 	case KERN_EVCOUNT:
404 		return (evcount_sysctl(name, namelen, oldp, oldlenp,
405 		    newp, newlen));
406 #endif
407 	case KERN_TIMECOUNTER:
408 		return (sysctl_tc(name, namelen, oldp, oldlenp, newp, newlen));
409 	case KERN_CPTIME2:
410 		return (sysctl_cptime2(name, namelen, oldp, oldlenp,
411 		    newp, newlen));
412 #ifdef WITNESS
413 	case KERN_WITNESSWATCH:
414 		return witness_sysctl_watch(oldp, oldlenp, newp, newlen);
415 	case KERN_WITNESS:
416 		return witness_sysctl(name, namelen, oldp, oldlenp,
417 		    newp, newlen);
418 #endif
419 #if NAUDIO > 0
420 	case KERN_AUDIO:
421 		return (sysctl_audio(name, namelen, oldp, oldlenp,
422 		    newp, newlen));
423 #endif
424 #if NVIDEO > 0
425 	case KERN_VIDEO:
426 		return (sysctl_video(name, namelen, oldp, oldlenp,
427 		    newp, newlen));
428 #endif
429 	case KERN_CPUSTATS:
430 		return (sysctl_cpustats(name, namelen, oldp, oldlenp,
431 		    newp, newlen));
432 #ifdef __HAVE_CLOCKINTR
433 	case KERN_CLOCKINTR:
434 		return sysctl_clockintr(name, namelen, oldp, oldlenp, newp,
435 		    newlen);
436 #endif
437 	default:
438 		return (ENOTDIR);	/* overloaded */
439 	}
440 }
441 
442 /*
443  * kernel related system variables.
444  */
445 int
446 kern_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp,
447     size_t newlen, struct proc *p)
448 {
449 	int error, level, inthostid, stackgap;
450 	dev_t dev;
451 	extern int pool_debug;
452 
453 	/* dispatch the non-terminal nodes first */
454 	if (namelen != 1) {
455 		return kern_sysctl_dirs(name[0], name + 1, namelen - 1,
456 		    oldp, oldlenp, newp, newlen, p);
457 	}
458 
459 	switch (name[0]) {
460 	case KERN_OSTYPE:
461 		return (sysctl_rdstring(oldp, oldlenp, newp, ostype));
462 	case KERN_OSRELEASE:
463 		return (sysctl_rdstring(oldp, oldlenp, newp, osrelease));
464 	case KERN_OSVERSION:
465 		return (sysctl_rdstring(oldp, oldlenp, newp, osversion));
466 	case KERN_VERSION:
467 		return (sysctl_rdstring(oldp, oldlenp, newp, version));
468 	case KERN_NUMVNODES:  /* XXX numvnodes is a long */
469 		return (sysctl_rdint(oldp, oldlenp, newp, numvnodes));
470 	case KERN_SECURELVL:
471 		level = securelevel;
472 		if ((error = sysctl_int(oldp, oldlenp, newp, newlen, &level)) ||
473 		    newp == NULL)
474 			return (error);
475 		if ((securelevel > 0 || level < -1) &&
476 		    level < securelevel && p->p_p->ps_pid != 1)
477 			return (EPERM);
478 		securelevel = level;
479 		return (0);
480 #if NDT > 0
481 	case KERN_ALLOWDT:
482 		return (sysctl_securelevel_int(oldp, oldlenp, newp, newlen,
483 		    &allowdt));
484 #endif
485 	case KERN_ALLOWKMEM:
486 		return (sysctl_securelevel_int(oldp, oldlenp, newp, newlen,
487 		    &allowkmem));
488 	case KERN_HOSTNAME:
489 		error = sysctl_tstring(oldp, oldlenp, newp, newlen,
490 		    hostname, sizeof(hostname));
491 		if (newp && !error)
492 			hostnamelen = newlen;
493 		return (error);
494 	case KERN_DOMAINNAME:
495 		if (securelevel >= 1 && domainnamelen && newp)
496 			error = EPERM;
497 		else
498 			error = sysctl_tstring(oldp, oldlenp, newp, newlen,
499 			    domainname, sizeof(domainname));
500 		if (newp && !error)
501 			domainnamelen = newlen;
502 		return (error);
503 	case KERN_HOSTID:
504 		inthostid = hostid;  /* XXX assumes sizeof long <= sizeof int */
505 		error =  sysctl_int(oldp, oldlenp, newp, newlen, &inthostid);
506 		hostid = inthostid;
507 		return (error);
508 	case KERN_CLOCKRATE:
509 		return (sysctl_clockrate(oldp, oldlenp, newp));
510 	case KERN_BOOTTIME: {
511 		struct timeval bt;
512 		memset(&bt, 0, sizeof bt);
513 		microboottime(&bt);
514 		return (sysctl_rdstruct(oldp, oldlenp, newp, &bt, sizeof bt));
515 	  }
516 	case KERN_MBSTAT: {
517 		extern struct cpumem *mbstat;
518 		uint64_t counters[MBSTAT_COUNT];
519 		struct mbstat mbs;
520 		unsigned int i;
521 
522 		memset(&mbs, 0, sizeof(mbs));
523 		counters_read(mbstat, counters, MBSTAT_COUNT);
524 		for (i = 0; i < MBSTAT_TYPES; i++)
525 			mbs.m_mtypes[i] = counters[i];
526 
527 		mbs.m_drops = counters[MBSTAT_DROPS];
528 		mbs.m_wait = counters[MBSTAT_WAIT];
529 		mbs.m_drain = counters[MBSTAT_DRAIN];
530 
531 		return (sysctl_rdstruct(oldp, oldlenp, newp,
532 		    &mbs, sizeof(mbs)));
533 	}
534 	case KERN_MSGBUFSIZE:
535 	case KERN_CONSBUFSIZE: {
536 		struct msgbuf *mp;
537 		mp = (name[0] == KERN_MSGBUFSIZE) ? msgbufp : consbufp;
538 		/*
539 		 * deal with cases where the message buffer has
540 		 * become corrupted.
541 		 */
542 		if (!mp || mp->msg_magic != MSG_MAGIC)
543 			return (ENXIO);
544 		return (sysctl_rdint(oldp, oldlenp, newp, mp->msg_bufs));
545 	}
546 	case KERN_CONSBUF:
547 		if ((error = suser(p)))
548 			return (error);
549 		/* FALLTHROUGH */
550 	case KERN_MSGBUF: {
551 		struct msgbuf *mp;
552 		mp = (name[0] == KERN_MSGBUF) ? msgbufp : consbufp;
553 		/* see note above */
554 		if (!mp || mp->msg_magic != MSG_MAGIC)
555 			return (ENXIO);
556 		return (sysctl_rdstruct(oldp, oldlenp, newp, mp,
557 		    mp->msg_bufs + offsetof(struct msgbuf, msg_bufc)));
558 	}
559 	case KERN_CPTIME:
560 	{
561 		CPU_INFO_ITERATOR cii;
562 		struct cpu_info *ci;
563 		long cp_time[CPUSTATES];
564 		int i, n = 0;
565 
566 		memset(cp_time, 0, sizeof(cp_time));
567 
568 		CPU_INFO_FOREACH(cii, ci) {
569 			if (!cpu_is_online(ci))
570 				continue;
571 			n++;
572 			for (i = 0; i < CPUSTATES; i++)
573 				cp_time[i] += ci->ci_schedstate.spc_cp_time[i];
574 		}
575 
576 		for (i = 0; i < CPUSTATES; i++)
577 			cp_time[i] /= n;
578 
579 		return (sysctl_rdstruct(oldp, oldlenp, newp, &cp_time,
580 		    sizeof(cp_time)));
581 	}
582 	case KERN_NCHSTATS:
583 		return (sysctl_rdstruct(oldp, oldlenp, newp, &nchstats,
584 		    sizeof(struct nchstats)));
585 	case KERN_FORKSTAT:
586 		return (sysctl_rdstruct(oldp, oldlenp, newp, &forkstat,
587 		    sizeof(struct forkstat)));
588 	case KERN_STACKGAPRANDOM:
589 		stackgap = stackgap_random;
590 		error = sysctl_int(oldp, oldlenp, newp, newlen, &stackgap);
591 		if (error)
592 			return (error);
593 		/*
594 		 * Safety harness.
595 		 */
596 		if ((stackgap < ALIGNBYTES && stackgap != 0) ||
597 		    !powerof2(stackgap) || stackgap >= MAXSSIZ)
598 			return (EINVAL);
599 		stackgap_random = stackgap;
600 		return (0);
601 	case KERN_MAXCLUSTERS: {
602 		int val = nmbclust;
603 		error = sysctl_int(oldp, oldlenp, newp, newlen, &val);
604 		if (error == 0 && val != nmbclust)
605 			error = nmbclust_update(val);
606 		return (error);
607 	}
608 	case KERN_CACHEPCT: {
609 		u_int64_t dmapages;
610 		int opct, pgs;
611 		opct = bufcachepercent;
612 		error = sysctl_int(oldp, oldlenp, newp, newlen,
613 		    &bufcachepercent);
614 		if (error)
615 			return(error);
616 		if (bufcachepercent > 90 || bufcachepercent < 5) {
617 			bufcachepercent = opct;
618 			return (EINVAL);
619 		}
620 		dmapages = uvm_pagecount(&dma_constraint);
621 		if (bufcachepercent != opct) {
622 			pgs = bufcachepercent * dmapages / 100;
623 			bufadjust(pgs); /* adjust bufpages */
624 			bufhighpages = bufpages; /* set high water mark */
625 		}
626 		return(0);
627 	}
628 	case KERN_CONSDEV:
629 		if (cn_tab != NULL)
630 			dev = cn_tab->cn_dev;
631 		else
632 			dev = NODEV;
633 		return sysctl_rdstruct(oldp, oldlenp, newp, &dev, sizeof(dev));
634 	case KERN_POOL_DEBUG: {
635 		int old_pool_debug = pool_debug;
636 
637 		error = sysctl_int(oldp, oldlenp, newp, newlen,
638 		    &pool_debug);
639 		if (error == 0 && pool_debug != old_pool_debug)
640 			pool_reclaim_all();
641 		return (error);
642 	}
643 #if NPF > 0
644 	case KERN_PFSTATUS:
645 		return (pf_sysctl(oldp, oldlenp, newp, newlen));
646 #endif
647 	case KERN_TIMEOUT_STATS:
648 		return (timeout_sysctl(oldp, oldlenp, newp, newlen));
649 	case KERN_UTC_OFFSET:
650 		return (sysctl_utc_offset(oldp, oldlenp, newp, newlen));
651 	default:
652 		return (sysctl_bounded_arr(kern_vars, nitems(kern_vars), name,
653 		    namelen, oldp, oldlenp, newp, newlen));
654 	}
655 	/* NOTREACHED */
656 }
657 
658 /*
659  * hardware related system variables.
660  */
661 char *hw_vendor, *hw_prod, *hw_uuid, *hw_serial, *hw_ver;
662 int allowpowerdown = 1;
663 int hw_power = 1;
664 
665 /* morally const values reported by sysctl_bounded_arr */
666 static int byte_order = BYTE_ORDER;
667 static int page_size = PAGE_SIZE;
668 
669 const struct sysctl_bounded_args hw_vars[] = {
670 	{HW_NCPU, &ncpus, SYSCTL_INT_READONLY},
671 	{HW_NCPUFOUND, &ncpusfound, SYSCTL_INT_READONLY},
672 	{HW_BYTEORDER, &byte_order, SYSCTL_INT_READONLY},
673 	{HW_PAGESIZE, &page_size, SYSCTL_INT_READONLY},
674 	{HW_DISKCOUNT, &disk_count, SYSCTL_INT_READONLY},
675 	{HW_POWER, &hw_power, SYSCTL_INT_READONLY},
676 };
677 
678 int
679 hw_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp,
680     size_t newlen, struct proc *p)
681 {
682 	extern char machine[], cpu_model[];
683 	int err, cpuspeed;
684 
685 	/* all sysctl names at this level except sensors are terminal */
686 	if (name[0] != HW_SENSORS && namelen != 1)
687 		return (ENOTDIR);		/* overloaded */
688 
689 	switch (name[0]) {
690 	case HW_MACHINE:
691 		return (sysctl_rdstring(oldp, oldlenp, newp, machine));
692 	case HW_MODEL:
693 		return (sysctl_rdstring(oldp, oldlenp, newp, cpu_model));
694 	case HW_NCPUONLINE:
695 		return (sysctl_rdint(oldp, oldlenp, newp,
696 		    sysctl_hwncpuonline()));
697 	case HW_PHYSMEM:
698 		return (sysctl_rdint(oldp, oldlenp, newp, ptoa(physmem)));
699 	case HW_USERMEM:
700 		return (sysctl_rdint(oldp, oldlenp, newp,
701 		    ptoa(physmem - uvmexp.wired)));
702 	case HW_DISKNAMES:
703 		err = sysctl_diskinit(0, p);
704 		if (err)
705 			return err;
706 		if (disknames)
707 			return (sysctl_rdstring(oldp, oldlenp, newp,
708 			    disknames));
709 		else
710 			return (sysctl_rdstring(oldp, oldlenp, newp, ""));
711 	case HW_DISKSTATS:
712 		err = sysctl_diskinit(1, p);
713 		if (err)
714 			return err;
715 		return (sysctl_rdstruct(oldp, oldlenp, newp, diskstats,
716 		    disk_count * sizeof(struct diskstats)));
717 	case HW_CPUSPEED:
718 		if (!cpu_cpuspeed)
719 			return (EOPNOTSUPP);
720 		err = cpu_cpuspeed(&cpuspeed);
721 		if (err)
722 			return err;
723 		return (sysctl_rdint(oldp, oldlenp, newp, cpuspeed));
724 #ifndef	SMALL_KERNEL
725 	case HW_SENSORS:
726 		return (sysctl_sensors(name + 1, namelen - 1, oldp, oldlenp,
727 		    newp, newlen));
728 	case HW_SETPERF:
729 		return (sysctl_hwsetperf(oldp, oldlenp, newp, newlen));
730 	case HW_PERFPOLICY:
731 		return (sysctl_hwperfpolicy(oldp, oldlenp, newp, newlen));
732 #endif /* !SMALL_KERNEL */
733 	case HW_VENDOR:
734 		if (hw_vendor)
735 			return (sysctl_rdstring(oldp, oldlenp, newp,
736 			    hw_vendor));
737 		else
738 			return (EOPNOTSUPP);
739 	case HW_PRODUCT:
740 		if (hw_prod)
741 			return (sysctl_rdstring(oldp, oldlenp, newp, hw_prod));
742 		else
743 			return (EOPNOTSUPP);
744 	case HW_VERSION:
745 		if (hw_ver)
746 			return (sysctl_rdstring(oldp, oldlenp, newp, hw_ver));
747 		else
748 			return (EOPNOTSUPP);
749 	case HW_SERIALNO:
750 		if (hw_serial)
751 			return (sysctl_rdstring(oldp, oldlenp, newp,
752 			    hw_serial));
753 		else
754 			return (EOPNOTSUPP);
755 	case HW_UUID:
756 		if (hw_uuid)
757 			return (sysctl_rdstring(oldp, oldlenp, newp, hw_uuid));
758 		else
759 			return (EOPNOTSUPP);
760 	case HW_PHYSMEM64:
761 		return (sysctl_rdquad(oldp, oldlenp, newp,
762 		    ptoa((psize_t)physmem)));
763 	case HW_USERMEM64:
764 		return (sysctl_rdquad(oldp, oldlenp, newp,
765 		    ptoa((psize_t)physmem - uvmexp.wired)));
766 	case HW_ALLOWPOWERDOWN:
767 		return (sysctl_securelevel_int(oldp, oldlenp, newp, newlen,
768 		    &allowpowerdown));
769 #ifdef __HAVE_CPU_TOPOLOGY
770 	case HW_SMT:
771 		return (sysctl_hwsmt(oldp, oldlenp, newp, newlen));
772 #endif
773 	default:
774 		return sysctl_bounded_arr(hw_vars, nitems(hw_vars), name,
775 		    namelen, oldp, oldlenp, newp, newlen);
776 	}
777 	/* NOTREACHED */
778 }
779 
780 #ifdef DEBUG_SYSCTL
781 /*
782  * Debugging related system variables.
783  */
784 extern struct ctldebug debug_vfs_busyprt;
785 struct ctldebug debug1, debug2, debug3, debug4;
786 struct ctldebug debug5, debug6, debug7, debug8, debug9;
787 struct ctldebug debug10, debug11, debug12, debug13, debug14;
788 struct ctldebug debug15, debug16, debug17, debug18, debug19;
789 static struct ctldebug *debugvars[CTL_DEBUG_MAXID] = {
790 	&debug_vfs_busyprt,
791 	&debug1, &debug2, &debug3, &debug4,
792 	&debug5, &debug6, &debug7, &debug8, &debug9,
793 	&debug10, &debug11, &debug12, &debug13, &debug14,
794 	&debug15, &debug16, &debug17, &debug18, &debug19,
795 };
796 int
797 debug_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp,
798     size_t newlen, struct proc *p)
799 {
800 	struct ctldebug *cdp;
801 
802 	/* all sysctl names at this level are name and field */
803 	if (namelen != 2)
804 		return (ENOTDIR);		/* overloaded */
805 	if (name[0] < 0 || name[0] >= nitems(debugvars))
806 		return (EOPNOTSUPP);
807 	cdp = debugvars[name[0]];
808 	if (cdp->debugname == 0)
809 		return (EOPNOTSUPP);
810 	switch (name[1]) {
811 	case CTL_DEBUG_NAME:
812 		return (sysctl_rdstring(oldp, oldlenp, newp, cdp->debugname));
813 	case CTL_DEBUG_VALUE:
814 		return (sysctl_int(oldp, oldlenp, newp, newlen, cdp->debugvar));
815 	default:
816 		return (EOPNOTSUPP);
817 	}
818 	/* NOTREACHED */
819 }
820 #endif /* DEBUG_SYSCTL */
821 
822 /*
823  * Reads, or writes that lower the value
824  */
825 int
826 sysctl_int_lower(void *oldp, size_t *oldlenp, void *newp, size_t newlen,
827     int *valp)
828 {
829 	unsigned int oval = *valp, val = *valp;
830 	int error;
831 
832 	if (newp == NULL)
833 		return (sysctl_rdint(oldp, oldlenp, newp, val));
834 
835 	if ((error = sysctl_int(oldp, oldlenp, newp, newlen, &val)))
836 		return (error);
837 	if (val > oval)
838 		return (EPERM);		/* do not allow raising */
839 	*(unsigned int *)valp = val;
840 	return (0);
841 }
842 
843 /*
844  * Validate parameters and get old / set new parameters
845  * for an integer-valued sysctl function.
846  */
847 int
848 sysctl_int(void *oldp, size_t *oldlenp, void *newp, size_t newlen, int *valp)
849 {
850 	int error = 0;
851 
852 	if (oldp && *oldlenp < sizeof(int))
853 		return (ENOMEM);
854 	if (newp && newlen != sizeof(int))
855 		return (EINVAL);
856 	*oldlenp = sizeof(int);
857 	if (oldp)
858 		error = copyout(valp, oldp, sizeof(int));
859 	if (error == 0 && newp)
860 		error = copyin(newp, valp, sizeof(int));
861 	return (error);
862 }
863 
864 /*
865  * As above, but read-only.
866  */
867 int
868 sysctl_rdint(void *oldp, size_t *oldlenp, void *newp, int val)
869 {
870 	int error = 0;
871 
872 	if (oldp && *oldlenp < sizeof(int))
873 		return (ENOMEM);
874 	if (newp)
875 		return (EPERM);
876 	*oldlenp = sizeof(int);
877 	if (oldp)
878 		error = copyout((caddr_t)&val, oldp, sizeof(int));
879 	return (error);
880 }
881 
882 /*
883  * Selects between sysctl_rdint and sysctl_int according to securelevel.
884  */
885 int
886 sysctl_securelevel_int(void *oldp, size_t *oldlenp, void *newp, size_t newlen,
887     int *valp)
888 {
889 	if (securelevel > 0)
890 		return (sysctl_rdint(oldp, oldlenp, newp, *valp));
891 	return (sysctl_int(oldp, oldlenp, newp, newlen, valp));
892 }
893 
894 /*
895  * Read-only or bounded integer values.
896  */
897 int
898 sysctl_int_bounded(void *oldp, size_t *oldlenp, void *newp, size_t newlen,
899     int *valp, int minimum, int maximum)
900 {
901 	int val = *valp;
902 	int error;
903 
904 	/* read only */
905 	if (newp == NULL || minimum > maximum)
906 		return (sysctl_rdint(oldp, oldlenp, newp, val));
907 
908 	if ((error = sysctl_int(oldp, oldlenp, newp, newlen, &val)))
909 		return (error);
910 	/* outside limits */
911 	if (val < minimum || maximum < val)
912 		return (EINVAL);
913 	*valp = val;
914 	return (0);
915 }
916 
917 /*
918  * Array of read-only or bounded integer values.
919  */
920 int
921 sysctl_bounded_arr(const struct sysctl_bounded_args *valpp, u_int valplen,
922     int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp,
923     size_t newlen)
924 {
925 	u_int i;
926 	if (namelen != 1)
927 		return (ENOTDIR);
928 	for (i = 0; i < valplen; ++i) {
929 		if (valpp[i].mib == name[0]) {
930 			return (sysctl_int_bounded(oldp, oldlenp, newp, newlen,
931 			    valpp[i].var, valpp[i].minimum, valpp[i].maximum));
932 		}
933 	}
934 	return (EOPNOTSUPP);
935 }
936 
937 /*
938  * Validate parameters and get old / set new parameters
939  * for an integer-valued sysctl function.
940  */
941 int
942 sysctl_quad(void *oldp, size_t *oldlenp, void *newp, size_t newlen,
943     int64_t *valp)
944 {
945 	int error = 0;
946 
947 	if (oldp && *oldlenp < sizeof(int64_t))
948 		return (ENOMEM);
949 	if (newp && newlen != sizeof(int64_t))
950 		return (EINVAL);
951 	*oldlenp = sizeof(int64_t);
952 	if (oldp)
953 		error = copyout(valp, oldp, sizeof(int64_t));
954 	if (error == 0 && newp)
955 		error = copyin(newp, valp, sizeof(int64_t));
956 	return (error);
957 }
958 
959 /*
960  * As above, but read-only.
961  */
962 int
963 sysctl_rdquad(void *oldp, size_t *oldlenp, void *newp, int64_t val)
964 {
965 	int error = 0;
966 
967 	if (oldp && *oldlenp < sizeof(int64_t))
968 		return (ENOMEM);
969 	if (newp)
970 		return (EPERM);
971 	*oldlenp = sizeof(int64_t);
972 	if (oldp)
973 		error = copyout((caddr_t)&val, oldp, sizeof(int64_t));
974 	return (error);
975 }
976 
977 /*
978  * Validate parameters and get old / set new parameters
979  * for a string-valued sysctl function.
980  */
981 int
982 sysctl_string(void *oldp, size_t *oldlenp, void *newp, size_t newlen, char *str,
983     size_t maxlen)
984 {
985 	return sysctl__string(oldp, oldlenp, newp, newlen, str, maxlen, 0);
986 }
987 
988 int
989 sysctl_tstring(void *oldp, size_t *oldlenp, void *newp, size_t newlen,
990     char *str, size_t maxlen)
991 {
992 	return sysctl__string(oldp, oldlenp, newp, newlen, str, maxlen, 1);
993 }
994 
995 int
996 sysctl__string(void *oldp, size_t *oldlenp, void *newp, size_t newlen,
997     char *str, size_t maxlen, int trunc)
998 {
999 	size_t len;
1000 	int error = 0;
1001 
1002 	len = strlen(str) + 1;
1003 	if (oldp && *oldlenp < len) {
1004 		if (trunc == 0 || *oldlenp == 0)
1005 			return (ENOMEM);
1006 	}
1007 	if (newp && newlen >= maxlen)
1008 		return (EINVAL);
1009 	if (oldp) {
1010 		if (trunc && *oldlenp < len) {
1011 			len = *oldlenp;
1012 			error = copyout(str, oldp, len - 1);
1013 			if (error == 0)
1014 				error = copyout("", (char *)oldp + len - 1, 1);
1015 		} else {
1016 			error = copyout(str, oldp, len);
1017 		}
1018 	}
1019 	*oldlenp = len;
1020 	if (error == 0 && newp) {
1021 		error = copyin(newp, str, newlen);
1022 		str[newlen] = 0;
1023 	}
1024 	return (error);
1025 }
1026 
1027 /*
1028  * As above, but read-only.
1029  */
1030 int
1031 sysctl_rdstring(void *oldp, size_t *oldlenp, void *newp, const char *str)
1032 {
1033 	size_t len;
1034 	int error = 0;
1035 
1036 	len = strlen(str) + 1;
1037 	if (oldp && *oldlenp < len)
1038 		return (ENOMEM);
1039 	if (newp)
1040 		return (EPERM);
1041 	*oldlenp = len;
1042 	if (oldp)
1043 		error = copyout(str, oldp, len);
1044 	return (error);
1045 }
1046 
1047 /*
1048  * Validate parameters and get old / set new parameters
1049  * for a structure oriented sysctl function.
1050  */
1051 int
1052 sysctl_struct(void *oldp, size_t *oldlenp, void *newp, size_t newlen, void *sp,
1053     size_t len)
1054 {
1055 	int error = 0;
1056 
1057 	if (oldp && *oldlenp < len)
1058 		return (ENOMEM);
1059 	if (newp && newlen > len)
1060 		return (EINVAL);
1061 	if (oldp) {
1062 		*oldlenp = len;
1063 		error = copyout(sp, oldp, len);
1064 	}
1065 	if (error == 0 && newp)
1066 		error = copyin(newp, sp, len);
1067 	return (error);
1068 }
1069 
1070 /*
1071  * Validate parameters and get old parameters
1072  * for a structure oriented sysctl function.
1073  */
1074 int
1075 sysctl_rdstruct(void *oldp, size_t *oldlenp, void *newp, const void *sp,
1076     size_t len)
1077 {
1078 	int error = 0;
1079 
1080 	if (oldp && *oldlenp < len)
1081 		return (ENOMEM);
1082 	if (newp)
1083 		return (EPERM);
1084 	*oldlenp = len;
1085 	if (oldp)
1086 		error = copyout(sp, oldp, len);
1087 	return (error);
1088 }
1089 
1090 #ifndef SMALL_KERNEL
1091 void
1092 fill_file(struct kinfo_file *kf, struct file *fp, struct filedesc *fdp,
1093 	  int fd, struct vnode *vp, struct process *pr, struct proc *p,
1094 	  struct socket *so, int show_pointers)
1095 {
1096 	struct vattr va;
1097 
1098 	memset(kf, 0, sizeof(*kf));
1099 
1100 	kf->fd_fd = fd;		/* might not really be an fd */
1101 
1102 	if (fp != NULL) {
1103 		if (show_pointers)
1104 			kf->f_fileaddr = PTRTOINT64(fp);
1105 		kf->f_flag = fp->f_flag;
1106 		kf->f_iflags = fp->f_iflags;
1107 		kf->f_type = fp->f_type;
1108 		kf->f_count = fp->f_count;
1109 		if (show_pointers)
1110 			kf->f_ucred = PTRTOINT64(fp->f_cred);
1111 		kf->f_uid = fp->f_cred->cr_uid;
1112 		kf->f_gid = fp->f_cred->cr_gid;
1113 		if (show_pointers)
1114 			kf->f_ops = PTRTOINT64(fp->f_ops);
1115 		if (show_pointers)
1116 			kf->f_data = PTRTOINT64(fp->f_data);
1117 		kf->f_usecount = 0;
1118 
1119 		if (suser(p) == 0 || p->p_ucred->cr_uid == fp->f_cred->cr_uid) {
1120 			mtx_enter(&fp->f_mtx);
1121 			kf->f_offset = fp->f_offset;
1122 			kf->f_rxfer = fp->f_rxfer;
1123 			kf->f_rwfer = fp->f_wxfer;
1124 			kf->f_seek = fp->f_seek;
1125 			kf->f_rbytes = fp->f_rbytes;
1126 			kf->f_wbytes = fp->f_wbytes;
1127 			mtx_leave(&fp->f_mtx);
1128 		} else
1129 			kf->f_offset = -1;
1130 	} else if (vp != NULL) {
1131 		/* fake it */
1132 		kf->f_type = DTYPE_VNODE;
1133 		kf->f_flag = FREAD;
1134 		if (fd == KERN_FILE_TRACE)
1135 			kf->f_flag |= FWRITE;
1136 	} else if (so != NULL) {
1137 		/* fake it */
1138 		kf->f_type = DTYPE_SOCKET;
1139 	}
1140 
1141 	/* information about the object associated with this file */
1142 	switch (kf->f_type) {
1143 	case DTYPE_VNODE:
1144 		if (fp != NULL)
1145 			vp = (struct vnode *)fp->f_data;
1146 
1147 		if (show_pointers)
1148 			kf->v_un = PTRTOINT64(vp->v_un.vu_socket);
1149 		kf->v_type = vp->v_type;
1150 		kf->v_tag = vp->v_tag;
1151 		kf->v_flag = vp->v_flag;
1152 		if (show_pointers)
1153 			kf->v_data = PTRTOINT64(vp->v_data);
1154 		if (show_pointers)
1155 			kf->v_mount = PTRTOINT64(vp->v_mount);
1156 		if (vp->v_mount)
1157 			strlcpy(kf->f_mntonname,
1158 			    vp->v_mount->mnt_stat.f_mntonname,
1159 			    sizeof(kf->f_mntonname));
1160 
1161 		if (VOP_GETATTR(vp, &va, p->p_ucred, p) == 0) {
1162 			kf->va_fileid = va.va_fileid;
1163 			kf->va_mode = MAKEIMODE(va.va_type, va.va_mode);
1164 			kf->va_size = va.va_size;
1165 			kf->va_rdev = va.va_rdev;
1166 			kf->va_fsid = va.va_fsid & 0xffffffff;
1167 			kf->va_nlink = va.va_nlink;
1168 		}
1169 		break;
1170 
1171 	case DTYPE_SOCKET: {
1172 		int locked = 0;
1173 
1174 		if (so == NULL) {
1175 			so = (struct socket *)fp->f_data;
1176 			/* if so is passed as parameter it is already locked */
1177 			switch (so->so_proto->pr_domain->dom_family) {
1178 			case AF_INET:
1179 			case AF_INET6:
1180 				NET_LOCK();
1181 				locked = 1;
1182 				break;
1183 			}
1184 		}
1185 
1186 		kf->so_type = so->so_type;
1187 		kf->so_state = so->so_state | so->so_snd.sb_state |
1188 		    so->so_rcv.sb_state;
1189 		if (show_pointers)
1190 			kf->so_pcb = PTRTOINT64(so->so_pcb);
1191 		else
1192 			kf->so_pcb = -1;
1193 		kf->so_protocol = so->so_proto->pr_protocol;
1194 		kf->so_family = so->so_proto->pr_domain->dom_family;
1195 		kf->so_rcv_cc = so->so_rcv.sb_cc;
1196 		kf->so_snd_cc = so->so_snd.sb_cc;
1197 		if (isspliced(so)) {
1198 			if (show_pointers)
1199 				kf->so_splice =
1200 				    PTRTOINT64(so->so_sp->ssp_socket);
1201 			kf->so_splicelen = so->so_sp->ssp_len;
1202 		} else if (issplicedback(so))
1203 			kf->so_splicelen = -1;
1204 		if (so->so_pcb == NULL) {
1205 			if (locked)
1206 				NET_UNLOCK();
1207 			break;
1208 		}
1209 		switch (kf->so_family) {
1210 		case AF_INET: {
1211 			struct inpcb *inpcb = so->so_pcb;
1212 
1213 			NET_ASSERT_LOCKED();
1214 			if (show_pointers)
1215 				kf->inp_ppcb = PTRTOINT64(inpcb->inp_ppcb);
1216 			kf->inp_lport = inpcb->inp_lport;
1217 			kf->inp_laddru[0] = inpcb->inp_laddr.s_addr;
1218 			kf->inp_fport = inpcb->inp_fport;
1219 			kf->inp_faddru[0] = inpcb->inp_faddr.s_addr;
1220 			kf->inp_rtableid = inpcb->inp_rtableid;
1221 			if (so->so_type == SOCK_RAW)
1222 				kf->inp_proto = inpcb->inp_ip.ip_p;
1223 			if (so->so_proto->pr_protocol == IPPROTO_TCP) {
1224 				struct tcpcb *tcpcb = (void *)inpcb->inp_ppcb;
1225 				kf->t_rcv_wnd = tcpcb->rcv_wnd;
1226 				kf->t_snd_wnd = tcpcb->snd_wnd;
1227 				kf->t_snd_cwnd = tcpcb->snd_cwnd;
1228 				kf->t_state = tcpcb->t_state;
1229 			}
1230 			break;
1231 		    }
1232 		case AF_INET6: {
1233 			struct inpcb *inpcb = so->so_pcb;
1234 
1235 			NET_ASSERT_LOCKED();
1236 			if (show_pointers)
1237 				kf->inp_ppcb = PTRTOINT64(inpcb->inp_ppcb);
1238 			kf->inp_lport = inpcb->inp_lport;
1239 			kf->inp_laddru[0] = inpcb->inp_laddr6.s6_addr32[0];
1240 			kf->inp_laddru[1] = inpcb->inp_laddr6.s6_addr32[1];
1241 			kf->inp_laddru[2] = inpcb->inp_laddr6.s6_addr32[2];
1242 			kf->inp_laddru[3] = inpcb->inp_laddr6.s6_addr32[3];
1243 			kf->inp_fport = inpcb->inp_fport;
1244 			kf->inp_faddru[0] = inpcb->inp_faddr6.s6_addr32[0];
1245 			kf->inp_faddru[1] = inpcb->inp_faddr6.s6_addr32[1];
1246 			kf->inp_faddru[2] = inpcb->inp_faddr6.s6_addr32[2];
1247 			kf->inp_faddru[3] = inpcb->inp_faddr6.s6_addr32[3];
1248 			kf->inp_rtableid = inpcb->inp_rtableid;
1249 			if (so->so_type == SOCK_RAW)
1250 				kf->inp_proto = inpcb->inp_ipv6.ip6_nxt;
1251 			if (so->so_proto->pr_protocol == IPPROTO_TCP) {
1252 				struct tcpcb *tcpcb = (void *)inpcb->inp_ppcb;
1253 				kf->t_rcv_wnd = tcpcb->rcv_wnd;
1254 				kf->t_snd_wnd = tcpcb->snd_wnd;
1255 				kf->t_state = tcpcb->t_state;
1256 			}
1257 			break;
1258 		    }
1259 		case AF_UNIX: {
1260 			struct unpcb *unpcb = so->so_pcb;
1261 
1262 			kf->f_msgcount = unpcb->unp_msgcount;
1263 			if (show_pointers) {
1264 				kf->unp_conn	= PTRTOINT64(unpcb->unp_conn);
1265 				kf->unp_refs	= PTRTOINT64(
1266 				    SLIST_FIRST(&unpcb->unp_refs));
1267 				kf->unp_nextref	= PTRTOINT64(
1268 				    SLIST_NEXT(unpcb, unp_nextref));
1269 				kf->v_un	= PTRTOINT64(unpcb->unp_vnode);
1270 				kf->unp_addr	= PTRTOINT64(unpcb->unp_addr);
1271 			}
1272 			if (unpcb->unp_addr != NULL) {
1273 				struct sockaddr_un *un = mtod(unpcb->unp_addr,
1274 				    struct sockaddr_un *);
1275 				memcpy(kf->unp_path, un->sun_path, un->sun_len
1276 				    - offsetof(struct sockaddr_un,sun_path));
1277 			}
1278 			break;
1279 		    }
1280 		}
1281 		if (locked)
1282 			NET_UNLOCK();
1283 		break;
1284 	    }
1285 
1286 	case DTYPE_PIPE: {
1287 		struct pipe *pipe = (struct pipe *)fp->f_data;
1288 
1289 		if (show_pointers)
1290 			kf->pipe_peer = PTRTOINT64(pipe->pipe_peer);
1291 		kf->pipe_state = pipe->pipe_state;
1292 		break;
1293 	    }
1294 
1295 	case DTYPE_KQUEUE: {
1296 		struct kqueue *kqi = (struct kqueue *)fp->f_data;
1297 
1298 		kf->kq_count = kqi->kq_count;
1299 		kf->kq_state = kqi->kq_state;
1300 		break;
1301 	    }
1302 	}
1303 
1304 	/* per-process information for KERN_FILE_BY[PU]ID */
1305 	if (pr != NULL) {
1306 		kf->p_pid = pr->ps_pid;
1307 		kf->p_uid = pr->ps_ucred->cr_uid;
1308 		kf->p_gid = pr->ps_ucred->cr_gid;
1309 		kf->p_tid = -1;
1310 		strlcpy(kf->p_comm, pr->ps_comm, sizeof(kf->p_comm));
1311 	}
1312 	if (fdp != NULL) {
1313 		fdplock(fdp);
1314 		kf->fd_ofileflags = fdp->fd_ofileflags[fd];
1315 		fdpunlock(fdp);
1316 	}
1317 }
1318 
1319 /*
1320  * Get file structures.
1321  */
1322 int
1323 sysctl_file(int *name, u_int namelen, char *where, size_t *sizep,
1324     struct proc *p)
1325 {
1326 	struct kinfo_file *kf;
1327 	struct filedesc *fdp;
1328 	struct file *fp;
1329 	struct process *pr;
1330 	size_t buflen, elem_size, elem_count, outsize;
1331 	char *dp = where;
1332 	int arg, i, error = 0, needed = 0, matched;
1333 	u_int op;
1334 	int show_pointers;
1335 
1336 	if (namelen > 4)
1337 		return (ENOTDIR);
1338 	if (namelen < 4 || name[2] > sizeof(*kf))
1339 		return (EINVAL);
1340 
1341 	buflen = where != NULL ? *sizep : 0;
1342 	op = name[0];
1343 	arg = name[1];
1344 	elem_size = name[2];
1345 	elem_count = name[3];
1346 	outsize = MIN(sizeof(*kf), elem_size);
1347 
1348 	if (elem_size < 1)
1349 		return (EINVAL);
1350 
1351 	show_pointers = suser(curproc) == 0;
1352 
1353 	kf = malloc(sizeof(*kf), M_TEMP, M_WAITOK);
1354 
1355 #define FILLIT2(fp, fdp, i, vp, pr, so) do {				\
1356 	if (buflen >= elem_size && elem_count > 0) {			\
1357 		fill_file(kf, fp, fdp, i, vp, pr, p, so, show_pointers);\
1358 		error = copyout(kf, dp, outsize);			\
1359 		if (error)						\
1360 			break;						\
1361 		dp += elem_size;					\
1362 		buflen -= elem_size;					\
1363 		elem_count--;						\
1364 	}								\
1365 	needed += elem_size;						\
1366 } while (0)
1367 #define FILLIT(fp, fdp, i, vp, pr) \
1368 	FILLIT2(fp, fdp, i, vp, pr, NULL)
1369 #define FILLSO(so) \
1370 	FILLIT2(NULL, NULL, 0, NULL, NULL, so)
1371 
1372 	switch (op) {
1373 	case KERN_FILE_BYFILE:
1374 		/* use the inp-tables to pick up closed connections, too */
1375 		if (arg == DTYPE_SOCKET) {
1376 			struct inpcb *inp;
1377 
1378 			NET_LOCK();
1379 			mtx_enter(&tcbtable.inpt_mtx);
1380 			TAILQ_FOREACH(inp, &tcbtable.inpt_queue, inp_queue)
1381 				FILLSO(inp->inp_socket);
1382 			mtx_leave(&tcbtable.inpt_mtx);
1383 			mtx_enter(&udbtable.inpt_mtx);
1384 			TAILQ_FOREACH(inp, &udbtable.inpt_queue, inp_queue)
1385 				FILLSO(inp->inp_socket);
1386 			mtx_leave(&udbtable.inpt_mtx);
1387 			mtx_enter(&rawcbtable.inpt_mtx);
1388 			TAILQ_FOREACH(inp, &rawcbtable.inpt_queue, inp_queue)
1389 				FILLSO(inp->inp_socket);
1390 			mtx_leave(&rawcbtable.inpt_mtx);
1391 #ifdef INET6
1392 			mtx_enter(&rawin6pcbtable.inpt_mtx);
1393 			TAILQ_FOREACH(inp, &rawin6pcbtable.inpt_queue,
1394 			    inp_queue)
1395 				FILLSO(inp->inp_socket);
1396 			mtx_leave(&rawin6pcbtable.inpt_mtx);
1397 #endif
1398 			NET_UNLOCK();
1399 		}
1400 		fp = NULL;
1401 		while ((fp = fd_iterfile(fp, p)) != NULL) {
1402 			if ((arg == 0 || fp->f_type == arg)) {
1403 				int af, skip = 0;
1404 				if (arg == DTYPE_SOCKET && fp->f_type == arg) {
1405 					af = ((struct socket *)fp->f_data)->
1406 					    so_proto->pr_domain->dom_family;
1407 					if (af == AF_INET || af == AF_INET6)
1408 						skip = 1;
1409 				}
1410 				if (!skip)
1411 					FILLIT(fp, NULL, 0, NULL, NULL);
1412 			}
1413 		}
1414 		break;
1415 	case KERN_FILE_BYPID:
1416 		/* A arg of -1 indicates all processes */
1417 		if (arg < -1) {
1418 			error = EINVAL;
1419 			break;
1420 		}
1421 		matched = 0;
1422 		LIST_FOREACH(pr, &allprocess, ps_list) {
1423 			/*
1424 			 * skip system, exiting, embryonic and undead
1425 			 * processes
1426 			 */
1427 			if (pr->ps_flags & (PS_SYSTEM | PS_EMBRYO | PS_EXITING))
1428 				continue;
1429 			if (arg > 0 && pr->ps_pid != (pid_t)arg) {
1430 				/* not the pid we are looking for */
1431 				continue;
1432 			}
1433 			matched = 1;
1434 			fdp = pr->ps_fd;
1435 			if (pr->ps_textvp)
1436 				FILLIT(NULL, NULL, KERN_FILE_TEXT, pr->ps_textvp, pr);
1437 			if (fdp->fd_cdir)
1438 				FILLIT(NULL, NULL, KERN_FILE_CDIR, fdp->fd_cdir, pr);
1439 			if (fdp->fd_rdir)
1440 				FILLIT(NULL, NULL, KERN_FILE_RDIR, fdp->fd_rdir, pr);
1441 			if (pr->ps_tracevp)
1442 				FILLIT(NULL, NULL, KERN_FILE_TRACE, pr->ps_tracevp, pr);
1443 			for (i = 0; i < fdp->fd_nfiles; i++) {
1444 				if ((fp = fd_getfile(fdp, i)) == NULL)
1445 					continue;
1446 				FILLIT(fp, fdp, i, NULL, pr);
1447 				FRELE(fp, p);
1448 			}
1449 		}
1450 		if (!matched)
1451 			error = ESRCH;
1452 		break;
1453 	case KERN_FILE_BYUID:
1454 		LIST_FOREACH(pr, &allprocess, ps_list) {
1455 			/*
1456 			 * skip system, exiting, embryonic and undead
1457 			 * processes
1458 			 */
1459 			if (pr->ps_flags & (PS_SYSTEM | PS_EMBRYO | PS_EXITING))
1460 				continue;
1461 			if (arg >= 0 && pr->ps_ucred->cr_uid != (uid_t)arg) {
1462 				/* not the uid we are looking for */
1463 				continue;
1464 			}
1465 			fdp = pr->ps_fd;
1466 			if (fdp->fd_cdir)
1467 				FILLIT(NULL, NULL, KERN_FILE_CDIR, fdp->fd_cdir, pr);
1468 			if (fdp->fd_rdir)
1469 				FILLIT(NULL, NULL, KERN_FILE_RDIR, fdp->fd_rdir, pr);
1470 			if (pr->ps_tracevp)
1471 				FILLIT(NULL, NULL, KERN_FILE_TRACE, pr->ps_tracevp, pr);
1472 			for (i = 0; i < fdp->fd_nfiles; i++) {
1473 				if ((fp = fd_getfile(fdp, i)) == NULL)
1474 					continue;
1475 				FILLIT(fp, fdp, i, NULL, pr);
1476 				FRELE(fp, p);
1477 			}
1478 		}
1479 		break;
1480 	default:
1481 		error = EINVAL;
1482 		break;
1483 	}
1484 	free(kf, M_TEMP, sizeof(*kf));
1485 
1486 	if (!error) {
1487 		if (where == NULL)
1488 			needed += KERN_FILESLOP * elem_size;
1489 		else if (*sizep < needed)
1490 			error = ENOMEM;
1491 		*sizep = needed;
1492 	}
1493 
1494 	return (error);
1495 }
1496 
1497 /*
1498  * try over estimating by 5 procs
1499  */
1500 #define KERN_PROCSLOP	5
1501 
1502 int
1503 sysctl_doproc(int *name, u_int namelen, char *where, size_t *sizep)
1504 {
1505 	struct kinfo_proc *kproc = NULL;
1506 	struct proc *p;
1507 	struct process *pr;
1508 	char *dp;
1509 	int arg, buflen, doingzomb, elem_size, elem_count;
1510 	int error, needed, op;
1511 	int dothreads = 0;
1512 	int show_pointers;
1513 
1514 	dp = where;
1515 	buflen = where != NULL ? *sizep : 0;
1516 	needed = error = 0;
1517 
1518 	if (namelen != 4 || name[2] <= 0 || name[3] < 0 ||
1519 	    name[2] > sizeof(*kproc))
1520 		return (EINVAL);
1521 	op = name[0];
1522 	arg = name[1];
1523 	elem_size = name[2];
1524 	elem_count = name[3];
1525 
1526 	dothreads = op & KERN_PROC_SHOW_THREADS;
1527 	op &= ~KERN_PROC_SHOW_THREADS;
1528 
1529 	show_pointers = suser(curproc) == 0;
1530 
1531 	if (where != NULL)
1532 		kproc = malloc(sizeof(*kproc), M_TEMP, M_WAITOK);
1533 
1534 	pr = LIST_FIRST(&allprocess);
1535 	doingzomb = 0;
1536 again:
1537 	for (; pr != NULL; pr = LIST_NEXT(pr, ps_list)) {
1538 		/* XXX skip processes in the middle of being zapped */
1539 		if (pr->ps_pgrp == NULL)
1540 			continue;
1541 
1542 		/*
1543 		 * Skip embryonic processes.
1544 		 */
1545 		if (pr->ps_flags & PS_EMBRYO)
1546 			continue;
1547 
1548 		/*
1549 		 * TODO - make more efficient (see notes below).
1550 		 */
1551 		switch (op) {
1552 
1553 		case KERN_PROC_PID:
1554 			/* could do this with just a lookup */
1555 			if (pr->ps_pid != (pid_t)arg)
1556 				continue;
1557 			break;
1558 
1559 		case KERN_PROC_PGRP:
1560 			/* could do this by traversing pgrp */
1561 			if (pr->ps_pgrp->pg_id != (pid_t)arg)
1562 				continue;
1563 			break;
1564 
1565 		case KERN_PROC_SESSION:
1566 			if (pr->ps_session->s_leader == NULL ||
1567 			    pr->ps_session->s_leader->ps_pid != (pid_t)arg)
1568 				continue;
1569 			break;
1570 
1571 		case KERN_PROC_TTY:
1572 			if ((pr->ps_flags & PS_CONTROLT) == 0 ||
1573 			    pr->ps_session->s_ttyp == NULL ||
1574 			    pr->ps_session->s_ttyp->t_dev != (dev_t)arg)
1575 				continue;
1576 			break;
1577 
1578 		case KERN_PROC_UID:
1579 			if (pr->ps_ucred->cr_uid != (uid_t)arg)
1580 				continue;
1581 			break;
1582 
1583 		case KERN_PROC_RUID:
1584 			if (pr->ps_ucred->cr_ruid != (uid_t)arg)
1585 				continue;
1586 			break;
1587 
1588 		case KERN_PROC_ALL:
1589 			if (pr->ps_flags & PS_SYSTEM)
1590 				continue;
1591 			break;
1592 
1593 		case KERN_PROC_KTHREAD:
1594 			/* no filtering */
1595 			break;
1596 
1597 		default:
1598 			error = EINVAL;
1599 			goto err;
1600 		}
1601 
1602 		if (buflen >= elem_size && elem_count > 0) {
1603 			fill_kproc(pr, kproc, NULL, show_pointers);
1604 			error = copyout(kproc, dp, elem_size);
1605 			if (error)
1606 				goto err;
1607 			dp += elem_size;
1608 			buflen -= elem_size;
1609 			elem_count--;
1610 		}
1611 		needed += elem_size;
1612 
1613 		/* Skip per-thread entries if not required by op */
1614 		if (!dothreads)
1615 			continue;
1616 
1617 		TAILQ_FOREACH(p, &pr->ps_threads, p_thr_link) {
1618 			if (buflen >= elem_size && elem_count > 0) {
1619 				fill_kproc(pr, kproc, p, show_pointers);
1620 				error = copyout(kproc, dp, elem_size);
1621 				if (error)
1622 					goto err;
1623 				dp += elem_size;
1624 				buflen -= elem_size;
1625 				elem_count--;
1626 			}
1627 			needed += elem_size;
1628 		}
1629 	}
1630 	if (doingzomb == 0) {
1631 		pr = LIST_FIRST(&zombprocess);
1632 		doingzomb++;
1633 		goto again;
1634 	}
1635 	if (where != NULL) {
1636 		*sizep = dp - where;
1637 		if (needed > *sizep) {
1638 			error = ENOMEM;
1639 			goto err;
1640 		}
1641 	} else {
1642 		needed += KERN_PROCSLOP * elem_size;
1643 		*sizep = needed;
1644 	}
1645 err:
1646 	if (kproc)
1647 		free(kproc, M_TEMP, sizeof(*kproc));
1648 	return (error);
1649 }
1650 
1651 /*
1652  * Fill in a kproc structure for the specified process.
1653  */
1654 void
1655 fill_kproc(struct process *pr, struct kinfo_proc *ki, struct proc *p,
1656     int show_pointers)
1657 {
1658 	struct session *s = pr->ps_session;
1659 	struct tty *tp;
1660 	struct vmspace *vm = pr->ps_vmspace;
1661 	struct timespec booted, st, ut, utc;
1662 	int isthread;
1663 
1664 	isthread = p != NULL;
1665 	if (!isthread)
1666 		p = pr->ps_mainproc;		/* XXX */
1667 
1668 	FILL_KPROC(ki, strlcpy, p, pr, pr->ps_ucred, pr->ps_pgrp,
1669 	    p, pr, s, vm, pr->ps_limit, pr->ps_sigacts, isthread,
1670 	    show_pointers);
1671 
1672 	/* stuff that's too painful to generalize into the macros */
1673 	if (pr->ps_pptr)
1674 		ki->p_ppid = pr->ps_ppid;
1675 	if (s->s_leader)
1676 		ki->p_sid = s->s_leader->ps_pid;
1677 
1678 	if ((pr->ps_flags & PS_CONTROLT) && (tp = s->s_ttyp)) {
1679 		ki->p_tdev = tp->t_dev;
1680 		ki->p_tpgid = tp->t_pgrp ? tp->t_pgrp->pg_id : -1;
1681 		if (show_pointers)
1682 			ki->p_tsess = PTRTOINT64(tp->t_session);
1683 	} else {
1684 		ki->p_tdev = NODEV;
1685 		ki->p_tpgid = -1;
1686 	}
1687 
1688 	/* fixups that can only be done in the kernel */
1689 	if ((pr->ps_flags & PS_ZOMBIE) == 0) {
1690 		if ((pr->ps_flags & PS_EMBRYO) == 0 && vm != NULL)
1691 			ki->p_vm_rssize = vm_resident_count(vm);
1692 		calctsru(isthread ? &p->p_tu : &pr->ps_tu, &ut, &st, NULL);
1693 		ki->p_uutime_sec = ut.tv_sec;
1694 		ki->p_uutime_usec = ut.tv_nsec/1000;
1695 		ki->p_ustime_sec = st.tv_sec;
1696 		ki->p_ustime_usec = st.tv_nsec/1000;
1697 
1698 		/* Convert starting uptime to a starting UTC time. */
1699 		nanoboottime(&booted);
1700 		timespecadd(&booted, &pr->ps_start, &utc);
1701 		ki->p_ustart_sec = utc.tv_sec;
1702 		ki->p_ustart_usec = utc.tv_nsec / 1000;
1703 
1704 #ifdef MULTIPROCESSOR
1705 		if (p->p_cpu != NULL)
1706 			ki->p_cpuid = CPU_INFO_UNIT(p->p_cpu);
1707 #endif
1708 	}
1709 
1710 	/* get %cpu and schedule state: just one thread or sum of all? */
1711 	if (isthread) {
1712 		ki->p_pctcpu = p->p_pctcpu;
1713 		ki->p_stat   = p->p_stat;
1714 	} else {
1715 		ki->p_pctcpu = 0;
1716 		ki->p_stat = (pr->ps_flags & PS_ZOMBIE) ? SDEAD : SIDL;
1717 		TAILQ_FOREACH(p, &pr->ps_threads, p_thr_link) {
1718 			ki->p_pctcpu += p->p_pctcpu;
1719 			/* find best state: ONPROC > RUN > STOP > SLEEP > .. */
1720 			if (p->p_stat == SONPROC || ki->p_stat == SONPROC)
1721 				ki->p_stat = SONPROC;
1722 			else if (p->p_stat == SRUN || ki->p_stat == SRUN)
1723 				ki->p_stat = SRUN;
1724 			else if (p->p_stat == SSTOP || ki->p_stat == SSTOP)
1725 				ki->p_stat = SSTOP;
1726 			else if (p->p_stat == SSLEEP)
1727 				ki->p_stat = SSLEEP;
1728 		}
1729 	}
1730 }
1731 
1732 int
1733 sysctl_proc_args(int *name, u_int namelen, void *oldp, size_t *oldlenp,
1734     struct proc *cp)
1735 {
1736 	struct process *vpr;
1737 	pid_t pid;
1738 	struct ps_strings pss;
1739 	struct iovec iov;
1740 	struct uio uio;
1741 	int error, cnt, op;
1742 	size_t limit;
1743 	char **rargv, **vargv;		/* reader vs. victim */
1744 	char *rarg, *varg, *buf;
1745 	struct vmspace *vm;
1746 	vaddr_t ps_strings;
1747 
1748 	if (namelen > 2)
1749 		return (ENOTDIR);
1750 	if (namelen < 2)
1751 		return (EINVAL);
1752 
1753 	pid = name[0];
1754 	op = name[1];
1755 
1756 	switch (op) {
1757 	case KERN_PROC_ARGV:
1758 	case KERN_PROC_NARGV:
1759 	case KERN_PROC_ENV:
1760 	case KERN_PROC_NENV:
1761 		break;
1762 	default:
1763 		return (EOPNOTSUPP);
1764 	}
1765 
1766 	if ((vpr = prfind(pid)) == NULL)
1767 		return (ESRCH);
1768 
1769 	if (oldp == NULL) {
1770 		if (op == KERN_PROC_NARGV || op == KERN_PROC_NENV)
1771 			*oldlenp = sizeof(int);
1772 		else
1773 			*oldlenp = ARG_MAX;	/* XXX XXX XXX */
1774 		return (0);
1775 	}
1776 
1777 	/* Either system process or exiting/zombie */
1778 	if (vpr->ps_flags & (PS_SYSTEM | PS_EXITING))
1779 		return (EINVAL);
1780 
1781 	/* Execing - danger. */
1782 	if ((vpr->ps_flags & PS_INEXEC))
1783 		return (EBUSY);
1784 
1785 	/* Only owner or root can get env */
1786 	if ((op == KERN_PROC_NENV || op == KERN_PROC_ENV) &&
1787 	    (vpr->ps_ucred->cr_uid != cp->p_ucred->cr_uid &&
1788 	    (error = suser(cp)) != 0))
1789 		return (error);
1790 
1791 	ps_strings = vpr->ps_strings;
1792 	vm = vpr->ps_vmspace;
1793 	uvmspace_addref(vm);
1794 	vpr = NULL;
1795 
1796 	buf = malloc(PAGE_SIZE, M_TEMP, M_WAITOK);
1797 
1798 	iov.iov_base = &pss;
1799 	iov.iov_len = sizeof(pss);
1800 	uio.uio_iov = &iov;
1801 	uio.uio_iovcnt = 1;
1802 	uio.uio_offset = (off_t)ps_strings;
1803 	uio.uio_resid = sizeof(pss);
1804 	uio.uio_segflg = UIO_SYSSPACE;
1805 	uio.uio_rw = UIO_READ;
1806 	uio.uio_procp = cp;
1807 
1808 	if ((error = uvm_io(&vm->vm_map, &uio, 0)) != 0)
1809 		goto out;
1810 
1811 	if (op == KERN_PROC_NARGV) {
1812 		error = sysctl_rdint(oldp, oldlenp, NULL, pss.ps_nargvstr);
1813 		goto out;
1814 	}
1815 	if (op == KERN_PROC_NENV) {
1816 		error = sysctl_rdint(oldp, oldlenp, NULL, pss.ps_nenvstr);
1817 		goto out;
1818 	}
1819 
1820 	if (op == KERN_PROC_ARGV) {
1821 		cnt = pss.ps_nargvstr;
1822 		vargv = pss.ps_argvstr;
1823 	} else {
1824 		cnt = pss.ps_nenvstr;
1825 		vargv = pss.ps_envstr;
1826 	}
1827 
1828 	/* -1 to have space for a terminating NUL */
1829 	limit = *oldlenp - 1;
1830 	*oldlenp = 0;
1831 
1832 	rargv = oldp;
1833 
1834 	/*
1835 	 * *oldlenp - number of bytes copied out into readers buffer.
1836 	 * limit - maximal number of bytes allowed into readers buffer.
1837 	 * rarg - pointer into readers buffer where next arg will be stored.
1838 	 * rargv - pointer into readers buffer where the next rarg pointer
1839 	 *  will be stored.
1840 	 * vargv - pointer into victim address space where the next argument
1841 	 *  will be read.
1842 	 */
1843 
1844 	/* space for cnt pointers and a NULL */
1845 	rarg = (char *)(rargv + cnt + 1);
1846 	*oldlenp += (cnt + 1) * sizeof(char **);
1847 
1848 	while (cnt > 0 && *oldlenp < limit) {
1849 		size_t len, vstrlen;
1850 
1851 		/* Write to readers argv */
1852 		if ((error = copyout(&rarg, rargv, sizeof(rarg))) != 0)
1853 			goto out;
1854 
1855 		/* read the victim argv */
1856 		iov.iov_base = &varg;
1857 		iov.iov_len = sizeof(varg);
1858 		uio.uio_iov = &iov;
1859 		uio.uio_iovcnt = 1;
1860 		uio.uio_offset = (off_t)(vaddr_t)vargv;
1861 		uio.uio_resid = sizeof(varg);
1862 		uio.uio_segflg = UIO_SYSSPACE;
1863 		uio.uio_rw = UIO_READ;
1864 		uio.uio_procp = cp;
1865 		if ((error = uvm_io(&vm->vm_map, &uio, 0)) != 0)
1866 			goto out;
1867 
1868 		if (varg == NULL)
1869 			break;
1870 
1871 		/*
1872 		 * read the victim arg. We must jump through hoops to avoid
1873 		 * crossing a page boundary too much and returning an error.
1874 		 */
1875 more:
1876 		len = PAGE_SIZE - (((vaddr_t)varg) & PAGE_MASK);
1877 		/* leave space for the terminating NUL */
1878 		iov.iov_base = buf;
1879 		iov.iov_len = len;
1880 		uio.uio_iov = &iov;
1881 		uio.uio_iovcnt = 1;
1882 		uio.uio_offset = (off_t)(vaddr_t)varg;
1883 		uio.uio_resid = len;
1884 		uio.uio_segflg = UIO_SYSSPACE;
1885 		uio.uio_rw = UIO_READ;
1886 		uio.uio_procp = cp;
1887 		if ((error = uvm_io(&vm->vm_map, &uio, 0)) != 0)
1888 			goto out;
1889 
1890 		for (vstrlen = 0; vstrlen < len; vstrlen++) {
1891 			if (buf[vstrlen] == '\0')
1892 				break;
1893 		}
1894 
1895 		/* Don't overflow readers buffer. */
1896 		if (*oldlenp + vstrlen + 1 >= limit) {
1897 			error = ENOMEM;
1898 			goto out;
1899 		}
1900 
1901 		if ((error = copyout(buf, rarg, vstrlen)) != 0)
1902 			goto out;
1903 
1904 		*oldlenp += vstrlen;
1905 		rarg += vstrlen;
1906 
1907 		/* The string didn't end in this page? */
1908 		if (vstrlen == len) {
1909 			varg += vstrlen;
1910 			goto more;
1911 		}
1912 
1913 		/* End of string. Terminate it with a NUL */
1914 		buf[0] = '\0';
1915 		if ((error = copyout(buf, rarg, 1)) != 0)
1916 			goto out;
1917 		*oldlenp += 1;
1918 		rarg += 1;
1919 
1920 		vargv++;
1921 		rargv++;
1922 		cnt--;
1923 	}
1924 
1925 	if (*oldlenp >= limit) {
1926 		error = ENOMEM;
1927 		goto out;
1928 	}
1929 
1930 	/* Write the terminating null */
1931 	rarg = NULL;
1932 	error = copyout(&rarg, rargv, sizeof(rarg));
1933 
1934 out:
1935 	uvmspace_free(vm);
1936 	free(buf, M_TEMP, PAGE_SIZE);
1937 	return (error);
1938 }
1939 
1940 int
1941 sysctl_proc_cwd(int *name, u_int namelen, void *oldp, size_t *oldlenp,
1942     struct proc *cp)
1943 {
1944 	struct process *findpr;
1945 	struct vnode *vp;
1946 	pid_t pid;
1947 	int error;
1948 	size_t lenused, len;
1949 	char *path, *bp, *bend;
1950 
1951 	if (namelen > 1)
1952 		return (ENOTDIR);
1953 	if (namelen < 1)
1954 		return (EINVAL);
1955 
1956 	pid = name[0];
1957 	if ((findpr = prfind(pid)) == NULL)
1958 		return (ESRCH);
1959 
1960 	if (oldp == NULL) {
1961 		*oldlenp = MAXPATHLEN * 4;
1962 		return (0);
1963 	}
1964 
1965 	/* Either system process or exiting/zombie */
1966 	if (findpr->ps_flags & (PS_SYSTEM | PS_EXITING))
1967 		return (EINVAL);
1968 
1969 	/* Only owner or root can get cwd */
1970 	if (findpr->ps_ucred->cr_uid != cp->p_ucred->cr_uid &&
1971 	    (error = suser(cp)) != 0)
1972 		return (error);
1973 
1974 	len = *oldlenp;
1975 	if (len > MAXPATHLEN * 4)
1976 		len = MAXPATHLEN * 4;
1977 	else if (len < 2)
1978 		return (ERANGE);
1979 	*oldlenp = 0;
1980 
1981 	/* snag a reference to the vnode before we can sleep */
1982 	vp = findpr->ps_fd->fd_cdir;
1983 	vref(vp);
1984 
1985 	path = malloc(len, M_TEMP, M_WAITOK);
1986 
1987 	bp = &path[len];
1988 	bend = bp;
1989 	*(--bp) = '\0';
1990 
1991 	/* Same as sys__getcwd */
1992 	error = vfs_getcwd_common(vp, NULL,
1993 	    &bp, path, len / 2, GETCWD_CHECK_ACCESS, cp);
1994 	if (error == 0) {
1995 		*oldlenp = lenused = bend - bp;
1996 		error = copyout(bp, oldp, lenused);
1997 	}
1998 
1999 	vrele(vp);
2000 	free(path, M_TEMP, len);
2001 
2002 	return (error);
2003 }
2004 
2005 int
2006 sysctl_proc_nobroadcastkill(int *name, u_int namelen, void *newp, size_t newlen,
2007     void *oldp, size_t *oldlenp, struct proc *cp)
2008 {
2009 	struct process *findpr;
2010 	pid_t pid;
2011 	int error, flag;
2012 
2013 	if (namelen > 1)
2014 		return (ENOTDIR);
2015 	if (namelen < 1)
2016 		return (EINVAL);
2017 
2018 	pid = name[0];
2019 	if ((findpr = prfind(pid)) == NULL)
2020 		return (ESRCH);
2021 
2022 	/* Either system process or exiting/zombie */
2023 	if (findpr->ps_flags & (PS_SYSTEM | PS_EXITING))
2024 		return (EINVAL);
2025 
2026 	/* Only root can change PS_NOBROADCASTKILL */
2027 	if (newp != NULL && (error = suser(cp)) != 0)
2028 		return (error);
2029 
2030 	/* get the PS_NOBROADCASTKILL flag */
2031 	flag = findpr->ps_flags & PS_NOBROADCASTKILL ? 1 : 0;
2032 
2033 	error = sysctl_int(oldp, oldlenp, newp, newlen, &flag);
2034 	if (error == 0 && newp) {
2035 		if (flag)
2036 			atomic_setbits_int(&findpr->ps_flags,
2037 			    PS_NOBROADCASTKILL);
2038 		else
2039 			atomic_clearbits_int(&findpr->ps_flags,
2040 			    PS_NOBROADCASTKILL);
2041 	}
2042 
2043 	return (error);
2044 }
2045 
2046 /* Arbitrary but reasonable limit for one iteration. */
2047 #define	VMMAP_MAXLEN	MAXPHYS
2048 
2049 int
2050 sysctl_proc_vmmap(int *name, u_int namelen, void *oldp, size_t *oldlenp,
2051     struct proc *cp)
2052 {
2053 	struct process *findpr;
2054 	pid_t pid;
2055 	int error;
2056 	size_t oldlen, len;
2057 	struct kinfo_vmentry *kve, *ukve;
2058 	u_long *ustart, start;
2059 
2060 	if (namelen > 1)
2061 		return (ENOTDIR);
2062 	if (namelen < 1)
2063 		return (EINVAL);
2064 
2065 	/* Provide max buffer length as hint. */
2066 	if (oldp == NULL) {
2067 		if (oldlenp == NULL)
2068 			return (EINVAL);
2069 		else {
2070 			*oldlenp = VMMAP_MAXLEN;
2071 			return (0);
2072 		}
2073 	}
2074 
2075 	pid = name[0];
2076 	if (pid == cp->p_p->ps_pid) {
2077 		/* Self process mapping. */
2078 		findpr = cp->p_p;
2079 	} else if (pid > 0) {
2080 		if ((findpr = prfind(pid)) == NULL)
2081 			return (ESRCH);
2082 
2083 		/* Either system process or exiting/zombie */
2084 		if (findpr->ps_flags & (PS_SYSTEM | PS_EXITING))
2085 			return (EINVAL);
2086 
2087 #if 1
2088 		/* XXX Allow only root for now */
2089 		if ((error = suser(cp)) != 0)
2090 			return (error);
2091 #else
2092 		/* Only owner or root can get vmmap */
2093 		if (findpr->ps_ucred->cr_uid != cp->p_ucred->cr_uid &&
2094 		    (error = suser(cp)) != 0)
2095 			return (error);
2096 #endif
2097 	} else {
2098 		/* Only root can get kernel_map */
2099 		if ((error = suser(cp)) != 0)
2100 			return (error);
2101 		findpr = NULL;
2102 	}
2103 
2104 	/* Check the given size. */
2105 	oldlen = *oldlenp;
2106 	if (oldlen == 0 || oldlen % sizeof(*kve) != 0)
2107 		return (EINVAL);
2108 
2109 	/* Deny huge allocation. */
2110 	if (oldlen > VMMAP_MAXLEN)
2111 		return (EINVAL);
2112 
2113 	/*
2114 	 * Iterate from the given address passed as the first element's
2115 	 * kve_start via oldp.
2116 	 */
2117 	ukve = (struct kinfo_vmentry *)oldp;
2118 	ustart = &ukve->kve_start;
2119 	error = copyin(ustart, &start, sizeof(start));
2120 	if (error != 0)
2121 		return (error);
2122 
2123 	/* Allocate wired memory to not block. */
2124 	kve = malloc(oldlen, M_TEMP, M_WAITOK);
2125 
2126 	/* Set the base address and read entries. */
2127 	kve[0].kve_start = start;
2128 	len = oldlen;
2129 	error = fill_vmmap(findpr, kve, &len);
2130 	if (error != 0 && error != ENOMEM)
2131 		goto done;
2132 	if (len == 0)
2133 		goto done;
2134 
2135 	KASSERT(len <= oldlen);
2136 	KASSERT((len % sizeof(struct kinfo_vmentry)) == 0);
2137 
2138 	error = copyout(kve, oldp, len);
2139 
2140 done:
2141 	*oldlenp = len;
2142 
2143 	free(kve, M_TEMP, oldlen);
2144 
2145 	return (error);
2146 }
2147 #endif
2148 
2149 /*
2150  * Initialize disknames/diskstats for export by sysctl. If update is set,
2151  * then we simply update the disk statistics information.
2152  */
2153 int
2154 sysctl_diskinit(int update, struct proc *p)
2155 {
2156 	struct diskstats *sdk;
2157 	struct disk *dk;
2158 	const char *duid;
2159 	int error, changed = 0;
2160 
2161 	KERNEL_ASSERT_LOCKED();
2162 
2163 	if ((error = rw_enter(&sysctl_disklock, RW_WRITE|RW_INTR)) != 0)
2164 		return error;
2165 
2166 	/* Run in a loop, disks may change while malloc sleeps. */
2167 	while (disk_change) {
2168 		int tlen;
2169 
2170 		disk_change = 0;
2171 
2172 		tlen = 0;
2173 		TAILQ_FOREACH(dk, &disklist, dk_link) {
2174 			if (dk->dk_name)
2175 				tlen += strlen(dk->dk_name);
2176 			tlen += 18;	/* label uid + separators */
2177 		}
2178 		tlen++;
2179 
2180 		/*
2181 		 * The sysctl_disklock ensures that no other process can
2182 		 * allocate disknames and diskstats while our malloc sleeps.
2183 		 */
2184 		free(disknames, M_SYSCTL, disknameslen);
2185 		free(diskstats, M_SYSCTL, diskstatslen);
2186 		diskstats = NULL;
2187 		disknames = NULL;
2188 		diskstats = mallocarray(disk_count, sizeof(struct diskstats),
2189 		    M_SYSCTL, M_WAITOK|M_ZERO);
2190 		diskstatslen = disk_count * sizeof(struct diskstats);
2191 		disknames = malloc(tlen, M_SYSCTL, M_WAITOK|M_ZERO);
2192 		disknameslen = tlen;
2193 		disknames[0] = '\0';
2194 		changed = 1;
2195 	}
2196 
2197 	if (changed) {
2198 		int l;
2199 
2200 		l = 0;
2201 		sdk = diskstats;
2202 		TAILQ_FOREACH(dk, &disklist, dk_link) {
2203 			duid = NULL;
2204 			if (dk->dk_label && !duid_iszero(dk->dk_label->d_uid))
2205 				duid = duid_format(dk->dk_label->d_uid);
2206 			snprintf(disknames + l, disknameslen - l, "%s:%s,",
2207 			    dk->dk_name ? dk->dk_name : "",
2208 			    duid ? duid : "");
2209 			l += strlen(disknames + l);
2210 			strlcpy(sdk->ds_name, dk->dk_name,
2211 			    sizeof(sdk->ds_name));
2212 			mtx_enter(&dk->dk_mtx);
2213 			sdk->ds_busy = dk->dk_busy;
2214 			sdk->ds_rxfer = dk->dk_rxfer;
2215 			sdk->ds_wxfer = dk->dk_wxfer;
2216 			sdk->ds_seek = dk->dk_seek;
2217 			sdk->ds_rbytes = dk->dk_rbytes;
2218 			sdk->ds_wbytes = dk->dk_wbytes;
2219 			sdk->ds_attachtime = dk->dk_attachtime;
2220 			sdk->ds_timestamp = dk->dk_timestamp;
2221 			sdk->ds_time = dk->dk_time;
2222 			mtx_leave(&dk->dk_mtx);
2223 			sdk++;
2224 		}
2225 
2226 		/* Eliminate trailing comma */
2227 		if (l != 0)
2228 			disknames[l - 1] = '\0';
2229 	} else if (update) {
2230 		/* Just update, number of drives hasn't changed */
2231 		sdk = diskstats;
2232 		TAILQ_FOREACH(dk, &disklist, dk_link) {
2233 			strlcpy(sdk->ds_name, dk->dk_name,
2234 			    sizeof(sdk->ds_name));
2235 			mtx_enter(&dk->dk_mtx);
2236 			sdk->ds_busy = dk->dk_busy;
2237 			sdk->ds_rxfer = dk->dk_rxfer;
2238 			sdk->ds_wxfer = dk->dk_wxfer;
2239 			sdk->ds_seek = dk->dk_seek;
2240 			sdk->ds_rbytes = dk->dk_rbytes;
2241 			sdk->ds_wbytes = dk->dk_wbytes;
2242 			sdk->ds_attachtime = dk->dk_attachtime;
2243 			sdk->ds_timestamp = dk->dk_timestamp;
2244 			sdk->ds_time = dk->dk_time;
2245 			mtx_leave(&dk->dk_mtx);
2246 			sdk++;
2247 		}
2248 	}
2249 	rw_exit_write(&sysctl_disklock);
2250 	return 0;
2251 }
2252 
2253 #if defined(SYSVMSG) || defined(SYSVSEM) || defined(SYSVSHM)
2254 int
2255 sysctl_sysvipc(int *name, u_int namelen, void *where, size_t *sizep)
2256 {
2257 #ifdef SYSVSEM
2258 	struct sem_sysctl_info *semsi;
2259 #endif
2260 #ifdef SYSVSHM
2261 	struct shm_sysctl_info *shmsi;
2262 #endif
2263 	size_t infosize, dssize, tsize, buflen, bufsiz;
2264 	int i, nds, error, ret;
2265 	void *buf;
2266 
2267 	if (namelen != 1)
2268 		return (EINVAL);
2269 
2270 	buflen = *sizep;
2271 
2272 	switch (*name) {
2273 	case KERN_SYSVIPC_MSG_INFO:
2274 #ifdef SYSVMSG
2275 		return (sysctl_sysvmsg(name, namelen, where, sizep));
2276 #else
2277 		return (EOPNOTSUPP);
2278 #endif
2279 	case KERN_SYSVIPC_SEM_INFO:
2280 #ifdef SYSVSEM
2281 		infosize = sizeof(semsi->seminfo);
2282 		nds = seminfo.semmni;
2283 		dssize = sizeof(semsi->semids[0]);
2284 		break;
2285 #else
2286 		return (EOPNOTSUPP);
2287 #endif
2288 	case KERN_SYSVIPC_SHM_INFO:
2289 #ifdef SYSVSHM
2290 		infosize = sizeof(shmsi->shminfo);
2291 		nds = shminfo.shmmni;
2292 		dssize = sizeof(shmsi->shmids[0]);
2293 		break;
2294 #else
2295 		return (EOPNOTSUPP);
2296 #endif
2297 	default:
2298 		return (EINVAL);
2299 	}
2300 	tsize = infosize + (nds * dssize);
2301 
2302 	/* Return just the total size required. */
2303 	if (where == NULL) {
2304 		*sizep = tsize;
2305 		return (0);
2306 	}
2307 
2308 	/* Not enough room for even the info struct. */
2309 	if (buflen < infosize) {
2310 		*sizep = 0;
2311 		return (ENOMEM);
2312 	}
2313 	bufsiz = min(tsize, buflen);
2314 	buf = malloc(bufsiz, M_TEMP, M_WAITOK|M_ZERO);
2315 
2316 	switch (*name) {
2317 #ifdef SYSVSEM
2318 	case KERN_SYSVIPC_SEM_INFO:
2319 		semsi = (struct sem_sysctl_info *)buf;
2320 		semsi->seminfo = seminfo;
2321 		break;
2322 #endif
2323 #ifdef SYSVSHM
2324 	case KERN_SYSVIPC_SHM_INFO:
2325 		shmsi = (struct shm_sysctl_info *)buf;
2326 		shmsi->shminfo = shminfo;
2327 		break;
2328 #endif
2329 	}
2330 	buflen -= infosize;
2331 
2332 	ret = 0;
2333 	if (buflen > 0) {
2334 		/* Fill in the IPC data structures.  */
2335 		for (i = 0; i < nds; i++) {
2336 			if (buflen < dssize) {
2337 				ret = ENOMEM;
2338 				break;
2339 			}
2340 			switch (*name) {
2341 #ifdef SYSVSEM
2342 			case KERN_SYSVIPC_SEM_INFO:
2343 				if (sema[i] != NULL)
2344 					memcpy(&semsi->semids[i], sema[i],
2345 					    dssize);
2346 				else
2347 					memset(&semsi->semids[i], 0, dssize);
2348 				break;
2349 #endif
2350 #ifdef SYSVSHM
2351 			case KERN_SYSVIPC_SHM_INFO:
2352 				if (shmsegs[i] != NULL)
2353 					memcpy(&shmsi->shmids[i], shmsegs[i],
2354 					    dssize);
2355 				else
2356 					memset(&shmsi->shmids[i], 0, dssize);
2357 				break;
2358 #endif
2359 			}
2360 			buflen -= dssize;
2361 		}
2362 	}
2363 	*sizep -= buflen;
2364 	error = copyout(buf, where, *sizep);
2365 	free(buf, M_TEMP, bufsiz);
2366 	/* If copyout succeeded, use return code set earlier. */
2367 	return (error ? error : ret);
2368 }
2369 #endif /* SYSVMSG || SYSVSEM || SYSVSHM */
2370 
2371 #ifndef	SMALL_KERNEL
2372 
2373 int
2374 sysctl_intrcnt(int *name, u_int namelen, void *oldp, size_t *oldlenp)
2375 {
2376 	return (evcount_sysctl(name, namelen, oldp, oldlenp, NULL, 0));
2377 }
2378 
2379 
2380 int
2381 sysctl_sensors(int *name, u_int namelen, void *oldp, size_t *oldlenp,
2382     void *newp, size_t newlen)
2383 {
2384 	struct ksensor *ks;
2385 	struct sensor *us;
2386 	struct ksensordev *ksd;
2387 	struct sensordev *usd;
2388 	int dev, numt, ret;
2389 	enum sensor_type type;
2390 
2391 	if (namelen != 1 && namelen != 3)
2392 		return (ENOTDIR);
2393 
2394 	dev = name[0];
2395 	if (namelen == 1) {
2396 		ret = sensordev_get(dev, &ksd);
2397 		if (ret)
2398 			return (ret);
2399 
2400 		/* Grab a copy, to clear the kernel pointers */
2401 		usd = malloc(sizeof(*usd), M_TEMP, M_WAITOK|M_ZERO);
2402 		usd->num = ksd->num;
2403 		strlcpy(usd->xname, ksd->xname, sizeof(usd->xname));
2404 		memcpy(usd->maxnumt, ksd->maxnumt, sizeof(usd->maxnumt));
2405 		usd->sensors_count = ksd->sensors_count;
2406 
2407 		ret = sysctl_rdstruct(oldp, oldlenp, newp, usd,
2408 		    sizeof(struct sensordev));
2409 
2410 		free(usd, M_TEMP, sizeof(*usd));
2411 		return (ret);
2412 	}
2413 
2414 	type = name[1];
2415 	numt = name[2];
2416 
2417 	ret = sensor_find(dev, type, numt, &ks);
2418 	if (ret)
2419 		return (ret);
2420 
2421 	/* Grab a copy, to clear the kernel pointers */
2422 	us = malloc(sizeof(*us), M_TEMP, M_WAITOK|M_ZERO);
2423 	memcpy(us->desc, ks->desc, sizeof(us->desc));
2424 	us->tv = ks->tv;
2425 	us->value = ks->value;
2426 	us->type = ks->type;
2427 	us->status = ks->status;
2428 	us->numt = ks->numt;
2429 	us->flags = ks->flags;
2430 
2431 	ret = sysctl_rdstruct(oldp, oldlenp, newp, us,
2432 	    sizeof(struct sensor));
2433 	free(us, M_TEMP, sizeof(*us));
2434 	return (ret);
2435 }
2436 #endif	/* SMALL_KERNEL */
2437 
2438 int
2439 sysctl_cptime2(int *name, u_int namelen, void *oldp, size_t *oldlenp,
2440     void *newp, size_t newlen)
2441 {
2442 	CPU_INFO_ITERATOR cii;
2443 	struct cpu_info *ci;
2444 	int found = 0;
2445 
2446 	if (namelen != 1)
2447 		return (ENOTDIR);
2448 
2449 	CPU_INFO_FOREACH(cii, ci) {
2450 		if (name[0] == CPU_INFO_UNIT(ci)) {
2451 			found = 1;
2452 			break;
2453 		}
2454 	}
2455 	if (!found)
2456 		return (ENOENT);
2457 
2458 	return (sysctl_rdstruct(oldp, oldlenp, newp,
2459 	    &ci->ci_schedstate.spc_cp_time,
2460 	    sizeof(ci->ci_schedstate.spc_cp_time)));
2461 }
2462 
2463 #if NAUDIO > 0
2464 int
2465 sysctl_audio(int *name, u_int namelen, void *oldp, size_t *oldlenp,
2466     void *newp, size_t newlen)
2467 {
2468 	if (namelen != 1)
2469 		return (ENOTDIR);
2470 
2471 	if (name[0] != KERN_AUDIO_RECORD)
2472 		return (ENOENT);
2473 
2474 	return (sysctl_int(oldp, oldlenp, newp, newlen, &audio_record_enable));
2475 }
2476 #endif
2477 
2478 #if NVIDEO > 0
2479 int
2480 sysctl_video(int *name, u_int namelen, void *oldp, size_t *oldlenp,
2481     void *newp, size_t newlen)
2482 {
2483 	if (namelen != 1)
2484 		return (ENOTDIR);
2485 
2486 	if (name[0] != KERN_VIDEO_RECORD)
2487 		return (ENOENT);
2488 
2489 	return (sysctl_int(oldp, oldlenp, newp, newlen, &video_record_enable));
2490 }
2491 #endif
2492 
2493 int
2494 sysctl_cpustats(int *name, u_int namelen, void *oldp, size_t *oldlenp,
2495     void *newp, size_t newlen)
2496 {
2497 	CPU_INFO_ITERATOR cii;
2498 	struct cpustats cs;
2499 	struct cpu_info *ci;
2500 	int found = 0;
2501 
2502 	if (namelen != 1)
2503 		return (ENOTDIR);
2504 
2505 	CPU_INFO_FOREACH(cii, ci) {
2506 		if (name[0] == CPU_INFO_UNIT(ci)) {
2507 			found = 1;
2508 			break;
2509 		}
2510 	}
2511 	if (!found)
2512 		return (ENOENT);
2513 
2514 	memset(&cs, 0, sizeof cs);
2515 	memcpy(&cs.cs_time, &ci->ci_schedstate.spc_cp_time, sizeof(cs.cs_time));
2516 	cs.cs_flags = 0;
2517 	if (cpu_is_online(ci))
2518 		cs.cs_flags |= CPUSTATS_ONLINE;
2519 
2520 	return (sysctl_rdstruct(oldp, oldlenp, newp, &cs, sizeof(cs)));
2521 }
2522 
2523 int
2524 sysctl_utc_offset(void *oldp, size_t *oldlenp, void *newp, size_t newlen)
2525 {
2526 	struct timespec adjusted, now;
2527 	int adjustment_seconds, error, new_offset_minutes, old_offset_minutes;
2528 
2529 	old_offset_minutes = utc_offset / 60;	/* seconds -> minutes */
2530 	new_offset_minutes = old_offset_minutes;
2531 	error = sysctl_securelevel_int(oldp, oldlenp, newp, newlen,
2532 	     &new_offset_minutes);
2533 	if (error)
2534 		return error;
2535 	if (new_offset_minutes < -24 * 60 || new_offset_minutes > 24 * 60)
2536 		return EINVAL;
2537 	if (new_offset_minutes == old_offset_minutes)
2538 		return 0;
2539 
2540 	utc_offset = new_offset_minutes * 60;	/* minutes -> seconds */
2541 	adjustment_seconds = (new_offset_minutes - old_offset_minutes) * 60;
2542 
2543 	nanotime(&now);
2544 	adjusted = now;
2545 	adjusted.tv_sec -= adjustment_seconds;
2546 	tc_setrealtimeclock(&adjusted);
2547 	resettodr();
2548 
2549 	return 0;
2550 }
2551