/* #define HOWFAR */ /* @(#)main.c 1.7 */ #include "sys/param.h" #include "sys/mmu.h" #include "sys/types.h" #include "sys/sysmacros.h" #include "sys/systm.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/filsys.h" #include "sys/mount.h" #include "sys/proc.h" #include "sys/inode.h" #include "sys/seg.h" #include "sys/conf.h" #include "sys/buf.h" #include "sys/iobuf.h" #include "sys/tty.h" #include "sys/var.h" #include /* * 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 * * loop at low address in user mode -- /etc/init * cannot be executed. */ int maxmem; int minmem; int physmem; int cputype; int *nofault; struct inode *rootdir; main(cudot) { register struct user *up; register struct proc *p; register struct init_tbl *initp; extern char oemmsg[], timestamp[]; extern int cmask, cdlimit; printf("(C) Copyright 1983 - UniSoft Corporation\n "); printf("%d", cputype ? cputype : 68000); printf(" Unix System V - August 1983\n\n"); printf("Created %s\n\n", timestamp); printf("%s\n", oemmsg); /* * set up system process */ up = &u; p = &proc[0]; #ifndef NONSCATLOAD p->p_scat = 0; #endif p->p_addr = cudot; p->p_size = v.v_usize; p->p_stat = SRUN; p->p_flag |= SLOAD|SSYS; p->p_nice = NZERO; up->u_procp = p; up->u_cmask = cmask; up->u_limit = cdlimit; up->u_stack[0] = STKMAGIC; startup(cudot); /* * initialize system tables at priority 7 */ for (initp = &init7_tbl[0]; initp->init_func; initp++) { #ifdef HOWFAR printf("main calling %s\n", initp->init_msg); #endif (*initp->init_func)(); } #ifdef HOWFAR printf("about to spl0\n"); #endif HOWFAR SPL0(); #ifdef HOWFAR printf("now at level 0\n"); #endif HOWFAR /* * initialize system tables at priority 0 */ for (initp = &init0_tbl[0]; initp->init_func; initp++) { #ifdef HOWFAR printf("main calling %s\n", initp->init_msg); #endif (*initp->init_func)(); } #ifdef HOWFAR printf("main calling iget\n"); #endif rootdir = iget(rootdev, ROOTINO); rootdir->i_flag &= ~ILOCK; up->u_cdir = iget(rootdev, ROOTINO); up->u_cdir->i_flag &= ~ILOCK; up->u_rdir = NULL; up->u_start = time; /* * create initial processes * start scheduling task */ #ifdef HOWFAR printf("main calling newproc\n"); # endif if (newproc(0)) { #ifdef HOWFAR printf("main calling expand\n"); # endif expand((int)(v.v_usize + btoc(szicode))); #ifdef HOWFAR printf("main calling estabur\n"); # endif (void) estabur((unsigned)0, (unsigned)btoc(szicode), (unsigned)0, 0, RO); #ifdef HOWFAR printf("main calling copyout\n"); # endif (void) copyout((caddr_t)icode, (caddr_t)(v.v_ustart+v.v_doffset), szicode); /* * Return goes to loc. 0 of user init * code just copied out. */ #ifdef HOWFAR printf("main returning to icode\n"); # endif return; } #ifdef HOWFAR printf("main calling sched\n"); # endif 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 user *up; register struct buf *cp; register struct filsys *fp; struct inode iinode; up = &u; (*bdevsw[bmajor(rootdev)].d_open)(minor(rootdev), FREAD | FWRITE); (*bdevsw[bmajor(pipedev)].d_open)(minor(pipedev), FREAD | FWRITE); (*bdevsw[bmajor(swapdev)].d_open)(minor(swapdev), FREAD | FWRITE); cp = geteblk(); fp = cp->b_un.b_filsys; iinode.i_mode = IFBLK; iinode.i_rdev = rootdev; up->u_offset = SUPERBOFF; up->u_count = sizeof(struct filsys); up->u_base = (caddr_t)fp; up->u_segflg = 1; readi(&iinode); if (up->u_error) panic("iinit"); mount[0].m_bufp = cp; mount[0].m_flags = MINUSE; mount[0].m_dev = brdev(rootdev); if (fp->s_magic != FsMAGIC) fp->s_type = Fs1b; /* assume old file system */ if (fp->s_type == Fs2b) mount[0].m_dev |= Fs2BLK; #if FsTYPE == 4 if (fp->s_type == Fs4b) mount[0].m_dev |= Fs4BLK; #endif rootdev = mount[0].m_dev; if (brdev(pipedev) == brdev(rootdev)) pipedev = rootdev; fp->s_flock = 0; fp->s_ilock = 0; fp->s_ronly = 0; fp->s_ninode = 0; fp->s_inode[0] = 0; clkset(fp->s_time); } /* * Initialize clist by freeing all character blocks. */ struct chead cfreelist; cinit() { register n; register struct cblock *cp; for(n = 0, cp = &cfree[0]; n < v.v_clist; n++, cp++) { cp->c_next = cfreelist.c_next; cfreelist.c_next = cp; } cfreelist.c_size = CLSIZE; } /* * Initialize the buffer I/O system by freeing * all buffers and setting all device hash buffer lists to empty. */ binit() { register struct buf *bp; register struct buf *dp; register unsigned i; register long b; dp = &bfreelist; dp->b_forw = dp; dp->b_back = dp; dp->av_forw = dp; dp->av_back = dp; b = (((long)buffers + (sizeof(int) - 1)) & (-sizeof(int))); for (i=0, bp=buf; ib_dev = NODEV; bp->b_un.b_addr = (caddr_t)b; b += SBUFSIZE; bp->b_back = dp; bp->b_forw = dp->b_forw; dp->b_forw->b_back = bp; dp->b_forw = bp; bp->b_flags = B_BUSY; bp->b_bcount = 0; brelse(bp); } pfreelist.av_forw = bp = pbuf; for (; bp < &pbuf[(short)(v.v_pbuf-1)]; bp++) bp->av_forw = bp+1; bp->av_forw = NULL; for (i=0; i < v.v_hbuf; i++) hbuf[(short)i].b_forw = hbuf[(short)i].b_back = (struct buf *)&hbuf[(short)i]; }