summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/kern/init_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'freebsd/sys/kern/init_main.c')
-rw-r--r--freebsd/sys/kern/init_main.c129
1 files changed, 75 insertions, 54 deletions
diff --git a/freebsd/sys/kern/init_main.c b/freebsd/sys/kern/init_main.c
index 7311bb02..627c01e0 100644
--- a/freebsd/sys/kern/init_main.c
+++ b/freebsd/sys/kern/init_main.c
@@ -48,6 +48,7 @@ __FBSDID("$FreeBSD$");
#include <rtems/bsd/local/opt_ddb.h>
#include <rtems/bsd/local/opt_init_path.h>
+#include <rtems/bsd/local/opt_verbose_sysinit.h>
#include <rtems/bsd/sys/param.h>
#include <sys/kernel.h>
@@ -88,6 +89,7 @@ __FBSDID("$FreeBSD$");
#include <vm/vm_param.h>
#include <vm/pmap.h>
#include <vm/vm_map.h>
+#include <vm/vm_domain.h>
#include <sys/copyright.h>
#include <ddb/ddb.h>
@@ -100,17 +102,28 @@ void mi_startup(void); /* Should be elsewhere */
static struct session session0;
static struct pgrp pgrp0;
struct proc proc0;
-struct thread thread0 __aligned(16);
+struct thread0_storage thread0_st __aligned(16);
struct vmspace vmspace0;
struct proc *initproc;
-int boothowto = 0; /* initialized so that it can be patched */
+#ifndef BOOTHOWTO
+#define BOOTHOWTO 0
+#endif
+int boothowto = BOOTHOWTO; /* initialized so that it can be patched */
SYSCTL_INT(_debug, OID_AUTO, boothowto, CTLFLAG_RD, &boothowto, 0,
"Boot control flags, passed from loader");
-int bootverbose;
+
+#ifndef BOOTVERBOSE
+#define BOOTVERBOSE 0
+#endif
+int bootverbose = BOOTVERBOSE;
SYSCTL_INT(_debug, OID_AUTO, bootverbose, CTLFLAG_RW, &bootverbose, 0,
"Control the output of verbose kernel messages");
+#ifdef INVARIANTS
+FEATURE(invariants, "Kernel compiled with INVARIANTS, may affect performance");
+#endif
+
/*
* This ensures that there is at least one entry so that the sysinit_set
* symbol is not undefined. A sybsystem ID of SI_SUB_DUMMY is never
@@ -398,8 +411,6 @@ struct sysentvec null_sysvec = {
.sv_size = 0,
.sv_table = NULL,
.sv_mask = 0,
- .sv_sigsize = 0,
- .sv_sigtbl = NULL,
.sv_errsize = 0,
.sv_errtbl = NULL,
.sv_transtrap = NULL,
@@ -407,7 +418,6 @@ struct sysentvec null_sysvec = {
.sv_sendsig = NULL,
.sv_sigcode = NULL,
.sv_szsigcode = NULL,
- .sv_prepsyscall = NULL,
.sv_name = "null",
.sv_coredump = NULL,
.sv_imgact_try = NULL,
@@ -427,8 +437,9 @@ struct sysentvec null_sysvec = {
.sv_fetch_syscall_args = null_fetch_syscall_args,
.sv_syscallnames = NULL,
.sv_schedtail = NULL,
+ .sv_thread_detach = NULL,
+ .sv_trap = NULL,
};
-#endif /* __rtems__ */
/*
***************************************************************************
@@ -447,9 +458,9 @@ struct sysentvec null_sysvec = {
static void
proc0_init(void *dummy __unused)
{
-#ifndef __rtems__
struct proc *p;
struct thread *td;
+ struct ucred *newcred;
vm_paddr_t pageablemem;
int i;
@@ -474,17 +485,6 @@ proc0_init(void *dummy __unused)
* Add scheduler specific parts to proc, thread as needed.
*/
schedinit(); /* scheduler gets its house in order */
-#endif /* __rtems__ */
- /*
- * Initialize sleep queue hash table
- */
- sleepinit();
-
-#ifndef __rtems__
- /*
- * additional VM structures
- */
- vm_init2();
/*
* Create process 0 (the swapper).
@@ -503,10 +503,10 @@ proc0_init(void *dummy __unused)
session0.s_leader = p;
p->p_sysent = &null_sysvec;
- p->p_flag = P_SYSTEM | P_INMEM;
+ p->p_flag = P_SYSTEM | P_INMEM | P_KPROC;
p->p_flag2 = 0;
p->p_state = PRS_NORMAL;
- knlist_init_mtx(&p->p_klist, &p->p_mtx);
+ p->p_klist = knlist_alloc(&p->p_mtx);
STAILQ_INIT(&p->p_ktr);
p->p_nice = NZERO;
/* pid_max cannot be greater than PID_MAX */
@@ -519,36 +519,41 @@ proc0_init(void *dummy __unused)
td->td_lend_user_pri = PRI_MAX;
td->td_priority = PVM;
td->td_base_pri = PVM;
- td->td_oncpu = 0;
- td->td_flags = TDF_INMEM|TDP_KTHREAD;
+ td->td_oncpu = curcpu;
+ td->td_flags = TDF_INMEM;
+ td->td_pflags = TDP_KTHREAD;
td->td_cpuset = cpuset_thread0();
- prison0.pr_cpuset = cpuset_ref(td->td_cpuset);
+ vm_domain_policy_init(&td->td_vm_dom_policy);
+ vm_domain_policy_set(&td->td_vm_dom_policy, VM_POLICY_NONE, -1);
+ vm_domain_policy_init(&p->p_vm_dom_policy);
+ vm_domain_policy_set(&p->p_vm_dom_policy, VM_POLICY_NONE, -1);
+ prison0_init();
p->p_peers = 0;
p->p_leader = p;
-
+ p->p_reaper = p;
+ LIST_INIT(&p->p_reaplist);
strncpy(p->p_comm, "kernel", sizeof (p->p_comm));
strncpy(td->td_name, "swapper", sizeof (td->td_name));
callout_init_mtx(&p->p_itcallout, &p->p_mtx, 0);
callout_init_mtx(&p->p_limco, &p->p_mtx, 0);
- callout_init(&td->td_slpcallout, CALLOUT_MPSAFE);
+ callout_init(&td->td_slpcallout, 1);
/* Create credentials. */
- p->p_ucred = crget();
- p->p_ucred->cr_ngroups = 1; /* group 0 */
- p->p_ucred->cr_uidinfo = uifind(0);
- p->p_ucred->cr_ruidinfo = uifind(0);
- p->p_ucred->cr_prison = &prison0;
- p->p_ucred->cr_loginclass = loginclass_find("default");
+ newcred = crget();
+ newcred->cr_ngroups = 1; /* group 0 */
+ newcred->cr_uidinfo = uifind(0);
+ newcred->cr_ruidinfo = uifind(0);
+ newcred->cr_prison = &prison0;
+ newcred->cr_loginclass = loginclass_find("default");
+ proc_set_cred_init(p, newcred);
#ifdef AUDIT
- audit_cred_kproc0(p->p_ucred);
+ audit_cred_kproc0(newcred);
#endif
#ifdef MAC
- mac_cred_create_swapper(p->p_ucred);
+ mac_cred_create_swapper(newcred);
#endif
- td->td_ucred = crhold(p->p_ucred);
-
/* Create sigacts. */
p->p_sigacts = sigacts_alloc();
@@ -556,7 +561,7 @@ proc0_init(void *dummy __unused)
siginit(&proc0);
/* Create the file descriptor table. */
- p->p_fd = fdinit(NULL);
+ p->p_fd = fdinit(NULL, false);
p->p_fdtol = NULL;
/* Create the limits structures. */
@@ -573,22 +578,26 @@ proc0_init(void *dummy __unused)
p->p_limit->pl_rlimit[RLIMIT_STACK].rlim_cur = dflssiz;
p->p_limit->pl_rlimit[RLIMIT_STACK].rlim_max = maxssiz;
/* Cast to avoid overflow on i386/PAE. */
- pageablemem = ptoa((vm_paddr_t)cnt.v_free_count);
+ pageablemem = ptoa((vm_paddr_t)vm_cnt.v_free_count);
p->p_limit->pl_rlimit[RLIMIT_RSS].rlim_cur =
p->p_limit->pl_rlimit[RLIMIT_RSS].rlim_max = pageablemem;
p->p_limit->pl_rlimit[RLIMIT_MEMLOCK].rlim_cur = pageablemem / 3;
p->p_limit->pl_rlimit[RLIMIT_MEMLOCK].rlim_max = pageablemem;
p->p_cpulimit = RLIM_INFINITY;
+ PROC_LOCK(p);
+ thread_cow_get_proc(td, p);
+ PROC_UNLOCK(p);
+
/* Initialize resource accounting structures. */
racct_create(&p->p_racct);
p->p_stats = pstats_alloc();
/* Allocate a prototype map so we have something to fork. */
- pmap_pinit0(vmspace_pmap(&vmspace0));
p->p_vmspace = &vmspace0;
vmspace0.vm_refcnt = 1;
+ pmap_pinit0(vmspace_pmap(&vmspace0));
/*
* proc0 is not expected to enter usermode, so there is no special
@@ -613,11 +622,9 @@ proc0_init(void *dummy __unused)
PROC_LOCK(p);
racct_add_force(p, RACCT_NPROC, 1);
PROC_UNLOCK(p);
-#endif /* __rtems__ */
}
SYSINIT(p0init, SI_SUB_INTRINSIC, SI_ORDER_FIRST, proc0_init, NULL);
-#ifndef __rtems__
/* ARGSUSED*/
static void
proc0_post(void *dummy __unused)
@@ -634,9 +641,9 @@ proc0_post(void *dummy __unused)
sx_slock(&allproc_lock);
FOREACH_PROC_IN_SYSTEM(p) {
microuptime(&p->p_stats->p_start);
- PROC_SLOCK(p);
+ PROC_STATLOCK(p);
rufetch(p, &ru); /* Clears thread stats */
- PROC_SUNLOCK(p);
+ PROC_STATUNLOCK(p);
p->p_rux.rux_runtime = 0;
p->p_rux.rux_uticks = 0;
p->p_rux.rux_sticks = 0;
@@ -696,7 +703,7 @@ static char init_path[MAXPATHLEN] =
#ifdef INIT_PATH
__XSTRING(INIT_PATH);
#else
- "/sbin/init:/sbin/oinit:/sbin/init.bak:/rescue/init:/stand/sysinstall";
+ "/sbin/init:/sbin/oinit:/sbin/init.bak:/rescue/init";
#endif
SYSCTL_STRING(_kern, OID_AUTO, init_path, CTLFLAG_RD, init_path, 0,
"Path used to search the init process");
@@ -737,17 +744,20 @@ start_init(void *dummy)
vfs_mountroot();
+ /* Wipe GELI passphrase from the environment. */
+ kern_unsetenv("kern.geom.eli.passphrase");
+
/*
* Need just enough stack to hold the faked-up "execve()" arguments.
*/
addr = p->p_sysent->sv_usrstack - PAGE_SIZE;
- if (vm_map_find(&p->p_vmspace->vm_map, NULL, 0, &addr, PAGE_SIZE,
- FALSE, VM_PROT_ALL, VM_PROT_ALL, 0) != 0)
+ if (vm_map_find(&p->p_vmspace->vm_map, NULL, 0, &addr, PAGE_SIZE, 0,
+ VMFS_NO_SPACE, VM_PROT_ALL, VM_PROT_ALL, 0) != 0)
panic("init: couldn't allocate argument space");
p->p_vmspace->vm_maxsaddr = (caddr_t)addr;
p->p_vmspace->vm_ssize = 1;
- if ((var = getenv("init_path")) != NULL) {
+ if ((var = kern_getenv("init_path")) != NULL) {
strlcpy(init_path, var, sizeof(init_path));
freeenv(var);
}
@@ -801,7 +811,7 @@ start_init(void *dummy)
/*
* Move out the arg pointers.
*/
- uap = (char **)((intptr_t)ucp & ~(sizeof(intptr_t)-1));
+ uap = (char **)rounddown2((intptr_t)ucp, sizeof(intptr_t));
(void)suword((caddr_t)--uap, (long)0); /* terminator */
(void)suword((caddr_t)--uap, (long)(intptr_t)arg1);
(void)suword((caddr_t)--uap, (long)(intptr_t)arg0);
@@ -842,18 +852,25 @@ start_init(void *dummy)
static void
create_init(const void *udata __unused)
{
+ struct fork_req fr;
struct ucred *newcred, *oldcred;
+ struct thread *td;
int error;
- error = fork1(&thread0, RFFDG | RFPROC | RFSTOPPED, 0, &initproc,
- NULL, 0);
+ bzero(&fr, sizeof(fr));
+ fr.fr_flags = RFFDG | RFPROC | RFSTOPPED;
+ fr.fr_procp = &initproc;
+ error = fork1(&thread0, &fr);
if (error)
panic("cannot fork init: %d\n", error);
KASSERT(initproc->p_pid == 1, ("create_init: initproc->p_pid != 1"));
/* divorce init's credentials from the kernel's */
newcred = crget();
+ sx_xlock(&proctree_lock);
PROC_LOCK(initproc);
initproc->p_flag |= P_SYSTEM | P_INMEM;
+ initproc->p_treeflag |= P_TREE_REAPER;
+ LIST_INSERT_HEAD(&initproc->p_reaplist, &proc0, p_reapsibling);
oldcred = initproc->p_ucred;
crcopy(newcred, oldcred);
#ifdef MAC
@@ -862,11 +879,15 @@ create_init(const void *udata __unused)
#ifdef AUDIT
audit_cred_proc1(newcred);
#endif
- initproc->p_ucred = newcred;
+ proc_set_cred(initproc, newcred);
+ td = FIRST_THREAD_IN_PROC(initproc);
+ crfree(td->td_ucred);
+ td->td_ucred = crhold(initproc->p_ucred);
PROC_UNLOCK(initproc);
+ sx_xunlock(&proctree_lock);
crfree(oldcred);
- cred_update_thread(FIRST_THREAD_IN_PROC(initproc));
- cpu_set_fork_handler(FIRST_THREAD_IN_PROC(initproc), start_init, NULL);
+ cpu_fork_kthread_handler(FIRST_THREAD_IN_PROC(initproc),
+ start_init, NULL);
}
SYSINIT(init, SI_SUB_CREATE_INIT, SI_ORDER_FIRST, create_init, NULL);
@@ -884,5 +905,5 @@ kick_init(const void *udata __unused)
sched_add(td, SRQ_BORING);
thread_unlock(td);
}
-SYSINIT(kickinit, SI_SUB_KTHREAD_INIT, SI_ORDER_FIRST, kick_init, NULL);
+SYSINIT(kickinit, SI_SUB_KTHREAD_INIT, SI_ORDER_MIDDLE, kick_init, NULL);
#endif /* __rtems__ */