| plan 9 kernel history: overview | file list | diff list |
1992/0807/ss/main.c (diff list | history)
| 1992/0807/sys/src/9/ss/main.c:1,387 – 1992/0808/sys/src/9/ss/main.c:1,465 (short | long | prev | next) | ||
| 1990/1223 | #include "u.h" | |
| 1992/0321 | #include "../port/lib.h" | |
| 1990/1223 | #include "mem.h" #include "dat.h" #include "fns.h" #include "io.h" #include "init.h" | |
| 1992/0808 | #include "rom.h" | |
| 1990/1223 | ||
| 1992/0211 | #include <libg.h> | |
| 1990/1223 | #include <gnot.h> | |
| 1992/0807 | uchar *intrreg; int model; uchar idprom[32]; | |
| 1992/0808 | ROM *rom; /* open boot rom vector */ | |
| 1992/0807 | int cpuserver; | |
| 1992/0808 | void (*romputcxsegm)(int, ulong, int); | |
| 1992/0807 | ulong bank[2]; | |
| 1992/0808 | char rombuf[20000]; char mempres[256]; | |
| 1991/0110 | ||
| 1990/1223 | void main(void) { u = 0; | |
| 1992/0325 | memset(edata, 0, (char*)end-(char*)edata); | |
| 1990/1223 | machinit(); | |
| 1991/1113 | active.exiting = 0; active.machs = 1; | |
| 1990/1223 | confinit(); | |
| 1992/0619 | xinit(); | |
| 1990/1226 | mmuinit(); | |
| 1992/0807 | if(conf.monitor) screeninit(); | |
| 1990/1226 | printinit(); trapinit(); | |
| 1990/1223 | kmapinit(); | |
| 1991/0604 | ioinit(); | |
| 1992/0807 | if(!conf.monitor) sccspecial(2, &printq, &kbdq, 9600); pageinit(); | |
| 1990/1226 | cacheinit(); | |
| 1991/0110 | intrinit(); | |
| 1990/1223 | procinit0(); | |
| 1991/0706 | initseg(); | |
| 1990/1223 | chandevreset(); streaminit(); | |
| 1992/0727 | swapinit(); | |
| 1990/1223 | userinit(); | |
| 1990/1227 | clockinit(); | |
| 1990/1223 | schedinit(); } void | |
| 1991/0110 | intrinit(void) { KMap *k; | |
| 1992/0101 | k = kmappa(INTRREG, PTEIO|PTENOCACHE); | |
| 1991/0110 | intrreg = (uchar*)k->va; } void | |
| 1991/0926 | systemreset(void) | |
| 1990/1223 | { delay(100); | |
| 1992/0807 | putenab(ENABRESET); | |
| 1990/1223 | } void machinit(void) { int n; n = m->machno; memset(m, 0, sizeof(Mach)); m->machno = n; m->mmask = 1<<m->machno; m->fpstate = FPinit; } void | |
| 1991/0604 | ioinit(void) { KMap *k; | |
| 1992/0722 | /* tell scc driver its addresses */ | |
| 1991/0604 | k = kmappa(KMDUART, PTEIO|PTENOCACHE); | |
| 1991/1225 | sccsetup((void*)(k->va), KMFREQ); k = kmappa(EIADUART, PTEIO|PTENOCACHE); sccsetup((void*)(k->va), EIAFREQ); | |
| 1991/0608 | /* scc port 0 is the keyboard */ sccspecial(0, 0, &kbdq, 2400); | |
| 1991/0604 | kbdq.putc = kbdstate; | |
| 1991/0608 | /* scc port 1 is the mouse */ sccspecial(1, 0, &mouseq, 2400); | |
| 1991/0604 | } void | |
| 1990/1223 | init0(void) { u->nerrlab = 0; m->proc = u->p; u->p->state = Running; u->p->mach = m; spllo(); | |
| 1992/0722 | ||
| 1992/0807 | print("bank 0: %dM 1: %dM\n", bank[0], bank[1]); | |
| 1990/1223 | u->slash = (*devtab[0].attach)(0); u->dot = clone(u->slash, 0); | |
| 1992/0516 | kproc("alarm", alarmkproc, 0); chandevinit(); | |
| 1990/1226 | ||
| 1992/0808 | ||
| 1991/0926 | if(!waserror()){ | |
| 1991/1102 | ksetterm("sun %s"); | |
| 1991/0927 | ksetenv("cputype", "sparc"); | |
| 1991/0926 | poperror(); } | |
| 1991/0711 | touser(USTKTOP-(1+MAXSYSARG)*BY2WD); | |
| 1990/1223 | } | |
| 1992/0727 | FPsave *initfpp; uchar initfpa[sizeof(FPsave)+7]; | |
| 1990/1223 | void userinit(void) { Proc *p; | |
| 1991/0706 | Segment *s; | |
| 1990/1223 | User *up; KMap *k; | |
| 1992/0727 | ulong l; | |
| 1990/1223 | p = newproc(); p->pgrp = newpgrp(); | |
| 1992/0623 | p->egrp = smalloc(sizeof(Egrp)); p->egrp->ref = 1; p->fgrp = smalloc(sizeof(Fgrp)); p->fgrp->ref = 1; | |
| 1991/1112 | p->procmode = 0640; | |
| 1991/0706 | ||
| 1990/1223 | strcpy(p->text, "*init*"); | |
| 1991/1109 | strcpy(p->user, eve); | |
| 1992/0727 | /* must align initfpp to an ODD word boundary */ l = (ulong)initfpa; l += 3; l &= ~7; l += 4; initfpp = (FPsave*)l; savefpregs(initfpp); | |
| 1990/1223 | p->fpstate = FPinit; /* * Kernel Stack */ | |
| 1991/0110 | p->sched.pc = (((ulong)init0) - 8); /* 8 because of RETURN in gotolabel */ | |
| 1991/0711 | p->sched.sp = USERADDR+BY2PG-(1+MAXSYSARG)*BY2WD; | |
| 1992/0802 | p->sched.sp &= ~7; /* SP must be 8-byte aligned */ | |
| 1991/1222 | p->upage = newpage(1, 0, USERADDR|(p->pid&0xFFFF)); | |
| 1990/1223 | /* * User */ k = kmap(p->upage); up = (User*)VA(k); up->p = p; kunmap(k); /* * User Stack */ | |
| 1991/0706 | s = newseg(SG_STACK, USTKTOP-BY2PG, 1); p->seg[SSEG] = s; | |
| 1990/1223 | /* * Text */ | |
| 1991/0706 | s = newseg(SG_TEXT, UTZERO, 1); p->seg[TSEG] = s; segpage(s, newpage(1, 0, UTZERO)); k = kmap(s->map[0]->pages[0]); | |
| 1991/0318 | memmove((ulong*)VA(k), initcode, sizeof initcode); | |
| 1990/1223 | kunmap(k); ready(p); } void exit(void) { int i; u = 0; | |
| 1991/0608 | spllo(); print("cpu %d exiting\n", m->machno); while(consactive()) for(i=0; i<1000; i++) ; | |
| 1990/1223 | splhi(); | |
| 1991/0926 | systemreset(); | |
| 1990/1223 | } | |
| 1992/0807 |
| |
| 1992/0808 | void scanmem(char *mempres, int n) | |
| 1992/0807 | { int i; | |
| 1992/0808 | ulong va, addr; | |
| 1992/0807 |
| |
| 1992/0808 | for(i=0; i<n; i++){ mempres[i] = 0; addr = i*MB; putw4(va, PPN(addr)|PTEVALID|PTEKERNEL|PTENOCACHE|PTEWRITE|PTEMAINMEM); *(ulong*)va = addr; if(*(ulong*)va == addr){ addr = ~addr; *(ulong*)va = addr; if(*(ulong*)va == addr){ mempres[i] = 1; *(ulong*)va = i + '0'; } } | |
| 1992/0807 | } | |
| 1992/0808 | for(i=0; i<n; i++) if(mempres[i]){ addr = i*MB; putw4(va, PPN(addr)|PTEVALID|PTEKERNEL|PTENOCACHE|PTEWRITE|PTEMAINMEM); mempres[i] = *(ulong*)va; }else mempres[i] = 0; } char name[1024]; void romprops(ulong d, char *namep, ulong p) { static ulong romp; uchar buf[128]; int i, n; romp += sprint(rombuf+romp, "romprops %lux %lux\n", d, p); while(p && *(char*)p){ n = call(rom->conf->getproplen, d, p); if(n>=0 && n<sizeof buf){ call(rom->conf->getprop, d, p, buf); if(strcmp((char*)p, "name")==0){ strcpy(namep, (char*)buf); romp += sprint(rombuf+romp, "`%s'\n", name); }else{ romp += sprint(rombuf+romp, "%lux: %s: ", d, p); for(i=0; i<n; i++) romp += sprint(rombuf+romp, "%.2ux ", buf[i]); romp += sprint(rombuf+romp, "\n"); } }else romp += sprint(rombuf+romp, "%lux: %s(%d)\n", d, p, n); p = call(rom->conf->nextprop, d, p); | |
| 1992/0807 | } | |
| 1992/0808 | void romwalk(ulong d, char* namep) { char *endp; *namep++ = '/'; *namep = 0; while(d){ romprops(d, namep, call(rom->conf->nextprop, d, 0)); endp = namep+strlen(namep); romwalk(call(rom->conf->child, d), endp); *endp = 0; d = call(rom->conf->next, d); } } void fuck(void) { name[0] = 0; romwalk(call(rom->conf->next, 0), name); } | |
| 1990/1223 | Conf conf; void confinit(void) { int mul; | |
| 1992/0807 |
| |
| 1992/0808 | ulong i, j; ulong ktop, va, mbytes, nmeg, npg, v; | |
| 1990/1226 | ||
| 1990/1223 | conf.nmach = 1; if(conf.nmach > MAXMACH) panic("confinit"); | |
| 1992/0619 | ||
| 1992/0807 | /* map id prom */ va = 1*MB-BY2PG; putw4(va, PPN(EEPROM)|PTEVALID|PTEKERNEL|PTENOCACHE|PTEIO); memmove(idprom, (char*)(va+0x7d8), 32); if(idprom[0]!=1 || (idprom[1]&0xF0)!=0x50) *(ulong*)va = 0; putw4(va, INVALIDPTE); | |
| 1992/0619 | ||
| 1992/0807 | switch(idprom[1]){ | |
| 1992/0808 | /* sparcstation 1+ BUG: unknown! */ case 0x52: /* IPC 4/40 */ case 0x53: /* sparcstation 1+ 4/65 */ /* fall through */ /* sparcstation 1 */ case 0x51: /* sparcstation 1 4/60 */ case 0x54: /* slc 4/20 */ | |
| 1992/0807 | default: conf.ss2 = 0; conf.vacsize = 65536; conf.vaclinesize = 16; conf.ncontext = 8; conf.npmeg = 128; conf.ss2cachebug = 0; conf.monitor = 1; /* BUG */ | |
| 1992/0808 | nmeg = 64; | |
| 1992/0807 | break; | |
| 1992/0715 | ||
| 1992/0807 |
| |
| 1992/0808 | /* sparcstation 2 */ case 0x55: /* sparcstation 2 4/75 */ case 0x56: /* ELC 4/25 */ case 0x57: /* IPX 4/50 */ | |
| 1992/0807 | conf.ss2 = 1; conf.vacsize = 65536; conf.vaclinesize = 32; conf.ncontext = 16; conf.npmeg = 256; conf.ss2cachebug = 1; conf.monitor = 0; /* BUG */ | |
| 1992/0808 | nmeg = 64; | |
| 1992/0807 | break; } | |
| 1992/0808 | scanmem(mempres, nmeg); for(i=0; i<nmeg; i++) if(mempres[i]){ v = mempres[i]; for(j=i+1; j<nmeg && mempres[j]>v; j++) v = mempres[j]; npg = ((v+1)-mempres[i])*MB/BY2PG; if(conf.npage0 == 0){ conf.base0 = i*MB; conf.npage0 = npg; }else if(conf.npage1 < npg){ conf.base1 = i*MB; conf.npage1 = npg; } i = v-'0'; } | |
| 1992/0807 |
| |
| 1992/0808 | bank[0] = conf.npage0*BY2PG/MB; bank[1] = conf.npage1*BY2PG/MB; | |
| 1992/0807 | conf.npage = conf.npage0+conf.npage1; conf.upages = (conf.npage*70)/100; if(cpuserver){ i = conf.npage-conf.upages; if(i > (6*MB)/BY2PG) conf.upages += i - ((6*MB)/BY2PG); } | |
| 1992/0808 | romputcxsegm = rom->putcxsegm; | |
| 1992/0807 | ||
| 1992/0715 | ktop = PGROUND((ulong)end); ktop = PADDR(ktop); conf.npage0 -= ktop/BY2PG; conf.base0 += ktop; | |
| 1992/0619 | ||
| 1992/0807 | mbytes = (conf.npage*BY2PG)>>20; mul = 1 + (mbytes+11)/12; if(mul > 2) mul = 2; | |
| 1992/0620 | ||
| 1990/1223 | conf.nproc = 50*mul; | |
| 1992/0807 | if(cpuserver) conf.nswap = conf.npage*2; else conf.nswap = 4096; | |
| 1991/0706 | conf.nimage = 50; | |
| 1990/1223 | conf.copymode = 0; /* copy on write */ | |
| 1991/0926 | conf.ipif = 8; conf.ip = 64; conf.arp = 32; conf.frag = 32; | |
| 1992/0807 | if(cpuserver) conf.nproc = 500; | |
| 1990/1231 | } /* * set up the lance */ void lancesetup(Lance *lp) { KMap *k; uchar *cp; | |
| 1992/0711 | ulong pa, va; | |
| 1991/0108 | int i, j; | |
| 1990/1231 | ||
| 1992/0101 | k = kmappa(ETHER, PTEIO|PTENOCACHE); | |
| 1990/1231 | lp->rdp = (void*)(k->va+0); lp->rap = (void*)(k->va+2); | |
| 1992/0101 | k = kmappa(EEPROM, PTEIO|PTENOCACHE); | |
| 1990/1231 | cp = (uchar*)(k->va+0x7da); for(i=0; i<6; i++) lp->ea[i] = *cp++; kunmap(k); | |
| 1991/1030 | lp->lognrrb = 7; | |
| 1991/0109 | lp->logntrb = 5; | |
| 1990/1231 | lp->nrrb = 1<<lp->lognrrb; lp->ntrb = 1<<lp->logntrb; lp->sep = 1; | |
| 1991/0109 | lp->busctl = BSWP | ACON | BCON; | |
| 1990/1231 | /* | |
| 1991/0108 | * Allocate area for lance init block and descriptor rings | |
| 1990/1231 | */ | |
| 1992/0621 | pa = (ulong)xspanalloc(BY2PG, BY2PG, 0); | |
| 1991/0108 | /* map at LANCESEGM */ | |
| 1992/0101 | k = kmappa(pa, PTEMAINMEM|PTENOCACHE); | |
| 1990/1231 | lp->lanceram = (ushort*)k->va; lp->lm = (Lancemem*)k->va; /* | |
| 1991/0108 | * Allocate space in host memory for the io buffers. * Allocate a block and kmap it page by page. kmap's are initially * in reverse order so rearrange them. | |
| 1990/1231 | */ | |
| 1991/0108 | i = (lp->nrrb+lp->ntrb)*sizeof(Etherpkt); | |
| 1990/1231 | i = (i+(BY2PG-1))/BY2PG; | |
| 1992/0622 | pa = (ulong)xspanalloc(i*BY2PG, BY2PG, 0)&~KZERO; | |
| 1991/0108 | va = 0; for(j=i-1; j>=0; j--){ | |
| 1992/0101 | k = kmappa(pa+j*BY2PG, PTEMAINMEM|PTENOCACHE); | |
| 1991/0108 | if(va){ if(va != k->va+BY2PG) panic("lancesetup va unordered"); va = k->va; } } /* * k->va is the base of the region */ | |
| 1990/1231 | lp->lrp = (Etherpkt*)k->va; lp->rp = (Etherpkt*)k->va; | |
| 1991/0108 | lp->ltp = lp->lrp+lp->nrrb; lp->tp = lp->rp+lp->nrrb; | |
| 1991/0604 | } | |