FreeBSD kernel kern code
init_main.c
Go to the documentation of this file.
1 /*-
2  * Copyright (c) 1995 Terrence R. Lambert
3  * All rights reserved.
4  *
5  * Copyright (c) 1982, 1986, 1989, 1991, 1992, 1993
6  * The Regents of the University of California. All rights reserved.
7  * (c) UNIX System Laboratories, Inc.
8  * All or some portions of this file are derived from material licensed
9  * to the University of California by American Telephone and Telegraph
10  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
11  * the permission of UNIX System Laboratories, Inc.
12  *
13  * Redistribution and use in source and binary forms, with or without
14  * modification, are permitted provided that the following conditions
15  * are met:
16  * 1. Redistributions of source code must retain the above copyright
17  * notice, this list of conditions and the following disclaimer.
18  * 2. Redistributions in binary form must reproduce the above copyright
19  * notice, this list of conditions and the following disclaimer in the
20  * documentation and/or other materials provided with the distribution.
21  * 3. All advertising materials mentioning features or use of this software
22  * must display the following acknowledgement:
23  * This product includes software developed by the University of
24  * California, Berkeley and its contributors.
25  * 4. Neither the name of the University nor the names of its contributors
26  * may be used to endorse or promote products derived from this software
27  * without specific prior written permission.
28  *
29  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
30  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
31  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
32  * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
33  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
34  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
35  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
37  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
38  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
39  * SUCH DAMAGE.
40  *
41  * @(#)init_main.c 8.9 (Berkeley) 1/21/94
42  */
43 
44 #include <sys/cdefs.h>
45 __FBSDID("$BSDSUniX$");
46 
47 #include "opt_ddb.h"
48 #include "opt_init_path.h"
49 
50 #include <sys/param.h>
51 #include <sys/kernel.h>
52 #include <sys/exec.h>
53 #include <sys/file.h>
54 #include <sys/filedesc.h>
55 #include <sys/jail.h>
56 #include <sys/ktr.h>
57 #include <sys/lock.h>
58 #include <sys/loginclass.h>
59 #include <sys/mount.h>
60 #include <sys/mutex.h>
61 #include <sys/syscallsubr.h>
62 #include <sys/sysctl.h>
63 #include <sys/proc.h>
64 #include <sys/racct.h>
65 #include <sys/resourcevar.h>
66 #include <sys/systm.h>
67 #include <sys/signalvar.h>
68 #include <sys/vnode.h>
69 #include <sys/sysent.h>
70 #include <sys/reboot.h>
71 #include <sys/sched.h>
72 #include <sys/sx.h>
73 #include <sys/sysproto.h>
74 #include <sys/vmmeter.h>
75 #include <sys/unistd.h>
76 #include <sys/malloc.h>
77 #include <sys/conf.h>
78 #include <sys/cpuset.h>
79 
80 #include <machine/cpu.h>
81 
82 #include <security/audit/audit.h>
83 #include <security/mac/mac_framework.h>
84 
85 #include <vm/vm.h>
86 #include <vm/vm_param.h>
87 #include <vm/pmap.h>
88 #include <vm/vm_map.h>
89 #include <sys/copyright.h>
90 
91 #include <ddb/ddb.h>
92 #include <ddb/db_sym.h>
93 
94 void mi_startup(void); /* Should be elsewhere */
95 
96 /* Components of the first process -- never freed. */
97 static struct session session0;
98 static struct pgrp pgrp0;
99 struct proc proc0;
100 struct thread thread0 __aligned(16);
101 struct vmspace vmspace0;
102 struct proc *initproc;
103 
104 int boothowto = 0; /* initialized so that it can be patched */
105 SYSCTL_INT(_debug, OID_AUTO, boothowto, CTLFLAG_RD, &boothowto, 0,
106  "Boot control flags, passed from loader");
108 SYSCTL_INT(_debug, OID_AUTO, bootverbose, CTLFLAG_RW, &bootverbose, 0,
109  "Control the output of verbose kernel messages");
110 
111 /*
112  * This ensures that there is at least one entry so that the sysinit_set
113  * symbol is not undefined. A sybsystem ID of SI_SUB_DUMMY is never
114  * executed.
115  */
116 SYSINIT(placeholder, SI_SUB_DUMMY, SI_ORDER_ANY, NULL, NULL);
117 
118 /*
119  * The sysinit table itself. Items are checked off as the are run.
120  * If we want to register new sysinit types, add them to newsysinit.
121  */
122 SET_DECLARE(sysinit_set, struct sysinit);
125 
126 /*
127  * Merge a new sysinit set into the current set, reallocating it if
128  * necessary. This can only be called after malloc is running.
129  */
130 void
131 sysinit_add(struct sysinit **set, struct sysinit **set_end)
132 {
133  struct sysinit **newset;
134  struct sysinit **sipp;
135  struct sysinit **xipp;
136  int count;
137 
138  count = set_end - set;
139  if (newsysinit)
140  count += newsysinit_end - newsysinit;
141  else
142  count += sysinit_end - sysinit;
143  newset = malloc(count * sizeof(*sipp), M_TEMP, M_NOWAIT);
144  if (newset == NULL)
145  panic("cannot malloc for sysinit");
146  xipp = newset;
147  if (newsysinit)
148  for (sipp = newsysinit; sipp < newsysinit_end; sipp++)
149  *xipp++ = *sipp;
150  else
151  for (sipp = sysinit; sipp < sysinit_end; sipp++)
152  *xipp++ = *sipp;
153  for (sipp = set; sipp < set_end; sipp++)
154  *xipp++ = *sipp;
155  if (newsysinit)
156  free(newsysinit, M_TEMP);
157  newsysinit = newset;
158  newsysinit_end = newset + count;
159 }
160 
161 #if defined (DDB) && defined(VERBOSE_SYSINIT)
162 static const char *
163 symbol_name(vm_offset_t va, db_strategy_t strategy)
164 {
165  const char *name;
166  c_db_sym_t sym;
167  db_expr_t offset;
168 
169  if (va == 0)
170  return (NULL);
171  sym = db_search_symbol(va, strategy, &offset);
172  if (offset != 0)
173  return (NULL);
174  db_symbol_values(sym, &name, NULL);
175  return (name);
176 }
177 #endif
178 
179 /*
180  * System startup; initialize the world, create process 0, mount root
181  * filesystem, and fork to create init and pagedaemon. Most of the
182  * hard work is done in the lower-level initialization routines including
183  * startup(), which does memory initialization and autoconfiguration.
184  *
185  * This allows simple addition of new kernel subsystems that require
186  * boot time initialization. It also allows substitution of subsystem
187  * (for instance, a scheduler, kernel profiler, or VM system) by object
188  * module. Finally, it allows for optional "kernel threads".
189  */
190 void
192 {
193 
194  register struct sysinit **sipp; /* system initialization*/
195  register struct sysinit **xipp; /* interior loop of sort*/
196  register struct sysinit *save; /* bubble*/
197 
198 #if defined(VERBOSE_SYSINIT)
199  int last;
200  int verbose;
201 #endif
202 
203  if (boothowto & RB_VERBOSE)
204  bootverbose++;
205 
206  if (sysinit == NULL) {
207  sysinit = SET_BEGIN(sysinit_set);
208  sysinit_end = SET_LIMIT(sysinit_set);
209  }
210 
211 restart:
212  /*
213  * Perform a bubble sort of the system initialization objects by
214  * their subsystem (primary key) and order (secondary key).
215  */
216  for (sipp = sysinit; sipp < sysinit_end; sipp++) {
217  for (xipp = sipp + 1; xipp < sysinit_end; xipp++) {
218  if ((*sipp)->subsystem < (*xipp)->subsystem ||
219  ((*sipp)->subsystem == (*xipp)->subsystem &&
220  (*sipp)->order <= (*xipp)->order))
221  continue; /* skip*/
222  save = *sipp;
223  *sipp = *xipp;
224  *xipp = save;
225  }
226  }
227 
228 #if defined(VERBOSE_SYSINIT)
229  last = SI_SUB_COPYRIGHT;
230  verbose = 0;
231 #if !defined(DDB)
232  printf("VERBOSE_SYSINIT: DDB not enabled, symbol lookups disabled.\n");
233 #endif
234 #endif
235 
236  /*
237  * Traverse the (now) ordered list of system initialization tasks.
238  * Perform each task, and continue on to the next task.
239  */
240  for (sipp = sysinit; sipp < sysinit_end; sipp++) {
241 
242  if ((*sipp)->subsystem == SI_SUB_DUMMY)
243  continue; /* skip dummy task(s)*/
244 
245  if ((*sipp)->subsystem == SI_SUB_DONE)
246  continue;
247 
248 #if defined(VERBOSE_SYSINIT)
249  if ((*sipp)->subsystem > last) {
250  verbose = 1;
251  last = (*sipp)->subsystem;
252  printf("subsystem %x\n", last);
253  }
254  if (verbose) {
255 #if defined(DDB)
256  const char *func, *data;
257 
258  func = symbol_name((vm_offset_t)(*sipp)->func,
259  DB_STGY_PROC);
260  data = symbol_name((vm_offset_t)(*sipp)->udata,
261  DB_STGY_ANY);
262  if (func != NULL && data != NULL)
263  printf(" %s(&%s)... ", func, data);
264  else if (func != NULL)
265  printf(" %s(%p)... ", func, (*sipp)->udata);
266  else
267 #endif
268  printf(" %p(%p)... ", (*sipp)->func,
269  (*sipp)->udata);
270  }
271 #endif
272 
273  /* Call function */
274  (*((*sipp)->func))((*sipp)->udata);
275 
276 #if defined(VERBOSE_SYSINIT)
277  if (verbose)
278  printf("done.\n");
279 #endif
280 
281  /* Check off the one we're just done */
282  (*sipp)->subsystem = SI_SUB_DONE;
283 
284  /* Check if we've installed more sysinit items via KLD */
285  if (newsysinit != NULL) {
286  if (sysinit != SET_BEGIN(sysinit_set))
287  free(sysinit, M_TEMP);
289  sysinit_end = newsysinit_end;
290  newsysinit = NULL;
291  newsysinit_end = NULL;
292  goto restart;
293  }
294  }
295 
296  mtx_assert(&Giant, MA_OWNED | MA_NOTRECURSED);
297  mtx_unlock(&Giant);
298 
299  /*
300  * Now hand over this thread to swapper.
301  */
302  swapper();
303  /* NOTREACHED*/
304 }
305 
306 
307 /*
308  ***************************************************************************
309  ****
310  **** The following SYSINIT's belong elsewhere, but have not yet
311  **** been moved.
312  ****
313  ***************************************************************************
314  */
315 static void
316 print_caddr_t(void *data)
317 {
318  printf("%s", (char *)data);
319 }
320 
321 static void
322 print_version(void *data __unused)
323 {
324  int len;
325 
326  /* Strip a trailing newline from version. */
327  len = strlen(version);
328  while (len > 0 && version[len - 1] == '\n')
329  len--;
330  printf("%.*s %s\n", len, version, machine);
331  printf("%s\n", compiler_version);
332 }
333 
334 SYSINIT(announce, SI_SUB_COPYRIGHT, SI_ORDER_FIRST, print_caddr_t,
335  copyright);
336 SYSINIT(trademark, SI_SUB_COPYRIGHT, SI_ORDER_SECOND, print_caddr_t,
337  trademark);
338 SYSINIT(version, SI_SUB_COPYRIGHT, SI_ORDER_THIRD, print_version, NULL);
339 
340 #ifdef WITNESS
341 static char wit_warn[] =
342  "WARNING: WITNESS option enabled, expect reduced performance.\n";
343 SYSINIT(witwarn, SI_SUB_COPYRIGHT, SI_ORDER_THIRD + 1,
344  print_caddr_t, wit_warn);
345 SYSINIT(witwarn2, SI_SUB_LAST, SI_ORDER_THIRD + 1,
346  print_caddr_t, wit_warn);
347 #endif
348 
349 #ifdef DIAGNOSTIC
350 static char diag_warn[] =
351  "WARNING: DIAGNOSTIC option enabled, expect reduced performance.\n";
352 SYSINIT(diagwarn, SI_SUB_COPYRIGHT, SI_ORDER_THIRD + 2,
353  print_caddr_t, diag_warn);
354 SYSINIT(diagwarn2, SI_SUB_LAST, SI_ORDER_THIRD + 2,
355  print_caddr_t, diag_warn);
356 #endif
357 
358 static int
359 null_fetch_syscall_args(struct thread *td __unused,
360  struct syscall_args *sa __unused)
361 {
362 
363  panic("null_fetch_syscall_args");
364 }
365 
366 static void
367 null_set_syscall_retval(struct thread *td __unused, int error __unused)
368 {
369 
370  panic("null_set_syscall_retval");
371 }
372 
373 struct sysentvec null_sysvec = {
374  .sv_size = 0,
375  .sv_table = NULL,
376  .sv_mask = 0,
377  .sv_sigsize = 0,
378  .sv_sigtbl = NULL,
379  .sv_errsize = 0,
380  .sv_errtbl = NULL,
381  .sv_transtrap = NULL,
382  .sv_fixup = NULL,
383  .sv_sendsig = NULL,
384  .sv_sigcode = NULL,
385  .sv_szsigcode = NULL,
386  .sv_prepsyscall = NULL,
387  .sv_name = "null",
388  .sv_coredump = NULL,
389  .sv_imgact_try = NULL,
390  .sv_minsigstksz = 0,
391  .sv_pagesize = PAGE_SIZE,
392  .sv_minuser = VM_MIN_ADDRESS,
393  .sv_maxuser = VM_MAXUSER_ADDRESS,
394  .sv_usrstack = USRSTACK,
395  .sv_psstrings = PS_STRINGS,
396  .sv_stackprot = VM_PROT_ALL,
397  .sv_copyout_strings = NULL,
398  .sv_setregs = NULL,
399  .sv_fixlimit = NULL,
400  .sv_maxssiz = NULL,
401  .sv_flags = 0,
402  .sv_set_syscall_retval = null_set_syscall_retval,
403  .sv_fetch_syscall_args = null_fetch_syscall_args,
404  .sv_syscallnames = NULL,
405  .sv_schedtail = NULL,
406 };
407 
408 /*
409  ***************************************************************************
410  ****
411  **** The two following SYSINIT's are proc0 specific glue code. I am not
412  **** convinced that they can not be safely combined, but their order of
413  **** operation has been maintained as the same as the original init_main.c
414  **** for right now.
415  ****
416  **** These probably belong in init_proc.c or kern_proc.c, since they
417  **** deal with proc0 (the fork template process).
418  ****
419  ***************************************************************************
420  */
421 /* ARGSUSED*/
422 static void
423 proc0_init(void *dummy __unused)
424 {
425  struct proc *p;
426  struct thread *td;
427  vm_paddr_t pageablemem;
428  int i;
429 
430  GIANT_REQUIRED;
431  p = &proc0;
432  td = &thread0;
433 
434  /*
435  * Initialize magic number and osrel.
436  */
437  p->p_magic = P_MAGIC;
438  p->p_osrel = osreldate;
439 
440  /*
441  * Initialize thread and process structures.
442  */
443  procinit(); /* set up proc zone */
444  threadinit(); /* set up UMA zones */
445 
446  /*
447  * Initialise scheduler resources.
448  * Add scheduler specific parts to proc, thread as needed.
449  */
450  schedinit(); /* scheduler gets its house in order */
451  /*
452  * Initialize sleep queue hash table
453  */
454  sleepinit();
455 
456  /*
457  * additional VM structures
458  */
459  vm_init2();
460 
461  /*
462  * Create process 0 (the swapper).
463  */
464  LIST_INSERT_HEAD(&allproc, p, p_list);
465  LIST_INSERT_HEAD(PIDHASH(0), p, p_hash);
466  mtx_init(&pgrp0.pg_mtx, "process group", NULL, MTX_DEF | MTX_DUPOK);
467  p->p_pgrp = &pgrp0;
468  LIST_INSERT_HEAD(PGRPHASH(0), &pgrp0, pg_hash);
469  LIST_INIT(&pgrp0.pg_members);
470  LIST_INSERT_HEAD(&pgrp0.pg_members, p, p_pglist);
471 
472  pgrp0.pg_session = &session0;
473  mtx_init(&session0.s_mtx, "session", NULL, MTX_DEF);
474  refcount_init(&session0.s_count, 1);
475  session0.s_leader = p;
476 
477  p->p_sysent = &null_sysvec;
478  p->p_flag = P_SYSTEM | P_INMEM | P_KTHREAD;
479  p->p_flag2 = 0;
480  p->p_state = PRS_NORMAL;
481  knlist_init_mtx(&p->p_klist, &p->p_mtx);
482  STAILQ_INIT(&p->p_ktr);
483  p->p_nice = NZERO;
484  /* pid_max cannot be greater than PID_MAX */
485  td->td_tid = PID_MAX + 1;
486  LIST_INSERT_HEAD(TIDHASH(td->td_tid), td, td_hash);
487  td->td_state = TDS_RUNNING;
488  td->td_pri_class = PRI_TIMESHARE;
489  td->td_user_pri = PUSER;
490  td->td_base_user_pri = PUSER;
491  td->td_lend_user_pri = PRI_MAX;
492  td->td_priority = PVM;
493  td->td_base_pri = PVM;
494  td->td_oncpu = 0;
495  td->td_flags = TDF_INMEM|TDP_KTHREAD;
496  td->td_cpuset = cpuset_thread0();
497  prison0.pr_cpuset = cpuset_ref(td->td_cpuset);
498  p->p_peers = 0;
499  p->p_leader = p;
500 
501 
502  strncpy(p->p_comm, "kernel", sizeof (p->p_comm));
503  strncpy(td->td_name, "swapper", sizeof (td->td_name));
504 
505  callout_init_mtx(&p->p_itcallout, &p->p_mtx, 0);
506  callout_init_mtx(&p->p_limco, &p->p_mtx, 0);
507  callout_init(&td->td_slpcallout, CALLOUT_MPSAFE);
508 
509  /* Create credentials. */
510  p->p_ucred = crget();
511  p->p_ucred->cr_ngroups = 1; /* group 0 */
512  p->p_ucred->cr_uidinfo = uifind(0);
513  p->p_ucred->cr_ruidinfo = uifind(0);
514  p->p_ucred->cr_prison = &prison0;
515  p->p_ucred->cr_loginclass = loginclass_find("default");
516 #ifdef AUDIT
517  audit_cred_kproc0(p->p_ucred);
518 #endif
519 #ifdef MAC
520  mac_cred_create_swapper(p->p_ucred);
521 #endif
522  td->td_ucred = crhold(p->p_ucred);
523 
524  /* Create sigacts. */
525  p->p_sigacts = sigacts_alloc();
526 
527  /* Initialize signal state for process 0. */
528  siginit(&proc0);
529 
530  /* Create the file descriptor table. */
531  p->p_fd = fdinit(NULL);
532  p->p_fdtol = NULL;
533 
534  /* Create the limits structures. */
535  p->p_limit = lim_alloc();
536  for (i = 0; i < RLIM_NLIMITS; i++)
537  p->p_limit->pl_rlimit[i].rlim_cur =
538  p->p_limit->pl_rlimit[i].rlim_max = RLIM_INFINITY;
539  p->p_limit->pl_rlimit[RLIMIT_NOFILE].rlim_cur =
540  p->p_limit->pl_rlimit[RLIMIT_NOFILE].rlim_max = maxfiles;
541  p->p_limit->pl_rlimit[RLIMIT_NPROC].rlim_cur =
542  p->p_limit->pl_rlimit[RLIMIT_NPROC].rlim_max = maxproc;
543  p->p_limit->pl_rlimit[RLIMIT_DATA].rlim_cur = dfldsiz;
544  p->p_limit->pl_rlimit[RLIMIT_DATA].rlim_max = maxdsiz;
545  p->p_limit->pl_rlimit[RLIMIT_STACK].rlim_cur = dflssiz;
546  p->p_limit->pl_rlimit[RLIMIT_STACK].rlim_max = maxssiz;
547  /* Cast to avoid overflow on i386/PAE. */
548  pageablemem = ptoa((vm_paddr_t)cnt.v_free_count);
549  p->p_limit->pl_rlimit[RLIMIT_RSS].rlim_cur =
550  p->p_limit->pl_rlimit[RLIMIT_RSS].rlim_max = pageablemem;
551  p->p_limit->pl_rlimit[RLIMIT_MEMLOCK].rlim_cur = pageablemem / 3;
552  p->p_limit->pl_rlimit[RLIMIT_MEMLOCK].rlim_max = pageablemem;
553  p->p_cpulimit = RLIM_INFINITY;
554 
555  /* Initialize resource accounting structures. */
556  racct_create(&p->p_racct);
557 
558  p->p_stats = pstats_alloc();
559 
560  /* Allocate a prototype map so we have something to fork. */
561  pmap_pinit0(vmspace_pmap(&vmspace0));
562  p->p_vmspace = &vmspace0;
563  vmspace0.vm_refcnt = 1;
564 
565  /*
566  * proc0 is not expected to enter usermode, so there is no special
567  * handling for sv_minuser here, like is done for exec_new_vmspace().
568  */
569  vm_map_init(&vmspace0.vm_map, vmspace_pmap(&vmspace0),
570  p->p_sysent->sv_minuser, p->p_sysent->sv_maxuser);
571 
572  /*
573  * Call the init and ctor for the new thread and proc. We wait
574  * to do this until all other structures are fairly sane.
575  */
576  EVENTHANDLER_INVOKE(process_init, p);
577  EVENTHANDLER_INVOKE(thread_init, td);
578  EVENTHANDLER_INVOKE(process_ctor, p);
579  EVENTHANDLER_INVOKE(thread_ctor, td);
580 
581  /*
582  * Charge root for one process.
583  */
584  (void)chgproccnt(p->p_ucred->cr_ruidinfo, 1, 0);
585  PROC_LOCK(p);
586  racct_add_force(p, RACCT_NPROC, 1);
587  PROC_UNLOCK(p);
588 }
589 SYSINIT(p0init, SI_SUB_INTRINSIC, SI_ORDER_FIRST, proc0_init, NULL);
590 
591 /* ARGSUSED*/
592 static void
593 proc0_post(void *dummy __unused)
594 {
595  struct timespec ts;
596  struct proc *p;
597  struct rusage ru;
598  struct thread *td;
599 
600  /*
601  * Now we can look at the time, having had a chance to verify the
602  * time from the filesystem. Pretend that proc0 started now.
603  */
604  sx_slock(&allproc_lock);
605  FOREACH_PROC_IN_SYSTEM(p) {
606  microuptime(&p->p_stats->p_start);
607  PROC_SLOCK(p);
608  rufetch(p, &ru); /* Clears thread stats */
609  PROC_SUNLOCK(p);
610  p->p_rux.rux_runtime = 0;
611  p->p_rux.rux_uticks = 0;
612  p->p_rux.rux_sticks = 0;
613  p->p_rux.rux_iticks = 0;
614  FOREACH_THREAD_IN_PROC(p, td) {
615  td->td_runtime = 0;
616  }
617  }
618  sx_sunlock(&allproc_lock);
619  PCPU_SET(switchtime, cpu_ticks());
620  PCPU_SET(switchticks, ticks);
621 
622  /*
623  * Give the ``random'' number generator a thump.
624  */
625  nanotime(&ts);
626  srandom(ts.tv_sec ^ ts.tv_nsec);
627 }
628 SYSINIT(p0post, SI_SUB_INTRINSIC_POST, SI_ORDER_FIRST, proc0_post, NULL);
629 
630 static void
631 random_init(void *dummy __unused)
632 {
633 
634  /*
635  * After CPU has been started we have some randomness on most
636  * platforms via get_cyclecount(). For platforms that don't
637  * we will reseed random(9) in proc0_post() as well.
638  */
639  srandom(get_cyclecount());
640 }
641 SYSINIT(random, SI_SUB_RANDOM, SI_ORDER_FIRST, random_init, NULL);
642 
643 /*
644  ***************************************************************************
645  ****
646  **** The following SYSINIT's and glue code should be moved to the
647  **** respective files on a per subsystem basis.
648  ****
649  ***************************************************************************
650  */
651 
652 
653 /*
654  ***************************************************************************
655  ****
656  **** The following code probably belongs in another file, like
657  **** kern/init_init.c.
658  ****
659  ***************************************************************************
660  */
661 
662 /*
663  * List of paths to try when searching for "init".
664  */
665 static char init_path[MAXPATHLEN] =
666 #ifdef INIT_PATH
667  __XSTRING(INIT_PATH);
668 #else
669  "/sbin/init:/sbin/oinit:/sbin/init.bak:/rescue/init:/stand/sysinstall";
670 #endif
671 SYSCTL_STRING(_kern, OID_AUTO, init_path, CTLFLAG_RD, init_path, 0,
672  "Path used to search the init process");
673 
674 /*
675  * Shutdown timeout of init(8).
676  * Unused within kernel, but used to control init(8), hence do not remove.
677  */
678 #ifndef INIT_SHUTDOWN_TIMEOUT
679 #define INIT_SHUTDOWN_TIMEOUT 120
680 #endif
682 SYSCTL_INT(_kern, OID_AUTO, init_shutdown_timeout,
683  CTLFLAG_RW, &init_shutdown_timeout, 0, "Shutdown timeout of init(8). "
684  "Unused within kernel, but used to control init(8)");
685 
686 /*
687  * Start the initial user process; try exec'ing each pathname in init_path.
688  * The program is invoked with one argument containing the boot flags.
689  */
690 static void
692 {
693  vm_offset_t addr;
694  struct execve_args args;
695  int options, error;
696  char *var, *path, *next, *s;
697  char *ucp, **uap, *arg0, *arg1;
698  struct thread *td;
699  struct proc *p;
700 
701  mtx_lock(&Giant);
702 
703  GIANT_REQUIRED;
704 
705  td = curthread;
706  p = td->td_proc;
707 
708  vfs_mountroot();
709 
710  /*
711  * Need just enough stack to hold the faked-up "execve()" arguments.
712  */
713  addr = p->p_sysent->sv_usrstack - PAGE_SIZE;
714  if (vm_map_find(&p->p_vmspace->vm_map, NULL, 0, &addr, PAGE_SIZE,
715  FALSE, VM_PROT_ALL, VM_PROT_ALL, 0) != 0)
716  panic("init: couldn't allocate argument space");
717  p->p_vmspace->vm_maxsaddr = (caddr_t)addr;
718  p->p_vmspace->vm_ssize = 1;
719 
720  if ((var = getenv("init_path")) != NULL) {
721  strlcpy(init_path, var, sizeof(init_path));
722  freeenv(var);
723  }
724 
725  for (path = init_path; *path != '\0'; path = next) {
726  while (*path == ':')
727  path++;
728  if (*path == '\0')
729  break;
730  for (next = path; *next != '\0' && *next != ':'; next++)
731  /* nothing */ ;
732  if (bootverbose)
733  printf("start_init: trying %.*s\n", (int)(next - path),
734  path);
735 
736  /*
737  * Move out the boot flag argument.
738  */
739  options = 0;
740  ucp = (char *)p->p_sysent->sv_usrstack;
741  (void)subyte(--ucp, 0); /* trailing zero */
742  if (boothowto & RB_SINGLE) {
743  (void)subyte(--ucp, 's');
744  options = 1;
745  }
746 #ifdef notyet
747  if (boothowto & RB_FASTBOOT) {
748  (void)subyte(--ucp, 'f');
749  options = 1;
750  }
751 #endif
752 
753 #ifdef BOOTCDROM
754  (void)subyte(--ucp, 'C');
755  options = 1;
756 #endif
757 
758  if (options == 0)
759  (void)subyte(--ucp, '-');
760  (void)subyte(--ucp, '-'); /* leading hyphen */
761  arg1 = ucp;
762 
763  /*
764  * Move out the file name (also arg 0).
765  */
766  (void)subyte(--ucp, 0);
767  for (s = next - 1; s >= path; s--)
768  (void)subyte(--ucp, *s);
769  arg0 = ucp;
770 
771  /*
772  * Move out the arg pointers.
773  */
774  uap = (char **)((intptr_t)ucp & ~(sizeof(intptr_t)-1));
775  (void)suword((caddr_t)--uap, (long)0); /* terminator */
776  (void)suword((caddr_t)--uap, (long)(intptr_t)arg1);
777  (void)suword((caddr_t)--uap, (long)(intptr_t)arg0);
778 
779  /*
780  * Point at the arguments.
781  */
782  args.fname = arg0;
783  args.argv = uap;
784  args.envv = NULL;
785 
786  /*
787  * Now try to exec the program. If can't for any reason
788  * other than it doesn't exist, complain.
789  *
790  * Otherwise, return via fork_trampoline() all the way
791  * to user mode as init!
792  */
793  if ((error = sys_execve(td, &args)) == 0) {
794  mtx_unlock(&Giant);
795  return;
796  }
797  if (error != ENOENT)
798  printf("exec %.*s: error %d\n", (int)(next - path),
799  path, error);
800  }
801  printf("init: not found in path %s\n", init_path);
802  panic("no init");
803 }
804 
805 /*
806  * Like kproc_create(), but runs in it's own address space.
807  * We do this early to reserve pid 1.
808  *
809  * Note special case - do not make it runnable yet. Other work
810  * in progress will change this more.
811  */
812 static void
813 create_init(const void *udata __unused)
814 {
815  struct ucred *newcred, *oldcred;
816  int error;
817 
818  error = fork1(&thread0, RFFDG | RFPROC | RFSTOPPED, 0, &initproc,
819  NULL, 0);
820  if (error)
821  panic("cannot fork init: %d\n", error);
822  KASSERT(initproc->p_pid == 1, ("create_init: initproc->p_pid != 1"));
823  /* divorce init's credentials from the kernel's */
824  newcred = crget();
825  PROC_LOCK(initproc);
826  initproc->p_flag |= P_SYSTEM | P_INMEM;
827  oldcred = initproc->p_ucred;
828  crcopy(newcred, oldcred);
829 #ifdef MAC
830  mac_cred_create_init(newcred);
831 #endif
832 #ifdef AUDIT
833  audit_cred_proc1(newcred);
834 #endif
835  initproc->p_ucred = newcred;
836  PROC_UNLOCK(initproc);
837  crfree(oldcred);
838  cred_update_thread(FIRST_THREAD_IN_PROC(initproc));
839  cpu_set_fork_handler(FIRST_THREAD_IN_PROC(initproc), start_init, NULL);
840 }
841 SYSINIT(init, SI_SUB_CREATE_INIT, SI_ORDER_FIRST, create_init, NULL);
842 
843 /*
844  * Make it runnable now.
845  */
846 static void
847 kick_init(const void *udata __unused)
848 {
849  struct thread *td;
850 
851  td = FIRST_THREAD_IN_PROC(initproc);
852  thread_lock(td);
853  TD_SET_CAN_RUN(td);
854  sched_add(td, SRQ_BORING);
855  thread_unlock(td);
856 }
857 SYSINIT(kickinit, SI_SUB_KTHREAD_INIT, SI_ORDER_FIRST, kick_init, NULL);
struct proclist allproc
Definition: kern_proc.c:134
struct sysentvec null_sysvec
Definition: init_main.c:373
static struct session session0
Definition: init_main.c:97
void rufetch(struct proc *p, struct rusage *ru)
struct sigacts * sigacts_alloc(void)
Definition: kern_sig.c:3452
METHOD int set
Definition: cpufreq_if.m:43
void cred_update_thread(struct thread *td)
Definition: kern_prot.c:1938
char * path
static void kick_init(const void *udata __unused)
Definition: init_main.c:847
static void print_caddr_t(void *data)
Definition: init_main.c:316
int bootverbose
Definition: init_main.c:107
void * malloc(unsigned long size, struct malloc_type *mtp, int flags)
Definition: kern_malloc.c:454
struct sysinit ** newsysinit
Definition: init_main.c:124
void siginit(struct proc *p)
Definition: kern_sig.c:896
static int null_fetch_syscall_args(struct thread *td __unused, struct syscall_args *sa __unused)
Definition: init_main.c:359
struct uidinfo * uifind(uid_t uid)
struct proc proc0
Definition: init_main.c:99
void panic(const char *fmt,...)
SYSINIT(placeholder, SI_SUB_DUMMY, SI_ORDER_ANY, NULL, NULL)
void freeenv(char *env)
u_long maxdsiz
Definition: subr_param.c:104
static void start_init(void *dummy)
Definition: init_main.c:691
struct proc * initproc
Definition: init_main.c:102
const char * name
Definition: kern_fail.c:97
int maxproc
Definition: subr_param.c:87
__FBSDID("$BSDSUniX$")
SYSCTL_INT(_debug, OID_AUTO, boothowto, CTLFLAG_RD,&boothowto, 0,"Boot control flags, passed from loader")
int boothowto
Definition: init_main.c:104
static struct pgrp pgrp0
Definition: init_main.c:98
int fork1(struct thread *td, int flags, int pages, struct proc **procp, int *procdescp, int pdflags)
Definition: kern_fork.c:759
void schedinit(void)
Definition: sched_4bsd.c:682
static void create_init(const void *udata __unused)
Definition: init_main.c:813
static void print_version(void *data __unused)
Definition: init_main.c:322
struct plimit * lim_alloc()
void procinit()
Definition: kern_proc.c:158
void sched_add(struct thread *td, int flags)
Definition: sched_4bsd.c:1258
struct sx allproc_lock
Definition: kern_proc.c:136
struct cpuset * cpuset_ref(struct cpuset *set)
Definition: kern_cpuset.c:121
void racct_add_force(struct proc *p, int resource, uint64_t amount)
Definition: kern_racct.c:1220
static int dummy
int maxfiles
Definition: subr_param.c:89
struct filedesc * fdinit(struct filedesc *fdp)
static void random_init(void *dummy __unused)
Definition: init_main.c:631
struct mtx Giant
Definition: kern_mutex.c:140
struct sysinit ** newsysinit_end
Definition: init_main.c:124
c_linker_sym_t sym
Definition: linker_if.m:45
struct vmspace vmspace0
Definition: init_main.c:101
struct sysinit ** sysinit
Definition: init_main.c:123
static int thread_init(void *mem, int size, int flags)
Definition: kern_thread.c:201
int chgproccnt(struct uidinfo *uip, int diff, rlim_t max)
struct prison prison0
Definition: kern_jail.c:99
struct pstats * pstats_alloc(void)
Definition: kern_proc.c:1030
void crfree(struct ucred *cr)
Definition: kern_prot.c:1835
u_long maxssiz
Definition: subr_param.c:106
struct cpuset * cpuset_thread0(void)
Definition: kern_cpuset.c:750
static void proc0_init(void *dummy __unused)
Definition: init_main.c:423
static int thread_ctor(void *mem, int size, void *arg, int flags)
Definition: kern_thread.c:132
void vfs_mountroot(void)
void nanotime(struct timespec *tsp)
Definition: kern_tc.c:211
static int init_shutdown_timeout
Definition: init_main.c:681
char * getenv(const char *name)
int sys_execve(struct thread *td, struct execve_args *uap)
Definition: kern_exec.c:198
struct loginclass * loginclass_find(const char *name)
struct ucred * crhold(struct ucred *cr)
Definition: kern_prot.c:1824
static void proc0_post(void *dummy __unused)
Definition: init_main.c:593
u_long dfldsiz
Definition: subr_param.c:103
void free(void *addr, struct malloc_type *mtp)
Definition: kern_malloc.c:554
void threadinit(void)
Definition: kern_thread.c:270
#define INIT_SHUTDOWN_TIMEOUT
Definition: init_main.c:679
int printf(const char *fmt,...)
Definition: subr_prf.c:367
#define suword
Definition: imgact_elf.c:978
void callout_init(struct callout *c, int mpsafe)
static void null_set_syscall_retval(struct thread *td __unused, int error __unused)
Definition: init_main.c:367
void mtx_init(struct mtx *m, const char *name, const char *type, int opts)
Definition: kern_mutex.c:837
void sleepinit(void)
Definition: kern_synch.c:124
char ** argv
Definition: kern_exec.c:192
SET_DECLARE(sysinit_set, struct sysinit)
void mi_startup(void)
Definition: init_main.c:191
char * fname
Definition: kern_exec.c:191
void sysinit_add(struct sysinit **set, struct sysinit **set_end)
Definition: init_main.c:131
volatile int ticks
Definition: kern_clock.c:387
void microuptime(struct timeval *tvp)
Definition: kern_tc.c:194
struct getcontext_args * ucp
Definition: kern_context.c:30
struct thread thread0 __aligned(16)
void crcopy(struct ucred *dest, struct ucred *src)
Definition: kern_prot.c:1882
u_long dflssiz
Definition: subr_param.c:105
char ** envv
Definition: kern_exec.c:193
struct ucred * crget(void)
Definition: kern_prot.c:1804
void racct_create(struct racct **racctp)
Definition: kern_racct.c:1263
static char init_path[MAXPATHLEN]
Definition: init_main.c:665
SYSCTL_STRING(_kern, OID_AUTO, init_path, CTLFLAG_RD, init_path, 0,"Path used to search the init process")
void knlist_init_mtx(struct knlist *knl, struct mtx *lock)
Definition: kern_event.c:1995
cpu_tick_f * cpu_ticks
Definition: kern_tc.c:986
int * count
Definition: cpufreq_if.m:63
struct sysinit ** sysinit_end
Definition: init_main.c:123