1 /* $NetBSD: init_sysctl_base.c,v 1.7 2015/08/25 14:52:31 pooka Exp $ */ 2 3 /*- 4 * Copyright (c) 2003, 2007, 2008, 2009 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Andrew Brown, and by Andrew Doran. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 #include <sys/cdefs.h> 33 __KERNEL_RCSID(0, "$NetBSD: init_sysctl_base.c,v 1.7 2015/08/25 14:52:31 pooka Exp $"); 34 35 #include <sys/types.h> 36 #include <sys/param.h> 37 #include <sys/sysctl.h> 38 #include <sys/cpu.h> 39 #include <sys/kernel.h> 40 #include <sys/disklabel.h> 41 42 static int sysctl_setlen(SYSCTLFN_PROTO); 43 44 /* 45 * sets up the base nodes... 46 */ 47 void 48 sysctl_basenode_init(void) 49 { 50 51 sysctl_createv(NULL, 0, NULL, NULL, 52 CTLFLAG_PERMANENT, 53 CTLTYPE_NODE, "kern", 54 SYSCTL_DESCR("High kernel"), 55 NULL, 0, NULL, 0, 56 CTL_KERN, CTL_EOL); 57 sysctl_createv(NULL, 0, NULL, NULL, 58 CTLFLAG_PERMANENT, 59 CTLTYPE_NODE, "vm", 60 SYSCTL_DESCR("Virtual memory"), 61 NULL, 0, NULL, 0, 62 CTL_VM, CTL_EOL); 63 sysctl_createv(NULL, 0, NULL, NULL, 64 CTLFLAG_PERMANENT, 65 CTLTYPE_NODE, "vfs", 66 SYSCTL_DESCR("Filesystem"), 67 NULL, 0, NULL, 0, 68 CTL_VFS, CTL_EOL); 69 sysctl_createv(NULL, 0, NULL, NULL, 70 CTLFLAG_PERMANENT, 71 CTLTYPE_NODE, "net", 72 SYSCTL_DESCR("Networking"), 73 NULL, 0, NULL, 0, 74 CTL_NET, CTL_EOL); 75 sysctl_createv(NULL, 0, NULL, NULL, 76 CTLFLAG_PERMANENT, 77 CTLTYPE_NODE, "debug", 78 SYSCTL_DESCR("Debugging"), 79 NULL, 0, NULL, 0, 80 CTL_DEBUG, CTL_EOL); 81 sysctl_createv(NULL, 0, NULL, NULL, 82 CTLFLAG_PERMANENT, 83 CTLTYPE_NODE, "hw", 84 SYSCTL_DESCR("Generic CPU, I/O"), 85 NULL, 0, NULL, 0, 86 CTL_HW, CTL_EOL); 87 sysctl_createv(NULL, 0, NULL, NULL, 88 CTLFLAG_PERMANENT, 89 CTLTYPE_NODE, "machdep", 90 SYSCTL_DESCR("Machine dependent"), 91 NULL, 0, NULL, 0, 92 CTL_MACHDEP, CTL_EOL); 93 /* 94 * this node is inserted so that the sysctl nodes in libc can 95 * operate. 96 */ 97 sysctl_createv(NULL, 0, NULL, NULL, 98 CTLFLAG_PERMANENT, 99 CTLTYPE_NODE, "user", 100 SYSCTL_DESCR("User-level"), 101 NULL, 0, NULL, 0, 102 CTL_USER, CTL_EOL); 103 sysctl_createv(NULL, 0, NULL, NULL, 104 CTLFLAG_PERMANENT, 105 CTLTYPE_NODE, "ddb", 106 SYSCTL_DESCR("In-kernel debugger"), 107 NULL, 0, NULL, 0, 108 CTL_DDB, CTL_EOL); 109 sysctl_createv(NULL, 0, NULL, NULL, 110 CTLFLAG_PERMANENT, 111 CTLTYPE_NODE, "proc", 112 SYSCTL_DESCR("Per-process"), 113 NULL, 0, NULL, 0, 114 CTL_PROC, CTL_EOL); 115 sysctl_createv(NULL, 0, NULL, NULL, 116 CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 117 CTLTYPE_NODE, "vendor", 118 SYSCTL_DESCR("Vendor specific"), 119 NULL, 0, NULL, 0, 120 CTL_VENDOR, CTL_EOL); 121 sysctl_createv(NULL, 0, NULL, NULL, 122 CTLFLAG_PERMANENT, 123 CTLTYPE_NODE, "emul", 124 SYSCTL_DESCR("Emulation settings"), 125 NULL, 0, NULL, 0, 126 CTL_EMUL, CTL_EOL); 127 sysctl_createv(NULL, 0, NULL, NULL, 128 CTLFLAG_PERMANENT, 129 CTLTYPE_NODE, "security", 130 SYSCTL_DESCR("Security"), 131 NULL, 0, NULL, 0, 132 CTL_SECURITY, CTL_EOL); 133 } 134 135 /* 136 * now add some nodes which both rump kernel and standard 137 * NetBSD both need, as rump cannot use sys/kern/init_sysctl.c 138 */ 139 SYSCTL_SETUP(sysctl_kernbase_setup, "sysctl kern subtree base setup") 140 { 141 142 sysctl_createv(clog, 0, NULL, NULL, 143 CTLFLAG_PERMANENT, 144 CTLTYPE_STRING, "ostype", 145 SYSCTL_DESCR("Operating system type"), 146 NULL, 0, __UNCONST(&ostype), 0, 147 CTL_KERN, KERN_OSTYPE, CTL_EOL); 148 sysctl_createv(clog, 0, NULL, NULL, 149 CTLFLAG_PERMANENT, 150 CTLTYPE_STRING, "osrelease", 151 SYSCTL_DESCR("Operating system release"), 152 NULL, 0, __UNCONST(&osrelease), 0, 153 CTL_KERN, KERN_OSRELEASE, CTL_EOL); 154 sysctl_createv(clog, 0, NULL, NULL, 155 CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE, 156 CTLTYPE_INT, "osrevision", 157 SYSCTL_DESCR("Operating system revision"), 158 NULL, __NetBSD_Version__, NULL, 0, 159 CTL_KERN, KERN_OSREV, CTL_EOL); 160 sysctl_createv(clog, 0, NULL, NULL, 161 CTLFLAG_PERMANENT, 162 CTLTYPE_STRING, "version", 163 SYSCTL_DESCR("Kernel version"), 164 NULL, 0, __UNCONST(&version), 0, 165 CTL_KERN, KERN_VERSION, CTL_EOL); 166 sysctl_createv(clog, 0, NULL, NULL, 167 CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 168 CTLTYPE_STRING, "hostname", 169 SYSCTL_DESCR("System hostname"), 170 sysctl_setlen, 0, hostname, MAXHOSTNAMELEN, 171 CTL_KERN, KERN_HOSTNAME, CTL_EOL); 172 sysctl_createv(clog, 0, NULL, NULL, 173 CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 174 CTLTYPE_STRING, "domainname", 175 SYSCTL_DESCR("YP domain name"), 176 sysctl_setlen, 0, domainname, MAXHOSTNAMELEN, 177 CTL_KERN, KERN_DOMAINNAME, CTL_EOL); 178 sysctl_createv(clog, 0, NULL, NULL, 179 CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE, 180 CTLTYPE_INT, "rawpartition", 181 SYSCTL_DESCR("Raw partition of a disk"), 182 NULL, RAW_PART, NULL, 0, 183 CTL_KERN, KERN_RAWPARTITION, CTL_EOL); 184 } 185 186 SYSCTL_SETUP(sysctl_hwbase_setup, "sysctl hw subtree base setup") 187 { 188 u_int u; 189 u_quad_t q; 190 const char *model = cpu_getmodel(); 191 192 sysctl_createv(clog, 0, NULL, NULL, 193 CTLFLAG_PERMANENT, 194 CTLTYPE_STRING, "model", 195 SYSCTL_DESCR("Machine model"), 196 NULL, 0, __UNCONST(model), 0, 197 CTL_HW, HW_MODEL, CTL_EOL); 198 sysctl_createv(clog, 0, NULL, NULL, 199 CTLFLAG_PERMANENT, 200 CTLTYPE_STRING, "machine", 201 SYSCTL_DESCR("Machine class"), 202 NULL, 0, machine, 0, 203 CTL_HW, HW_MACHINE, CTL_EOL); 204 sysctl_createv(clog, 0, NULL, NULL, 205 CTLFLAG_PERMANENT, 206 CTLTYPE_STRING, "machine_arch", 207 SYSCTL_DESCR("Machine CPU class"), 208 NULL, 0, machine_arch, 0, 209 CTL_HW, HW_MACHINE_ARCH, CTL_EOL); 210 sysctl_createv(clog, 0, NULL, NULL, 211 CTLFLAG_PERMANENT, 212 CTLTYPE_INT, "ncpu", 213 SYSCTL_DESCR("Number of CPUs configured"), 214 NULL, 0, &ncpu, 0, 215 CTL_HW, HW_NCPU, CTL_EOL); 216 sysctl_createv(clog, 0, NULL, NULL, 217 CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE, 218 CTLTYPE_INT, "byteorder", 219 SYSCTL_DESCR("System byte order"), 220 NULL, BYTE_ORDER, NULL, 0, 221 CTL_HW, HW_BYTEORDER, CTL_EOL); 222 u = ((u_int)physmem > (UINT_MAX / PAGE_SIZE)) ? 223 UINT_MAX : physmem * PAGE_SIZE; 224 sysctl_createv(clog, 0, NULL, NULL, 225 CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE, 226 CTLTYPE_INT, "physmem", 227 SYSCTL_DESCR("Bytes of physical memory"), 228 NULL, u, NULL, 0, 229 CTL_HW, HW_PHYSMEM, CTL_EOL); 230 sysctl_createv(clog, 0, NULL, NULL, 231 CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE, 232 CTLTYPE_INT, "pagesize", 233 SYSCTL_DESCR("Software page size"), 234 NULL, PAGE_SIZE, NULL, 0, 235 CTL_HW, HW_PAGESIZE, CTL_EOL); 236 sysctl_createv(clog, 0, NULL, NULL, 237 CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE, 238 CTLTYPE_INT, "alignbytes", 239 SYSCTL_DESCR("Alignment constraint for all possible " 240 "data types"), 241 NULL, ALIGNBYTES, NULL, 0, 242 CTL_HW, HW_ALIGNBYTES, CTL_EOL); 243 q = (u_quad_t)physmem * PAGE_SIZE; 244 sysctl_createv(clog, 0, NULL, NULL, 245 CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE, 246 CTLTYPE_QUAD, "physmem64", 247 SYSCTL_DESCR("Bytes of physical memory"), 248 NULL, q, NULL, 0, 249 CTL_HW, HW_PHYSMEM64, CTL_EOL); 250 sysctl_createv(clog, 0, NULL, NULL, 251 CTLFLAG_PERMANENT, 252 CTLTYPE_INT, "ncpuonline", 253 SYSCTL_DESCR("Number of CPUs online"), 254 NULL, 0, &ncpuonline, 0, 255 CTL_HW, HW_NCPUONLINE, CTL_EOL); 256 } 257 258 /* 259 * sysctl helper function for kern.hostname and kern.domainnname. 260 * resets the relevant recorded length when the underlying name is 261 * changed. 262 */ 263 static int 264 sysctl_setlen(SYSCTLFN_ARGS) 265 { 266 int error; 267 268 error = sysctl_lookup(SYSCTLFN_CALL(rnode)); 269 if (error || newp == NULL) 270 return (error); 271 272 switch (rnode->sysctl_num) { 273 case KERN_HOSTNAME: 274 hostnamelen = strlen((const char*)rnode->sysctl_data); 275 break; 276 case KERN_DOMAINNAME: 277 domainnamelen = strlen((const char*)rnode->sysctl_data); 278 break; 279 } 280 281 return (0); 282 } 283