describe ap (Kirk); delete lfs_mntinvalbuf, lfs_vinvalbuf, add
[unix-history] / usr / src / sys / kern / init_main.c
CommitLineData
da7c5cc6 1/*
d7db4999 2 * Copyright (c) 1982, 1986, 1989, 1991 Regents of the University of California.
2d9d8fa8 3 * All rights reserved.
da7c5cc6 4 *
2d9d8fa8
MK
5 * %sccs.include.redist.c%
6 *
5312431c 7 * @(#)init_main.c 7.49 (Berkeley) %G%
da7c5cc6 8 */
961945a8 9
94368568 10#include "param.h"
5e00df3b 11#include "filedesc.h"
94368568 12#include "kernel.h"
94368568
JB
13#include "mount.h"
14#include "map.h"
15#include "proc.h"
c040c6b1
MK
16#include "resourcevar.h"
17#include "signalvar.h"
18#include "systm.h"
475798b6 19#include "vnode.h"
94368568
JB
20#include "conf.h"
21#include "buf.h"
94368568 22#include "clist.h"
8fe87cbb 23#include "malloc.h"
94368568 24#include "protosw.h"
f378da4c 25#include "reboot.h"
c040c6b1
MK
26#include "user.h"
27
d301d150 28
d301d150 29#include "machine/cpu.h"
961945a8 30
d7db4999 31#include "vm/vm.h"
d7db4999 32
94d045fa
MK
33char copyright[] =
34"Copyright (c) 1982,1986,1989,1991 The Regents of the University of California.\nAll rights reserved.\n\n";
35
d7db4999
MK
36/*
37 * Components of process 0;
38 * never freed.
39 */
40struct session session0;
41struct pgrp pgrp0;
42struct proc proc0;
43struct pcred cred0;
c040c6b1 44struct filedesc0 filedesc0;
d7db4999
MK
45struct plimit limit0;
46struct vmspace vmspace0;
c040c6b1 47struct proc *curproc = &proc0;
d7db4999 48struct proc *initproc, *pageproc;
9d4095a1 49
28c7a4c5 50int cmask = CMASK;
f657c741 51extern struct user *proc0paddr;
475798b6 52extern int (*mountroot)();
362786f8 53
94d045fa
MK
54struct vnode *rootvp, *swapdev_vp;
55int boothowto;
31390dba 56struct timeval boottime;
94d045fa 57
c4708522 58/*
d7db4999
MK
59 * System startup; initialize the world, create process 0,
60 * mount root filesystem, and fork to create init and pagedaemon.
61 * Most of the hard work is done in the lower-level initialization
62 * routines including startup(), which does memory initialization
63 * and autoconfiguration.
c4708522 64 */
27bff27d 65main()
c4708522 66{
73248996 67 register int i;
dd4b582c 68 register struct proc *p;
c040c6b1 69 register struct filedesc0 *fdp;
d7db4999 70 int s, rval[2];
083baeb6 71
362786f8 72 /*
d7db4999
MK
73 * Initialize curproc before any possible traps/probes
74 * to simplify trap processing.
362786f8 75 */
d7db4999
MK
76 p = &proc0;
77 curproc = p;
9d4095a1 78 /*
d7db4999
MK
79 * Attempt to find console and initialize
80 * in case of early panic or other messages.
9d4095a1 81 */
d7db4999 82 consinit();
94d045fa 83 printf(copyright);
d7db4999 84
9d4095a1
KM
85 vm_mem_init();
86 kmeminit();
27bff27d 87 cpu_startup();
c4708522
BJ
88
89 /*
90 * set up system process 0 (swapper)
91 */
d7db4999
MK
92 p = &proc0;
93 curproc = p;
94
95 allproc = p;
96 p->p_prev = &allproc;
97 p->p_pgrp = &pgrp0;
98 pgrphash[0] = &pgrp0;
99 pgrp0.pg_mem = p;
100 pgrp0.pg_session = &session0;
101 session0.s_count = 1;
102 session0.s_leader = p;
103
104 p->p_flag = SLOAD|SSYS;
dd4b582c 105 p->p_stat = SRUN;
dd4b582c 106 p->p_nice = NZERO;
d7db4999
MK
107 bcopy("swapper", p->p_comm, sizeof ("swapper"));
108
9d4095a1 109 /*
d7db4999 110 * Setup credentials
14fda239 111 */
2dd3075b 112 cred0.p_refcnt = 1;
d7db4999
MK
113 p->p_cred = &cred0;
114 p->p_ucred = crget();
115 p->p_ucred->cr_ngroups = 1; /* group 0 */
fb1db32c 116
5e00df3b
KM
117 /*
118 * Create the file descriptor table for process 0.
119 */
d7db4999 120 fdp = &filedesc0;
c040c6b1
MK
121 p->p_fd = &fdp->fd_fd;
122 fdp->fd_fd.fd_refcnt = 1;
123 fdp->fd_fd.fd_cmask = cmask;
124 fdp->fd_fd.fd_ofiles = fdp->fd_dfiles;
125 fdp->fd_fd.fd_ofileflags = fdp->fd_dfileflags;
126 fdp->fd_fd.fd_nfiles = NDFILE;
d7db4999
MK
127
128 /*
129 * Set initial limits
130 */
131 p->p_limit = &limit0;
132 for (i = 0; i < sizeof(p->p_rlimit)/sizeof(p->p_rlimit[0]); i++)
133 limit0.pl_rlimit[i].rlim_cur =
134 limit0.pl_rlimit[i].rlim_max = RLIM_INFINITY;
135 limit0.pl_rlimit[RLIMIT_OFILE].rlim_cur = NOFILE;
136 limit0.pl_rlimit[RLIMIT_NPROC].rlim_cur = MAXUPRC;
137 limit0.p_refcnt = 1;
138
139 /*
140 * Allocate a prototype map so we have something to fork
141 */
142 p->p_vmspace = &vmspace0;
143 vmspace0.vm_refcnt = 1;
144 pmap_pinit(&vmspace0.vm_pmap);
145 vm_map_init(&p->p_vmspace->vm_map, round_page(VM_MIN_ADDRESS),
146 trunc_page(VM_MAX_ADDRESS), TRUE);
147 vmspace0.vm_map.pmap = &vmspace0.vm_pmap;
148 p->p_addr = proc0paddr; /* XXX */
149
150 /*
151 * We continue to place resource usage info
152 * and signal actions in the user struct so they're pageable.
153 */
f657c741
MK
154 p->p_stats = &p->p_addr->u_stats;
155 p->p_sigacts = &p->p_addr->u_sigacts;
d7db4999
MK
156
157 rqinit();
158
4898b838 159 /*
8ede3c1b
MK
160 * configure virtual memory system,
161 * set vm rlimits
4898b838 162 */
d7db4999 163 vm_init_limits(p);
8ede3c1b 164
475798b6 165 /*
85570e35
KM
166 * Initialize the file systems.
167 *
94d045fa 168 * Get vnodes for swapdev and rootdev.
475798b6 169 */
85570e35 170 vfsinit();
94d045fa 171 if (bdevvp(swapdev, &swapdev_vp) || bdevvp(rootdev, &rootvp))
475798b6
KM
172 panic("can't setup bdevvp's");
173
c70d0a8b 174 startrtclock();
5cb75b5d 175#if defined(vax)
f882447b
SL
176#include "kg.h"
177#if NKG > 0
d0ab60b1 178 startkgclock();
fb1db32c 179#endif
d0ab60b1 180#endif
c4708522
BJ
181
182 /*
d872f034 183 * Initialize tables, protocols, and set up well-known inodes.
c4708522 184 */
d872f034 185 mbinit();
a5829200 186 cinit();
933220e9
KM
187#ifdef SYSVSHM
188 shminit();
189#endif
730ff8ce
MK
190#include "sl.h"
191#if NSL > 0
192 slattach(); /* XXX */
193#endif
933220e9 194#include "loop.h"
4f4caf05
BJ
195#if NLOOP > 0
196 loattach(); /* XXX */
197#endif
4f083fd7
SL
198 /*
199 * Block reception of incoming packets
200 * until protocols have been initialized.
201 */
202 s = splimp();
fbf9a431 203 ifinit();
b7892118 204 domaininit();
4f083fd7 205 splx(s);
d7db4999 206
e6254ffb
BJ
207#ifdef GPROF
208 kmstartup();
209#endif
9d6d37ce 210
d7db4999 211 /* kick off timeout driven events by calling first time */
27b91f59
BJ
212 roundrobin();
213 schedcpu();
362786f8 214 enablertclock(); /* enable realtime clock interrupts */
27b91f59 215
d7db4999
MK
216 /*
217 * Set up the root file system and vnode.
218 */
475798b6
KM
219 if ((*mountroot)())
220 panic("cannot mount root");
221 /*
222 * Get vnode for '/'.
c040c6b1 223 * Setup rootdir and fdp->fd_fd.fd_cdir to point to it.
475798b6
KM
224 */
225 if (VFS_ROOT(rootfs, &rootdir))
226 panic("cannot find root vnode");
c040c6b1
MK
227 fdp->fd_fd.fd_cdir = rootdir;
228 VREF(fdp->fd_fd.fd_cdir);
3ca85ace 229 VOP_UNLOCK(rootdir);
c040c6b1 230 fdp->fd_fd.fd_rdir = NULL;
d7db4999 231 swapinit();
c4708522 232
28c7a4c5 233 /*
d7db4999
MK
234 * Now can look at time, having had a chance
235 * to verify the time from the file system.
28c7a4c5 236 */
67cfeda8 237 mono_time = boottime = p->p_stats->p_start = time;
28c7a4c5 238
d7db4999
MK
239 /*
240 * make init process
241 */
242 siginit(p);
fb06b384 243 if (fork(p, NULL, rval))
d7db4999
MK
244 panic("fork init");
245 if (rval[1]) {
94d045fa
MK
246 extern int icode[]; /* user init code */
247 extern int szicode; /* size of icode */
fb06b384
KB
248 static char initflags[] = "-sf";
249 vm_offset_t addr;
250 char *ip;
9d4095a1 251
d7db4999 252 /*
fb06b384
KB
253 * Now in process 1. Set init flags into icode, get a minimal
254 * address space, copy out "icode", and return to it to do an
255 * exec of init.
d7db4999 256 */
fb06b384 257 ip = initflags + 1;
d7db4999
MK
258 if (boothowto&RB_SINGLE)
259 *ip++ = 's';
260#ifdef notyet
261 if (boothowto&RB_FASTBOOT)
262 *ip++ = 'f';
d7db4999 263#endif
fb06b384
KB
264 if (ip == initflags + 1)
265 *ip++ = '-';
83cf086b 266 *ip++ = '\0';
d7db4999 267
f5c2666f 268 addr = VM_MIN_ADDRESS;
fb06b384 269 initproc = p = curproc;
d7db4999 270 if (vm_allocate(&p->p_vmspace->vm_map, &addr,
83cf086b 271 round_page(szicode + sizeof(initflags)), FALSE) != 0 ||
f5c2666f 272 addr != VM_MIN_ADDRESS)
9d4095a1
KM
273 panic("init: couldn't allocate at zero");
274
275 /* need just enough stack to exec from */
f657c741 276 addr = trunc_page(USRSTACK - PAGE_SIZE);
d7db4999
MK
277 if (vm_allocate(&p->p_vmspace->vm_map, &addr,
278 PAGE_SIZE, FALSE) != KERN_SUCCESS)
279 panic("vm_allocate init stack");
280 p->p_vmspace->vm_maxsaddr = (caddr_t)addr;
f5c2666f
CT
281 (void)copyout((caddr_t)icode, (caddr_t)VM_MIN_ADDRESS,
282 (u_int)szicode);
283 (void)copyout(initflags, (caddr_t)(VM_MIN_ADDRESS + szicode),
284 sizeof(initflags));
d7db4999 285 return; /* returns to icode */
28c7a4c5 286 }
d7db4999 287
c4708522 288 /*
9d4095a1 289 * Start up pageout daemon (process 2).
c4708522 290 */
fb06b384 291 if (fork(p, NULL, rval))
d7db4999
MK
292 panic("fork pager");
293 if (rval[1]) {
294 /*
295 * Now in process 2.
296 */
297 p = curproc;
298 pageproc = p;
299 p->p_flag |= SLOAD|SSYS; /* XXX */
300 bcopy("pagedaemon", curproc->p_comm, sizeof ("pagedaemon"));
9d4095a1 301 vm_pageout();
b7892118 302 /*NOTREACHED*/
c4708522
BJ
303 }
304
305 /*
c4708522
BJ
306 * enter scheduling loop
307 */
c4708522
BJ
308 sched();
309}