4.2 distribution
[unix-history] / usr / src / sys / kern / init_main.c
index ec291d8..b244654 100644 (file)
@@ -1,9 +1,12 @@
-/*     init_main.c     4.29    82/04/19        */
+/*     init_main.c     6.1     83/07/29        */
+
+#include "../machine/pte.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
 #include "../h/dir.h"
 #include "../h/user.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/fs.h"
 #include "../h/mount.h"
 #include "../h/map.h"
 #include "../h/seg.h"
 #include "../h/conf.h"
 #include "../h/buf.h"
 #include "../h/seg.h"
 #include "../h/conf.h"
 #include "../h/buf.h"
-#include "../h/mtpr.h"
-#include "../h/pte.h"
-#include "../h/clock.h"
 #include "../h/vm.h"
 #include "../h/cmap.h"
 #include "../h/text.h"
 #include "../h/vm.h"
 #include "../h/cmap.h"
 #include "../h/text.h"
-#include "../h/vlimit.h"
 #include "../h/clist.h"
 #ifdef INET
 #include "../h/protosw.h"
 #endif
 #include "../h/clist.h"
 #ifdef INET
 #include "../h/protosw.h"
 #endif
+#include "../h/quota.h"
+#include "../machine/reg.h"
+#include "../machine/cpu.h"
 
 
+extern struct user u;          /* have to declare it somewhere! */
 /*
  * Initialization code.
  * Called from cold start routine as
 /*
  * Initialization code.
  * Called from cold start routine as
  *     cannot be executed.
  */
 main(firstaddr)
  *     cannot be executed.
  */
 main(firstaddr)
