1 1.552 imil /* $NetBSD: init_main.c,v 1.552 2025/05/08 05:31:16 imil Exp $ */ 2 1.347 ad 3 1.347 ad /*- 4 1.546 ad * Copyright (c) 2008, 2009, 2019, 2023 The NetBSD Foundation, Inc. 5 1.347 ad * All rights reserved. 6 1.347 ad * 7 1.347 ad * Redistribution and use in source and binary forms, with or without 8 1.347 ad * modification, are permitted provided that the following conditions 9 1.347 ad * are met: 10 1.347 ad * 1. Redistributions of source code must retain the above copyright 11 1.347 ad * notice, this list of conditions and the following disclaimer. 12 1.347 ad * 2. Redistributions in binary form must reproduce the above copyright 13 1.347 ad * notice, this list of conditions and the following disclaimer in the 14 1.347 ad * documentation and/or other materials provided with the distribution. 15 1.347 ad * 16 1.347 ad * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17 1.347 ad * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 1.347 ad * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 1.347 ad * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20 1.347 ad * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 1.347 ad * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 1.347 ad * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 1.347 ad * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 1.347 ad * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 1.347 ad * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 1.347 ad * POSSIBILITY OF SUCH DAMAGE. 27 1.347 ad */ 28 1.61 mycroft 29 1.61 mycroft /* 30 1.61 mycroft * Copyright (c) 1982, 1986, 1989, 1991, 1992, 1993 31 1.61 mycroft * The Regents of the University of California. All rights reserved. 32 1.61 mycroft * (c) UNIX System Laboratories, Inc. 33 1.61 mycroft * All or some portions of this file are derived from material licensed 34 1.61 mycroft * to the University of California by American Telephone and Telegraph 35 1.61 mycroft * Co. or Unix System Laboratories, Inc. and are reproduced herein with 36 1.61 mycroft * the permission of UNIX System Laboratories, Inc. 37 1.61 mycroft * 38 1.61 mycroft * Redistribution and use in source and binary forms, with or without 39 1.61 mycroft * modification, are permitted provided that the following conditions 40 1.61 mycroft * are met: 41 1.61 mycroft * 1. Redistributions of source code must retain the above copyright 42 1.61 mycroft * notice, this list of conditions and the following disclaimer. 43 1.61 mycroft * 2. Redistributions in binary form must reproduce the above copyright 44 1.61 mycroft * notice, this list of conditions and the following disclaimer in the 45 1.61 mycroft * documentation and/or other materials provided with the distribution. 46 1.224 agc * 3. Neither the name of the University nor the names of its contributors 47 1.224 agc * may be used to endorse or promote products derived from this software 48 1.224 agc * without specific prior written permission. 49 1.224 agc * 50 1.224 agc * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 51 1.224 agc * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 52 1.224 agc * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 53 1.224 agc * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 54 1.224 agc * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 55 1.224 agc * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 56 1.224 agc * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 57 1.224 agc * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 58 1.224 agc * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 59 1.224 agc * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 60 1.224 agc * SUCH DAMAGE. 61 1.224 agc * 62 1.224 agc * @(#)init_main.c 8.16 (Berkeley) 5/14/95 63 1.224 agc */ 64 1.224 agc 65 1.224 agc /* 66 1.224 agc * Copyright (c) 1995 Christopher G. Demetriou. All rights reserved. 67 1.224 agc * 68 1.224 agc * Redistribution and use in source and binary forms, with or without 69 1.224 agc * modification, are permitted provided that the following conditions 70 1.224 agc * are met: 71 1.224 agc * 1. Redistributions of source code must retain the above copyright 72 1.224 agc * notice, this list of conditions and the following disclaimer. 73 1.224 agc * 2. Redistributions in binary form must reproduce the above copyright 74 1.224 agc * notice, this list of conditions and the following disclaimer in the 75 1.224 agc * documentation and/or other materials provided with the distribution. 76 1.61 mycroft * 3. All advertising materials mentioning features or use of this software 77 1.61 mycroft * must display the following acknowledgement: 78 1.61 mycroft * This product includes software developed by the University of 79 1.61 mycroft * California, Berkeley and its contributors. 80 1.61 mycroft * 4. Neither the name of the University nor the names of its contributors 81 1.61 mycroft * may be used to endorse or promote products derived from this software 82 1.61 mycroft * without specific prior written permission. 83 1.61 mycroft * 84 1.61 mycroft * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 85 1.61 mycroft * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 86 1.61 mycroft * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 87 1.61 mycroft * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 88 1.61 mycroft * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 89 1.61 mycroft * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 90 1.61 mycroft * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 91 1.61 mycroft * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 92 1.61 mycroft * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 93 1.61 mycroft * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 94 1.61 mycroft * SUCH DAMAGE. 95 1.61 mycroft * 96 1.118 fvdl * @(#)init_main.c 8.16 (Berkeley) 5/14/95 97 1.61 mycroft */ 98 1.196 lukem 99 1.196 lukem #include <sys/cdefs.h> 100 1.552 imil __KERNEL_RCSID(0, "$NetBSD: init_main.c,v 1.552 2025/05/08 05:31:16 imil Exp $"); 101 1.115 mrg 102 1.530 thorpej #include "opt_cnmagic.h" 103 1.370 tsutsui #include "opt_ddb.h" 104 1.475 ozaki #include "opt_inet.h" 105 1.223 jonathan #include "opt_ipsec.h" 106 1.382 apb #include "opt_modular.h" 107 1.267 kardel #include "opt_ntp.h" 108 1.198 jdolecek #include "opt_pipe.h" 109 1.172 soren #include "opt_syscall_debug.h" 110 1.267 kardel #include "opt_sysv.h" 111 1.292 ad #include "opt_fileassoc.h" 112 1.292 ad #include "opt_ktrace.h" 113 1.281 elad #include "opt_pax.h" 114 1.380 christos #include "opt_compat_netbsd.h" 115 1.404 elad #include "opt_ptrace.h" 116 1.465 nat #include "opt_splash.h" 117 1.489 pgoyette #include "opt_kernhist.h" 118 1.495 maxv #include "opt_gprof.h" 119 1.465 nat 120 1.470 uebayasi #if defined(SPLASHSCREEN) && defined(makeoptions_SPLASHSCREEN_IMAGE) 121 1.465 nat extern void *_binary_splash_image_start; 122 1.465 nat extern void *_binary_splash_image_end; 123 1.465 nat #endif 124 1.61 mycroft 125 1.377 he #include "ksyms.h" 126 1.441 tls 127 1.276 dogcow #include "veriexec.h" 128 1.106 explorer 129 1.61 mycroft #include <sys/param.h> 130 1.164 enami #include <sys/acct.h> 131 1.61 mycroft #include <sys/filedesc.h> 132 1.131 thorpej #include <sys/file.h> 133 1.61 mycroft #include <sys/errno.h> 134 1.162 thorpej #include <sys/callout.h> 135 1.302 yamt #include <sys/cpu.h> 136 1.436 jruoho #include <sys/cpufreq.h> 137 1.408 dyoung #include <sys/spldebug.h> 138 1.61 mycroft #include <sys/kernel.h> 139 1.61 mycroft #include <sys/mount.h> 140 1.61 mycroft #include <sys/proc.h> 141 1.541 riastrad #include <sys/lwp.h> 142 1.136 thorpej #include <sys/kthread.h> 143 1.61 mycroft #include <sys/resourcevar.h> 144 1.61 mycroft #include <sys/signalvar.h> 145 1.61 mycroft #include <sys/systm.h> 146 1.61 mycroft #include <sys/vnode.h> 147 1.288 hannken #include <sys/fstrans.h> 148 1.87 thorpej #include <sys/tty.h> 149 1.61 mycroft #include <sys/conf.h> 150 1.95 thorpej #include <sys/disklabel.h> 151 1.61 mycroft #include <sys/buf.h> 152 1.61 mycroft #include <sys/device.h> 153 1.186 jdolecek #include <sys/exec.h> 154 1.128 thorpej #include <sys/socketvar.h> 155 1.61 mycroft #include <sys/protosw.h> 156 1.338 yamt #include <sys/percpu.h> 157 1.434 christos #include <sys/pserialize.h> 158 1.342 rmind #include <sys/pset.h> 159 1.338 yamt #include <sys/sysctl.h> 160 1.61 mycroft #include <sys/reboot.h> 161 1.209 jdolecek #include <sys/event.h> 162 1.227 jonathan #include <sys/mbuf.h> 163 1.302 yamt #include <sys/sched.h> 164 1.292 ad #include <sys/sleepq.h> 165 1.455 rmind #include <sys/ipi.h> 166 1.284 ad #include <sys/iostat.h> 167 1.304 yamt #include <sys/vmem.h> 168 1.307 ad #include <sys/uuid.h> 169 1.307 ad #include <sys/extent.h> 170 1.309 ad #include <sys/disk.h> 171 1.325 ad #include <sys/msgbuf.h> 172 1.340 ad #include <sys/module.h> 173 1.509 pgoyette #include <sys/module_hook.h> 174 1.343 ad #include <sys/event.h> 175 1.357 ad #include <sys/lockf.h> 176 1.364 pooka #include <sys/once.h> 177 1.435 rmind #include <sys/kcpuset.h> 178 1.367 ad #include <sys/ksyms.h> 179 1.365 pooka #include <sys/uidinfo.h> 180 1.379 pooka #include <sys/kprintf.h> 181 1.485 pgoyette #include <sys/bufq.h> 182 1.501 thorpej #include <sys/threadpool.h> 183 1.523 thorpej #include <sys/futex.h> 184 1.449 christos #ifdef IPSEC 185 1.223 jonathan #include <netipsec/ipsec.h> 186 1.223 jonathan #endif 187 1.82 christos #include <sys/domain.h> 188 1.94 mouse #include <sys/namei.h> 189 1.103 explorer #include <sys/rnd.h> 190 1.192 jdolecek #include <sys/pipe.h> 191 1.273 elad #if NVERIEXEC > 0 192 1.245 blymn #include <sys/verified_exec.h> 193 1.273 elad #endif /* NVERIEXEC > 0 */ 194 1.292 ad #ifdef KTRACE 195 1.292 ad #include <sys/ktrace.h> 196 1.292 ad #endif 197 1.266 elad #include <sys/kauth.h> 198 1.252 skrll #include <net80211/ieee80211_netbsd.h> 199 1.437 tls #include <sys/cprng.h> 200 1.504 ozaki #include <sys/psref.h> 201 1.510 ad #include <sys/radixtree.h> 202 1.542 riastrad #include <sys/heartbeat.h> 203 1.61 mycroft 204 1.77 christos #include <sys/syscall.h> 205 1.68 cgd #include <sys/syscallargs.h> 206 1.68 cgd 207 1.281 elad #include <sys/pax.h> 208 1.334 elad 209 1.515 thorpej #include <dev/clock_subr.h> 210 1.515 thorpej 211 1.438 jym #include <secmodel/secmodel.h> 212 1.438 jym 213 1.61 mycroft #include <ufs/ufs/quota.h> 214 1.61 mycroft 215 1.159 fvdl #include <miscfs/genfs/genfs.h> 216 1.410 elad #include <miscfs/specfs/specdev.h> 217 1.159 fvdl 218 1.323 ad #include <sys/cpu.h> 219 1.61 mycroft 220 1.425 uebayasi #include <uvm/uvm.h> /* extern struct uvm uvm */ 221 1.114 mrg 222 1.202 lukem #include <dev/cons.h> 223 1.465 nat #include <dev/splash/splash.h> 224 1.310 xtraeme 225 1.414 pooka #include <net/bpf.h> 226 1.81 christos #include <net/if.h> 227 1.490 ryo #include <net/pfil.h> 228 1.81 christos #include <net/raw_cb.h> 229 1.468 ozaki #include <net/if_llatbl.h> 230 1.61 mycroft 231 1.399 pooka #include <prop/proplib.h> 232 1.399 pooka 233 1.398 pooka #include <sys/userconf.h> 234 1.398 pooka 235 1.552 imil #ifdef BOOT_DURATION 236 1.552 imil #include <sys/boot_duration.h> 237 1.551 imil #endif 238 1.551 imil 239 1.311 pooka extern time_t rootfstime; 240 1.251 junyoung 241 1.216 thorpej #ifndef curlwp 242 1.216 thorpej struct lwp *curlwp = &lwp0; 243 1.133 pk #endif 244 1.105 mycroft struct proc *initproc; 245 1.61 mycroft 246 1.61 mycroft struct vnode *rootvp, *swapdev_vp; 247 1.61 mycroft int boothowto; 248 1.494 msaitoh int cold __read_mostly = 1; /* still working on startup */ 249 1.516 thorpej int shutting_down __read_mostly; /* system is shutting down */ 250 1.61 mycroft 251 1.356 ad int start_init_exec; /* semaphore for start_init() */ 252 1.163 thorpej 253 1.260 christos static void check_console(struct lwp *l); 254 1.176 thorpej static void start_init(void *); 255 1.398 pooka static void configure(void); 256 1.398 pooka static void configure2(void); 257 1.421 tsutsui static void configure3(void); 258 1.176 thorpej void main(void); 259 1.280 christos 260 1.61 mycroft /* 261 1.61 mycroft * System startup; initialize the world, create process 0, mount root 262 1.61 mycroft * filesystem, and fork to create init and pagedaemon. Most of the 263 1.61 mycroft * hard work is done in the lower-level initialization routines including 264 1.61 mycroft * startup(), which does memory initialization and autoconfiguration. 265 1.61 mycroft */ 266 1.81 christos void 267 1.176 thorpej main(void) 268 1.61 mycroft { 269 1.380 christos struct timespec time; 270 1.216 thorpej struct lwp *l; 271 1.144 thorpej struct proc *p; 272 1.204 thorpej int s, error; 273 1.175 jdolecek #ifdef NVNODE_IMPLICIT 274 1.175 jdolecek int usevnodes; 275 1.175 jdolecek #endif 276 1.312 ad CPU_INFO_ITERATOR cii; 277 1.312 ad struct cpu_info *ci; 278 1.61 mycroft 279 1.493 chs #ifdef DIAGNOSTIC 280 1.493 chs /* 281 1.493 chs * Verify that CPU_INFO_FOREACH() knows about the boot CPU 282 1.549 thorpej * and only the boot CPU at this point. 283 1.493 chs */ 284 1.493 chs int cpucount = 0; 285 1.493 chs for (CPU_INFO_FOREACH(cii, ci)) { 286 1.493 chs KASSERT(ci == curcpu()); 287 1.493 chs cpucount++; 288 1.493 chs } 289 1.493 chs KASSERT(cpucount == 1); 290 1.493 chs #endif 291 1.493 chs 292 1.216 thorpej l = &lwp0; 293 1.327 matt #ifndef LWP0_CPU_INFO 294 1.216 thorpej l->l_cpu = curcpu(); 295 1.327 matt #endif 296 1.520 ad l->l_pflag |= LP_RUNNING; 297 1.233 junyoung 298 1.317 ad /* 299 1.61 mycroft * Attempt to find console and initialize 300 1.61 mycroft * in case of early panic or other messages. 301 1.61 mycroft */ 302 1.61 mycroft consinit(); 303 1.530 thorpej #ifdef CNMAGIC 304 1.530 thorpej cn_set_magic(CNMAGIC); 305 1.530 thorpej #endif 306 1.61 mycroft 307 1.321 ad kernel_lock_init(); 308 1.364 pooka once_init(); 309 1.515 thorpej todr_init(); 310 1.434 christos 311 1.440 rmind mi_cpu_init(); 312 1.423 pgoyette kernconfig_lock_init(); 313 1.429 rmind kthread_sysinit(); 314 1.179 thorpej 315 1.397 pooka /* Initialize the device switch tables. */ 316 1.397 pooka devsw_init(); 317 1.397 pooka 318 1.432 rmind /* Initialize event counters. */ 319 1.432 rmind evcnt_init(); 320 1.432 rmind 321 1.114 mrg uvm_init(); 322 1.457 riastrad ubchist_init(); 323 1.435 rmind kcpuset_sysinit(); 324 1.127 thorpej 325 1.399 pooka prop_kern_init(); 326 1.399 pooka 327 1.377 he #if ((NKSYMS > 0) || (NDDB > 0) || (NMODULAR > 0)) 328 1.376 martin ksyms_init(); 329 1.377 he #endif 330 1.379 pooka kprintf_init(); 331 1.376 martin 332 1.338 yamt percpu_init(); 333 1.338 yamt 334 1.519 ad /* Initialize radix trees (used by numerous subsystems). */ 335 1.519 ad radix_tree_init(); 336 1.519 ad 337 1.434 christos /* Passive serialization. */ 338 1.434 christos pserialize_init(); 339 1.434 christos 340 1.307 ad /* Initialize the extent manager. */ 341 1.307 ad extent_init(); 342 1.307 ad 343 1.145 thorpej /* Do machine-dependent initialization. */ 344 1.145 thorpej cpu_startup(); 345 1.162 thorpej 346 1.378 pooka /* Initialize the sysctl subsystem. */ 347 1.378 pooka sysctl_init(); 348 1.378 pooka 349 1.307 ad /* Initialize callouts, part 1. */ 350 1.166 enami callout_startup(); 351 1.145 thorpej 352 1.409 elad /* Initialize the kernel authorization subsystem. */ 353 1.409 elad kauth_init(); 354 1.409 elad 355 1.438 jym secmodel_init(); 356 1.438 jym 357 1.409 elad spec_init(); 358 1.409 elad 359 1.414 pooka /* 360 1.414 pooka * Set BPF op vector. Can't do this in bpf attach, since 361 1.414 pooka * network drivers attach before bpf. 362 1.414 pooka */ 363 1.414 pooka bpf_setops(); 364 1.414 pooka 365 1.531 riastrad /* Initialize what we can in ipi(9) before CPUs are detected. */ 366 1.531 riastrad ipi_sysinit(); 367 1.531 riastrad 368 1.403 elad /* Start module system. */ 369 1.417 pooka module_init(); 370 1.509 pgoyette module_hook_init(); 371 1.403 elad 372 1.291 elad /* 373 1.291 elad * Initialize the kernel authorization subsystem and start the 374 1.291 elad * default security model, if any. We need to do this early 375 1.291 elad * enough so that subsystems relying on any of the aforementioned 376 1.291 elad * can work properly. Since the security model may dictate the 377 1.291 elad * credential inheritance policy, it is needed at least before 378 1.291 elad * any process is created, specifically proc0. 379 1.291 elad */ 380 1.403 elad module_init_class(MODULE_CLASS_SECMODEL); 381 1.290 elad 382 1.228 pk /* Initialize the buffer cache */ 383 1.228 pk bufinit(); 384 1.488 pgoyette biohist_init(); 385 1.228 pk 386 1.489 pgoyette #ifdef KERNHIST 387 1.489 pgoyette sysctl_kernhist_init(); 388 1.489 pgoyette #endif 389 1.489 pgoyette 390 1.465 nat 391 1.550 jmmv #if defined(SPLASHSCREEN) && defined(makeoptions_SPLASHSCREEN_IMAGE) 392 1.465 nat size_t splash_size = (&_binary_splash_image_end - 393 1.465 nat &_binary_splash_image_start) * sizeof(void *); 394 1.465 nat splash_setimage(&_binary_splash_image_start, splash_size); 395 1.465 nat #endif 396 1.465 nat 397 1.128 thorpej /* Initialize sockets. */ 398 1.128 thorpej soinit(); 399 1.127 thorpej 400 1.156 thorpej /* 401 1.212 thorpej * The following things must be done before autoconfiguration. 402 1.156 thorpej */ 403 1.437 tls rnd_init(); /* initialize entropy pool */ 404 1.437 tls 405 1.525 riastrad cprng_init(); /* initialize cryptographic PRNG */ 406 1.525 riastrad 407 1.236 simonb /* Initialize process and pgrp structures. */ 408 1.63 mycroft procinit(); 409 1.279 thorpej lwpinit(); 410 1.210 thorpej 411 1.504 ozaki /* Must be called after lwpinit (lwpinit_specificdata) */ 412 1.504 ozaki psref_init(); 413 1.504 ozaki 414 1.547 hannken /* Initialize exec structures */ 415 1.547 hannken exec_init(1); /* signal_init calls exechook_establish() */ 416 1.547 hannken 417 1.251 junyoung /* Initialize signal-related data structures. */ 418 1.251 junyoung signal_init(); 419 1.61 mycroft 420 1.333 ad /* Initialize resource management. */ 421 1.333 ad resource_init(); 422 1.333 ad 423 1.407 rmind /* Create process 0. */ 424 1.251 junyoung proc0_init(); 425 1.420 pooka lwp0_init(); 426 1.61 mycroft 427 1.383 yamt /* Disable preemption during boot. */ 428 1.383 yamt kpreempt_disable(); 429 1.383 yamt 430 1.501 thorpej /* Initialize the threadpool system. */ 431 1.501 thorpej threadpools_init(); 432 1.501 thorpej 433 1.307 ad /* Initialize the UID hash table. */ 434 1.307 ad uid_init(); 435 1.307 ad 436 1.307 ad /* Charge root for one process. */ 437 1.61 mycroft (void)chgproccnt(0, 1); 438 1.61 mycroft 439 1.292 ad /* Initialize the run queues, turnstiles and sleep queues. */ 440 1.302 yamt sched_rqinit(); 441 1.292 ad turnstile_init(); 442 1.292 ad sleeptab_init(&sleeptab); 443 1.292 ad 444 1.405 elad sched_init(); 445 1.405 elad 446 1.339 rmind /* Initialize processor-sets */ 447 1.339 rmind psets_init(); 448 1.339 rmind 449 1.436 jruoho /* Initialize cpufreq(9) */ 450 1.436 jruoho cpufreq_init(); 451 1.436 jruoho 452 1.302 yamt /* MI initialization of the boot cpu */ 453 1.302 yamt error = mi_cpu_attach(curcpu()); 454 1.302 yamt KASSERT(error == 0); 455 1.302 yamt 456 1.534 thorpej /* Initialize timekeeping. */ 457 1.534 thorpej time_init(); 458 1.350 ad 459 1.338 yamt /* 460 1.338 yamt * Initialize mbuf's. Do this now because we might attempt to 461 1.338 yamt * allocate mbufs or mbuf clusters during autoconfiguration. 462 1.338 yamt */ 463 1.338 yamt mbinit(); 464 1.338 yamt 465 1.284 ad /* Initialize I/O statistics. */ 466 1.284 ad iostat_init(); 467 1.284 ad 468 1.325 ad /* Initialize the log device. */ 469 1.325 ad loginit(); 470 1.325 ad 471 1.403 elad /* Second part of module system initialization. */ 472 1.422 pgoyette module_start_unload_thread(); 473 1.355 ad 474 1.522 jdolecek /* Initialize autoconf data structures before any modules are loaded */ 475 1.522 jdolecek config_init_mi(); 476 1.522 jdolecek 477 1.61 mycroft /* Initialize the file systems. */ 478 1.194 matt #ifdef NVNODE_IMPLICIT 479 1.194 matt /* 480 1.194 matt * If maximum number of vnodes in namei vnode cache is not explicitly 481 1.194 matt * defined in kernel config, adjust the number such as we use roughly 482 1.359 ad * 10% of memory for vnodes and associated data structures in the 483 1.359 ad * assumed worst case. Do not provide fewer than NVNODE vnodes. 484 1.194 matt */ 485 1.448 para usevnodes = calc_cache_size(vmem_size(kmem_arena, VMEM_FREE|VMEM_ALLOC), 486 1.448 para 10, VNODE_KMEM_MAXPCT) / VNODE_COST; 487 1.205 sommerfe if (usevnodes > desiredvnodes) 488 1.194 matt desiredvnodes = usevnodes; 489 1.533 simonb #endif /* NVNODE_IMPLICIT */ 490 1.533 simonb #ifdef MAXFILES_IMPLICIT 491 1.533 simonb /* 492 1.533 simonb * If maximum number of files is not explicitly defined in 493 1.533 simonb * kernel config, adjust the number so that it is somewhat 494 1.533 simonb * more reasonable on machines with larger memory sizes. 495 1.536 andvar * Arbitrary numbers are 20,000 files for 16GB RAM or more 496 1.533 simonb * and 10,000 files for 1GB RAM or more. 497 1.533 simonb * 498 1.533 simonb * XXXtodo: adjust this and other values totally dynamically 499 1.533 simonb */ 500 1.533 simonb if (ctob((uint64_t)physmem) >= 16ULL * 1024 * 1024 * 1024) 501 1.533 simonb maxfiles = MAX(maxfiles, 20000); 502 1.533 simonb if (ctob((uint64_t)physmem) >= 1024 * 1024 * 1024) 503 1.533 simonb maxfiles = MAX(maxfiles, 10000); 504 1.533 simonb #endif /* MAXFILES_IMPLICIT */ 505 1.61 mycroft 506 1.288 hannken /* Initialize fstrans. */ 507 1.288 hannken fstrans_init(); 508 1.267 kardel 509 1.503 hannken vfsinit(); 510 1.545 ad lf_init(); 511 1.503 hannken 512 1.319 ad /* Initialize the file descriptor system. */ 513 1.343 ad fd_sys_init(); 514 1.319 ad 515 1.344 ad /* Initialize kqueue. */ 516 1.343 ad kqueue_init(); 517 1.307 ad 518 1.268 kardel inittimecounter(); 519 1.267 kardel ntp_init(); 520 1.267 kardel 521 1.326 ad /* Initialize tty subsystem. */ 522 1.326 ad tty_init(); 523 1.326 ad ttyldisc_init(); 524 1.326 ad 525 1.336 ad /* Initialize the buffer cache, part 2. */ 526 1.336 ad bufinit2(); 527 1.336 ad 528 1.309 ad /* Initialize the disk wedge subsystem. */ 529 1.309 ad dkwedge_init(); 530 1.309 ad 531 1.490 ryo /* Initialize pfil */ 532 1.490 ryo pfil_init(); 533 1.490 ryo 534 1.360 yamt /* Initialize interfaces. */ 535 1.360 yamt ifinit1(); 536 1.360 yamt 537 1.408 dyoung spldebug_start(); 538 1.408 dyoung 539 1.433 bouyer /* Initialize sockets thread(s) */ 540 1.433 bouyer soinit1(); 541 1.433 bouyer 542 1.486 pgoyette /* 543 1.487 pgoyette * Initialize the bufq strategy sub-system and any built-in 544 1.487 pgoyette * strategy modules - they may be needed by some devices during 545 1.487 pgoyette * auto-configuration 546 1.486 pgoyette */ 547 1.487 pgoyette bufq_init(); 548 1.486 pgoyette module_init_class(MODULE_CLASS_BUFQ); 549 1.486 pgoyette 550 1.156 thorpej /* Configure the system hardware. This will enable interrupts. */ 551 1.156 thorpej configure(); 552 1.535 simonb #ifdef __HAVE_LEGACY_INTRCNT 553 1.535 simonb evcnt_attach_legacy_intrcnt(); 554 1.535 simonb #endif 555 1.61 mycroft 556 1.537 riastrad /* Enable deferred processing of RNG samples */ 557 1.537 riastrad rnd_init_softint(); 558 1.537 riastrad 559 1.459 riastrad /* Once all CPUs are detected, initialize the per-CPU cprng_fast. */ 560 1.459 riastrad cprng_fast_init(); 561 1.459 riastrad 562 1.542 riastrad /* 563 1.542 riastrad * Now that softints can be established, start monitoring 564 1.542 riastrad * system heartbeat on all CPUs. 565 1.542 riastrad */ 566 1.542 riastrad heartbeat_start(); 567 1.542 riastrad 568 1.381 christos ssp_init(); 569 1.381 christos 570 1.424 eeh ubc_init(); /* must be after autoconfig */ 571 1.424 eeh 572 1.432 rmind mm_init(); 573 1.432 rmind 574 1.381 christos configure2(); 575 1.456 rmind 576 1.531 riastrad /* Initialize the rest of ipi(9) after CPUs have been detected. */ 577 1.531 riastrad ipi_percpu_init(); 578 1.456 rmind 579 1.523 thorpej futex_sys_init(); 580 1.523 thorpej 581 1.383 yamt /* Now timer is working. Enable preemption. */ 582 1.383 yamt kpreempt_enable(); 583 1.383 yamt 584 1.461 uebayasi /* Get the threads going and into any sleeps before continuing. */ 585 1.461 uebayasi yield(); 586 1.461 uebayasi 587 1.418 cegger vmem_rehash_start(); /* must be before exec_init */ 588 1.418 cegger 589 1.273 elad #if NVERIEXEC > 0 590 1.283 elad /* 591 1.283 elad * Initialise the Veriexec subsystem. 592 1.283 elad */ 593 1.283 elad veriexec_init(); 594 1.273 elad #endif /* NVERIEXEC > 0 */ 595 1.251 junyoung 596 1.281 elad pax_init(); 597 1.281 elad 598 1.449 christos #ifdef IPSEC 599 1.223 jonathan /* Attach network crypto subsystem */ 600 1.223 jonathan ipsec_attach(); 601 1.223 jonathan #endif 602 1.61 mycroft 603 1.61 mycroft /* 604 1.61 mycroft * Initialize protocols. Block reception of incoming packets 605 1.61 mycroft * until everything is ready. 606 1.61 mycroft */ 607 1.190 thorpej s = splnet(); 608 1.61 mycroft ifinit(); 609 1.475 ozaki #if defined(INET) || defined(INET6) 610 1.468 ozaki lltableinit(); 611 1.469 ozaki #endif 612 1.390 pooka domaininit(true); 613 1.498 ozaki ifinit_post(); 614 1.200 itojun if_attachdomain(); 615 1.61 mycroft splx(s); 616 1.61 mycroft 617 1.61 mycroft #ifdef GPROF 618 1.61 mycroft /* Initialize kernel profiling. */ 619 1.61 mycroft kmstartup(); 620 1.61 mycroft #endif 621 1.164 enami 622 1.351 sborrill /* Initialize system accounting. */ 623 1.164 enami acct_init(); 624 1.61 mycroft 625 1.301 ad #ifndef PIPE_SOCKETPAIR 626 1.300 ad /* Initialize pipes. */ 627 1.300 ad pipe_init(); 628 1.301 ad #endif 629 1.300 ad 630 1.292 ad #ifdef KTRACE 631 1.292 ad /* Initialize ktrace. */ 632 1.292 ad ktrinit(); 633 1.292 ad #endif 634 1.292 ad 635 1.406 elad machdep_init(); 636 1.406 elad 637 1.427 pooka procinit_sysctl(); 638 1.427 pooka 639 1.472 mrg scdebug_init(); 640 1.472 mrg 641 1.163 thorpej /* 642 1.163 thorpej * Create process 1 (init(8)). We do this now, as Unix has 643 1.163 thorpej * historically had init be process 1, and changing this would 644 1.163 thorpej * probably upset a lot of people. 645 1.163 thorpej * 646 1.163 thorpej * Note that process 1 won't immediately exec init(8), but will 647 1.163 thorpej * wait for us to inform it that the root file system has been 648 1.163 thorpej * mounted. 649 1.163 thorpej */ 650 1.497 kamil if (fork1(l, 0, SIGCHLD, NULL, 0, start_init, NULL, NULL)) 651 1.163 thorpej panic("fork init"); 652 1.163 thorpej 653 1.163 thorpej /* 654 1.502 kamil * The initproc variable cannot be initialized in start_init as there 655 1.502 kamil * is a race between vfs_mountroot and start_init. 656 1.502 kamil */ 657 1.526 ad mutex_enter(&proc_lock); 658 1.502 kamil initproc = proc_find_raw(1); 659 1.526 ad mutex_exit(&proc_lock); 660 1.502 kamil 661 1.502 kamil /* 662 1.340 ad * Load any remaining builtin modules, and hand back temporary 663 1.422 pgoyette * storage to the VM system. Then require force when loading any 664 1.422 pgoyette * remaining un-init'ed built-in modules to avoid later surprises. 665 1.340 ad */ 666 1.340 ad module_init_class(MODULE_CLASS_ANY); 667 1.422 pgoyette module_builtin_require_force(); 668 1.340 ad 669 1.340 ad /* 670 1.208 thorpej * Finalize configuration now that all real devices have been 671 1.208 thorpej * found. This needs to be done before the root device is 672 1.208 thorpej * selected, since finalization may create the root device. 673 1.208 thorpej */ 674 1.208 thorpej config_finalize(); 675 1.163 thorpej 676 1.400 pooka sysctl_finalize(); 677 1.400 pooka 678 1.163 thorpej /* 679 1.163 thorpej * Now that autoconfiguration has completed, we can determine 680 1.163 thorpej * the root and dump devices. 681 1.163 thorpej */ 682 1.445 mlelstv cpu_rootconf(); 683 1.101 thorpej cpu_dumpconf(); 684 1.61 mycroft 685 1.61 mycroft /* Mount the root file system. */ 686 1.95 thorpej do { 687 1.416 pooka domountroothook(root_device); 688 1.95 thorpej if ((error = vfs_mountroot())) { 689 1.97 thorpej printf("cannot mount root, error = %d\n", error); 690 1.95 thorpej boothowto |= RB_ASKNAME; 691 1.95 thorpej setroot(root_device, 692 1.152 thorpej (rootdev != NODEV) ? DISKPART(rootdev) : 0); 693 1.95 thorpej } 694 1.95 thorpej } while (error != 0); 695 1.95 thorpej mountroothook_destroy(); 696 1.95 thorpej 697 1.421 tsutsui configure3(); 698 1.421 tsutsui 699 1.239 pk /* 700 1.239 pk * Initialise the time-of-day clock, passing the time recorded 701 1.239 pk * in the root filesystem (if any) for use by systems that 702 1.239 pk * don't have a non-volatile time-of-day device. 703 1.239 pk */ 704 1.239 pk inittodr(rootfstime); 705 1.239 pk 706 1.61 mycroft /* 707 1.61 mycroft * Now can look at time, having had a chance to verify the time 708 1.292 ad * from the file system. Reset l->l_rtime as it may have been 709 1.61 mycroft * munched in mi_switch() after the time got set. 710 1.61 mycroft */ 711 1.380 christos getnanotime(&time); 712 1.447 pgoyette 713 1.526 ad mutex_enter(&proc_lock); 714 1.225 jdolecek LIST_FOREACH(p, &allproc, p_list) { 715 1.295 pavel KASSERT((p->p_flag & PK_MARKER) == 0); 716 1.353 ad mutex_enter(p->p_lock); 717 1.380 christos TIMESPEC_TO_TIMEVAL(&p->p_stats->p_start, &time); 718 1.225 jdolecek LIST_FOREACH(l, &p->p_lwps, l_sibling) { 719 1.292 ad lwp_lock(l); 720 1.332 yamt memset(&l->l_rtime, 0, sizeof(l->l_rtime)); 721 1.292 ad lwp_unlock(l); 722 1.225 jdolecek } 723 1.353 ad mutex_exit(p->p_lock); 724 1.163 thorpej } 725 1.526 ad mutex_exit(&proc_lock); 726 1.332 yamt binuptime(&curlwp->l_stime); 727 1.61 mycroft 728 1.312 ad for (CPU_INFO_FOREACH(cii, ci)) { 729 1.312 ad ci->ci_schedstate.spc_lastmod = time_second; 730 1.312 ad } 731 1.312 ad 732 1.163 thorpej /* Create the pageout daemon kernel thread. */ 733 1.163 thorpej uvm_swap_init(); 734 1.336 ad if (kthread_create(PRI_PGDAEMON, KTHREAD_MPSAFE, NULL, uvm_pageout, 735 1.307 ad NULL, NULL, "pgdaemon")) 736 1.135 thorpej panic("fork pagedaemon"); 737 1.61 mycroft 738 1.163 thorpej /* Create the filesystem syncer kernel thread. */ 739 1.336 ad if (kthread_create(PRI_IOFLUSH, KTHREAD_MPSAFE, NULL, sched_sync, 740 1.336 ad NULL, NULL, "ioflush")) 741 1.159 fvdl panic("fork syncer"); 742 1.185 chs 743 1.462 mrg /* Wait for final configure threads to complete. */ 744 1.462 mrg config_finalize_mountroot(); 745 1.462 mrg 746 1.163 thorpej /* 747 1.163 thorpej * Okay, now we can let init(8) exec! It's off to userland! 748 1.163 thorpej */ 749 1.526 ad mutex_enter(&proc_lock); 750 1.163 thorpej start_init_exec = 1; 751 1.356 ad cv_broadcast(&lbolt); 752 1.526 ad mutex_exit(&proc_lock); 753 1.163 thorpej 754 1.552 imil #ifdef BOOT_DURATION 755 1.552 imil printf_nolog("kernel boot time: %"PRIu64"ms\n", boot_duration_timer()); 756 1.551 imil #endif 757 1.61 mycroft /* The scheduler is an infinite loop. */ 758 1.114 mrg uvm_scheduler(); 759 1.61 mycroft /* NOTREACHED */ 760 1.61 mycroft } 761 1.61 mycroft 762 1.398 pooka /* 763 1.398 pooka * Configure the system's hardware. 764 1.398 pooka */ 765 1.398 pooka static void 766 1.398 pooka configure(void) 767 1.398 pooka { 768 1.398 pooka 769 1.398 pooka /* 770 1.398 pooka * XXX 771 1.398 pooka * callout_setfunc() requires mutex(9) so it can't be in config_init() 772 1.539 andvar * on amiga and atari which use config_init() and autoconf(9) functions 773 1.398 pooka * to initialize console devices. 774 1.398 pooka */ 775 1.398 pooka config_twiddle_init(); 776 1.398 pooka 777 1.398 pooka pmf_init(); 778 1.398 pooka 779 1.471 jmcneill /* Initialize driver modules */ 780 1.471 jmcneill module_init_class(MODULE_CLASS_DRIVER); 781 1.471 jmcneill 782 1.430 uebayasi userconf_init(); 783 1.398 pooka if (boothowto & RB_USERCONF) 784 1.430 uebayasi userconf_prompt(); 785 1.398 pooka 786 1.398 pooka if ((boothowto & (AB_SILENT|AB_VERBOSE)) == AB_SILENT) { 787 1.398 pooka printf_nolog("Detecting hardware..."); 788 1.398 pooka } 789 1.398 pooka 790 1.398 pooka /* 791 1.398 pooka * Do the machine-dependent portion of autoconfiguration. This 792 1.398 pooka * sets the configuration machinery here in motion by "finding" 793 1.398 pooka * the root bus. When this function returns, we expect interrupts 794 1.398 pooka * to be enabled. 795 1.398 pooka */ 796 1.398 pooka cpu_configure(); 797 1.398 pooka } 798 1.398 pooka 799 1.398 pooka static void 800 1.398 pooka configure2(void) 801 1.398 pooka { 802 1.398 pooka CPU_INFO_ITERATOR cii; 803 1.398 pooka struct cpu_info *ci; 804 1.398 pooka int s; 805 1.398 pooka 806 1.508 ad /* Fix up CPU topology info, which has all been collected by now. */ 807 1.508 ad cpu_topology_init(); 808 1.508 ad 809 1.398 pooka /* 810 1.398 pooka * Now that we've found all the hardware, start the real time 811 1.398 pooka * and statistics clocks. 812 1.398 pooka */ 813 1.398 pooka initclocks(); 814 1.398 pooka 815 1.398 pooka cold = 0; /* clocks are running, we're warm now! */ 816 1.398 pooka s = splsched(); 817 1.398 pooka curcpu()->ci_schedstate.spc_flags |= SPCF_RUNNING; 818 1.398 pooka splx(s); 819 1.398 pooka 820 1.507 ad /* Setup the runqueues and scheduler. */ 821 1.507 ad runq_init(); 822 1.507 ad synch_init(); 823 1.507 ad 824 1.398 pooka /* Boot the secondary processors. */ 825 1.398 pooka for (CPU_INFO_FOREACH(cii, ci)) { 826 1.398 pooka uvm_cpu_attach(ci); 827 1.398 pooka } 828 1.513 ad 829 1.513 ad /* Decide how to partition free memory. */ 830 1.513 ad uvm_page_rebucket(); 831 1.513 ad 832 1.398 pooka mp_online = true; 833 1.398 pooka #if defined(MULTIPROCESSOR) 834 1.398 pooka cpu_boot_secondary_processors(); 835 1.398 pooka #endif 836 1.398 pooka 837 1.398 pooka /* 838 1.398 pooka * Bus scans can make it appear as if the system has paused, so 839 1.398 pooka * twiddle constantly while config_interrupts() jobs are running. 840 1.398 pooka */ 841 1.398 pooka config_twiddle_fn(NULL); 842 1.398 pooka 843 1.398 pooka /* 844 1.398 pooka * Create threads to call back and finish configuration for 845 1.398 pooka * devices that want interrupts enabled. 846 1.398 pooka */ 847 1.398 pooka config_create_interruptthreads(); 848 1.398 pooka } 849 1.398 pooka 850 1.93 mouse static void 851 1.421 tsutsui configure3(void) 852 1.421 tsutsui { 853 1.421 tsutsui 854 1.421 tsutsui /* 855 1.421 tsutsui * Create threads to call back and finish configuration for 856 1.421 tsutsui * devices that want the mounted root file system. 857 1.421 tsutsui */ 858 1.421 tsutsui config_create_mountrootthreads(); 859 1.421 tsutsui 860 1.421 tsutsui /* Get the threads going and into any sleeps before continuing. */ 861 1.421 tsutsui yield(); 862 1.421 tsutsui } 863 1.421 tsutsui 864 1.421 tsutsui static void 865 1.443 mlelstv rootconf_handle_wedges(void) 866 1.443 mlelstv { 867 1.477 christos struct disklabel label; 868 1.443 mlelstv struct partition *p; 869 1.443 mlelstv struct vnode *vp; 870 1.443 mlelstv daddr_t startblk; 871 1.443 mlelstv uint64_t nblks; 872 1.482 msaitoh device_t dev; 873 1.443 mlelstv int error; 874 1.443 mlelstv 875 1.443 mlelstv if (booted_nblks) { 876 1.443 mlelstv /* 877 1.443 mlelstv * bootloader passed geometry 878 1.443 mlelstv */ 879 1.443 mlelstv dev = booted_device; 880 1.443 mlelstv startblk = booted_startblk; 881 1.443 mlelstv nblks = booted_nblks; 882 1.443 mlelstv 883 1.443 mlelstv /* 884 1.443 mlelstv * keep booted_device and booted_partition 885 1.443 mlelstv * in case the kernel doesn't identify a wedge 886 1.443 mlelstv */ 887 1.443 mlelstv } else { 888 1.443 mlelstv /* 889 1.443 mlelstv * bootloader passed partition number 890 1.443 mlelstv * 891 1.443 mlelstv * We cannot ask the partition device directly when it is 892 1.443 mlelstv * covered by a wedge. Instead we look up the geometry in 893 1.443 mlelstv * the disklabel. 894 1.443 mlelstv */ 895 1.443 mlelstv vp = opendisk(booted_device); 896 1.444 martin 897 1.444 martin if (vp == NULL) 898 1.444 martin return; 899 1.444 martin 900 1.538 hannken VOP_UNLOCK(vp); 901 1.477 christos error = VOP_IOCTL(vp, DIOCGDINFO, &label, FREAD, NOCRED); 902 1.538 hannken vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); 903 1.443 mlelstv VOP_CLOSE(vp, FREAD, NOCRED); 904 1.443 mlelstv vput(vp); 905 1.443 mlelstv if (error) 906 1.443 mlelstv return; 907 1.443 mlelstv 908 1.443 mlelstv KASSERT(booted_partition >= 0 909 1.443 mlelstv && booted_partition < MAXPARTITIONS); 910 1.443 mlelstv 911 1.477 christos p = &label.d_partitions[booted_partition]; 912 1.443 mlelstv 913 1.443 mlelstv dev = booted_device; 914 1.443 mlelstv startblk = p->p_offset; 915 1.443 mlelstv nblks = p->p_size; 916 1.443 mlelstv } 917 1.443 mlelstv 918 1.443 mlelstv dev = dkwedge_find_partition(dev, startblk, nblks); 919 1.443 mlelstv if (dev != NULL) { 920 1.443 mlelstv booted_device = dev; 921 1.443 mlelstv booted_partition = 0; 922 1.443 mlelstv } 923 1.443 mlelstv } 924 1.443 mlelstv 925 1.445 mlelstv void 926 1.443 mlelstv rootconf(void) 927 1.443 mlelstv { 928 1.445 mlelstv if (booted_device != NULL) 929 1.445 mlelstv rootconf_handle_wedges(); 930 1.443 mlelstv 931 1.443 mlelstv setroot(booted_device, booted_partition); 932 1.443 mlelstv } 933 1.443 mlelstv 934 1.443 mlelstv static void 935 1.260 christos check_console(struct lwp *l) 936 1.93 mouse { 937 1.391 dholland struct vnode *vp; 938 1.93 mouse int error; 939 1.93 mouse 940 1.391 dholland error = namei_simple_kernel("/dev/console", 941 1.391 dholland NSM_FOLLOW_NOEMULROOT, &vp); 942 1.499 martin if (error == 0) { 943 1.391 dholland vrele(vp); 944 1.499 martin } else if (error == ENOENT) { 945 1.499 martin if (boothowto & (AB_VERBOSE|AB_DEBUG)) 946 1.499 martin printf("warning: no /dev/console\n"); 947 1.499 martin } else { 948 1.96 cgd printf("warning: lookup /dev/console: error %d\n", error); 949 1.499 martin } 950 1.93 mouse } 951 1.93 mouse 952 1.61 mycroft /* 953 1.61 mycroft * List of paths to try when searching for "init". 954 1.61 mycroft */ 955 1.327 matt static const char * const initpaths[] = { 956 1.61 mycroft "/sbin/init", 957 1.61 mycroft "/sbin/oinit", 958 1.61 mycroft "/sbin/init.bak", 959 1.454 apb "/rescue/init", 960 1.61 mycroft NULL, 961 1.61 mycroft }; 962 1.61 mycroft 963 1.61 mycroft /* 964 1.61 mycroft * Start the initial user process; try exec'ing each pathname in "initpaths". 965 1.61 mycroft * The program is invoked with one argument containing the boot flags. 966 1.61 mycroft */ 967 1.61 mycroft static void 968 1.176 thorpej start_init(void *arg) 969 1.61 mycroft { 970 1.216 thorpej struct lwp *l = arg; 971 1.216 thorpej struct proc *p = l->l_proc; 972 1.130 eeh vaddr_t addr; 973 1.78 mycroft struct sys_execve_args /* { 974 1.108 mycroft syscallarg(const char *) path; 975 1.92 cgd syscallarg(char * const *) argp; 976 1.92 cgd syscallarg(char * const *) envp; 977 1.68 cgd } */ args; 978 1.68 cgd int options, i, error; 979 1.68 cgd register_t retval[2]; 980 1.66 mycroft char flags[4], *flagsp; 981 1.202 lukem const char *path, *slash; 982 1.474 christos char *ucp, **uap, *arg0, *arg1, *argv[3]; 983 1.202 lukem char ipath[129]; 984 1.202 lukem int ipx, len; 985 1.61 mycroft 986 1.76 cgd /* 987 1.76 cgd * Now in process 1. 988 1.76 cgd */ 989 1.146 gwr strncpy(p->p_comm, "init", MAXCOMLEN); 990 1.163 thorpej 991 1.163 thorpej /* 992 1.163 thorpej * Wait for main() to tell us that it's safe to exec. 993 1.163 thorpej */ 994 1.526 ad mutex_enter(&proc_lock); 995 1.163 thorpej while (start_init_exec == 0) 996 1.526 ad cv_wait(&lbolt, &proc_lock); 997 1.526 ad mutex_exit(&proc_lock); 998 1.93 mouse 999 1.93 mouse /* 1000 1.93 mouse * This is not the right way to do this. We really should 1001 1.93 mouse * hand-craft a descriptor onto /dev/console to hand to init, 1002 1.93 mouse * but that's a _lot_ more work, and the benefit from this easy 1003 1.93 mouse * hack makes up for the "good is the enemy of the best" effect. 1004 1.93 mouse */ 1005 1.260 christos check_console(l); 1006 1.61 mycroft 1007 1.61 mycroft /* 1008 1.61 mycroft * Need just enough stack to hold the faked-up "execve()" arguments. 1009 1.61 mycroft */ 1010 1.211 chs addr = (vaddr_t)STACK_ALLOC(USRSTACK, PAGE_SIZE); 1011 1.205 sommerfe if (uvm_map(&p->p_vmspace->vm_map, &addr, PAGE_SIZE, 1012 1.483 maxv NULL, UVM_UNKNOWN_OFFSET, 0, 1013 1.483 maxv UVM_MAPFLAG(UVM_PROT_RW, UVM_PROT_RW, UVM_INH_COPY, 1014 1.483 maxv UVM_ADV_NORMAL, 1015 1.483 maxv UVM_FLAG_FIXED|UVM_FLAG_OVERLAY|UVM_FLAG_COPYONW)) != 0) 1016 1.114 mrg panic("init: couldn't allocate argument space"); 1017 1.297 christos p->p_vmspace->vm_maxsaddr = (void *)STACK_MAX(addr, PAGE_SIZE); 1018 1.61 mycroft 1019 1.202 lukem ipx = 0; 1020 1.202 lukem while (1) { 1021 1.202 lukem if (boothowto & RB_ASKNAME) { 1022 1.202 lukem printf("init path"); 1023 1.202 lukem if (initpaths[ipx]) 1024 1.202 lukem printf(" (default %s)", initpaths[ipx]); 1025 1.202 lukem printf(": "); 1026 1.202 lukem len = cngetsn(ipath, sizeof(ipath)-1); 1027 1.371 tsutsui if (len == 4 && strcmp(ipath, "halt") == 0) { 1028 1.516 thorpej kern_reboot(RB_HALT, NULL); 1029 1.370 tsutsui } else if (len == 6 && strcmp(ipath, "reboot") == 0) { 1030 1.516 thorpej kern_reboot(0, NULL); 1031 1.370 tsutsui #if defined(DDB) 1032 1.370 tsutsui } else if (len == 3 && strcmp(ipath, "ddb") == 0) { 1033 1.370 tsutsui console_debugger(); 1034 1.370 tsutsui continue; 1035 1.370 tsutsui #endif 1036 1.371 tsutsui } else if (len > 0 && ipath[0] == '/') { 1037 1.202 lukem ipath[len] = '\0'; 1038 1.202 lukem path = ipath; 1039 1.371 tsutsui } else if (len == 0 && initpaths[ipx] != NULL) { 1040 1.371 tsutsui path = initpaths[ipx++]; 1041 1.371 tsutsui } else { 1042 1.371 tsutsui printf("use absolute path, "); 1043 1.371 tsutsui #if defined(DDB) 1044 1.371 tsutsui printf("\"ddb\", "); 1045 1.371 tsutsui #endif 1046 1.371 tsutsui printf("\"halt\", or \"reboot\"\n"); 1047 1.371 tsutsui continue; 1048 1.202 lukem } 1049 1.202 lukem } else { 1050 1.370 tsutsui if ((path = initpaths[ipx++]) == NULL) { 1051 1.370 tsutsui ipx = 0; 1052 1.370 tsutsui boothowto |= RB_ASKNAME; 1053 1.370 tsutsui continue; 1054 1.370 tsutsui } 1055 1.202 lukem } 1056 1.202 lukem 1057 1.211 chs ucp = (char *)USRSTACK; 1058 1.64 mycroft 1059 1.61 mycroft /* 1060 1.64 mycroft * Construct the boot flag argument. 1061 1.61 mycroft */ 1062 1.66 mycroft flagsp = flags; 1063 1.66 mycroft *flagsp++ = '-'; 1064 1.61 mycroft options = 0; 1065 1.66 mycroft 1066 1.61 mycroft if (boothowto & RB_SINGLE) { 1067 1.64 mycroft *flagsp++ = 's'; 1068 1.61 mycroft options = 1; 1069 1.61 mycroft } 1070 1.61 mycroft #ifdef notyet 1071 1.61 mycroft if (boothowto & RB_FASTBOOT) { 1072 1.64 mycroft *flagsp++ = 'f'; 1073 1.61 mycroft options = 1; 1074 1.61 mycroft } 1075 1.61 mycroft #endif 1076 1.64 mycroft 1077 1.64 mycroft /* 1078 1.64 mycroft * Move out the flags (arg 1), if necessary. 1079 1.64 mycroft */ 1080 1.64 mycroft if (options != 0) { 1081 1.64 mycroft *flagsp++ = '\0'; 1082 1.64 mycroft i = flagsp - flags; 1083 1.64 mycroft #ifdef DEBUG 1084 1.415 hubertf aprint_normal("init: copying out flags `%s' %d\n", flags, i); 1085 1.64 mycroft #endif 1086 1.211 chs arg1 = STACK_ALLOC(ucp, i); 1087 1.211 chs ucp = STACK_MAX(arg1, i); 1088 1.474 christos if ((error = copyout((void *)flags, arg1, i)) != 0) 1089 1.474 christos goto copyerr; 1090 1.474 christos } else 1091 1.474 christos arg1 = NULL; 1092 1.61 mycroft 1093 1.61 mycroft /* 1094 1.61 mycroft * Move out the file name (also arg 0). 1095 1.61 mycroft */ 1096 1.64 mycroft i = strlen(path) + 1; 1097 1.64 mycroft #ifdef DEBUG 1098 1.415 hubertf aprint_normal("init: copying out path `%s' %d\n", path, i); 1099 1.202 lukem #else 1100 1.203 lukem if (boothowto & RB_ASKNAME || path != initpaths[0]) 1101 1.202 lukem printf("init: trying %s\n", path); 1102 1.64 mycroft #endif 1103 1.211 chs arg0 = STACK_ALLOC(ucp, i); 1104 1.211 chs ucp = STACK_MAX(arg0, i); 1105 1.474 christos if ((error = copyout(path, arg0, i)) != 0) 1106 1.474 christos goto copyerr; 1107 1.61 mycroft 1108 1.61 mycroft /* 1109 1.61 mycroft * Move out the arg pointers. 1110 1.61 mycroft */ 1111 1.439 christos ucp = (void *)STACK_ALIGN(ucp, STACK_ALIGNBYTES); 1112 1.479 macallan uap = (char **)STACK_ALLOC(ucp, sizeof(argv)); 1113 1.211 chs SCARG(&args, path) = arg0; 1114 1.211 chs SCARG(&args, argp) = uap; 1115 1.211 chs SCARG(&args, envp) = NULL; 1116 1.142 mycroft slash = strrchr(path, '/'); 1117 1.474 christos 1118 1.474 christos argv[0] = slash ? arg0 + (slash + 1 - path) : arg0; 1119 1.474 christos argv[1] = arg1; 1120 1.474 christos argv[2] = NULL; 1121 1.479 macallan if ((error = copyout(argv, uap, sizeof(argv))) != 0) 1122 1.474 christos goto copyerr; 1123 1.61 mycroft 1124 1.61 mycroft /* 1125 1.481 palle * Now try to exec the program. If it can't for any reason 1126 1.61 mycroft * other than it doesn't exist, complain. 1127 1.61 mycroft */ 1128 1.260 christos error = sys_execve(l, &args, retval); 1129 1.179 thorpej if (error == 0 || error == EJUSTRETURN) { 1130 1.292 ad KERNEL_UNLOCK_LAST(l); 1131 1.61 mycroft return; 1132 1.179 thorpej } 1133 1.202 lukem printf("exec %s: error %d\n", path, error); 1134 1.61 mycroft } 1135 1.90 christos printf("init: not found\n"); 1136 1.61 mycroft panic("no init"); 1137 1.474 christos copyerr: 1138 1.474 christos panic("copyout %d", error); 1139 1.61 mycroft } 1140 1.345 yamt 1141 1.345 yamt /* 1142 1.448 para * calculate cache size (in bytes) from physmem and vsize. 1143 1.345 yamt */ 1144 1.345 yamt vaddr_t 1145 1.448 para calc_cache_size(vsize_t vsize, int pct, int va_pct) 1146 1.345 yamt { 1147 1.345 yamt paddr_t t; 1148 1.345 yamt 1149 1.345 yamt /* XXX should consider competing cache if any */ 1150 1.345 yamt /* XXX should consider submaps */ 1151 1.346 yamt t = (uintmax_t)physmem * pct / 100 * PAGE_SIZE; 1152 1.448 para if (vsize != 0) { 1153 1.346 yamt vsize = (uintmax_t)vsize * va_pct / 100; 1154 1.346 yamt if (t > vsize) { 1155 1.346 yamt t = vsize; 1156 1.346 yamt } 1157 1.345 yamt } 1158 1.345 yamt return t; 1159 1.345 yamt } 1160 1.385 ad 1161 1.385 ad /* 1162 1.385 ad * Print the system start up banner. 1163 1.385 ad * 1164 1.385 ad * - Print a limited banner if AB_SILENT. 1165 1.385 ad * - Always send normal banner to the log. 1166 1.385 ad */ 1167 1.388 tsutsui #define MEM_PBUFSIZE sizeof("99999 MB") 1168 1.388 tsutsui 1169 1.385 ad void 1170 1.385 ad banner(void) 1171 1.385 ad { 1172 1.385 ad static char notice[] = " Notice: this software is " 1173 1.385 ad "protected by copyright"; 1174 1.386 ad char pbuf[81]; 1175 1.446 christos void (*pr)(const char *, ...) __printflike(1, 2); 1176 1.385 ad int i; 1177 1.385 ad 1178 1.385 ad if ((boothowto & AB_SILENT) != 0) { 1179 1.385 ad snprintf(pbuf, sizeof(pbuf), "%s %s (%s)", 1180 1.385 ad ostype, osrelease, kernel_ident); 1181 1.392 ad printf_nolog("%s", pbuf); 1182 1.387 ad for (i = 80 - strlen(pbuf) - sizeof(notice); i > 0; i--) 1183 1.385 ad printf(" "); 1184 1.392 ad printf_nolog("%s\n", notice); 1185 1.385 ad pr = aprint_normal; 1186 1.385 ad } else { 1187 1.492 joerg pr = printf; 1188 1.385 ad } 1189 1.385 ad 1190 1.385 ad memset(pbuf, 0, sizeof(pbuf)); 1191 1.385 ad (*pr)("%s%s", copyright, version); 1192 1.388 tsutsui format_bytes(pbuf, MEM_PBUFSIZE, ctob((uint64_t)physmem)); 1193 1.385 ad (*pr)("total memory = %s\n", pbuf); 1194 1.527 ad format_bytes(pbuf, MEM_PBUFSIZE, ctob((uint64_t)uvm_availmem(false))); 1195 1.385 ad (*pr)("avail memory = %s\n", pbuf); 1196 1.385 ad } 1197