X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/b1c262554900f5718aaa5804d6272e6b97848c19..e950748be99d47c449cad95598fec793143b49b1:/usr/src/sys/kern/init_main.c diff --git a/usr/src/sys/kern/init_main.c b/usr/src/sys/kern/init_main.c index 6a77647f17..286ff7964d 100644 --- a/usr/src/sys/kern/init_main.c +++ b/usr/src/sys/kern/init_main.c @@ -1,4 +1,10 @@ -/* init_main.c 6.7 85/03/03 */ +/* + * 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" @@ -19,10 +25,10 @@ #include "cmap.h" #include "text.h" #include "clist.h" -#ifdef INET +#include "malloc.h" #include "protosw.h" -#endif #include "quota.h" +#include "reboot.h" #include "../machine/reg.h" #include "../machine/cpu.h" @@ -38,17 +44,15 @@ int cmask = CMASK; * 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; @@ -68,42 +72,65 @@ main(firstaddr) p->p_nice = NZERO; setredzone(p->p_addr, (caddr_t)&u); u.u_procp = p; -#ifdef vax + 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; /* - * This assumes that the u. area is always mapped - * to the same physical address. Otherwise must be + * 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; -#endif + 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_maxrss is set later, in pageout (process 2) */ + /* + * 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 @@ -113,22 +140,18 @@ main(firstaddr) */ 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); @@ -151,6 +174,7 @@ main(firstaddr) u.u_dmap = zdmap; u.u_smap = zdmap; + enablertclock(); /* enable realtime clock interrupts */ /* * make init process */ @@ -158,7 +182,7 @@ main(firstaddr) proc[0].p_szpt = CLSIZE; if (newproc(0)) { expand(clrnd((int)btoc(szicode)), 0); - (void) swpexpand(u.u_dsize, 0, &u.u_dmap, &u.u_smap); + (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 @@ -207,7 +231,6 @@ binit() { register struct buf *bp, *dp; register int i; - struct swdevt *swp; int base, residual; for (dp = bfreelist; dp < &bfreelist[BQUEUES]; dp++) { @@ -229,9 +252,25 @@ binit() 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; @@ -242,25 +281,24 @@ binit() 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; iav_forw = sp+1;