This commit was generated by cvs2svn to track changes on a CVS vendor
[unix-history] / sys / kern / init_main.c
index 9ecd7e4..4e3470e 100644 (file)
@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  *     from: @(#)init_main.c   7.41 (Berkeley) 5/15/91
  * SUCH DAMAGE.
  *
  *     from: @(#)init_main.c   7.41 (Berkeley) 5/15/91
- *     $Id$
+ *     $Id: init_main.c,v 1.15 1994/03/06 03:20:31 jkh Exp $
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -57,7 +57,7 @@
 
 #include "vm/vm.h"
 
 
 #include "vm/vm.h"
 
-char   copyright[] =
+const char     copyright[] =
 "Copyright (c) 1989,1990,1991,1992 William F. Jolitz. All rights reserved.\n\
 Copyright (c) 1982,1986,1989,1991 The Regents of the University\n\
 of California.  All rights reserved.\n\n";
 "Copyright (c) 1989,1990,1991,1992 William F. Jolitz. All rights reserved.\n\
 Copyright (c) 1982,1986,1989,1991 The Regents of the University\n\
 of California.  All rights reserved.\n\n";
@@ -77,7 +77,7 @@ struct        filedesc0 filedesc0;
 struct plimit limit0;
 struct vmspace vmspace0;
 struct proc *curproc = &proc0;
 struct plimit limit0;
 struct vmspace vmspace0;
 struct proc *curproc = &proc0;
-struct proc *initproc, *pageproc;
+struct proc *initproc, *pageproc, *pagescanproc, *updateproc;
 
 int    cmask = CMASK;
 extern struct user *proc0paddr;
 
 int    cmask = CMASK;
 extern struct user *proc0paddr;
@@ -87,9 +87,18 @@ struct       vnode *rootvp, *swapdev_vp;
 int    boothowto;
 
 #if __GNUC__ >= 2
 int    boothowto;
 
 #if __GNUC__ >= 2
-__main() {}
+void __main() {}
 #endif
 
 #endif
 
+/*
+ * This table is filled in by the linker with functions that need to be
+ * called to initialize various pseudo-devices and whatnot.
+ */
+typedef void (*pseudo_func_t)(void);
+extern const struct linker_set pseudo_set;
+static const pseudo_func_t *pseudos = 
+  (const pseudo_func_t *)&pseudo_set.ls_items[0];
+
 /*
  * System startup; initialize the world, create process 0,
  * mount root filesystem, and fork to create init and pagedaemon.
 /*
  * System startup; initialize the world, create process 0,
  * mount root filesystem, and fork to create init and pagedaemon.
@@ -97,13 +106,14 @@ __main() {}
  * routines including startup(), which does memory initialization
  * and autoconfiguration.
  */
  * routines including startup(), which does memory initialization
  * and autoconfiguration.
  */
+void
 main()
 {
        register int i;
        register struct proc *p;
        register struct filedesc0 *fdp;
        int s, rval[2];
 main()
 {
        register int i;
        register struct proc *p;
        register struct filedesc0 *fdp;
        int s, rval[2];
-       char *cp;
+       const char *cp;
 
        /*
         * Initialize curproc before any possible traps/probes
 
        /*
         * Initialize curproc before any possible traps/probes
@@ -220,21 +230,11 @@ main()
         * Initialize tables, protocols, and set up well-known inodes.
         */
        mbinit();
         * Initialize tables, protocols, and set up well-known inodes.
         */
        mbinit();
-#ifdef SYSVSHM
-       shminit();
-#endif
-#include "sl.h"
-#if NSL > 0
-       slattach();                     /* XXX */
-#endif
-#include "ppp.h"
-#if NPPP > 0
-       pppattach();                    /* XXX */
-#endif
-#include "loop.h"
-#if NLOOP > 0
-       loattach();                     /* XXX */
-#endif
+
+       while(*pseudos) {
+               (**pseudos++)();
+       }
+
        /*
         * Block reception of incoming packets
         * until protocols have been initialized.
        /*
         * Block reception of incoming packets
         * until protocols have been initialized.
@@ -249,8 +249,8 @@ main()
 #endif
 
        /* kick off timeout driven events by calling first time */
 #endif
 
        /* kick off timeout driven events by calling first time */
-       roundrobin();
-       schedcpu();
+       roundrobin(0, 0);
+       schedcpu(0, 0);
        enablertclock();                /* enable realtime clock interrupts */
 
        /*
        enablertclock();                /* enable realtime clock interrupts */
 
        /*
@@ -281,22 +281,20 @@ main()
         * XXX probably should go elsewhere.
         */
        bzero(utsname.sysname, sizeof(utsname.sysname));
         * XXX probably should go elsewhere.
         */
        bzero(utsname.sysname, sizeof(utsname.sysname));
-       for (cp = version, i= 0;
-            *cp && *cp != ' ' && i <= sizeof(utsname.sysname);
-            )
-         utsname.sysname[i++] = *cp++;
+       for (cp = version, i= 0; *cp && *cp != ' ' && i <= sizeof(utsname.sysname);)
+               utsname.sysname[i++] = *cp++;
        bzero(utsname.release, sizeof(utsname.release));
        for (cp++, i= 0; *cp && *cp != ' ' && i <= sizeof(utsname.release);)
        bzero(utsname.release, sizeof(utsname.release));
        for (cp++, i= 0; *cp && *cp != ' ' && i <= sizeof(utsname.release);)
-         utsname.release[i++] = *cp++;
+               utsname.release[i++] = *cp++;
        bzero(utsname.version, sizeof(utsname.version));
        for (; *cp != '('; cp++);
        for (cp++, i= 0; *cp && *cp != ')' && i <= sizeof(utsname.version);)
        bzero(utsname.version, sizeof(utsname.version));
        for (; *cp != '('; cp++);
        for (cp++, i= 0; *cp && *cp != ')' && i <= sizeof(utsname.version);)
-         utsname.version[i++] = *cp++;
+               utsname.version[i++] = *cp++;
        for (; *cp != '#'; cp++);
        if(i <= sizeof(utsname.version))
        for (; *cp != '#'; cp++);
        if(i <= sizeof(utsname.version))
-         utsname.version[i++] = '#';
+               utsname.version[i++] = '#';
        for (cp++; *cp && *cp != ':' && i <= sizeof(utsname.version);)
        for (cp++; *cp && *cp != ':' && i <= sizeof(utsname.version);)
-         utsname.version[i++] = *cp++;
+               utsname.version[i++] = *cp++;
        strncpy(utsname.machine, MACHINE, sizeof(utsname.machine));
        utsname.machine[sizeof(utsname.machine)-1] = '\0';
 
        strncpy(utsname.machine, MACHINE, sizeof(utsname.machine));
        utsname.machine[sizeof(utsname.machine)-1] = '\0';
 
@@ -326,6 +324,8 @@ main()
                if (boothowto&RB_FASTBOOT)
                        *ip++ = 'f';
 #endif
                if (boothowto&RB_FASTBOOT)
                        *ip++ = 'f';
 #endif
+               if (ip == initflags + 1)
+                       *ip++ = '-';
                *ip++ = '\0';
 
                if (vm_allocate(&p->p_vmspace->vm_map, &addr,
                *ip++ = '\0';
 
                if (vm_allocate(&p->p_vmspace->vm_map, &addr,
@@ -349,7 +349,7 @@ main()
         * Start up pageout daemon (process 2).
         */
        if (fork(p, (void *) NULL, rval))
         * Start up pageout daemon (process 2).
         */
        if (fork(p, (void *) NULL, rval))
-               panic("fork pager");
+               panic("failed fork pageout daemon");
        if (rval[1]) {
                /*
                 * Now in process 2.
        if (rval[1]) {
                /*
                 * Now in process 2.
@@ -362,6 +362,38 @@ main()
                /*NOTREACHED*/
        }
 
                /*NOTREACHED*/
        }
 
+#if 1
+       /*
+        * Start page scanner daemon (process 3).
+        */
+       if (fork(p, (void *) NULL, rval))
+               panic("failed fork page scanner daemon");
+       if (rval[1]) {
+               p = curproc;
+               pagescanproc = p;
+               p->p_flag |= SLOAD|SSYS;
+               bcopy("pagescan", p->p_comm, sizeof("pagescan"));
+               vm_pagescan();
+               /*NOTREACHED*/
+       }
+#endif
+
+       /*
+        * Start update daemon (process 4).
+        */
+#ifndef LAPTOP
+       if (fork(p, (void *) NULL, rval))
+               panic("failed fork update daemon");
+       if (rval[1]) {
+               p = curproc;
+               updateproc = p;
+               p->p_flag |= SLOAD|SSYS;
+               bcopy("update", p->p_comm, sizeof("update"));
+               vfs_update();
+               /*NOTREACHED*/
+       }
+#endif
+
        /*
         * enter scheduling loop
         */
        /*
         * enter scheduling loop
         */