|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.