xref: /freebsd/sys/kern/init_main.c (revision 2be1a816)
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("$FreeBSD$");
46 
47 #include "opt_ddb.h"
48 #include "opt_init_path.h"
49 #include "opt_mac.h"
50 
51 #include <sys/param.h>
52 #include <sys/kernel.h>
53 #include <sys/exec.h>
54 #include <sys/file.h>
55 #include <sys/filedesc.h>
56 #include <sys/ktr.h>
57 #include <sys/lock.h>
58 #include <sys/mount.h>
59 #include <sys/mutex.h>
60 #include <sys/syscallsubr.h>
61 #include <sys/sysctl.h>
62 #include <sys/proc.h>
63 #include <sys/resourcevar.h>
64 #include <sys/systm.h>
65 #include <sys/signalvar.h>
66 #include <sys/vnode.h>
67 #include <sys/sysent.h>
68 #include <sys/reboot.h>
69 #include <sys/sched.h>
70 #include <sys/sx.h>
71 #include <sys/sysproto.h>
72 #include <sys/vmmeter.h>
73 #include <sys/unistd.h>
74 #include <sys/malloc.h>
75 #include <sys/conf.h>
76 #include <sys/cpuset.h>
77 
78 #include <machine/cpu.h>
79 
80 #include <security/audit/audit.h>
81 #include <security/mac/mac_framework.h>
82 
83 #include <vm/vm.h>
84 #include <vm/vm_param.h>
85 #include <vm/pmap.h>
86 #include <vm/vm_map.h>
87 #include <sys/copyright.h>
88 
89 #include <ddb/ddb.h>
90 #include <ddb/db_sym.h>
91 
92 void mi_startup(void);				/* Should be elsewhere */
93 
94 /* Components of the first process -- never freed. */
95 static struct session session0;
96 static struct pgrp pgrp0;
97 struct	proc proc0;
98 struct	thread thread0 __aligned(16);
99 struct	vmspace vmspace0;
100 struct	proc *initproc;
101 
102 int	boothowto = 0;		/* initialized so that it can be patched */
103 SYSCTL_INT(_debug, OID_AUTO, boothowto, CTLFLAG_RD, &boothowto, 0, "");
104 int	bootverbose;
105 SYSCTL_INT(_debug, OID_AUTO, bootverbose, CTLFLAG_RW, &bootverbose, 0, "");
106 
107 /*
108  * This ensures that there is at least one entry so that the sysinit_set
109  * symbol is not undefined.  A sybsystem ID of SI_SUB_DUMMY is never
110  * executed.
111  */
112 SYSINIT(placeholder, SI_SUB_DUMMY, SI_ORDER_ANY, NULL, NULL);
113 
114 /*
115  * The sysinit table itself.  Items are checked off as the are run.
116  * If we want to register new sysinit types, add them to newsysinit.
117  */
118 SET_DECLARE(sysinit_set, struct sysinit);
119 struct sysinit **sysinit, **sysinit_end;
120 struct sysinit **newsysinit, **newsysinit_end;
121 
122 /*
123  * Merge a new sysinit set into the current set, reallocating it if
124  * necessary.  This can only be called after malloc is running.
125  */
126 void
127 sysinit_add(struct sysinit **set, struct sysinit **set_end)
128 {
129 	struct sysinit **newset;
130 	struct sysinit **sipp;
131 	struct sysinit **xipp;
132 	int count;
133 
134 	count = set_end - set;
135 	if (newsysinit)
136 		count += newsysinit_end - newsysinit;
137 	else
138 		count += sysinit_end - sysinit;
139 	newset = malloc(count * sizeof(*sipp), M_TEMP, M_NOWAIT);
140 	if (newset == NULL)
141 		panic("cannot malloc for sysinit");
142 	xipp = newset;
143 	if (newsysinit)
144 		for (sipp = newsysinit; sipp < newsysinit_end; sipp++)
145 			*xipp++ = *sipp;
146 	else
147 		for (sipp = sysinit; sipp < sysinit_end; sipp++)
148 			*xipp++ = *sipp;
149 	for (sipp = set; sipp < set_end; sipp++)
150 		*xipp++ = *sipp;
151 	if (newsysinit)
152 		free(newsysinit, M_TEMP);
153 	newsysinit = newset;
154 	newsysinit_end = newset + count;
155 }
156 
157 /*
158  * System startup; initialize the world, create process 0, mount root
159  * filesystem, and fork to create init and pagedaemon.  Most of the
160  * hard work is done in the lower-level initialization routines including
161  * startup(), which does memory initialization and autoconfiguration.
162  *
163  * This allows simple addition of new kernel subsystems that require
164  * boot time initialization.  It also allows substitution of subsystem
165  * (for instance, a scheduler, kernel profiler, or VM system) by object
166  * module.  Finally, it allows for optional "kernel threads".
167  */
168 void
169 mi_startup(void)
170 {
171 
172 	register struct sysinit **sipp;		/* system initialization*/
173 	register struct sysinit **xipp;		/* interior loop of sort*/
174 	register struct sysinit *save;		/* bubble*/
175 
176 #if defined(VERBOSE_SYSINIT)
177 	int last;
178 	int verbose;
179 #endif
180 
181 	if (sysinit == NULL) {
182 		sysinit = SET_BEGIN(sysinit_set);
183 		sysinit_end = SET_LIMIT(sysinit_set);
184 	}
185 
186 restart:
187 	/*
188 	 * Perform a bubble sort of the system initialization objects by
189 	 * their subsystem (primary key) and order (secondary key).
190 	 */
191 	for (sipp = sysinit; sipp < sysinit_end; sipp++) {
192 		for (xipp = sipp + 1; xipp < sysinit_end; xipp++) {
193 			if ((*sipp)->subsystem < (*xipp)->subsystem ||
194 			     ((*sipp)->subsystem == (*xipp)->subsystem &&
195 			      (*sipp)->order <= (*xipp)->order))
196 				continue;	/* skip*/
197 			save = *sipp;
198 			*sipp = *xipp;
199 			*xipp = save;
200 		}
201 	}
202 
203 #if defined(VERBOSE_SYSINIT)
204 	last = SI_SUB_COPYRIGHT;
205 	verbose = 0;
206 #if !defined(DDB)
207 	printf("VERBOSE_SYSINIT: DDB not enabled, symbol lookups disabled.\n");
208 #endif
209 #endif
210 
211 	/*
212 	 * Traverse the (now) ordered list of system initialization tasks.
213 	 * Perform each task, and continue on to the next task.
214 	 *
215 	 * The last item on the list is expected to be the scheduler,
216 	 * which will not return.
217 	 */
218 	for (sipp = sysinit; sipp < sysinit_end; sipp++) {
219 
220 		if ((*sipp)->subsystem == SI_SUB_DUMMY)
221 			continue;	/* skip dummy task(s)*/
222 
223 		if ((*sipp)->subsystem == SI_SUB_DONE)
224 			continue;
225 
226 #if defined(VERBOSE_SYSINIT)
227 		if ((*sipp)->subsystem > last) {
228 			verbose = 1;
229 			last = (*sipp)->subsystem;
230 			printf("subsystem %x\n", last);
231 		}
232 		if (verbose) {
233 #if defined(DDB)
234 			const char *name;
235 			c_db_sym_t sym;
236 			db_expr_t  offset;
237 
238 			sym = db_search_symbol((vm_offset_t)(*sipp)->func,
239 			    DB_STGY_PROC, &offset);
240 			db_symbol_values(sym, &name, NULL);
241 			if (name != NULL)
242 				printf("   %s(%p)... ", name, (*sipp)->udata);
243 			else
244 #endif
245 				printf("   %p(%p)... ", (*sipp)->func,
246 				    (*sipp)->udata);
247 		}
248 #endif
249 
250 		/* Call function */
251 		(*((*sipp)->func))((*sipp)->udata);
252 
253 #if defined(VERBOSE_SYSINIT)
254 		if (verbose)
255 			printf("done.\n");
256 #endif
257 
258 		/* Check off the one we're just done */
259 		(*sipp)->subsystem = SI_SUB_DONE;
260 
261 		/* Check if we've installed more sysinit items via KLD */
262 		if (newsysinit != NULL) {
263 			if (sysinit != SET_BEGIN(sysinit_set))
264 				free(sysinit, M_TEMP);
265 			sysinit = newsysinit;
266 			sysinit_end = newsysinit_end;
267 			newsysinit = NULL;
268 			newsysinit_end = NULL;
269 			goto restart;
270 		}
271 	}
272 
273 	panic("Shouldn't get here!");
274 	/* NOTREACHED*/
275 }
276 
277 
278 /*
279  ***************************************************************************
280  ****
281  **** The following SYSINIT's belong elsewhere, but have not yet
282  **** been moved.
283  ****
284  ***************************************************************************
285  */
286 static void
287 print_caddr_t(void *data __unused)
288 {
289 	printf("%s", (char *)data);
290 }
291 SYSINIT(announce, SI_SUB_COPYRIGHT, SI_ORDER_FIRST, print_caddr_t,
292     copyright);
293 SYSINIT(trademark, SI_SUB_COPYRIGHT, SI_ORDER_SECOND, print_caddr_t,
294     trademark);
295 SYSINIT(version, SI_SUB_COPYRIGHT, SI_ORDER_THIRD, print_caddr_t, version);
296 
297 #ifdef WITNESS
298 static char wit_warn[] =
299      "WARNING: WITNESS option enabled, expect reduced performance.\n";
300 SYSINIT(witwarn, SI_SUB_COPYRIGHT, SI_ORDER_THIRD + 1,
301    print_caddr_t, wit_warn);
302 SYSINIT(witwarn2, SI_SUB_RUN_SCHEDULER, SI_ORDER_THIRD + 1,
303    print_caddr_t, wit_warn);
304 #endif
305 
306 #ifdef DIAGNOSTIC
307 static char diag_warn[] =
308      "WARNING: DIAGNOSTIC option enabled, expect reduced performance.\n";
309 SYSINIT(diagwarn, SI_SUB_COPYRIGHT, SI_ORDER_THIRD + 2,
310     print_caddr_t, diag_warn);
311 SYSINIT(diagwarn2, SI_SUB_RUN_SCHEDULER, SI_ORDER_THIRD + 2,
312     print_caddr_t, diag_warn);
313 #endif
314 
315 static void
316 set_boot_verbose(void *data __unused)
317 {
318 
319 	if (boothowto & RB_VERBOSE)
320 		bootverbose++;
321 }
322 SYSINIT(boot_verbose, SI_SUB_TUNABLES, SI_ORDER_ANY, set_boot_verbose, NULL);
323 
324 struct sysentvec null_sysvec = {
325 	0,
326 	NULL,
327 	0,
328 	0,
329 	NULL,
330 	0,
331 	NULL,
332 	NULL,
333 	NULL,
334 	NULL,
335 	NULL,
336 	NULL,
337 	NULL,
338 	"null",
339 	NULL,
340 	NULL,
341 	0,
342 	PAGE_SIZE,
343 	VM_MIN_ADDRESS,
344 	VM_MAXUSER_ADDRESS,
345 	USRSTACK,
346 	PS_STRINGS,
347 	VM_PROT_ALL,
348 	NULL,
349 	NULL,
350 	NULL
351 };
352 
353 /*
354  ***************************************************************************
355  ****
356  **** The two following SYSINIT's are proc0 specific glue code.  I am not
357  **** convinced that they can not be safely combined, but their order of
358  **** operation has been maintained as the same as the original init_main.c
359  **** for right now.
360  ****
361  **** These probably belong in init_proc.c or kern_proc.c, since they
362  **** deal with proc0 (the fork template process).
363  ****
364  ***************************************************************************
365  */
366 /* ARGSUSED*/
367 static void
368 proc0_init(void *dummy __unused)
369 {
370 	struct proc *p;
371 	unsigned i;
372 	struct thread *td;
373 
374 	GIANT_REQUIRED;
375 	p = &proc0;
376 	td = &thread0;
377 
378 	/*
379 	 * Initialize magic number and osrel.
380 	 */
381 	p->p_magic = P_MAGIC;
382 	p->p_osrel = osreldate;
383 
384 	/*
385 	 * Initialize thread and process structures.
386 	 */
387 	procinit();	/* set up proc zone */
388 	threadinit();	/* set up UMA zones */
389 
390 	/*
391 	 * Initialise scheduler resources.
392 	 * Add scheduler specific parts to proc, thread as needed.
393 	 */
394 	schedinit();	/* scheduler gets its house in order */
395 	/*
396 	 * Initialize sleep queue hash table
397 	 */
398 	sleepinit();
399 
400 	/*
401 	 * additional VM structures
402 	 */
403 	vm_init2();
404 
405 	/*
406 	 * Create process 0 (the swapper).
407 	 */
408 	LIST_INSERT_HEAD(&allproc, p, p_list);
409 	LIST_INSERT_HEAD(PIDHASH(0), p, p_hash);
410 	mtx_init(&pgrp0.pg_mtx, "process group", NULL, MTX_DEF | MTX_DUPOK);
411 	p->p_pgrp = &pgrp0;
412 	LIST_INSERT_HEAD(PGRPHASH(0), &pgrp0, pg_hash);
413 	LIST_INIT(&pgrp0.pg_members);
414 	LIST_INSERT_HEAD(&pgrp0.pg_members, p, p_pglist);
415 
416 	pgrp0.pg_session = &session0;
417 	mtx_init(&session0.s_mtx, "session", NULL, MTX_DEF);
418 	session0.s_count = 1;
419 	session0.s_leader = p;
420 
421 	p->p_sysent = &null_sysvec;
422 	p->p_flag = P_SYSTEM | P_INMEM;
423 	p->p_state = PRS_NORMAL;
424 	knlist_init(&p->p_klist, &p->p_mtx, NULL, NULL, NULL);
425 	STAILQ_INIT(&p->p_ktr);
426 	p->p_nice = NZERO;
427 	td->td_tid = PID_MAX + 1;
428 	td->td_state = TDS_RUNNING;
429 	td->td_pri_class = PRI_TIMESHARE;
430 	td->td_user_pri = PUSER;
431 	td->td_base_user_pri = PUSER;
432 	td->td_priority = PVM;
433 	td->td_base_pri = PUSER;
434 	td->td_oncpu = 0;
435 	td->td_flags = TDF_INMEM|TDP_KTHREAD;
436 	td->td_cpuset = cpuset_thread0();
437 	p->p_peers = 0;
438 	p->p_leader = p;
439 
440 
441 	strncpy(p->p_comm, "kernel", sizeof (p->p_comm));
442 	strncpy(td->td_name, "swapper", sizeof (td->td_name));
443 
444 	callout_init(&p->p_itcallout, CALLOUT_MPSAFE);
445 	callout_init_mtx(&p->p_limco, &p->p_mtx, 0);
446 	callout_init(&td->td_slpcallout, CALLOUT_MPSAFE);
447 
448 	/* Create credentials. */
449 	p->p_ucred = crget();
450 	p->p_ucred->cr_ngroups = 1;	/* group 0 */
451 	p->p_ucred->cr_uidinfo = uifind(0);
452 	p->p_ucred->cr_ruidinfo = uifind(0);
453 	p->p_ucred->cr_prison = NULL;	/* Don't jail it. */
454 #ifdef AUDIT
455 	audit_cred_kproc0(p->p_ucred);
456 #endif
457 #ifdef MAC
458 	mac_proc_create_swapper(p->p_ucred);
459 #endif
460 	td->td_ucred = crhold(p->p_ucred);
461 
462 	/* Create sigacts. */
463 	p->p_sigacts = sigacts_alloc();
464 
465 	/* Initialize signal state for process 0. */
466 	siginit(&proc0);
467 
468 	/* Create the file descriptor table. */
469 	p->p_fd = fdinit(NULL);
470 	p->p_fdtol = NULL;
471 
472 	/* Create the limits structures. */
473 	p->p_limit = lim_alloc();
474 	for (i = 0; i < RLIM_NLIMITS; i++)
475 		p->p_limit->pl_rlimit[i].rlim_cur =
476 		    p->p_limit->pl_rlimit[i].rlim_max = RLIM_INFINITY;
477 	p->p_limit->pl_rlimit[RLIMIT_NOFILE].rlim_cur =
478 	    p->p_limit->pl_rlimit[RLIMIT_NOFILE].rlim_max = maxfiles;
479 	p->p_limit->pl_rlimit[RLIMIT_NPROC].rlim_cur =
480 	    p->p_limit->pl_rlimit[RLIMIT_NPROC].rlim_max = maxproc;
481 	i = ptoa(cnt.v_free_count);
482 	p->p_limit->pl_rlimit[RLIMIT_RSS].rlim_max = i;
483 	p->p_limit->pl_rlimit[RLIMIT_MEMLOCK].rlim_max = i;
484 	p->p_limit->pl_rlimit[RLIMIT_MEMLOCK].rlim_cur = i / 3;
485 	p->p_cpulimit = RLIM_INFINITY;
486 
487 	p->p_stats = pstats_alloc();
488 
489 	/* Allocate a prototype map so we have something to fork. */
490 	pmap_pinit0(vmspace_pmap(&vmspace0));
491 	p->p_vmspace = &vmspace0;
492 	vmspace0.vm_refcnt = 1;
493 	vm_map_init(&vmspace0.vm_map, p->p_sysent->sv_minuser,
494 	    p->p_sysent->sv_maxuser);
495 	vmspace0.vm_map.pmap = vmspace_pmap(&vmspace0);
496 
497 	/*-
498 	 * call the init and ctor for the new thread and proc
499 	 * we wait to do this until all other structures
500 	 * are fairly sane.
501 	 */
502 	EVENTHANDLER_INVOKE(process_init, p);
503 	EVENTHANDLER_INVOKE(thread_init, td);
504 	EVENTHANDLER_INVOKE(process_ctor, p);
505 	EVENTHANDLER_INVOKE(thread_ctor, td);
506 
507 	/*
508 	 * Charge root for one process.
509 	 */
510 	(void)chgproccnt(p->p_ucred->cr_ruidinfo, 1, 0);
511 }
512 SYSINIT(p0init, SI_SUB_INTRINSIC, SI_ORDER_FIRST, proc0_init, NULL);
513 
514 /* ARGSUSED*/
515 static void
516 proc0_post(void *dummy __unused)
517 {
518 	struct timespec ts;
519 	struct proc *p;
520 	struct rusage ru;
521 	struct thread *td;
522 
523 	/*
524 	 * Now we can look at the time, having had a chance to verify the
525 	 * time from the filesystem.  Pretend that proc0 started now.
526 	 */
527 	sx_slock(&allproc_lock);
528 	FOREACH_PROC_IN_SYSTEM(p) {
529 		microuptime(&p->p_stats->p_start);
530 		PROC_SLOCK(p);
531 		rufetch(p, &ru);	/* Clears thread stats */
532 		PROC_SUNLOCK(p);
533 		p->p_rux.rux_runtime = 0;
534 		p->p_rux.rux_uticks = 0;
535 		p->p_rux.rux_sticks = 0;
536 		p->p_rux.rux_iticks = 0;
537 		FOREACH_THREAD_IN_PROC(p, td) {
538 			td->td_runtime = 0;
539 		}
540 	}
541 	sx_sunlock(&allproc_lock);
542 	PCPU_SET(switchtime, cpu_ticks());
543 	PCPU_SET(switchticks, ticks);
544 
545 	/*
546 	 * Give the ``random'' number generator a thump.
547 	 */
548 	nanotime(&ts);
549 	srandom(ts.tv_sec ^ ts.tv_nsec);
550 }
551 SYSINIT(p0post, SI_SUB_INTRINSIC_POST, SI_ORDER_FIRST, proc0_post, NULL);
552 
553 /*
554  ***************************************************************************
555  ****
556  **** The following SYSINIT's and glue code should be moved to the
557  **** respective files on a per subsystem basis.
558  ****
559  ***************************************************************************
560  */
561 
562 
563 /*
564  ***************************************************************************
565  ****
566  **** The following code probably belongs in another file, like
567  **** kern/init_init.c.
568  ****
569  ***************************************************************************
570  */
571 
572 /*
573  * List of paths to try when searching for "init".
574  */
575 static char init_path[MAXPATHLEN] =
576 #ifdef	INIT_PATH
577     __XSTRING(INIT_PATH);
578 #else
579     "/sbin/init:/sbin/oinit:/sbin/init.bak:/rescue/init:/stand/sysinstall";
580 #endif
581 SYSCTL_STRING(_kern, OID_AUTO, init_path, CTLFLAG_RD, init_path, 0,
582 	"Path used to search the init process");
583 
584 /*
585  * Shutdown timeout of init(8).
586  * Unused within kernel, but used to control init(8), hence do not remove.
587  */
588 #ifndef INIT_SHUTDOWN_TIMEOUT
589 #define INIT_SHUTDOWN_TIMEOUT 120
590 #endif
591 static int init_shutdown_timeout = INIT_SHUTDOWN_TIMEOUT;
592 SYSCTL_INT(_kern, OID_AUTO, init_shutdown_timeout,
593 	CTLFLAG_RW, &init_shutdown_timeout, 0, "");
594 
595 /*
596  * Start the initial user process; try exec'ing each pathname in init_path.
597  * The program is invoked with one argument containing the boot flags.
598  */
599 static void
600 start_init(void *dummy)
601 {
602 	vm_offset_t addr;
603 	struct execve_args args;
604 	int options, error;
605 	char *var, *path, *next, *s;
606 	char *ucp, **uap, *arg0, *arg1;
607 	struct thread *td;
608 	struct proc *p;
609 
610 	mtx_lock(&Giant);
611 
612 	GIANT_REQUIRED;
613 
614 	td = curthread;
615 	p = td->td_proc;
616 
617 	vfs_mountroot();
618 
619 	/*
620 	 * Need just enough stack to hold the faked-up "execve()" arguments.
621 	 */
622 	addr = p->p_sysent->sv_usrstack - PAGE_SIZE;
623 	if (vm_map_find(&p->p_vmspace->vm_map, NULL, 0, &addr, PAGE_SIZE,
624 			FALSE, VM_PROT_ALL, VM_PROT_ALL, 0) != 0)
625 		panic("init: couldn't allocate argument space");
626 	p->p_vmspace->vm_maxsaddr = (caddr_t)addr;
627 	p->p_vmspace->vm_ssize = 1;
628 
629 	if ((var = getenv("init_path")) != NULL) {
630 		strlcpy(init_path, var, sizeof(init_path));
631 		freeenv(var);
632 	}
633 
634 	for (path = init_path; *path != '\0'; path = next) {
635 		while (*path == ':')
636 			path++;
637 		if (*path == '\0')
638 			break;
639 		for (next = path; *next != '\0' && *next != ':'; next++)
640 			/* nothing */ ;
641 		if (bootverbose)
642 			printf("start_init: trying %.*s\n", (int)(next - path),
643 			    path);
644 
645 		/*
646 		 * Move out the boot flag argument.
647 		 */
648 		options = 0;
649 		ucp = (char *)p->p_sysent->sv_usrstack;
650 		(void)subyte(--ucp, 0);		/* trailing zero */
651 		if (boothowto & RB_SINGLE) {
652 			(void)subyte(--ucp, 's');
653 			options = 1;
654 		}
655 #ifdef notyet
656                 if (boothowto & RB_FASTBOOT) {
657 			(void)subyte(--ucp, 'f');
658 			options = 1;
659 		}
660 #endif
661 
662 #ifdef BOOTCDROM
663 		(void)subyte(--ucp, 'C');
664 		options = 1;
665 #endif
666 
667 		if (options == 0)
668 			(void)subyte(--ucp, '-');
669 		(void)subyte(--ucp, '-');		/* leading hyphen */
670 		arg1 = ucp;
671 
672 		/*
673 		 * Move out the file name (also arg 0).
674 		 */
675 		(void)subyte(--ucp, 0);
676 		for (s = next - 1; s >= path; s--)
677 			(void)subyte(--ucp, *s);
678 		arg0 = ucp;
679 
680 		/*
681 		 * Move out the arg pointers.
682 		 */
683 		uap = (char **)((intptr_t)ucp & ~(sizeof(intptr_t)-1));
684 		(void)suword((caddr_t)--uap, (long)0);	/* terminator */
685 		(void)suword((caddr_t)--uap, (long)(intptr_t)arg1);
686 		(void)suword((caddr_t)--uap, (long)(intptr_t)arg0);
687 
688 		/*
689 		 * Point at the arguments.
690 		 */
691 		args.fname = arg0;
692 		args.argv = uap;
693 		args.envv = NULL;
694 
695 		/*
696 		 * Now try to exec the program.  If can't for any reason
697 		 * other than it doesn't exist, complain.
698 		 *
699 		 * Otherwise, return via fork_trampoline() all the way
700 		 * to user mode as init!
701 		 */
702 		if ((error = execve(td, &args)) == 0) {
703 			mtx_unlock(&Giant);
704 			return;
705 		}
706 		if (error != ENOENT)
707 			printf("exec %.*s: error %d\n", (int)(next - path),
708 			    path, error);
709 	}
710 	printf("init: not found in path %s\n", init_path);
711 	panic("no init");
712 }
713 
714 /*
715  * Like kproc_create(), but runs in it's own address space.
716  * We do this early to reserve pid 1.
717  *
718  * Note special case - do not make it runnable yet.  Other work
719  * in progress will change this more.
720  */
721 static void
722 create_init(const void *udata __unused)
723 {
724 	struct ucred *newcred, *oldcred;
725 	int error;
726 
727 	error = fork1(&thread0, RFFDG | RFPROC | RFSTOPPED, 0, &initproc);
728 	if (error)
729 		panic("cannot fork init: %d\n", error);
730 	KASSERT(initproc->p_pid == 1, ("create_init: initproc->p_pid != 1"));
731 	/* divorce init's credentials from the kernel's */
732 	newcred = crget();
733 	PROC_LOCK(initproc);
734 	initproc->p_flag |= P_SYSTEM | P_INMEM;
735 	oldcred = initproc->p_ucred;
736 	crcopy(newcred, oldcred);
737 #ifdef MAC
738 	mac_proc_create_init(newcred);
739 #endif
740 #ifdef AUDIT
741 	audit_cred_proc1(newcred);
742 #endif
743 	initproc->p_ucred = newcred;
744 	PROC_UNLOCK(initproc);
745 	crfree(oldcred);
746 	cred_update_thread(FIRST_THREAD_IN_PROC(initproc));
747 	cpu_set_fork_handler(FIRST_THREAD_IN_PROC(initproc), start_init, NULL);
748 }
749 SYSINIT(init, SI_SUB_CREATE_INIT, SI_ORDER_FIRST, create_init, NULL);
750 
751 /*
752  * Make it runnable now.
753  */
754 static void
755 kick_init(const void *udata __unused)
756 {
757 	struct thread *td;
758 
759 	td = FIRST_THREAD_IN_PROC(initproc);
760 	thread_lock(td);
761 	TD_SET_CAN_RUN(td);
762 	sched_add(td, SRQ_BORING);
763 	thread_unlock(td);
764 }
765 SYSINIT(kickinit, SI_SUB_KTHREAD_INIT, SI_ORDER_FIRST, kick_init, NULL);
766