-/* init_main.c 6.3 84/05/22 */
+/*
+ * Copyright (c) 1982, 1986 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ *
+ * @(#)init_main.c 7.7 (Berkeley) %G%
+ */
#include "../machine/pte.h"
-#include "../h/param.h"
-#include "../h/systm.h"
-#include "../h/dir.h"
-#include "../h/user.h"
-#include "../h/kernel.h"
-#include "../h/fs.h"
-#include "../h/mount.h"
-#include "../h/map.h"
-#include "../h/proc.h"
-#include "../h/inode.h"
-#include "../h/seg.h"
-#include "../h/conf.h"
-#include "../h/buf.h"
-#include "../h/vm.h"
-#include "../h/cmap.h"
-#include "../h/text.h"
-#include "../h/clist.h"
-#ifdef INET
-#include "../h/protosw.h"
-#endif
-#include "../h/quota.h"
+#include "param.h"
+#include "systm.h"
+#include "dir.h"
+#include "user.h"
+#include "kernel.h"
+#include "fs.h"
+#include "mount.h"
+#include "map.h"
+#include "proc.h"
+#include "inode.h"
+#include "seg.h"
+#include "conf.h"
+#include "buf.h"
+#include "vm.h"
+#include "cmap.h"
+#include "text.h"
+#include "clist.h"
+#include "malloc.h"
+#include "protosw.h"
+#include "quota.h"
+#include "reboot.h"
#include "../machine/reg.h"
#include "../machine/cpu.h"
-extern struct user u; /* have to declare it somewhere! */
+int cmask = CMASK;
/*
* Initialization code.
* Called from cold start routine as
* hand craft 0th process
* call all initialization routines
* fork - process 0 to schedule
- * - process 2 to page out
* - process 1 execute bootstrap
- *
- * loop at loc 13 (0xd) in user mode -- /etc/init
- * cannot be executed.
+ * - process 2 to page out
*/
main(firstaddr)
int firstaddr;
{
register int i;
register struct proc *p;
+ register struct pgrp *pg;
struct fs *fs;
int s;
p->p_nice = NZERO;
setredzone(p->p_addr, (caddr_t)&u);
u.u_procp = p;
- u.u_cmask = CMASK;
+ MALLOC(pgrphash[0], struct pgrp *, sizeof (struct pgrp),
+ M_PGRP, M_NOWAIT);
+ if ((pg = pgrphash[0]) == NULL)
+ panic("no space to craft zero'th process group");
+ pg->pg_id = 0;
+ pg->pg_hforw = 0;
+ pg->pg_mem = p;
+ pg->pg_jobc = 0;
+ p->p_pgrp = pg;
+ p->p_pgrpnxt = 0;
+ MALLOC(pg->pg_session, struct session *, sizeof (struct session),
+ M_SESSION, M_NOWAIT);
+ if (pg->pg_session == NULL)
+ panic("no space to craft zero'th session");
+ pg->pg_session->s_count = 1;
+ pg->pg_session->s_leader = 0;
+ /*
+ * These assume that the u. area is always mapped
+ * to the same virtual address. Otherwise must be
+ * handled when copying the u. area in newproc().
+ */
+ u.u_nd.ni_iov = &u.u_nd.ni_iovec;
+ u.u_ap = u.u_arg;
+ u.u_nd.ni_iovcnt = 1;
+
+ u.u_cmask = cmask;
+ u.u_lastfile = -1;
for (i = 1; i < NGROUPS; i++)
u.u_groups[i] = NOGROUP;
for (i = 0; i < sizeof(u.u_rlimit)/sizeof(u.u_rlimit[0]); i++)
u.u_rlimit[i].rlim_cur = u.u_rlimit[i].rlim_max =
RLIM_INFINITY;
- u.u_rlimit[RLIMIT_STACK].rlim_cur = 512*1024;
- u.u_rlimit[RLIMIT_STACK].rlim_max = ctob(MAXSSIZ);
- u.u_rlimit[RLIMIT_DATA].rlim_max =
- u.u_rlimit[RLIMIT_DATA].rlim_cur = ctob(MAXDSIZ);
- p->p_maxrss = RLIM_INFINITY/NBPG;
+ /*
+ * configure virtual memory system,
+ * set vm rlimits
+ */
+ vminit();
+
#if defined(QUOTA)
qtinit();
p->p_quota = u.u_quota = getquota(0, 0, Q_NDQ);
#endif
startrtclock();
+#if defined(vax)
#include "kg.h"
#if NKG > 0
startkgclock();
+#endif
#endif
/*
* Initialize tables, protocols, and set up well-known inodes.
*/
mbinit();
- cinit(); /* needed by dmc-11 driver */
-#ifdef INET
+ cinit();
+#include "sl.h"
+#if NSL > 0
+ slattach(); /* XXX */
+#endif
#if NLOOP > 0
loattach(); /* XXX */
#endif
*/
s = splimp();
ifinit();
-#endif
domaininit();
-#ifdef INET
splx(s);
-#endif
pqinit();
+ xinit();
ihinit();
- bhinit();
- binit();
- bswinit();
+ swapinit();
nchinit();
#ifdef GPROF
kmstartup();
#endif
- fs = mountfs(rootdev, 0, (struct inode *)0);
+ fs = mountfs(rootdev, boothowto & RB_RDONLY, (struct inode *)0);
if (fs == 0)
panic("iinit");
bcopy("/", fs->fs_fsmnt, 2);
u.u_dmap = zdmap;
u.u_smap = zdmap;
+ enablertclock(); /* enable realtime clock interrupts */
/*
- * Set the scan rate and other parameters of the paging subsystem.
+ * make init process
*/
- setupclock();
+ proc[0].p_szpt = CLSIZE;
+ if (newproc(0)) {
+ expand(clrnd((int)btoc(szicode)), 0);
+ (void) swpexpand(u.u_dsize, (size_t)0, &u.u_dmap, &u.u_smap);
+ (void) copyout((caddr_t)icode, (caddr_t)0, (unsigned)szicode);
+ /*
+ * Return goes to loc. 0 of user init
+ * code just copied out.
+ */
+ return;
+ }
/*
* make page-out daemon (process 2)
* the daemon has ctopt(nswbuf*CLSIZE*KLMAX) pages of page
* table so that it can map dirty pages into
* its address space during asychronous pushes.
*/
- mpid = 1;
proc[0].p_szpt = clrnd(ctopt(nswbuf*CLSIZE*KLMAX + UPAGES));
- proc[1].p_stat = SZOMB; /* force it to be in proc slot 2 */
- p = freeproc;
- freeproc = p->p_nxt;
if (newproc(0)) {
proc[2].p_flag |= SLOAD|SSYS;
proc[2].p_dsize = u.u_dsize = nswbuf*CLSIZE*KLMAX;
}
/*
- * make init process and
* enter scheduling loop
*/
-
- mpid = 0;
- proc[1].p_stat = 0;
- proc[0].p_szpt = CLSIZE;
- p->p_nxt = freeproc;
- freeproc = p;
- if (newproc(0)) {
- expand(clrnd((int)btoc(szicode)), 0);
- (void) swpexpand(u.u_dsize, 0, &u.u_dmap, &u.u_smap);
- (void) copyout((caddr_t)icode, (caddr_t)0, (unsigned)szicode);
- /*
- * Return goes to loc. 0 of user init
- * code just copied out.
- */
- return;
- }
proc[0].p_szpt = 1;
sched();
}
{
register struct buf *bp, *dp;
register int i;
- struct swdevt *swp;
int base, residual;
for (dp = bfreelist; dp < &bfreelist[BQUEUES]; dp++) {
bp->b_flags = B_BUSY|B_INVAL;
brelse(bp);
}
+}
+
+/*
+ * Set up swap devices.
+ * Initialize linked list of free swap
+ * headers. These do not actually point
+ * to buffers, but rather to pages that
+ * are being swapped in and out.
+ */
+swapinit()
+{
+ register int i;
+ register struct buf *sp = swbuf;
+ struct swdevt *swp;
+ int error;
+
/*
* Count swap devices, and adjust total swap space available.
- * Some of this space will not be available until a vswapon()
+ * Some of this space will not be available until a swapon()
* system is issued, usually when the system goes multi-user.
*/
nswdev = 0;
nswap = swp->sw_nblks;
}
if (nswdev == 0)
- panic("binit");
+ panic("swapinit");
if (nswdev > 1)
nswap = ((nswap + dmmax - 1) / dmmax) * dmmax;
nswap *= nswdev;
- maxpgio *= nswdev;
- swfree(0);
-}
-
-/*
- * Initialize linked list of free swap
- * headers. These do not actually point
- * to buffers, but rather to pages that
- * are being swapped in and out.
- */
-bswinit()
-{
- register int i;
- register struct buf *sp = swbuf;
+ /*
+ * If there are multiple swap areas,
+ * allow more paging operations per second.
+ */
+ if (nswdev > 1)
+ maxpgio = (maxpgio * (2 * nswdev - 1)) / 2;
+ if (error = swfree(0)) {
+ printf("swfree errno %d\n", error); /* XXX */
+ panic("swapinit swfree 0");
+ }
+ /*
+ * Now set up swap buffer headers.
+ */
bswlist.av_forw = sp;
for (i=0; i<nswbuf-1; i++, sp++)
sp->av_forw = sp+1;