/* * SCCS id @(#)main.c 2.1 (Berkeley) 8/29/83 */ #include "param.h" #include #include #include #include #include #include #include #include #include #include #include #ifdef UCB_FRCSWAP /* * If set, allow incore forks and expands. * Set before idle(), cleared in clock.c. * Set to 1 here because the init creation * must not cause a swap. */ int idleflg = 1; #endif /* * Initialization code. * Called from cold start routine as * soon as a stack and segmentation * have been established. * Functions: * clear and free user core * turn on clock * hand craft 0th process * call all initialization routines * fork - process 0 to schedule * - process 1 execute bootstrap */ main() { extern char version[]; printf("\n%s", version); startup(); /* * set up system process */ proc[0].p_addr = *ka6; #ifndef VIRUS_VFORK proc[0].p_size = USIZE; #endif proc[0].p_stat = SRUN; proc[0].p_flag |= SLOAD|SSYS; proc[0].p_nice = NZERO; u.u_procp = &proc[0]; u.u_cmask = CMASK; /* * Initialize devices and * set up 'known' i-nodes */ #ifdef UCB_IHASH ihinit(); #endif cinit(); binit(); #ifdef UNIBUS_MAP (void) ubinit(); #endif UNIBUS_MAP #ifdef UCB_NET netinit(); #endif clkstart(); iinit(); rootdir = iget(rootdev, (ino_t)ROOTINO); rootdir->i_flag &= ~ILOCK; u.u_cdir = iget(rootdev, (ino_t)ROOTINO); u.u_cdir->i_flag &= ~ILOCK; /* * make init process * enter scheduling loop * with system process */ #ifdef VIRUS_VFORK if(newproc(0)) #else if(newproc()) #endif { #ifdef VIRUS_VFORK expand((int)btoc(szicode),S_DATA); #else expand(USIZE + (int)btoc(szicode)); #endif estabur((unsigned)0, btoc(szicode), (unsigned)0, 0, RO); copyout((caddr_t)icode, (caddr_t)0, szicode); /* * Return goes to loc. 0 of user init * code just copied out. */ return; } else sched(); } /* * 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). */ iinit() { register struct buf *cp, *bp; register struct filsys *fp; register i; (*bdevsw[major(rootdev)].d_open)(rootdev, B_READ); (*bdevsw[major(swapdev)].d_open)(swapdev, B_READ); bp = bread(rootdev, SUPERB); if(u.u_error) panic("iinit"); fp = &mount[0].m_filsys; bcopy(mapin(bp), (caddr_t)fp, sizeof(struct filsys)); mapout(bp); mount[0].m_inodp = (struct inode *) 1; brelse(bp); mount[0].m_dev = rootdev; fp->s_flock = 0; fp->s_ilock = 0; fp->s_ronly = 0; #ifdef UCB_IHASH fp->s_lasti = 1; fp->s_nbehind = 0; #endif fp->s_fsmnt[0] = '/'; for (i = 1; i < sizeof(fp->s_fsmnt); i++) fp->s_fsmnt[i] = 0; time = fp->s_time; bootime = time; } memaddr bpaddr; /* physical click-address of buffers */ /* * Initialize the buffer I/O system by freeing * all buffers and setting all device buffer lists to empty. */ binit() { register struct buf *bp; register struct buf *dp; register int i; struct bdevsw *bdp; long paddr; bfreelist.b_forw = bfreelist.b_back = bfreelist.av_forw = bfreelist.av_back = &bfreelist; paddr = ((long) bpaddr) << 6; for (i=0; ib_dev = NODEV; bp->b_un.b_addr = loint(paddr); bp->b_xmem = hiint(paddr); paddr += bsize; bp->b_back = &bfreelist; bp->b_forw = bfreelist.b_forw; bfreelist.b_forw->b_back = bp; bfreelist.b_forw = bp; bp->b_flags = B_BUSY; brelse(bp); } for (bdp = bdevsw; bdp < bdevsw + nblkdev; bdp++) { dp = bdp->d_tab; if(dp) { dp->b_forw = dp; dp->b_back = dp; } (void) (*bdp->d_root)(); } }