xref: /minix3/minix/servers/mib/kern.c (revision 534584945c0f50b9816e7051003856bd31bf8c65)
1e4e21ee1SDavid van Moolenbroek /* MIB service - kern.c - implementation of the CTL_KERN subtree */
2e4e21ee1SDavid van Moolenbroek 
3e4e21ee1SDavid van Moolenbroek #include "mib.h"
4e4e21ee1SDavid van Moolenbroek 
525d39513SDavid van Moolenbroek #include <sys/svrctl.h>
625d39513SDavid van Moolenbroek #include <minix/sysinfo.h>
725d39513SDavid van Moolenbroek #include <machine/partition.h>
825d39513SDavid van Moolenbroek 
925d39513SDavid van Moolenbroek #include "servers/vfs/const.h"
1025d39513SDavid van Moolenbroek #include "servers/vfs/dmap.h"
1125d39513SDavid van Moolenbroek 
1225d39513SDavid van Moolenbroek static char hostname[MAXHOSTNAMELEN], domainname[MAXHOSTNAMELEN];
1325d39513SDavid van Moolenbroek 
1425d39513SDavid van Moolenbroek /*
1525d39513SDavid van Moolenbroek  * Verification for CTL_KERN KERN_SECURELVL.
1625d39513SDavid van Moolenbroek  */
1725d39513SDavid van Moolenbroek static int
mib_kern_securelvl(struct mib_call * call __unused,struct mib_node * node,void * ptr,size_t size __unused)1825d39513SDavid van Moolenbroek mib_kern_securelvl(struct mib_call * call __unused, struct mib_node * node,
1925d39513SDavid van Moolenbroek 	void * ptr, size_t size __unused)
2025d39513SDavid van Moolenbroek {
2125d39513SDavid van Moolenbroek 	int v;
2225d39513SDavid van Moolenbroek 
2325d39513SDavid van Moolenbroek 	memcpy(&v, ptr, sizeof(v));
2425d39513SDavid van Moolenbroek 
2525d39513SDavid van Moolenbroek 	/*
2625d39513SDavid van Moolenbroek 	 * Only ever allow the security level to be increased.  This is a mock
2725d39513SDavid van Moolenbroek 	 * implementation.  TODO: implement actual support for security levels.
2825d39513SDavid van Moolenbroek 	 */
2925d39513SDavid van Moolenbroek 	return (v >= node->node_int);
3025d39513SDavid van Moolenbroek }
3125d39513SDavid van Moolenbroek 
3225d39513SDavid van Moolenbroek /*
3325d39513SDavid van Moolenbroek  * Implementation of CTL_KERN KERN_CLOCKRATE.
3425d39513SDavid van Moolenbroek  */
3525d39513SDavid van Moolenbroek static ssize_t
mib_kern_clockrate(struct mib_call * call __unused,struct mib_node * node __unused,struct mib_oldp * oldp,struct mib_newp * newp __unused)3625d39513SDavid van Moolenbroek mib_kern_clockrate(struct mib_call * call __unused,
3725d39513SDavid van Moolenbroek 	struct mib_node * node __unused, struct mib_oldp * oldp,
3825d39513SDavid van Moolenbroek 	struct mib_newp * newp __unused)
3925d39513SDavid van Moolenbroek {
4025d39513SDavid van Moolenbroek 	struct clockinfo clockinfo;
4125d39513SDavid van Moolenbroek 
4225d39513SDavid van Moolenbroek 	memset(&clockinfo, 0, sizeof(clockinfo));
4325d39513SDavid van Moolenbroek 
4425d39513SDavid van Moolenbroek 	clockinfo.hz = sys_hz();
4525d39513SDavid van Moolenbroek 	clockinfo.tick = 1000000 / clockinfo.hz;
4625d39513SDavid van Moolenbroek 	clockinfo.profhz = clockinfo.hz;
4725d39513SDavid van Moolenbroek 	clockinfo.stathz = clockinfo.hz;
4825d39513SDavid van Moolenbroek 
4925d39513SDavid van Moolenbroek 	/*
5025d39513SDavid van Moolenbroek 	 * Number of microseconds that can be corrected per clock tick through
5125d39513SDavid van Moolenbroek 	 * adjtime(2).  The kernel allows correction of one clock tick per
5225d39513SDavid van Moolenbroek 	 * clock tick, which means it should be the same as .tick.. I think.
5325d39513SDavid van Moolenbroek 	 * TODO: get this from the kernel itself.
5425d39513SDavid van Moolenbroek 	 */
5525d39513SDavid van Moolenbroek 	clockinfo.tickadj = clockinfo.tick;
5625d39513SDavid van Moolenbroek 
5725d39513SDavid van Moolenbroek 	return mib_copyout(oldp, 0, &clockinfo, sizeof(clockinfo));
5825d39513SDavid van Moolenbroek }
5925d39513SDavid van Moolenbroek 
6025d39513SDavid van Moolenbroek /*
6125d39513SDavid van Moolenbroek  * Implementation of CTL_KERN KERN_PROFILING.
6225d39513SDavid van Moolenbroek  */
6325d39513SDavid van Moolenbroek static ssize_t
mib_kern_profiling(struct mib_call * call __unused,struct mib_node * node __unused,struct mib_oldp * oldp __unused,struct mib_newp * newp __unused)6425d39513SDavid van Moolenbroek mib_kern_profiling(struct mib_call * call __unused,
6525d39513SDavid van Moolenbroek 	struct mib_node * node __unused, struct mib_oldp * oldp __unused,
6625d39513SDavid van Moolenbroek 	struct mib_newp * newp __unused)
6725d39513SDavid van Moolenbroek {
6825d39513SDavid van Moolenbroek 
6925d39513SDavid van Moolenbroek 	/* As per sysctl(7).  We have a different profiling API. */
7025d39513SDavid van Moolenbroek 	return EOPNOTSUPP;
7125d39513SDavid van Moolenbroek }
7225d39513SDavid van Moolenbroek 
7325d39513SDavid van Moolenbroek /*
7425d39513SDavid van Moolenbroek  * Implementation of CTL_KERN KERN_HARDCLOCK_TICKS.
7525d39513SDavid van Moolenbroek  */
7625d39513SDavid van Moolenbroek static ssize_t
mib_kern_hardclock_ticks(struct mib_call * call __unused,struct mib_node * node __unused,struct mib_oldp * oldp,struct mib_newp * newp __unused)7725d39513SDavid van Moolenbroek mib_kern_hardclock_ticks(struct mib_call * call __unused,
7825d39513SDavid van Moolenbroek 	struct mib_node * node __unused, struct mib_oldp * oldp,
7925d39513SDavid van Moolenbroek 	struct mib_newp * newp __unused)
8025d39513SDavid van Moolenbroek {
8125d39513SDavid van Moolenbroek 	int uptime;
8225d39513SDavid van Moolenbroek 
8325d39513SDavid van Moolenbroek 	/*
8425d39513SDavid van Moolenbroek 	 * The number of hardclock (hardware clock driver) ticks is what we
8525d39513SDavid van Moolenbroek 	 * call the number of monotonic clock ticks AKA the uptime clock ticks.
8625d39513SDavid van Moolenbroek 	 */
8725d39513SDavid van Moolenbroek 	uptime = (int)getticks();
8825d39513SDavid van Moolenbroek 
8925d39513SDavid van Moolenbroek 	return mib_copyout(oldp, 0, &uptime, sizeof(uptime));
9025d39513SDavid van Moolenbroek }
9125d39513SDavid van Moolenbroek 
9225d39513SDavid van Moolenbroek /*
9325d39513SDavid van Moolenbroek  * Implementation of CTL_KERN KERN_ROOT_DEVICE.
9425d39513SDavid van Moolenbroek  */
9525d39513SDavid van Moolenbroek static ssize_t
mib_kern_root_device(struct mib_call * call __unused,struct mib_node * node __unused,struct mib_oldp * oldp,struct mib_newp * newp __unused)9625d39513SDavid van Moolenbroek mib_kern_root_device(struct mib_call * call __unused,
9725d39513SDavid van Moolenbroek 	struct mib_node * node __unused, struct mib_oldp * oldp,
9825d39513SDavid van Moolenbroek 	struct mib_newp * newp __unused)
9925d39513SDavid van Moolenbroek {
10025d39513SDavid van Moolenbroek 	char name[PATH_MAX];
10125d39513SDavid van Moolenbroek 	struct sysgetenv sysgetenv;
10225d39513SDavid van Moolenbroek 
10325d39513SDavid van Moolenbroek 	sysgetenv.key = __UNCONST("rootdevname");
10425d39513SDavid van Moolenbroek 	sysgetenv.keylen = strlen(sysgetenv.key) + 1;
10525d39513SDavid van Moolenbroek 	sysgetenv.val = name;
10625d39513SDavid van Moolenbroek 	sysgetenv.vallen = sizeof(name);
10725d39513SDavid van Moolenbroek 
10825d39513SDavid van Moolenbroek 	if (svrctl(PMGETPARAM, &sysgetenv) != 0)
10925d39513SDavid van Moolenbroek 		return EINVAL;
11025d39513SDavid van Moolenbroek 
11125d39513SDavid van Moolenbroek 	name[MIN(sysgetenv.vallen, sizeof(name) - 1)] = '\0';
11225d39513SDavid van Moolenbroek 
11325d39513SDavid van Moolenbroek 	return mib_copyout(oldp, 0, name, strlen(name) + 1);
11425d39513SDavid van Moolenbroek }
11525d39513SDavid van Moolenbroek 
11625d39513SDavid van Moolenbroek /*
11725d39513SDavid van Moolenbroek  * Implementation of CTL_KERN KERN_CCPU.
11825d39513SDavid van Moolenbroek  */
11925d39513SDavid van Moolenbroek static ssize_t
mib_kern_ccpu(struct mib_call * call __unused,struct mib_node * node __unused,struct mib_oldp * oldp,struct mib_newp * newp __unused)12025d39513SDavid van Moolenbroek mib_kern_ccpu(struct mib_call * call __unused,
12125d39513SDavid van Moolenbroek 	struct mib_node * node __unused, struct mib_oldp * oldp,
12225d39513SDavid van Moolenbroek 	struct mib_newp * newp __unused)
12325d39513SDavid van Moolenbroek {
12425d39513SDavid van Moolenbroek 	int ccpu;
12525d39513SDavid van Moolenbroek 
12625d39513SDavid van Moolenbroek 	ccpu = (int)cpuavg_getccpu();
12725d39513SDavid van Moolenbroek 
12825d39513SDavid van Moolenbroek 	return mib_copyout(oldp, 0, &ccpu, sizeof(ccpu));
12925d39513SDavid van Moolenbroek }
13025d39513SDavid van Moolenbroek 
13125d39513SDavid van Moolenbroek /*
13225d39513SDavid van Moolenbroek  * Implementation of CTL_KERN KERN_CP_TIME.
13325d39513SDavid van Moolenbroek  */
13425d39513SDavid van Moolenbroek static ssize_t
mib_kern_cp_time(struct mib_call * call,struct mib_node * node __unused,struct mib_oldp * oldp,struct mib_newp * newp __unused)13525d39513SDavid van Moolenbroek mib_kern_cp_time(struct mib_call * call, struct mib_node * node __unused,
13625d39513SDavid van Moolenbroek 	struct mib_oldp * oldp, struct mib_newp * newp __unused)
13725d39513SDavid van Moolenbroek {
13825d39513SDavid van Moolenbroek 	uint64_t ticks[MINIX_CPUSTATES], sum[MINIX_CPUSTATES];
13925d39513SDavid van Moolenbroek 	unsigned int cpu;
14025d39513SDavid van Moolenbroek 	int i, r, do_sum;
14125d39513SDavid van Moolenbroek 
14225d39513SDavid van Moolenbroek 	/*
14325d39513SDavid van Moolenbroek 	 * If a subnode is provided, it identifies the CPU number for which to
14425d39513SDavid van Moolenbroek 	 * return information.  If no subnode is provided, but a size is given
14525d39513SDavid van Moolenbroek 	 * that allows returning information for all CPUs, return information
14625d39513SDavid van Moolenbroek 	 * for all of them in an array.  If no such size is given either,
14725d39513SDavid van Moolenbroek 	 * return a summation of all CPU statistics.  Both we and the kernel
14825d39513SDavid van Moolenbroek 	 * are considering the number of configured CPUs (hw.ncpu).
14925d39513SDavid van Moolenbroek 	 */
15025d39513SDavid van Moolenbroek 	if (call->call_namelen > 1)
15125d39513SDavid van Moolenbroek 		return EINVAL;
15225d39513SDavid van Moolenbroek 
15325d39513SDavid van Moolenbroek 	if (call->call_namelen == 1) {
15425d39513SDavid van Moolenbroek 		/* Do not bother saving on this call if oldp is NULL. */
15525d39513SDavid van Moolenbroek 		if ((r = sys_getcputicks(ticks, call->call_name[0])) != OK)
15625d39513SDavid van Moolenbroek 			return r;
15725d39513SDavid van Moolenbroek 
15825d39513SDavid van Moolenbroek 		return mib_copyout(oldp, 0, ticks, sizeof(ticks));
15925d39513SDavid van Moolenbroek 	}
16025d39513SDavid van Moolenbroek 
16125d39513SDavid van Moolenbroek 	if (oldp == NULL)
16225d39513SDavid van Moolenbroek 		return sizeof(ticks); /* implying a summation request */
16325d39513SDavid van Moolenbroek 
16425d39513SDavid van Moolenbroek 	do_sum = (mib_getoldlen(oldp) == sizeof(ticks));
16525d39513SDavid van Moolenbroek 
16625d39513SDavid van Moolenbroek 	if (do_sum)
16725d39513SDavid van Moolenbroek 		memset(&sum, 0, sizeof(sum));
16825d39513SDavid van Moolenbroek 
16925d39513SDavid van Moolenbroek 	for (cpu = 0; cpu < CONFIG_MAX_CPUS; cpu++) {
17025d39513SDavid van Moolenbroek 		if ((r = sys_getcputicks(ticks, cpu)) != OK)
17125d39513SDavid van Moolenbroek 			return r;
17225d39513SDavid van Moolenbroek 
17325d39513SDavid van Moolenbroek 		if (do_sum) {
17425d39513SDavid van Moolenbroek 			for (i = 0; i < MINIX_CPUSTATES; i++)
17525d39513SDavid van Moolenbroek 				sum[i] += ticks[i];
17625d39513SDavid van Moolenbroek 		} else {
17725d39513SDavid van Moolenbroek 			if ((r = mib_copyout(oldp, cpu * sizeof(ticks), ticks,
17825d39513SDavid van Moolenbroek 			    sizeof(ticks))) < 0)
17925d39513SDavid van Moolenbroek 				return r;
18025d39513SDavid van Moolenbroek 		}
18125d39513SDavid van Moolenbroek 	}
18225d39513SDavid van Moolenbroek 
18325d39513SDavid van Moolenbroek 	if (do_sum)
18425d39513SDavid van Moolenbroek 		return mib_copyout(oldp, 0, sum, sizeof(sum));
18525d39513SDavid van Moolenbroek 	else
18625d39513SDavid van Moolenbroek 		return cpu * sizeof(ticks);
18725d39513SDavid van Moolenbroek }
18825d39513SDavid van Moolenbroek 
18925d39513SDavid van Moolenbroek /*
19025d39513SDavid van Moolenbroek  * Implementation of CTL_KERN KERN_CONSDEV.
19125d39513SDavid van Moolenbroek  */
19225d39513SDavid van Moolenbroek static ssize_t
mib_kern_consdev(struct mib_call * call __unused,struct mib_node * node __unused,struct mib_oldp * oldp,struct mib_newp * newp __unused)19325d39513SDavid van Moolenbroek mib_kern_consdev(struct mib_call * call __unused,
19425d39513SDavid van Moolenbroek 	struct mib_node * node __unused, struct mib_oldp * oldp,
19525d39513SDavid van Moolenbroek 	struct mib_newp * newp __unused)
19625d39513SDavid van Moolenbroek {
19725d39513SDavid van Moolenbroek 	dev_t dev;
19825d39513SDavid van Moolenbroek 
19925d39513SDavid van Moolenbroek 	dev = makedev(TTY_MAJOR, CONS_MINOR);
20025d39513SDavid van Moolenbroek 
20125d39513SDavid van Moolenbroek 	/* No support for legacy 32-bit requests. */
20225d39513SDavid van Moolenbroek 	return mib_copyout(oldp, 0, &dev, sizeof(dev));
20325d39513SDavid van Moolenbroek }
20425d39513SDavid van Moolenbroek 
20525d39513SDavid van Moolenbroek /*
20625d39513SDavid van Moolenbroek  * Verification for CTL_KERN KERN_FORKFSLEEP.
20725d39513SDavid van Moolenbroek  */
20825d39513SDavid van Moolenbroek static int
mib_kern_forkfsleep(struct mib_call * call __unused,struct mib_node * node __unused,void * ptr,size_t size __unused)20925d39513SDavid van Moolenbroek mib_kern_forkfsleep(struct mib_call * call __unused,
21025d39513SDavid van Moolenbroek 	struct mib_node * node __unused, void * ptr, size_t size __unused)
21125d39513SDavid van Moolenbroek {
21225d39513SDavid van Moolenbroek 	int v;
21325d39513SDavid van Moolenbroek 
21425d39513SDavid van Moolenbroek 	memcpy(&v, ptr, sizeof(v));
21525d39513SDavid van Moolenbroek 
21625d39513SDavid van Moolenbroek 	return (v >= 0 && v <= MAXSLP * 1000); /* rules from NetBSD */
21725d39513SDavid van Moolenbroek }
21825d39513SDavid van Moolenbroek 
21925d39513SDavid van Moolenbroek /*
22025d39513SDavid van Moolenbroek  * Implementation of CTL_KERN KERN_DRIVERS.
22125d39513SDavid van Moolenbroek  */
22225d39513SDavid van Moolenbroek static ssize_t
mib_kern_drivers(struct mib_call * call __unused,struct mib_node * node __unused,struct mib_oldp * oldp,struct mib_newp * newp __unused)22325d39513SDavid van Moolenbroek mib_kern_drivers(struct mib_call * call __unused,
22425d39513SDavid van Moolenbroek 	struct mib_node * node __unused, struct mib_oldp * oldp,
22525d39513SDavid van Moolenbroek 	struct mib_newp * newp __unused)
22625d39513SDavid van Moolenbroek {
22725d39513SDavid van Moolenbroek 	struct dmap dmap_tab[NR_DEVICES];
22825d39513SDavid van Moolenbroek 	struct kinfo_drivers drivers[NR_DEVICES + 1];
22925d39513SDavid van Moolenbroek 	unsigned int count;
23025d39513SDavid van Moolenbroek 	devmajor_t maj;
23125d39513SDavid van Moolenbroek 
23225d39513SDavid van Moolenbroek 	/*
23325d39513SDavid van Moolenbroek 	 * On MINIX3, we list only drivers that are actually running.
23425d39513SDavid van Moolenbroek 	 */
23525d39513SDavid van Moolenbroek 
23625d39513SDavid van Moolenbroek 	if (getsysinfo(VFS_PROC_NR, SI_DMAP_TAB, dmap_tab,
23725d39513SDavid van Moolenbroek 	    sizeof(dmap_tab)) != OK)
23825d39513SDavid van Moolenbroek 		return EINVAL;
23925d39513SDavid van Moolenbroek 
24025d39513SDavid van Moolenbroek 	count = 0;
24125d39513SDavid van Moolenbroek 
24225d39513SDavid van Moolenbroek 	/*
24325d39513SDavid van Moolenbroek 	 * Compatibility hack.  NetBSD userland expects that the name of the
24425d39513SDavid van Moolenbroek 	 * PTY driver is "pts".  Add an extra entry for this purpose if needed.
24525d39513SDavid van Moolenbroek 	 */
24625d39513SDavid van Moolenbroek 	if (dmap_tab[PTY_MAJOR].dmap_driver != NONE &&
24725d39513SDavid van Moolenbroek 	    strcmp(dmap_tab[PTY_MAJOR].dmap_label, "pts")) {
24825d39513SDavid van Moolenbroek 		if (mib_inrange(oldp, 0)) {
24925d39513SDavid van Moolenbroek 			memset(&drivers[0], 0, sizeof(drivers[0]));
25025d39513SDavid van Moolenbroek 			strlcpy(drivers[count].d_name, "pts",
25125d39513SDavid van Moolenbroek 			    sizeof(drivers[0].d_name));
25225d39513SDavid van Moolenbroek 			drivers[count].d_bmajor = -1;
25325d39513SDavid van Moolenbroek 			drivers[count].d_cmajor = PTY_MAJOR;
25425d39513SDavid van Moolenbroek 		}
25525d39513SDavid van Moolenbroek 		count++;
25625d39513SDavid van Moolenbroek 	}
25725d39513SDavid van Moolenbroek 
25825d39513SDavid van Moolenbroek 	for (maj = 0; maj < NR_DEVICES; maj++) {
25925d39513SDavid van Moolenbroek 		if (dmap_tab[maj].dmap_driver == NONE)
26025d39513SDavid van Moolenbroek 			continue;
26125d39513SDavid van Moolenbroek 
26225d39513SDavid van Moolenbroek 		if (mib_inrange(oldp, sizeof(drivers[0]) * count)) {
26325d39513SDavid van Moolenbroek 			memset(&drivers[count], 0, sizeof(drivers[0]));
26425d39513SDavid van Moolenbroek 
26525d39513SDavid van Moolenbroek 			strlcpy(drivers[count].d_name,
26625d39513SDavid van Moolenbroek 			    dmap_tab[maj].dmap_label,
26725d39513SDavid van Moolenbroek 			    sizeof(drivers[0].d_name));
26825d39513SDavid van Moolenbroek 
26925d39513SDavid van Moolenbroek 			/*
27025d39513SDavid van Moolenbroek 			 * We do not know whether the device is a block device,
27125d39513SDavid van Moolenbroek 			 * character device, or both.  In any case, a driver
27225d39513SDavid van Moolenbroek 			 * has only one major number.
27325d39513SDavid van Moolenbroek 			 */
27425d39513SDavid van Moolenbroek 			drivers[count].d_bmajor = maj;
27525d39513SDavid van Moolenbroek 			drivers[count].d_cmajor = maj;
27625d39513SDavid van Moolenbroek 		}
27725d39513SDavid van Moolenbroek 		count++;
27825d39513SDavid van Moolenbroek 	}
27925d39513SDavid van Moolenbroek 
28025d39513SDavid van Moolenbroek 	return mib_copyout(oldp, 0, drivers, count * sizeof(drivers[0]));
28125d39513SDavid van Moolenbroek }
28225d39513SDavid van Moolenbroek 
28325d39513SDavid van Moolenbroek /*
28425d39513SDavid van Moolenbroek  * Implementation of CTL_KERN KERN_BOOTTIME.
28525d39513SDavid van Moolenbroek  */
28625d39513SDavid van Moolenbroek static ssize_t
mib_kern_boottime(struct mib_call * call __unused,struct mib_node * node __unused,struct mib_oldp * oldp,struct mib_newp * newp __unused)28725d39513SDavid van Moolenbroek mib_kern_boottime(struct mib_call * call __unused,
28825d39513SDavid van Moolenbroek 	struct mib_node * node __unused, struct mib_oldp * oldp,
28925d39513SDavid van Moolenbroek 	struct mib_newp * newp __unused)
29025d39513SDavid van Moolenbroek {
29125d39513SDavid van Moolenbroek 	struct timeval tv;
29225d39513SDavid van Moolenbroek 
29325d39513SDavid van Moolenbroek 	memset(&tv, 0, sizeof(tv));
29425d39513SDavid van Moolenbroek 
29525d39513SDavid van Moolenbroek 	if (getuptime(NULL, NULL, &tv.tv_sec) != OK)
29625d39513SDavid van Moolenbroek 		return EINVAL;
29725d39513SDavid van Moolenbroek 
29825d39513SDavid van Moolenbroek 	return mib_copyout(oldp, 0, &tv, sizeof(tv));
29925d39513SDavid van Moolenbroek }
30025d39513SDavid van Moolenbroek 
3012f09e77bSDavid van Moolenbroek /*
302*53458494SDavid van Moolenbroek  * Mock implementation of CTL_KERN KERN_SYSVIPC KERN_SYSVIPC_INFO.  Normally,
303*53458494SDavid van Moolenbroek  * the IPC service overrides the entire "kern.ipc" subtree.  Therefore, this
304*53458494SDavid van Moolenbroek  * function will only ever be called when the IPC service is *not* running.
3052f09e77bSDavid van Moolenbroek  */
3062f09e77bSDavid van Moolenbroek static ssize_t
mib_kern_ipc_info(struct mib_call * call,struct mib_node * node __unused,struct mib_oldp * oldp __unused,struct mib_newp * newp __unused)3072f09e77bSDavid van Moolenbroek mib_kern_ipc_info(struct mib_call * call, struct mib_node * node __unused,
308*53458494SDavid van Moolenbroek 	struct mib_oldp * oldp __unused, struct mib_newp * newp __unused)
3092f09e77bSDavid van Moolenbroek {
3102f09e77bSDavid van Moolenbroek 
311*53458494SDavid van Moolenbroek 	/* The caller must always specify the resouce type (sem/shm/msg). */
3122f09e77bSDavid van Moolenbroek 	if (call->call_namelen != 1)
3132f09e77bSDavid van Moolenbroek 		return EINVAL;
3142f09e77bSDavid van Moolenbroek 
3152f09e77bSDavid van Moolenbroek 	return EOPNOTSUPP;
3162f09e77bSDavid van Moolenbroek }
3172f09e77bSDavid van Moolenbroek 
318*53458494SDavid van Moolenbroek /* The CTL_KERN KERN_SYSVIPC nodes, when not overridden by the IPC service. */
31925d39513SDavid van Moolenbroek static struct mib_node mib_kern_ipc_table[] = {
3202f09e77bSDavid van Moolenbroek /* 1*/	[KERN_SYSVIPC_INFO]	= MIB_FUNC(_P | _RO | CTLTYPE_NODE, 0,
3212f09e77bSDavid van Moolenbroek 				    mib_kern_ipc_info, "sysvipc_info",
3222f09e77bSDavid van Moolenbroek 				    "System V style IPC information"),
32325d39513SDavid van Moolenbroek /* 2*/	[KERN_SYSVIPC_MSG]	= MIB_INT(_P | _RO, 0, "sysvmsg", "System V "
32425d39513SDavid van Moolenbroek 				    "style message support available"),
325*53458494SDavid van Moolenbroek /* 3*/	[KERN_SYSVIPC_SEM]	= MIB_INT(_P | _RO, 0, "sysvsem", "System V "
32625d39513SDavid van Moolenbroek 				    "style semaphore support available"),
327*53458494SDavid van Moolenbroek /* 4*/	[KERN_SYSVIPC_SHM]	= MIB_INT(_P | _RO, 0, "sysvshm", "System V "
32825d39513SDavid van Moolenbroek 				    "style shared memory support available"),
32925d39513SDavid van Moolenbroek };
33025d39513SDavid van Moolenbroek 
33125d39513SDavid van Moolenbroek /* The CTL_KERN nodes. */
332e4e21ee1SDavid van Moolenbroek static struct mib_node mib_kern_table[] = {
33325d39513SDavid van Moolenbroek /* 1*/	[KERN_OSTYPE]		= MIB_STRING(_P | _RO, OS_NAME, "ostype",
33425d39513SDavid van Moolenbroek 				    "Operating system type"),
33525d39513SDavid van Moolenbroek /* 2*/	[KERN_OSRELEASE]	= MIB_STRING(_P | _RO, OS_RELEASE, "osrelease",
33625d39513SDavid van Moolenbroek 				    "Operating system release"),
33725d39513SDavid van Moolenbroek /* 3*/	[KERN_OSREV]		= MIB_INT(_P | _RO , OS_REV, "osrevision",
33825d39513SDavid van Moolenbroek 				    "Operating system revision"),
33925d39513SDavid van Moolenbroek /* 4*/	[KERN_VERSION]		= MIB_STRING(_P | _RO, OS_VERSION, "version",
34025d39513SDavid van Moolenbroek 				    "Kernel version"),
34125d39513SDavid van Moolenbroek /* 5*/	[KERN_MAXVNODES]	= MIB_INT(_P | _RO, NR_VNODES, "maxvnodes",
34225d39513SDavid van Moolenbroek 				    "Maximum number of vnodes"),
34325d39513SDavid van Moolenbroek /* 6*/	[KERN_MAXPROC]		= MIB_INT(_P | _RO, NR_PROCS, "maxproc",
34425d39513SDavid van Moolenbroek 				    "Maximum number of simultaneous "
34525d39513SDavid van Moolenbroek 				    "processes"),
34625d39513SDavid van Moolenbroek /* 7*/	[KERN_MAXFILES]		= MIB_INT(_P | _RO, NR_VNODES, "maxfiles",
34725d39513SDavid van Moolenbroek 				    "Maximum number of open files"),
348e4e21ee1SDavid van Moolenbroek /* 8*/	[KERN_ARGMAX]		= MIB_INT(_P | _RO, ARG_MAX, "argmax",
349e4e21ee1SDavid van Moolenbroek 				    "Maximum number of bytes of arguments to "
350e4e21ee1SDavid van Moolenbroek 				    "execve(2)"),
35125d39513SDavid van Moolenbroek /* 9*/	[KERN_SECURELVL]	= MIB_INTV(_P | _RW, -1, mib_kern_securelvl,
35225d39513SDavid van Moolenbroek 				    "securelevel", "System security level"),
35325d39513SDavid van Moolenbroek /*10*/	[KERN_HOSTNAME]		= MIB_STRING(_P | _RW, hostname, "hostname",
35425d39513SDavid van Moolenbroek 				    "System hostname"),
35525d39513SDavid van Moolenbroek /*11*/	[KERN_HOSTID]		= MIB_INT(_P | _RW | CTLFLAG_HEX, 0, "hostid",
35625d39513SDavid van Moolenbroek 				    "System host ID number"),
35725d39513SDavid van Moolenbroek /*12*/	[KERN_CLOCKRATE]	= MIB_FUNC(_P | _RO | CTLTYPE_STRUCT,
35825d39513SDavid van Moolenbroek 				    sizeof(struct clockinfo),
35925d39513SDavid van Moolenbroek 				    mib_kern_clockrate, "clockrate",
36025d39513SDavid van Moolenbroek 				    "Kernel clock rates"),
36125d39513SDavid van Moolenbroek /*13*/	/* KERN_VNODE: not yet implemented */
36225d39513SDavid van Moolenbroek /*14*/	/* KERN_PROC: not yet implemented */
36325d39513SDavid van Moolenbroek /*15*/	/* KERN_FILE: not yet implemented */
36425d39513SDavid van Moolenbroek /*16*/	[KERN_PROF]		= MIB_FUNC(_P | _RO | CTLTYPE_NODE, 0,
36525d39513SDavid van Moolenbroek 				    mib_kern_profiling, "profiling",
36625d39513SDavid van Moolenbroek 				    "Profiling information (not available)"),
36725d39513SDavid van Moolenbroek /*17*/	[KERN_POSIX1]		= MIB_INT(_P | _RO, _POSIX_VERSION,
36825d39513SDavid van Moolenbroek 				    "posix1version", "Version of ISO/IEC 9945 "
36925d39513SDavid van Moolenbroek 				    "(POSIX 1003.1) with which the operating "
37025d39513SDavid van Moolenbroek 				    "system attempts to comply"),
37125d39513SDavid van Moolenbroek /*18*/	[KERN_NGROUPS]		= MIB_INT(_P | _RO, NGROUPS_MAX, "ngroups",
37225d39513SDavid van Moolenbroek 				    "Maximum number of supplemental groups"),
37325d39513SDavid van Moolenbroek /*19*/	[KERN_JOB_CONTROL]	= MIB_INT(_P | _RO, 0, "job_control",
37425d39513SDavid van Moolenbroek 				    "Whether job control is available"),
37525d39513SDavid van Moolenbroek /*20*/	[KERN_SAVED_IDS]	= MIB_INT(_P | _RO, 0, "saved_ids",
37625d39513SDavid van Moolenbroek 				    "Whether POSIX saved set-group/user ID is "
37725d39513SDavid van Moolenbroek 				    "available"),
37825d39513SDavid van Moolenbroek /*21*/	/* KERN_OBOOTTIME: obsolete */
37925d39513SDavid van Moolenbroek /*22*/	[KERN_DOMAINNAME]	= MIB_STRING(_P | _RW, domainname,
38025d39513SDavid van Moolenbroek 				    "domainname", "YP domain name"),
38125d39513SDavid van Moolenbroek /*23*/	[KERN_MAXPARTITIONS]	= MIB_INT(_P | _RO, NR_PARTITIONS,
38225d39513SDavid van Moolenbroek 				    "maxpartitions", "Maximum number of "
38325d39513SDavid van Moolenbroek 				    "partitions allowed per disk"),
38425d39513SDavid van Moolenbroek /*24*/	/* KERN_RAWPARTITION: incompatible with our device node scheme */
38525d39513SDavid van Moolenbroek /*25*/	/* KERN_NTPTIME: not yet supported */
38625d39513SDavid van Moolenbroek /*26*/	/* KERN_TIMEX: not yet supported */
38725d39513SDavid van Moolenbroek /*27*/	/* KERN_AUTONICETIME: not yet supported */
38825d39513SDavid van Moolenbroek /*28*/	/* KERN_AUTONICEVAL: not yet supported */
38925d39513SDavid van Moolenbroek /*29*/	[KERN_RTC_OFFSET]	= MIB_INT(_P | _RW, 0, "rtc_offset", "Offset "
39025d39513SDavid van Moolenbroek 				    "of real time clock from UTC in minutes"),
39125d39513SDavid van Moolenbroek /*30*/	[KERN_ROOT_DEVICE]	= MIB_FUNC(_P | _RO | CTLTYPE_STRING, 0,
39225d39513SDavid van Moolenbroek 				    mib_kern_root_device, "root_device",
39325d39513SDavid van Moolenbroek 				    "Name of the root device"),
39425d39513SDavid van Moolenbroek /*31*/	[KERN_MSGBUFSIZE]	= MIB_INT(_P | _RO, DIAG_BUFSIZE, "msgbufsize",
39525d39513SDavid van Moolenbroek 				    "Size of the kernel message buffer"),
39625d39513SDavid van Moolenbroek /*32*/	[KERN_FSYNC]		= MIB_INT(_P | _RO, 1, "fsync", "Whether the "
39725d39513SDavid van Moolenbroek 				    "POSIX 1003.1b File Synchronization Option"
39825d39513SDavid van Moolenbroek 				    " is available on this system"),
39925d39513SDavid van Moolenbroek /*33*/	/* KERN_OLDSYSVMSG: obsolete */
40025d39513SDavid van Moolenbroek /*34*/	/* KERN_OLDSYSVSEM: obsolete */
40125d39513SDavid van Moolenbroek /*35*/	/* KERN_OLDSYSVSHM: obsolete */
40225d39513SDavid van Moolenbroek /*36*/	/* KERN_OLDSHORTCORENAME: obsolete */
40325d39513SDavid van Moolenbroek /*37*/	[KERN_SYNCHRONIZED_IO]	= MIB_INT(_P | _RO, 0, "synchronized_io",
40425d39513SDavid van Moolenbroek 				    "Whether the POSIX 1003.1b Synchronized "
40525d39513SDavid van Moolenbroek 				    "I/O Option is available on this system"),
40625d39513SDavid van Moolenbroek /*38*/	[KERN_IOV_MAX]		= MIB_INT(_P | _RO, IOV_MAX, "iov_max",
40725d39513SDavid van Moolenbroek 				    "Maximum number of iovec structures per "
40825d39513SDavid van Moolenbroek 				    "process"),
40925d39513SDavid van Moolenbroek /*39*/	/* KERN_MBUF: not yet supported */
41025d39513SDavid van Moolenbroek /*40*/	[KERN_MAPPED_FILES]	= MIB_INT(_P | _RO, 1, "mapped_files",
41125d39513SDavid van Moolenbroek 				    "Whether the POSIX 1003.1b Memory Mapped "
41225d39513SDavid van Moolenbroek 				    "Files Option is available on this "
41325d39513SDavid van Moolenbroek 				    "system"),
41425d39513SDavid van Moolenbroek /*41*/	[KERN_MEMLOCK]		= MIB_INT(_P | _RO, 0, "memlock", "Whether "
41525d39513SDavid van Moolenbroek 				    "the POSIX 1003.1b Process Memory Locking "
41625d39513SDavid van Moolenbroek 				    "Option is available on this system"),
41725d39513SDavid van Moolenbroek /*42*/	[KERN_MEMLOCK_RANGE]	= MIB_INT(_P | _RO, 0, "memlock_range",
41825d39513SDavid van Moolenbroek 				    "Whether the POSIX 1003.1b Range Memory "
41925d39513SDavid van Moolenbroek 				    "Locking Option is available on this "
42025d39513SDavid van Moolenbroek 				    "system"),
42125d39513SDavid van Moolenbroek /*43*/	[KERN_MEMORY_PROTECTION]= MIB_INT(_P | _RO, 0, "memory_protection",
42225d39513SDavid van Moolenbroek 				    "Whether the POSIX 1003.1b Memory "
42325d39513SDavid van Moolenbroek 				    "Protection Option is available on this "
42425d39513SDavid van Moolenbroek 				    "system"),
42525d39513SDavid van Moolenbroek /*44*/	/* KERN_LOGIN_NAME_MAX: not yet supported */
42625d39513SDavid van Moolenbroek /*45*/	/* KERN_DEFCORENAME: obsolete */
42725d39513SDavid van Moolenbroek /*46*/	/* KERN_LOGSIGEXIT: not yet supported */
42825d39513SDavid van Moolenbroek /*47*/	[KERN_PROC2]		= MIB_FUNC(_P | _RO | CTLTYPE_NODE, 0,
42925d39513SDavid van Moolenbroek 				    mib_kern_proc2, "proc2",
43025d39513SDavid van Moolenbroek 				    "Machine-independent process information"),
43125d39513SDavid van Moolenbroek /*48*/	[KERN_PROC_ARGS]	= MIB_FUNC(_P | _RO | CTLTYPE_NODE, 0,
43225d39513SDavid van Moolenbroek 				    mib_kern_proc_args, "proc_args",
43325d39513SDavid van Moolenbroek 				    "Process argument information"),
43425d39513SDavid van Moolenbroek /*49*/	[KERN_FSCALE]		= MIB_INT(_P | _RO, FSCALE, "fscale",
43525d39513SDavid van Moolenbroek 				    "Kernel fixed-point scale factor"),
43625d39513SDavid van Moolenbroek /*50*/	[KERN_CCPU]		= MIB_FUNC(_P | _RO | CTLTYPE_INT, sizeof(int),
43725d39513SDavid van Moolenbroek 				    mib_kern_ccpu, "ccpu",
43825d39513SDavid van Moolenbroek 				    "Scheduler exponential decay value"),
43925d39513SDavid van Moolenbroek /*51*/	[KERN_CP_TIME]		= MIB_FUNC(_P | _RO | CTLTYPE_NODE, 0,
44025d39513SDavid van Moolenbroek 				    mib_kern_cp_time, "cp_time", "Clock ticks "
44125d39513SDavid van Moolenbroek 				    "spent in different CPU states"),
44225d39513SDavid van Moolenbroek /*52*/	/* KERN_OLDSYSVIPC_INFO: obsolete */
44325d39513SDavid van Moolenbroek /*53*/	/* KERN_MSGBUF: not yet supported */
44425d39513SDavid van Moolenbroek /*54*/	[KERN_CONSDEV]		= MIB_FUNC(_P | _RO | CTLTYPE_STRUCT,
44525d39513SDavid van Moolenbroek 				    sizeof(dev_t), mib_kern_consdev, "consdev",
44625d39513SDavid van Moolenbroek 				    "Console device"),
44725d39513SDavid van Moolenbroek /*55*/	[KERN_MAXPTYS]		= MIB_INT(_P | _RO, NR_PTYS, "maxptys",
44825d39513SDavid van Moolenbroek 				    "Maximum number of pseudo-ttys"),
44925d39513SDavid van Moolenbroek /*56*/	/* KERN_PIPE: not yet supported */
45025d39513SDavid van Moolenbroek /*57*/	[KERN_MAXPHYS]		= MIB_INT(_P | _RO, 4*1024*1024, "maxphys",
45125d39513SDavid van Moolenbroek 				    "Maximum raw I/O transfer size"),
45225d39513SDavid van Moolenbroek 				    /* 4MB is the upper limit for AHCI */
45325d39513SDavid van Moolenbroek /*58*/	/* KERN_SBMAX: not yet supported */
45425d39513SDavid van Moolenbroek /*59*/	/* KERN_TKSTAT: not yet supported */
45525d39513SDavid van Moolenbroek /*60*/	[KERN_MONOTONIC_CLOCK]	= MIB_INT(_P | _RO, _POSIX_MONOTONIC_CLOCK,
45625d39513SDavid van Moolenbroek 				    "monotonic_clock",
45725d39513SDavid van Moolenbroek 				    "Implementation version of the POSIX "
45825d39513SDavid van Moolenbroek 				    "1003.1b Monotonic Clock Option"),
45925d39513SDavid van Moolenbroek /*61*/	/* KERN_URND: not yet supported */
46025d39513SDavid van Moolenbroek /*62*/	/* KERN_LABELSECTOR: not yet supported */
46125d39513SDavid van Moolenbroek /*63*/	/* KERN_LABELOFFSET: not yet supported */
46225d39513SDavid van Moolenbroek /*64*/	[KERN_LWP]		= MIB_FUNC(_P | _RO | CTLTYPE_NODE, 0,
46325d39513SDavid van Moolenbroek 				    mib_kern_lwp, "lwp",
46425d39513SDavid van Moolenbroek 				    "System-wide LWP information"),
46525d39513SDavid van Moolenbroek /*65*/	[KERN_FORKFSLEEP]	= MIB_INTV(_P | _RW, 0, mib_kern_forkfsleep,
46625d39513SDavid van Moolenbroek 				    "forkfsleep", "Milliseconds to sleep on "
46725d39513SDavid van Moolenbroek 				    "fork failure due to process limits"),
46825d39513SDavid van Moolenbroek /*66*/	/* KERN_POSIX_THREADS: not yet supported */
46925d39513SDavid van Moolenbroek /*67*/	/* KERN_POSIX_SEMAPHORES: not yet supported */
47025d39513SDavid van Moolenbroek /*68*/	/* KERN_POSIX_BARRIERS: not yet supported */
47125d39513SDavid van Moolenbroek /*69*/	/* KERN_POSIX_TIMERS: not yet supported */
47225d39513SDavid van Moolenbroek /*70*/	/* KERN_POSIX_SPIN_LOCKS: not yet supported */
47325d39513SDavid van Moolenbroek /*71*/	/* KERN_POSIX_READER_WRITER_LOCKS: not yet supported */
47425d39513SDavid van Moolenbroek /*72*/	[KERN_DUMP_ON_PANIC]	= MIB_INT(_P | _RO, 0, "dump_on_panic",
47525d39513SDavid van Moolenbroek 				    "Perform a crash dump on system panic"),
47625d39513SDavid van Moolenbroek /*73*/	/* KERN_SOMAXKVA: not yet supported */
47725d39513SDavid van Moolenbroek /*74*/	/* KERN_ROOT_PARTITION: incompatible with our device node scheme */
47825d39513SDavid van Moolenbroek /*75*/	[KERN_DRIVERS]		= MIB_FUNC(_P | _RO | CTLTYPE_STRUCT, 0,
47925d39513SDavid van Moolenbroek 				    mib_kern_drivers, "drivers",
48025d39513SDavid van Moolenbroek 				    "List of all drivers with block and "
48125d39513SDavid van Moolenbroek 				    "character device numbers"),
48225d39513SDavid van Moolenbroek /*76*/	/* KERN_BUF: not yet supported */
48325d39513SDavid van Moolenbroek /*77*/	/* KERN_FILE2: not yet supported */
48425d39513SDavid van Moolenbroek /*78*/	/* KERN_VERIEXEC: not yet supported */
48525d39513SDavid van Moolenbroek /*79*/	/* KERN_CP_ID: not yet supported */
48625d39513SDavid van Moolenbroek /*80*/	[KERN_HARDCLOCK_TICKS]	= MIB_FUNC(_P | _RO | CTLFLAG_UNSIGNED |
48725d39513SDavid van Moolenbroek 				    CTLTYPE_INT, sizeof(int),
48825d39513SDavid van Moolenbroek 				    mib_kern_hardclock_ticks,
48925d39513SDavid van Moolenbroek 				    "hardclock_ticks",
49025d39513SDavid van Moolenbroek 				    "Number of hardclock ticks"),
49125d39513SDavid van Moolenbroek /*81*/	/* KERN_ARND: not yet supported */
49225d39513SDavid van Moolenbroek /*82*/	[KERN_SYSVIPC]		= MIB_NODE(_P | _RO, mib_kern_ipc_table, "ipc",
49325d39513SDavid van Moolenbroek 				    "SysV IPC options"),
49425d39513SDavid van Moolenbroek /*83*/	[KERN_BOOTTIME]		= MIB_FUNC(_P | _RO | CTLTYPE_STRUCT,
49525d39513SDavid van Moolenbroek 				    sizeof(struct timeval), mib_kern_boottime,
49625d39513SDavid van Moolenbroek 				    "boottime", "System boot time"),
49725d39513SDavid van Moolenbroek /*84*/	/* KERN_EVCNT: not yet supported */
498e4e21ee1SDavid van Moolenbroek };
499e4e21ee1SDavid van Moolenbroek 
500e4e21ee1SDavid van Moolenbroek /*
501e4e21ee1SDavid van Moolenbroek  * Initialize the CTL_KERN subtree.
502e4e21ee1SDavid van Moolenbroek  */
503e4e21ee1SDavid van Moolenbroek void
mib_kern_init(struct mib_node * node)504e4e21ee1SDavid van Moolenbroek mib_kern_init(struct mib_node * node)
505e4e21ee1SDavid van Moolenbroek {
506e4e21ee1SDavid van Moolenbroek 
507e4e21ee1SDavid van Moolenbroek 	MIB_INIT_ENODE(node, mib_kern_table);
508e4e21ee1SDavid van Moolenbroek }
509