* 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 "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";
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 boothowto;
#if __GNUC__ >= 2
-__main() {}
+void __main() {}
#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.
* 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];
- char *cp;
+ const char *cp;
/*
* Initialize curproc before any possible traps/probes
* 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.
#endif
/* kick off timeout driven events by calling first time */
- roundrobin();
- schedcpu();
+ roundrobin(0, 0);
+ schedcpu(0, 0);
enablertclock(); /* enable realtime clock interrupts */
/*
* 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);)
- 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);)
- utsname.version[i++] = *cp++;
+ utsname.version[i++] = *cp++;
for (; *cp != '#'; cp++);
if(i <= sizeof(utsname.version))
- utsname.version[i++] = '#';
+ utsname.version[i++] = '#';
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';
if (boothowto&RB_FASTBOOT)
*ip++ = 'f';
#endif
+ if (ip == initflags + 1)
+ *ip++ = '-';
*ip++ = '\0';
if (vm_allocate(&p->p_vmspace->vm_map, &addr,
* 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.
/*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
*/