summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/kern/init_main.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2013-11-06 16:20:21 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-11-11 10:08:08 +0100
commit66659ff1ad6831b0ea7425fa6ecd8a8687523658 (patch)
tree48e22b475fa8854128e0861a33fed6f78c8094b5 /freebsd/sys/kern/init_main.c
parentDefine __GLOBL1() and __GLOBL() (diff)
downloadrtems-libbsd-66659ff1ad6831b0ea7425fa6ecd8a8687523658.tar.bz2
Update to FreeBSD 9.2
Diffstat (limited to 'freebsd/sys/kern/init_main.c')
-rw-r--r--freebsd/sys/kern/init_main.c96
1 files changed, 68 insertions, 28 deletions
diff --git a/freebsd/sys/kern/init_main.c b/freebsd/sys/kern/init_main.c
index 23170bb6..e694f479 100644
--- a/freebsd/sys/kern/init_main.c
+++ b/freebsd/sys/kern/init_main.c
@@ -57,11 +57,13 @@ __FBSDID("$FreeBSD$");
#include <sys/jail.h>
#include <sys/ktr.h>
#include <rtems/bsd/sys/lock.h>
+#include <sys/loginclass.h>
#include <sys/mount.h>
#include <sys/mutex.h>
#include <sys/syscallsubr.h>
#include <sys/sysctl.h>
#include <sys/proc.h>
+#include <sys/racct.h>
#include <sys/resourcevar.h>
#include <sys/systm.h>
#include <sys/signalvar.h>
@@ -103,9 +105,11 @@ struct vmspace vmspace0;
struct proc *initproc;
int boothowto = 0; /* initialized so that it can be patched */
-SYSCTL_INT(_debug, OID_AUTO, boothowto, CTLFLAG_RD, &boothowto, 0, "");
+SYSCTL_INT(_debug, OID_AUTO, boothowto, CTLFLAG_RD, &boothowto, 0,
+ "Boot control flags, passed from loader");
int bootverbose;
-SYSCTL_INT(_debug, OID_AUTO, bootverbose, CTLFLAG_RW, &bootverbose, 0, "");
+SYSCTL_INT(_debug, OID_AUTO, bootverbose, CTLFLAG_RW, &bootverbose, 0,
+ "Control the output of verbose kernel messages");
/*
* This ensures that there is at least one entry so that the sysinit_set
@@ -160,6 +164,24 @@ sysinit_add(struct sysinit **set, struct sysinit **set_end)
}
#endif /* __rtems__ */
+#if defined (DDB) && defined(VERBOSE_SYSINIT)
+static const char *
+symbol_name(vm_offset_t va, db_strategy_t strategy)
+{
+ const char *name;
+ c_db_sym_t sym;
+ db_expr_t offset;
+
+ if (va == 0)
+ return (NULL);
+ sym = db_search_symbol(va, strategy, &offset);
+ if (offset != 0)
+ return (NULL);
+ db_symbol_values(sym, &name, NULL);
+ return (name);
+}
+#endif
+
/*
* System startup; initialize the world, create process 0, mount root
* filesystem, and fork to create init and pagedaemon. Most of the
@@ -248,15 +270,16 @@ restart:
}
if (verbose) {
#if defined(DDB)
- const char *name;
- c_db_sym_t sym;
- db_expr_t offset;
-
- sym = db_search_symbol((vm_offset_t)(*sipp)->func,
- DB_STGY_PROC, &offset);
- db_symbol_values(sym, &name, NULL);
- if (name != NULL)
- printf(" %s(%p)... ", name, (*sipp)->udata);
+ const char *func, *data;
+
+ func = symbol_name((vm_offset_t)(*sipp)->func,
+ DB_STGY_PROC);
+ data = symbol_name((vm_offset_t)(*sipp)->udata,
+ DB_STGY_ANY);
+ if (func != NULL && data != NULL)
+ printf(" %s(&%s)... ", func, data);
+ else if (func != NULL)
+ printf(" %s(%p)... ", func, (*sipp)->udata);
else
#endif
printf(" %p(%p)... ", (*sipp)->func,
@@ -418,8 +441,9 @@ proc0_init(void *dummy __unused)
{
#ifndef __rtems__
struct proc *p;
- unsigned i;
struct thread *td;
+ vm_paddr_t pageablemem;
+ int i;
GIANT_REQUIRED;
p = &proc0;
@@ -474,11 +498,14 @@ proc0_init(void *dummy __unused)
knlist_init_mtx(&p->p_klist, &p->p_mtx);
STAILQ_INIT(&p->p_ktr);
p->p_nice = NZERO;
+ /* pid_max cannot be greater than PID_MAX */
td->td_tid = PID_MAX + 1;
+ LIST_INSERT_HEAD(TIDHASH(td->td_tid), td, td_hash);
td->td_state = TDS_RUNNING;
td->td_pri_class = PRI_TIMESHARE;
td->td_user_pri = PUSER;
td->td_base_user_pri = PUSER;
+ td->td_lend_user_pri = PRI_MAX;
td->td_priority = PVM;
td->td_base_pri = PVM;
td->td_oncpu = 0;
@@ -492,7 +519,7 @@ proc0_init(void *dummy __unused)
strncpy(p->p_comm, "kernel", sizeof (p->p_comm));
strncpy(td->td_name, "swapper", sizeof (td->td_name));
- callout_init(&p->p_itcallout, CALLOUT_MPSAFE);
+ 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);
@@ -502,6 +529,7 @@ proc0_init(void *dummy __unused)
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");
#ifdef AUDIT
audit_cred_kproc0(p->p_ucred);
#endif
@@ -529,12 +557,21 @@ proc0_init(void *dummy __unused)
p->p_limit->pl_rlimit[RLIMIT_NOFILE].rlim_max = maxfiles;
p->p_limit->pl_rlimit[RLIMIT_NPROC].rlim_cur =
p->p_limit->pl_rlimit[RLIMIT_NPROC].rlim_max = maxproc;
- i = ptoa(cnt.v_free_count);
- p->p_limit->pl_rlimit[RLIMIT_RSS].rlim_max = i;
- p->p_limit->pl_rlimit[RLIMIT_MEMLOCK].rlim_max = i;
- p->p_limit->pl_rlimit[RLIMIT_MEMLOCK].rlim_cur = i / 3;
+ p->p_limit->pl_rlimit[RLIMIT_DATA].rlim_cur = dfldsiz;
+ p->p_limit->pl_rlimit[RLIMIT_DATA].rlim_max = maxdsiz;
+ 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);
+ 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;
+ /* Initialize resource accounting structures. */
+ racct_create(&p->p_racct);
+
p->p_stats = pstats_alloc();
/* Allocate a prototype map so we have something to fork. */
@@ -546,14 +583,12 @@ proc0_init(void *dummy __unused)
* proc0 is not expected to enter usermode, so there is no special
* handling for sv_minuser here, like is done for exec_new_vmspace().
*/
- vm_map_init(&vmspace0.vm_map, p->p_sysent->sv_minuser,
- p->p_sysent->sv_maxuser);
- vmspace0.vm_map.pmap = vmspace_pmap(&vmspace0);
-
- /*-
- * call the init and ctor for the new thread and proc
- * we wait to do this until all other structures
- * are fairly sane.
+ vm_map_init(&vmspace0.vm_map, vmspace_pmap(&vmspace0),
+ p->p_sysent->sv_minuser, p->p_sysent->sv_maxuser);
+
+ /*
+ * Call the init and ctor for the new thread and proc. We wait
+ * to do this until all other structures are fairly sane.
*/
EVENTHANDLER_INVOKE(process_init, p);
EVENTHANDLER_INVOKE(thread_init, td);
@@ -564,6 +599,9 @@ proc0_init(void *dummy __unused)
* Charge root for one process.
*/
(void)chgproccnt(p->p_ucred->cr_ruidinfo, 1, 0);
+ 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);
@@ -661,7 +699,8 @@ SYSCTL_STRING(_kern, OID_AUTO, init_path, CTLFLAG_RD, init_path, 0,
#endif
static int init_shutdown_timeout = INIT_SHUTDOWN_TIMEOUT;
SYSCTL_INT(_kern, OID_AUTO, init_shutdown_timeout,
- CTLFLAG_RW, &init_shutdown_timeout, 0, "");
+ CTLFLAG_RW, &init_shutdown_timeout, 0, "Shutdown timeout of init(8). "
+ "Unused within kernel, but used to control init(8)");
/*
* Start the initial user process; try exec'ing each pathname in init_path.
@@ -770,7 +809,7 @@ start_init(void *dummy)
* Otherwise, return via fork_trampoline() all the way
* to user mode as init!
*/
- if ((error = execve(td, &args)) == 0) {
+ if ((error = sys_execve(td, &args)) == 0) {
mtx_unlock(&Giant);
return;
}
@@ -795,7 +834,8 @@ create_init(const void *udata __unused)
struct ucred *newcred, *oldcred;
int error;
- error = fork1(&thread0, RFFDG | RFPROC | RFSTOPPED, 0, &initproc);
+ error = fork1(&thread0, RFFDG | RFPROC | RFSTOPPED, 0, &initproc,
+ NULL, 0);
if (error)
panic("cannot fork init: %d\n", error);
KASSERT(initproc->p_pid == 1, ("create_init: initproc->p_pid != 1"));