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