+ consinit();
+ printf(copyright);
+
+ vm_mem_init();
+ kmeminit();
+ cpu_startup();
+
+ /* Create process 0 (the swapper). */
+ p = &proc0;
+ curproc = p;
+
+ allproc = (volatile struct proc *)p;
+ p->p_prev = (struct proc **)&allproc;
+ p->p_pgrp = &pgrp0;
+ pgrphash[0] = &pgrp0;
+ pgrp0.pg_mem = p;
+ pgrp0.pg_session = &session0;
+ session0.s_count = 1;
+ session0.s_leader = p;
+
+ p->p_flag = SLOAD|SSYS;
+ p->p_stat = SRUN;
+ p->p_nice = NZERO;
+ bcopy("swapper", p->p_comm, sizeof ("swapper"));
+
+ /* Create credentials. */
+ cred0.p_refcnt = 1;
+ p->p_cred = &cred0;
+ p->p_ucred = crget();
+ p->p_ucred->cr_ngroups = 1; /* group 0 */
+
+ /* Create the file descriptor table. */
+ fdp = &filedesc0;
+ p->p_fd = &fdp->fd_fd;
+ fdp->fd_fd.fd_refcnt = 1;
+ fdp->fd_fd.fd_cmask = cmask;
+ fdp->fd_fd.fd_ofiles = fdp->fd_dfiles;
+ fdp->fd_fd.fd_ofileflags = fdp->fd_dfileflags;
+ fdp->fd_fd.fd_nfiles = NDFILE;
+
+ /* Create the limits structures. */
+ p->p_limit = &limit0;
+ for (i = 0; i < sizeof(p->p_rlimit)/sizeof(p->p_rlimit[0]); i++)
+ limit0.pl_rlimit[i].rlim_cur =
+ limit0.pl_rlimit[i].rlim_max = RLIM_INFINITY;
+ limit0.pl_rlimit[RLIMIT_NOFILE].rlim_cur = NOFILE;
+ limit0.pl_rlimit[RLIMIT_NPROC].rlim_cur = MAXUPRC;
+ i = ptoa(cnt.v_free_count);
+ limit0.pl_rlimit[RLIMIT_RSS].rlim_max = i;
+ limit0.pl_rlimit[RLIMIT_MEMLOCK].rlim_max = i;
+ limit0.pl_rlimit[RLIMIT_MEMLOCK].rlim_cur = i / 3;
+ limit0.p_refcnt = 1;
+
+ /* Allocate a prototype map so we have something to fork. */
+ p->p_vmspace = &vmspace0;
+ vmspace0.vm_refcnt = 1;
+ pmap_pinit(&vmspace0.vm_pmap);
+ vm_map_init(&p->p_vmspace->vm_map, round_page(VM_MIN_ADDRESS),
+ trunc_page(VM_MAX_ADDRESS), TRUE);
+ vmspace0.vm_map.pmap = &vmspace0.vm_pmap;
+ p->p_addr = proc0paddr; /* XXX */