Annotation of lucent/sys/src/9/gnot/main.c, revision 1.1

1.1     ! root        1: #include       "u.h"
        !             2: #include       "../port/lib.h"
        !             3: #include       "mem.h"
        !             4: #include       "dat.h"
        !             5: #include       "fns.h"
        !             6: #include       "io.h"
        !             7: #include       "ureg.h"
        !             8: #include       "init.h"
        !             9: 
        !            10: #include       <libg.h>
        !            11: #include       <gnot.h>
        !            12: 
        !            13: typedef struct Boot Boot;
        !            14: struct Boot
        !            15: {
        !            16:        long station;
        !            17:        long traffic;
        !            18:        char user[NAMELEN];
        !            19:        char server[64];
        !            20:        char line[64];
        !            21:        char device;
        !            22: };
        !            23: #define BOOT ((Boot*)0)
        !            24: 
        !            25: char   bootuser[NAMELEN];
        !            26: char   bootline[64];
        !            27: char   bootserver[72];
        !            28: int    bank[2];
        !            29: uchar  *sp;
        !            30: 
        !            31: extern GBitmap gscreen;
        !            32: 
        !            33: void unloadboot(void);
        !            34: 
        !            35: void
        !            36: main(void)
        !            37: {
        !            38:        u = 0;
        !            39:        unloadboot();
        !            40:        machinit();
        !            41:        active.exiting = 0;
        !            42:        active.machs = 1;
        !            43:        mmuinit();
        !            44:        confinit();
        !            45:        xinit();
        !            46:        kmapinit();
        !            47:        duartinit();
        !            48:        screeninit();
        !            49:        printinit();
        !            50:        print("bank 0: %dM  bank 1: %dM\n", bank[0], bank[1]);
        !            51:        flushmmu();
        !            52:        pageinit();
        !            53:        procinit0();
        !            54:        initseg();
        !            55:        chandevreset();
        !            56:        streaminit();
        !            57:        swapinit();
        !            58:        kmapinit();
        !            59:        userinit();
        !            60:        schedinit();
        !            61: }
        !            62: 
        !            63: void
        !            64: unloadboot(void)
        !            65: {
        !            66:        char s[64];
        !            67: 
        !            68:        memmove(bootuser, BOOT->user, sizeof(bootuser)-1);
        !            69:        bootuser[sizeof(bootuser)-1] = 0;
        !            70:        memmove(bootline, BOOT->line, sizeof(bootline)-1);
        !            71:        bootline[sizeof(bootline)-1] = 0;
        !            72:        memmove(s, BOOT->server, sizeof(s) - 1);
        !            73:        s[sizeof(s)-1] = 0;
        !            74:        switch(BOOT->device){
        !            75:        case 'a':
        !            76:                sprint(bootserver, "19200!%s", s);
        !            77:                break;
        !            78:        case 'A':
        !            79:                sprint(bootserver, "9600!%s", s);
        !            80:                break;
        !            81:        case 'i':
        !            82:                sprint(bootserver, "incon!%s", s);
        !            83:                break;
        !            84:        default:
        !            85:                /* older boot ROM's don't zero out BOOT->user if it isn't set. */
        !            86:                memset(bootuser, 0, sizeof(bootuser));
        !            87:                sprint(bootserver, "scsi!%s", s);
        !            88:                break;
        !            89:        }
        !            90: }
        !            91: 
        !            92: void
        !            93: machinit(void)
        !            94: {
        !            95:        int n;
        !            96: 
        !            97:        n = m->machno;
        !            98:        memset(m, 0, sizeof(Mach));
        !            99:        m->machno = n;
        !           100:        m->fpstate = FPinit;
        !           101:        fprestore(&initfp);
        !           102: }
        !           103: 
        !           104: void
        !           105: mmuinit(void)
        !           106: {
        !           107:        ulong l, d, i;
        !           108: 
        !           109:        /*
        !           110:         * Invalidate user addresses
        !           111:         */
        !           112:        for(l=0; l<4*1024*1024; l+=BY2PG)
        !           113:                putmmu(l, INVALIDPTE, 0);
        !           114:        /*
        !           115:         * Four meg of usable memory, with top 256K for screen
        !           116:         */
        !           117:        for(i=1,l=KTZERO; i<MB4/BY2PG; l+=BY2PG,i++)
        !           118:                putkmmu(l, PPN(l)|PTEVALID|PTEKERNEL);
        !           119:        /*
        !           120:         * Screen after end
        !           121:         */
        !           122:        l = PGROUND((ulong)end);
        !           123:        gscreen.base = (ulong*)l;
        !           124:        for(i=0,d=DISPLAYRAM; i<256*1024/BY2PG; d+=BY2PG,l+=BY2PG,i++)
        !           125:                putkmmu(l, PPN(d)|PTEVALID|PTEKERNEL);
        !           126: }
        !           127: 
        !           128: void
        !           129: init0(void)
        !           130: {
        !           131:        u->nerrlab = 0;
        !           132:        m->proc = u->p;
        !           133:        u->p->state = Running;
        !           134:        u->p->mach = m;
        !           135:        spllo();
        !           136:        
        !           137:        u->slash = (*devtab[0].attach)(0);
        !           138:        u->dot = clone(u->slash, 0);
        !           139: 
        !           140:        kproc("alarm", alarmkproc, 0);
        !           141:        chandevinit();
        !           142: 
        !           143:        if(!waserror()){
        !           144:                ksetterm("at&t %s");
        !           145:                ksetenv("cputype", "68020");
        !           146:                poperror();
        !           147:        }
        !           148: 
        !           149:        touser(sp);
        !           150: }
        !           151: 
        !           152: FPsave initfp;
        !           153: 
        !           154: void
        !           155: userinit(void)
        !           156: {
        !           157:        Proc *p;
        !           158:        Segment *s;
        !           159:        User *up;
        !           160:        KMap *k;
        !           161:        Page *pg;
        !           162: 
        !           163:        p = newproc();
        !           164:        p->pgrp = newpgrp();
        !           165:        p->egrp = smalloc(sizeof(Egrp));
        !           166:        p->egrp->ref = 1;
        !           167:        p->fgrp = smalloc(sizeof(Fgrp));
        !           168:        p->fgrp->ref = 1;
        !           169:        p->procmode = 0640;
        !           170: 
        !           171:        strcpy(p->text, "*init*");
        !           172:        strcpy(p->user, eve);
        !           173:        p->fpstate = FPinit;
        !           174: 
        !           175:        /*
        !           176:         * Kernel Stack
        !           177:         */
        !           178:        p->sched.pc = (ulong)init0;
        !           179:        p->sched.sp = USERADDR+BY2PG-5*BY2WD;
        !           180:        p->sched.sr = SUPER|SPL(0);
        !           181:        p->upage = newpage(1, 0, USERADDR|(p->pid&0xFFFF));
        !           182: 
        !           183:        /*
        !           184:         * User
        !           185:         */
        !           186:        k = kmap(p->upage);
        !           187:        up = (User*)VA(k);
        !           188:        up->p = p;
        !           189:        kunmap(k);
        !           190: 
        !           191:        /*
        !           192:         * User Stack, copy in boot arguments
        !           193:         */
        !           194:        s = newseg(SG_STACK, USTKTOP-BY2PG, 1);
        !           195:        p->seg[SSEG] = s;
        !           196:        pg = newpage(1, 0, USTKTOP-BY2PG);
        !           197:        segpage(s, pg);
        !           198:        k = kmap(pg);
        !           199:        bootargs(VA(k));
        !           200:        kunmap(k);
        !           201: 
        !           202:        /*
        !           203:         * Text
        !           204:         */
        !           205:        s = newseg(SG_TEXT, UTZERO, 1);
        !           206:        p->seg[TSEG] = s;
        !           207:        segpage(s, newpage(1, 0, UTZERO));
        !           208:        k = kmap(s->map[0]->pages[0]);
        !           209:        memmove((ulong*)VA(k), initcode, sizeof initcode);
        !           210:        kunmap(k);
        !           211: 
        !           212:        ready(p);
        !           213: }
        !           214: 
        !           215: uchar *
        !           216: pusharg(char *p)
        !           217: {
        !           218:        int n;
        !           219: 
        !           220:        n = strlen(p)+1;
        !           221:        sp -= n;
        !           222:        memmove(sp, p, n);
        !           223:        return sp;
        !           224: }
        !           225: 
        !           226: void
        !           227: bootargs(ulong base)
        !           228: {
        !           229:        int i, ac;
        !           230:        uchar *av[32];
        !           231:        char *p, *pp;
        !           232:        uchar **lsp;
        !           233: 
        !           234:        sp = (uchar*)base + BY2PG - MAXSYSARG*BY2WD;
        !           235: 
        !           236:        ac = 0;
        !           237:        for(p = bootline; p && *p; p = pp){
        !           238:                pp = strchr(p, ' ');
        !           239:                if(pp)
        !           240:                        *pp++ = 0;
        !           241:                av[ac++] = pusharg(p);
        !           242:        }
        !           243:        if(bootuser[0]){
        !           244:                av[ac++] = pusharg("-u");
        !           245:                av[ac++] = pusharg(bootuser);
        !           246:        }
        !           247:        av[ac++] = pusharg(bootserver);
        !           248: 
        !           249:        /* 4 byte word align stack */
        !           250:        sp = (uchar*)((ulong)sp & ~3);
        !           251: 
        !           252:        /* build argc, argv on stack */
        !           253:        sp -= (ac+1)*sizeof(sp);
        !           254:        lsp = (uchar**)sp;
        !           255:        for(i = 0; i < ac; i++)
        !           256:                *lsp++ = av[i] + ((USTKTOP - BY2PG) - base);
        !           257:        *lsp = 0;
        !           258:        sp += (USTKTOP - BY2PG) - base - sizeof(sp);
        !           259: }
        !           260: 
        !           261: void
        !           262: exit(int ispanic)
        !           263: {
        !           264:        int i;
        !           265: 
        !           266:        u = 0;
        !           267:        wipekeys();
        !           268:        spllo();
        !           269:        while(consactive())
        !           270:                for(i=0; i<1000; i++)
        !           271:                        ;
        !           272:        splhi();
        !           273:        if(ispanic)
        !           274:                for(;;);
        !           275:        firmware();
        !           276: }
        !           277: 
        !           278: banksize(int base)
        !           279: {
        !           280:        ulong va;
        !           281: 
        !           282:        if(end > (char *)((KZERO|1024L*1024L)-BY2PG))
        !           283:                return 0;
        !           284:        va = UZERO;     /* user page 1 is free to play with */
        !           285:        putmmu(va, PTEVALID|(base+0)*MB/BY2PG, 0);
        !           286:        *(ulong*)va = 0;        /* 0 at 0M */
        !           287:        putmmu(va, PTEVALID|(base+1)*MB/BY2PG, 0);
        !           288:        *(ulong*)va = 1;        /* 1 at 1M */
        !           289:        putmmu(va, PTEVALID|(base+4)*MB/BY2PG, 0);
        !           290:        *(ulong*)va = 4;        /* 4 at 4M */
        !           291:        putmmu(va, PTEVALID|(base+0)*MB/BY2PG, 0);
        !           292:        if(*(ulong*)va == 0)
        !           293:                return 16;
        !           294:        putmmu(va, PTEVALID|(base+1)*MB/BY2PG, 0);
        !           295:        if(*(ulong*)va == 1)
        !           296:                return 4;
        !           297:        putmmu(va, PTEVALID|(base+0)*MB/BY2PG, 0);
        !           298:        if(*(ulong*)va == 4)
        !           299:                return 1;
        !           300:        return 0;
        !           301: }
        !           302: 
        !           303: Conf   conf;
        !           304: 
        !           305: void
        !           306: confinit(void)
        !           307: {
        !           308:        int mul, pcnt;
        !           309:        ulong ktop;
        !           310: 
        !           311:        conf.nmach = 1;
        !           312:        if(conf.nmach > MAXMACH)
        !           313:                panic("confinit");
        !           314:        conf.monitor = 1;
        !           315:        bank[0] = banksize(0);
        !           316:        bank[1] = banksize(16);
        !           317:        conf.npage0 = (bank[0]*MB)/BY2PG;
        !           318:        conf.base0 = 0;
        !           319:        conf.npage1 = (bank[1]*MB)/BY2PG;
        !           320:        conf.base1 = 16*MB;
        !           321:        conf.npage = conf.npage0+conf.npage1;
        !           322: 
        !           323:        pcnt = screenbits()-1;          /* Calculate % of memory for page pool */
        !           324:        pcnt = 70 - (pcnt*10);
        !           325:        conf.upages = (conf.npage*pcnt)/100;
        !           326: 
        !           327:        ktop = PGROUND((ulong)end) + 256*1024;  /* cf. mmuinit */
        !           328:        ktop = PADDR(ktop);
        !           329:        conf.npage0 -= ktop/BY2PG;
        !           330:        conf.base0 += ktop;
        !           331: 
        !           332:        mul = 1 + (conf.npage1>0);
        !           333:        conf.nproc = 50*mul;
        !           334:        conf.nswap = 4096;
        !           335:        conf.nimage = 50;
        !           336:        conf.copymode = 0;              /* copy on write */
        !           337:        conf.portispaged = 0;
        !           338:        confinit1(mul);
        !           339: }
        !           340: 
        !           341: /*
        !           342:  *  set up floating point for a new process
        !           343:  */
        !           344: void
        !           345: procsetup(Proc *p)
        !           346: {
        !           347:        long fpnull;
        !           348: 
        !           349:        fpnull = 0;
        !           350:        splhi();
        !           351:        m->fpstate = FPinit;
        !           352:        p->fpstate = FPinit;
        !           353:        fprestore((FPsave*)&fpnull);
        !           354:        spllo();
        !           355: }
        !           356: 
        !           357: /*
        !           358:  * Save the part of the process state.
        !           359:  */
        !           360: void
        !           361: procsave(Proc *p)
        !           362: {
        !           363:        Balu *balu = (Balu *)u->balusave;
        !           364: 
        !           365:        USED(p);
        !           366:        fpsave(&u->fpsave);
        !           367:        if(u->fpsave.type){
        !           368:                if(u->fpsave.size > sizeof u->fpsave.junk)
        !           369:                        panic("fpsize %d max %d\n", u->fpsave.size, sizeof u->fpsave.junk);
        !           370:                fpregsave(u->fpsave.reg);
        !           371:                u->p->fpstate = FPactive;
        !           372:                m->fpstate = FPdirty;
        !           373:        }
        !           374:        if(BALU->cr0 != 0xFFFFFFFF)     /* balu busy */
        !           375:                memmove(balu, BALU, sizeof(Balu));
        !           376:        else{
        !           377:                balu->cr0 = 0xFFFFFFFF;
        !           378:                BALU->cr0 = 0xFFFFFFFF;
        !           379:        }
        !           380: }
        !           381: 
        !           382: /*
        !           383:  *  Restore what procsave() saves
        !           384:  *
        !           385:  *  Procsave() makes sure that what state points to is long enough
        !           386:  */
        !           387: void
        !           388: procrestore(Proc *p)
        !           389: {
        !           390:        Balu *balu = (Balu *)u->balusave;
        !           391: 
        !           392:        if(p->fpstate != m->fpstate){
        !           393:                if(p->fpstate == FPinit){
        !           394:                        u->p->fpstate = FPinit;
        !           395:                        fprestore(&initfp);
        !           396:                        m->fpstate = FPinit;
        !           397:                }else{
        !           398:                        fpregrestore(u->fpsave.reg);
        !           399:                        fprestore(&u->fpsave);
        !           400:                        m->fpstate = FPdirty;
        !           401:                }
        !           402:        }
        !           403:        if(balu->cr0 != 0xFFFFFFFF)     /* balu busy */
        !           404:                memmove(BALU, balu, sizeof BALU);
        !           405: }
        !           406: 
        !           407: void
        !           408: buzz(int f, int d)
        !           409: {
        !           410:        USED(f, d);
        !           411: }
        !           412: 
        !           413: void
        !           414: lights(int val)
        !           415: {
        !           416:        USED(val);
        !           417: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.