+       int firstaddr;
 {
        register int i;
        register struct proc *p;
 {
        register int i;
        register struct proc *p;
-       struct fs *fsp;
+       struct fs *fs;
+       int s;
 
        rqinit();
 #include "loop.h"
 
        rqinit();
 #include "loop.h"
@@ -55,7 +60,7 @@ main(firstaddr)
         * set up system process 0 (swapper)
         */
        p = &proc[0];
         * set up system process 0 (swapper)
         */
        p = &proc[0];
-       p->p_p0br = (struct pte *)mfpr(P0BR);
+       p->p_p0br = u.u_pcb.pcb_p0br;
        p->p_szpt = 1;
        p->p_addr = uaddr(p);
        p->p_stat = SRUN;
        p->p_szpt = 1;
        p->p_addr = uaddr(p);
        p->p_stat = SRUN;
@@ -64,21 +69,25 @@ main(firstaddr)
        setredzone(p->p_addr, (caddr_t)&u);
        u.u_procp = p;
        u.u_cmask = CMASK;
        setredzone(p->p_addr, (caddr_t)&u);
        u.u_procp = p;
        u.u_cmask = CMASK;
-       for (i = 1; i < sizeof(u.u_limit)/sizeof(u.u_limit[0]); i++)
-               switch (i) {
-
-               case LIM_STACK:
-                       u.u_limit[i] = 512*1024;
-                       continue;
-               case LIM_DATA:
-                       u.u_limit[i] = ctob(MAXDSIZ);
-                       continue;
-               default:
-                       u.u_limit[i] = INFINITY;
-                       continue;
-               }
-       p->p_maxrss = INFINITY/NBPG;
-       clkstart();
+       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(MAXDSIZ);
+       u.u_rlimit[RLIMIT_DATA].rlim_max =
+           u.u_rlimit[RLIMIT_DATA].rlim_cur = ctob(MAXDSIZ);
+       p->p_maxrss = RLIM_INFINITY/NBPG;
+#ifdef QUOTA
+       qtinit();
+       p->p_quota = u.u_quota = getquota(0, 0, Q_NDQ);
+#endif
+       startrtclock();
+#include "kg.h"
+#if NKG > 0
+       startkgclock();
+#endif
 
        /*
         * Initialize tables, protocols, and set up well-known inodes.
 
        /*
         * Initialize tables, protocols, and set up well-known inodes.
@@ -89,20 +98,45 @@ main(firstaddr)
 #if NLOOP > 0
        loattach();                     /* XXX */
 #endif
 #if NLOOP > 0
        loattach();                     /* XXX */
 #endif
+       /*
+        * Block reception of incoming packets
+        * until protocols have been initialized.
+        */
+       s = splimp();
        ifinit();
        ifinit();
-       pfinit();                       /* must follow interfaces */
+#endif
+       domaininit();
+#ifdef INET
+       splx(s);
 #endif
        ihinit();
        bhinit();
        binit();
        bswinit();
 #endif
        ihinit();
        bhinit();
        binit();
        bswinit();
-       iinit();
-       fsp = getfs(rootdev);
-       rootdir = iget(rootdev, fsp, (ino_t)ROOTINO);
-       rootdir->i_flag &= ~ILOCK;
-       u.u_cdir = iget(rootdev, fsp, (ino_t)ROOTINO);
-       u.u_cdir->i_flag &= ~ILOCK;
+#ifdef GPROF
+       kmstartup();
+#endif
+
+       fs = mountfs(rootdev, 0, (struct inode *)0);
+       if (fs == 0)
+               panic("iinit");
+       bcopy("/", fs->fs_fsmnt, 2);
+
+       inittodr(fs->fs_time);
+       boottime = time;
+
+/* kick off timeout driven events by calling first time */
+       roundrobin();
+       schedcpu();
+       schedpaging();
+
+/* set up the root file system */
+       rootdir = iget(rootdev, fs, (ino_t)ROOTINO);
+       iunlock(rootdir);
+       u.u_cdir = iget(rootdev, fs, (ino_t)ROOTINO);
+       iunlock(u.u_cdir);
        u.u_rdir = NULL;
        u.u_rdir = NULL;
+
        u.u_dmap = zdmap;
        u.u_smap = zdmap;
 
        u.u_dmap = zdmap;
        u.u_smap = zdmap;
 
@@ -124,6 +158,7 @@ main(firstaddr)
                proc[2].p_flag |= SLOAD|SSYS;
                proc[2].p_dsize = u.u_dsize = nswbuf*CLSIZE*KLMAX; 
                pageout();
                proc[2].p_flag |= SLOAD|SSYS;
                proc[2].p_dsize = u.u_dsize = nswbuf*CLSIZE*KLMAX; 
                pageout();
+               /*NOTREACHED*/
        }
 
        /*
        }
 
        /*
@@ -135,7 +170,7 @@ main(firstaddr)
        proc[1].p_stat = 0;
        proc[0].p_szpt = CLSIZE;
        if (newproc(0)) {
        proc[1].p_stat = 0;
        proc[0].p_szpt = CLSIZE;
        if (newproc(0)) {
-               expand(clrnd((int)btoc(szicode)), P0BR);
+               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);
                /*
                (void) swpexpand(u.u_dsize, 0, &u.u_dmap, &u.u_smap);
                (void) copyout((caddr_t)icode, (caddr_t)0, (unsigned)szicode);
                /*
@@ -149,51 +184,15 @@ main(firstaddr)
 }
 
 /*
 }
 
 /*
- * iinit is called once (from main)
- * very early in initialization.
- * It reads the root's super block
- * and initializes the current date
- * from the last modified date.
- *
- * panic: iinit -- cannot read the super
- * block. Usually because of an IO error.
+ * Initialize hash links for buffers.
  */
  */
-iinit()
+bhinit()
 {
 {
-       register struct buf *bp;
-       register struct fs *fp;
        register int i;
        register int i;
-       int blks;
+       register struct bufhd *bp;
 
 
-       (*bdevsw[major(rootdev)].d_open)(rootdev, 1);
-       bp = bread(rootdev, SBLOCK, SBSIZE);
-       if(u.u_error)
-               panic("iinit");
-       bp->b_flags |= B_LOCKED;                /* block can never be re-used */
-       brelse(bp);
-       mount[0].m_dev = rootdev;
-       mount[0].m_bufp = bp;
-       fp = bp->b_un.b_fs;
-       if (fp->fs_magic != FS_MAGIC)
-               panic("root bad magic number");
-       if (fp->fs_bsize > MAXBSIZE)
-               panic("root fs_bsize too big");
-       fp->fs_ronly = 0;
-       fp->fs_fsmnt[0] = '/';
-       for (i = 1; i < sizeof(fp->fs_fsmnt); i++)
-               fp->fs_fsmnt[i] = 0;
-       blks = howmany(fp->fs_cssize, fp->fs_fsize);
-       for (i = 0; i < blks; i += fp->fs_frag) {
-               bp = bread(rootdev, fsbtodb(fp, fp->fs_csaddr + i),
-                   blks - i < fp->fs_frag ?
-                       (blks - i) * fp->fs_fsize :
-                       fp->fs_bsize);
-               if (u.u_error)
-                       panic("root can't read csum");
-               fp->fs_csp[i / fp->fs_frag] = bp->b_un.b_cs;
-               bp->b_flags |= B_LOCKED;
-               brelse(bp);
-       }
+       for (bp = bufhash, i = 0; i < BUFHSZ; i++, bp++)
+               bp->b_forw = bp->b_back = (struct buf *)bp;
 }
 
 /*
 }
 
 /*
@@ -202,43 +201,46 @@ iinit()
  */
 binit()
 {
  */
 binit()
 {
-       register struct buf *bp;
-       register struct buf *dp;
+       register struct buf *bp, *dp;
        register int i;
        register int i;
-       struct bdevsw *bdp;
        struct swdevt *swp;
        struct swdevt *swp;
+       int base, residual;
 
        for (dp = bfreelist; dp < &bfreelist[BQUEUES]; dp++) {
                dp->b_forw = dp->b_back = dp->av_forw = dp->av_back = dp;
                dp->b_flags = B_HEAD;
        }
 
        for (dp = bfreelist; dp < &bfreelist[BQUEUES]; dp++) {
                dp->b_forw = dp->b_back = dp->av_forw = dp->av_back = dp;
                dp->b_flags = B_HEAD;
        }
-       dp--;                           /* dp = &bfreelist[BQUEUES-1]; */
+       base = bufpages / nbuf;
+       residual = bufpages % nbuf;
        for (i = 0; i < nbuf; i++) {
                bp = &buf[i];
                bp->b_dev = NODEV;
        for (i = 0; i < nbuf; i++) {
                bp = &buf[i];
                bp->b_dev = NODEV;
+               bp->b_bcount = 0;
                bp->b_un.b_addr = buffers + i * MAXBSIZE;
                bp->b_un.b_addr = buffers + i * MAXBSIZE;
-               bp->b_bcount = MAXBSIZE;
-               bp->b_back = dp;
-               bp->b_forw = dp->b_forw;
-               dp->b_forw->b_back = bp;
-               dp->b_forw = bp;
+               if (i < residual)
+                       bp->b_bufsize = (base + 1) * CLBYTES;
+               else
+                       bp->b_bufsize = base * CLBYTES;
+               binshash(bp, &bfreelist[BQ_AGE]);
                bp->b_flags = B_BUSY|B_INVAL;
                brelse(bp);
        }
                bp->b_flags = B_BUSY|B_INVAL;
                brelse(bp);
        }
-       for (bdp = bdevsw; bdp->d_open; bdp++)
-               nblkdev++;
        /*
         * Count swap devices, and adjust total swap space available.
         * Some of this space will not be available until a vswapon()
         * system is issued, usually when the system goes multi-user.
         */
        nswdev = 0;
        /*
         * Count swap devices, and adjust total swap space available.
         * Some of this space will not be available until a vswapon()
         * system is issued, usually when the system goes multi-user.
         */
        nswdev = 0;
-       for (swp = swdevt; swp->sw_dev; swp++)
+       nswap = 0;
+       for (swp = swdevt; swp->sw_dev; swp++) {
                nswdev++;
                nswdev++;
+               if (swp->sw_nblks > nswap)
+                       nswap = swp->sw_nblks;
+       }
        if (nswdev == 0)
                panic("binit");
        if (nswdev > 1)
        if (nswdev == 0)
                panic("binit");
        if (nswdev > 1)
-               nswap = (nswap/DMMAX)*DMMAX;
+               nswap = ((nswap + dmmax - 1) / dmmax) * dmmax;
        nswap *= nswdev;
        maxpgio *= nswdev;
        swfree(0);
        nswap *= nswdev;
        maxpgio *= nswdev;
        swfree(0);
@@ -269,7 +271,6 @@ cinit()
 {
        register int ccp;
        register struct cblock *cp;
 {
        register int ccp;
        register struct cblock *cp;
-       register struct cdevsw *cdp;
 
        ccp = (int)cfree;
        ccp = (ccp+CROUND) & ~CROUND;
 
        ccp = (int)cfree;
        ccp = (ccp+CROUND) & ~CROUND;
@@ -278,8 +279,4 @@ cinit()
                cfreelist = cp;
                cfreecount += CBSIZE;
        }
                cfreelist = cp;
                cfreecount += CBSIZE;
        }
-       ccp = 0;
-       for(cdp = cdevsw; cdp->d_open; cdp++)
-               ccp++;
-       nchrdev = ccp;
 }
 }