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