1*74a4d8c2SCharles.Forsyth #include "u.h"
2*74a4d8c2SCharles.Forsyth #include "../port/lib.h"
3*74a4d8c2SCharles.Forsyth #include "mem.h"
4*74a4d8c2SCharles.Forsyth #include "dat.h"
5*74a4d8c2SCharles.Forsyth #include "fns.h"
6*74a4d8c2SCharles.Forsyth #include "io.h"
7*74a4d8c2SCharles.Forsyth #include "ureg.h"
8*74a4d8c2SCharles.Forsyth #include "version.h"
9*74a4d8c2SCharles.Forsyth
10*74a4d8c2SCharles.Forsyth #define MAXCONF 32
11*74a4d8c2SCharles.Forsyth
12*74a4d8c2SCharles.Forsyth extern ulong kerndate;
13*74a4d8c2SCharles.Forsyth extern int cflag;
14*74a4d8c2SCharles.Forsyth int remotedebug;
15*74a4d8c2SCharles.Forsyth
16*74a4d8c2SCharles.Forsyth extern int main_pool_pcnt;
17*74a4d8c2SCharles.Forsyth extern int heap_pool_pcnt;
18*74a4d8c2SCharles.Forsyth extern int image_pool_pcnt;
19*74a4d8c2SCharles.Forsyth
20*74a4d8c2SCharles.Forsyth char *confname[MAXCONF];
21*74a4d8c2SCharles.Forsyth char *confval[MAXCONF];
22*74a4d8c2SCharles.Forsyth int nconf;
23*74a4d8c2SCharles.Forsyth
24*74a4d8c2SCharles.Forsyth void addconf(char *, char *);
25*74a4d8c2SCharles.Forsyth
26*74a4d8c2SCharles.Forsyth static void
options(void)27*74a4d8c2SCharles.Forsyth options(void)
28*74a4d8c2SCharles.Forsyth {
29*74a4d8c2SCharles.Forsyth nconf = archconfval(confname, confval, sizeof(confname));
30*74a4d8c2SCharles.Forsyth }
31*74a4d8c2SCharles.Forsyth
32*74a4d8c2SCharles.Forsyth void
doc(char * m)33*74a4d8c2SCharles.Forsyth doc(char *m)
34*74a4d8c2SCharles.Forsyth {
35*74a4d8c2SCharles.Forsyth USED(m);
36*74a4d8c2SCharles.Forsyth //iprint("%s...\n", m);
37*74a4d8c2SCharles.Forsyth }
38*74a4d8c2SCharles.Forsyth
39*74a4d8c2SCharles.Forsyth static void
poolsizeinit(void)40*74a4d8c2SCharles.Forsyth poolsizeinit(void)
41*74a4d8c2SCharles.Forsyth {
42*74a4d8c2SCharles.Forsyth ulong nb;
43*74a4d8c2SCharles.Forsyth
44*74a4d8c2SCharles.Forsyth nb = conf.npage*BY2PG;
45*74a4d8c2SCharles.Forsyth poolsize(mainmem, (nb*main_pool_pcnt)/100, 0);
46*74a4d8c2SCharles.Forsyth poolsize(heapmem, (nb*heap_pool_pcnt)/100, 0);
47*74a4d8c2SCharles.Forsyth poolsize(imagmem, (nb*image_pool_pcnt)/100, 1);
48*74a4d8c2SCharles.Forsyth }
49*74a4d8c2SCharles.Forsyth
50*74a4d8c2SCharles.Forsyth static void
serialconsole(void)51*74a4d8c2SCharles.Forsyth serialconsole(void)
52*74a4d8c2SCharles.Forsyth {
53*74a4d8c2SCharles.Forsyth char *p;
54*74a4d8c2SCharles.Forsyth int port, baud;
55*74a4d8c2SCharles.Forsyth
56*74a4d8c2SCharles.Forsyth p = getconf("console");
57*74a4d8c2SCharles.Forsyth if(p == nil)
58*74a4d8c2SCharles.Forsyth p = "0";
59*74a4d8c2SCharles.Forsyth if(p != nil && !remotedebug){
60*74a4d8c2SCharles.Forsyth port = strtol(p, nil, 0);
61*74a4d8c2SCharles.Forsyth baud = 9600;
62*74a4d8c2SCharles.Forsyth p = getconf("baud");
63*74a4d8c2SCharles.Forsyth if(p != nil){
64*74a4d8c2SCharles.Forsyth baud = strtol(p, nil, 0);
65*74a4d8c2SCharles.Forsyth if(baud < 9600)
66*74a4d8c2SCharles.Forsyth baud = 9600;
67*74a4d8c2SCharles.Forsyth }
68*74a4d8c2SCharles.Forsyth uartspecial(port, baud, &kbdq, &printq, kbdcr2nl);
69*74a4d8c2SCharles.Forsyth }
70*74a4d8c2SCharles.Forsyth }
71*74a4d8c2SCharles.Forsyth
72*74a4d8c2SCharles.Forsyth void
main(void)73*74a4d8c2SCharles.Forsyth main(void)
74*74a4d8c2SCharles.Forsyth {
75*74a4d8c2SCharles.Forsyth machinit();
76*74a4d8c2SCharles.Forsyth options();
77*74a4d8c2SCharles.Forsyth archinit();
78*74a4d8c2SCharles.Forsyth quotefmtinstall();
79*74a4d8c2SCharles.Forsyth confinit();
80*74a4d8c2SCharles.Forsyth cpminit();
81*74a4d8c2SCharles.Forsyth xinit();
82*74a4d8c2SCharles.Forsyth poolsizeinit();
83*74a4d8c2SCharles.Forsyth trapinit();
84*74a4d8c2SCharles.Forsyth mmuinit();
85*74a4d8c2SCharles.Forsyth printinit();
86*74a4d8c2SCharles.Forsyth uartinstall();
87*74a4d8c2SCharles.Forsyth serialconsole();
88*74a4d8c2SCharles.Forsyth doc("screeninit");
89*74a4d8c2SCharles.Forsyth screeninit();
90*74a4d8c2SCharles.Forsyth doc("kbdinit");
91*74a4d8c2SCharles.Forsyth kbdinit();
92*74a4d8c2SCharles.Forsyth doc("clockinit");
93*74a4d8c2SCharles.Forsyth clockinit();
94*74a4d8c2SCharles.Forsyth doc("procinit");
95*74a4d8c2SCharles.Forsyth procinit();
96*74a4d8c2SCharles.Forsyth cpuidprint();
97*74a4d8c2SCharles.Forsyth doc("links");
98*74a4d8c2SCharles.Forsyth links();
99*74a4d8c2SCharles.Forsyth doc("chandevreset");
100*74a4d8c2SCharles.Forsyth chandevreset();
101*74a4d8c2SCharles.Forsyth
102*74a4d8c2SCharles.Forsyth eve = strdup("inferno");
103*74a4d8c2SCharles.Forsyth
104*74a4d8c2SCharles.Forsyth print("\nInferno %s\n", VERSION);
105*74a4d8c2SCharles.Forsyth print("Vita Nuova\n");
106*74a4d8c2SCharles.Forsyth print("conf %s (%lud) jit %d\n\n",conffile, kerndate, cflag);
107*74a4d8c2SCharles.Forsyth
108*74a4d8c2SCharles.Forsyth doc("userinit");
109*74a4d8c2SCharles.Forsyth userinit();
110*74a4d8c2SCharles.Forsyth doc("schedinit");
111*74a4d8c2SCharles.Forsyth schedinit();
112*74a4d8c2SCharles.Forsyth }
113*74a4d8c2SCharles.Forsyth
114*74a4d8c2SCharles.Forsyth void
machinit(void)115*74a4d8c2SCharles.Forsyth machinit(void)
116*74a4d8c2SCharles.Forsyth {
117*74a4d8c2SCharles.Forsyth int n;
118*74a4d8c2SCharles.Forsyth
119*74a4d8c2SCharles.Forsyth n = m->machno;
120*74a4d8c2SCharles.Forsyth memset(m, 0, sizeof(Mach));
121*74a4d8c2SCharles.Forsyth m->machno = n;
122*74a4d8c2SCharles.Forsyth m->mmask = 1<<m->machno;
123*74a4d8c2SCharles.Forsyth m->iomem = KADDR(getimmr() & ~0xFFFF);
124*74a4d8c2SCharles.Forsyth m->cputype = getpvr()>>16;
125*74a4d8c2SCharles.Forsyth m->delayloop = 20000; /* initial estimate only; set by clockinit */
126*74a4d8c2SCharles.Forsyth m->speed = 50; /* initial estimate only; set by archinit */
127*74a4d8c2SCharles.Forsyth }
128*74a4d8c2SCharles.Forsyth
129*74a4d8c2SCharles.Forsyth void
init0(void)130*74a4d8c2SCharles.Forsyth init0(void)
131*74a4d8c2SCharles.Forsyth {
132*74a4d8c2SCharles.Forsyth Osenv *o;
133*74a4d8c2SCharles.Forsyth int i;
134*74a4d8c2SCharles.Forsyth char buf[2*KNAMELEN];
135*74a4d8c2SCharles.Forsyth
136*74a4d8c2SCharles.Forsyth up->nerrlab = 0;
137*74a4d8c2SCharles.Forsyth
138*74a4d8c2SCharles.Forsyth spllo();
139*74a4d8c2SCharles.Forsyth
140*74a4d8c2SCharles.Forsyth if(waserror())
141*74a4d8c2SCharles.Forsyth panic("init0");
142*74a4d8c2SCharles.Forsyth /*
143*74a4d8c2SCharles.Forsyth * These are o.k. because rootinit is null.
144*74a4d8c2SCharles.Forsyth * Then early kproc's will have a root and dot.
145*74a4d8c2SCharles.Forsyth */
146*74a4d8c2SCharles.Forsyth o = up->env;
147*74a4d8c2SCharles.Forsyth o->pgrp->slash = namec("#/", Atodir, 0, 0);
148*74a4d8c2SCharles.Forsyth cnameclose(o->pgrp->slash->name);
149*74a4d8c2SCharles.Forsyth o->pgrp->slash->name = newcname("/");
150*74a4d8c2SCharles.Forsyth o->pgrp->dot = cclone(o->pgrp->slash);
151*74a4d8c2SCharles.Forsyth
152*74a4d8c2SCharles.Forsyth chandevinit();
153*74a4d8c2SCharles.Forsyth
154*74a4d8c2SCharles.Forsyth if(!waserror()){
155*74a4d8c2SCharles.Forsyth ksetenv("cputype", "power", 0);
156*74a4d8c2SCharles.Forsyth snprint(buf, sizeof(buf), "power %s", conffile);
157*74a4d8c2SCharles.Forsyth ksetenv("terminal", buf, 0);
158*74a4d8c2SCharles.Forsyth poperror();
159*74a4d8c2SCharles.Forsyth }
160*74a4d8c2SCharles.Forsyth for(i = 0; i < nconf; i++)
161*74a4d8c2SCharles.Forsyth if(confname[i][0] != '*'){
162*74a4d8c2SCharles.Forsyth if(!waserror()){
163*74a4d8c2SCharles.Forsyth ksetenv(confname[i], confval[i], 0);
164*74a4d8c2SCharles.Forsyth poperror();
165*74a4d8c2SCharles.Forsyth }
166*74a4d8c2SCharles.Forsyth }
167*74a4d8c2SCharles.Forsyth
168*74a4d8c2SCharles.Forsyth poperror();
169*74a4d8c2SCharles.Forsyth disinit("/osinit.dis");
170*74a4d8c2SCharles.Forsyth }
171*74a4d8c2SCharles.Forsyth
172*74a4d8c2SCharles.Forsyth void
userinit(void)173*74a4d8c2SCharles.Forsyth userinit(void)
174*74a4d8c2SCharles.Forsyth {
175*74a4d8c2SCharles.Forsyth Proc *p;
176*74a4d8c2SCharles.Forsyth Osenv *o;
177*74a4d8c2SCharles.Forsyth
178*74a4d8c2SCharles.Forsyth p = newproc();
179*74a4d8c2SCharles.Forsyth o = p->env;
180*74a4d8c2SCharles.Forsyth
181*74a4d8c2SCharles.Forsyth o->fgrp = newfgrp(nil);
182*74a4d8c2SCharles.Forsyth o->pgrp = newpgrp();
183*74a4d8c2SCharles.Forsyth o->egrp = newegrp();
184*74a4d8c2SCharles.Forsyth kstrdup(&o->user, eve);
185*74a4d8c2SCharles.Forsyth
186*74a4d8c2SCharles.Forsyth strcpy(p->text, "interp");
187*74a4d8c2SCharles.Forsyth
188*74a4d8c2SCharles.Forsyth /*
189*74a4d8c2SCharles.Forsyth * Kernel Stack
190*74a4d8c2SCharles.Forsyth */
191*74a4d8c2SCharles.Forsyth p->sched.pc = (ulong)init0;
192*74a4d8c2SCharles.Forsyth p->sched.sp = (ulong)p->kstack+KSTACK;
193*74a4d8c2SCharles.Forsyth
194*74a4d8c2SCharles.Forsyth ready(p);
195*74a4d8c2SCharles.Forsyth }
196*74a4d8c2SCharles.Forsyth
197*74a4d8c2SCharles.Forsyth Conf conf;
198*74a4d8c2SCharles.Forsyth
199*74a4d8c2SCharles.Forsyth void
addconf(char * name,char * val)200*74a4d8c2SCharles.Forsyth addconf(char *name, char *val)
201*74a4d8c2SCharles.Forsyth {
202*74a4d8c2SCharles.Forsyth if(nconf >= MAXCONF)
203*74a4d8c2SCharles.Forsyth return;
204*74a4d8c2SCharles.Forsyth confname[nconf] = name;
205*74a4d8c2SCharles.Forsyth confval[nconf] = val;
206*74a4d8c2SCharles.Forsyth nconf++;
207*74a4d8c2SCharles.Forsyth }
208*74a4d8c2SCharles.Forsyth
209*74a4d8c2SCharles.Forsyth char*
getconf(char * name)210*74a4d8c2SCharles.Forsyth getconf(char *name)
211*74a4d8c2SCharles.Forsyth {
212*74a4d8c2SCharles.Forsyth int i;
213*74a4d8c2SCharles.Forsyth
214*74a4d8c2SCharles.Forsyth for(i = 0; i < nconf; i++)
215*74a4d8c2SCharles.Forsyth if(cistrcmp(confname[i], name) == 0)
216*74a4d8c2SCharles.Forsyth return confval[i];
217*74a4d8c2SCharles.Forsyth return 0;
218*74a4d8c2SCharles.Forsyth }
219*74a4d8c2SCharles.Forsyth
220*74a4d8c2SCharles.Forsyth void
confinit(void)221*74a4d8c2SCharles.Forsyth confinit(void)
222*74a4d8c2SCharles.Forsyth {
223*74a4d8c2SCharles.Forsyth char *p;
224*74a4d8c2SCharles.Forsyth int pcnt;
225*74a4d8c2SCharles.Forsyth
226*74a4d8c2SCharles.Forsyth if(p = getconf("*kernelpercent"))
227*74a4d8c2SCharles.Forsyth pcnt = 100 - strtol(p, 0, 0);
228*74a4d8c2SCharles.Forsyth else
229*74a4d8c2SCharles.Forsyth pcnt = 0;
230*74a4d8c2SCharles.Forsyth
231*74a4d8c2SCharles.Forsyth conf.nscc = 4;
232*74a4d8c2SCharles.Forsyth conf.smcuarts = (1<<1)|(1<<0); /* SMC2, SMC1 (usual console) */
233*74a4d8c2SCharles.Forsyth conf.sccuarts = 0; /* SCC2 not available by default (it's Ether) */
234*74a4d8c2SCharles.Forsyth
235*74a4d8c2SCharles.Forsyth archconfinit();
236*74a4d8c2SCharles.Forsyth
237*74a4d8c2SCharles.Forsyth conf.npage = conf.npage0 + conf.npage1;
238*74a4d8c2SCharles.Forsyth if(pcnt < 10)
239*74a4d8c2SCharles.Forsyth pcnt = 70;
240*74a4d8c2SCharles.Forsyth conf.ialloc = (((conf.npage*(100-pcnt))/100)/2)*BY2PG;
241*74a4d8c2SCharles.Forsyth
242*74a4d8c2SCharles.Forsyth conf.nproc = 100 + ((conf.npage*BY2PG)/MB)*5;
243*74a4d8c2SCharles.Forsyth conf.nmach = MAXMACH;
244*74a4d8c2SCharles.Forsyth }
245*74a4d8c2SCharles.Forsyth
246*74a4d8c2SCharles.Forsyth void
exit(int ispanic)247*74a4d8c2SCharles.Forsyth exit(int ispanic)
248*74a4d8c2SCharles.Forsyth {
249*74a4d8c2SCharles.Forsyth up = 0;
250*74a4d8c2SCharles.Forsyth toggleled(3);
251*74a4d8c2SCharles.Forsyth spllo();
252*74a4d8c2SCharles.Forsyth print("cpu %d exiting\n", m->machno);
253*74a4d8c2SCharles.Forsyth
254*74a4d8c2SCharles.Forsyth /* Shutdown running devices */
255*74a4d8c2SCharles.Forsyth chandevshutdown();
256*74a4d8c2SCharles.Forsyth
257*74a4d8c2SCharles.Forsyth delay(1000);
258*74a4d8c2SCharles.Forsyth splhi();
259*74a4d8c2SCharles.Forsyth if(ispanic)
260*74a4d8c2SCharles.Forsyth for(;;);
261*74a4d8c2SCharles.Forsyth archreboot();
262*74a4d8c2SCharles.Forsyth }
263*74a4d8c2SCharles.Forsyth
264*74a4d8c2SCharles.Forsyth void
reboot(void)265*74a4d8c2SCharles.Forsyth reboot(void)
266*74a4d8c2SCharles.Forsyth {
267*74a4d8c2SCharles.Forsyth exit(0);
268*74a4d8c2SCharles.Forsyth }
269*74a4d8c2SCharles.Forsyth
270*74a4d8c2SCharles.Forsyth void
halt(void)271*74a4d8c2SCharles.Forsyth halt(void)
272*74a4d8c2SCharles.Forsyth {
273*74a4d8c2SCharles.Forsyth print("cpu halted\n");
274*74a4d8c2SCharles.Forsyth microdelay(1000);
275*74a4d8c2SCharles.Forsyth for(;;)
276*74a4d8c2SCharles.Forsyth ;
277*74a4d8c2SCharles.Forsyth }
278*74a4d8c2SCharles.Forsyth
279*74a4d8c2SCharles.Forsyth int
isaconfig(char * class,int ctlrno,ISAConf * isa)280*74a4d8c2SCharles.Forsyth isaconfig(char *class, int ctlrno, ISAConf *isa)
281*74a4d8c2SCharles.Forsyth {
282*74a4d8c2SCharles.Forsyth char cc[KNAMELEN], *p;
283*74a4d8c2SCharles.Forsyth int i;
284*74a4d8c2SCharles.Forsyth
285*74a4d8c2SCharles.Forsyth snprint(cc, sizeof cc, "%s%d", class, ctlrno);
286*74a4d8c2SCharles.Forsyth p = getconf(cc);
287*74a4d8c2SCharles.Forsyth if(p == nil)
288*74a4d8c2SCharles.Forsyth return 0;
289*74a4d8c2SCharles.Forsyth
290*74a4d8c2SCharles.Forsyth isa->nopt = tokenize(p, isa->opt, NISAOPT);
291*74a4d8c2SCharles.Forsyth for(i = 0; i < isa->nopt; i++){
292*74a4d8c2SCharles.Forsyth p = isa->opt[i];
293*74a4d8c2SCharles.Forsyth if(cistrncmp(p, "type=", 5) == 0)
294*74a4d8c2SCharles.Forsyth isa->type = p + 5;
295*74a4d8c2SCharles.Forsyth else if(cistrncmp(p, "port=", 5) == 0)
296*74a4d8c2SCharles.Forsyth isa->port = strtoul(p+5, &p, 0);
297*74a4d8c2SCharles.Forsyth else if(cistrncmp(p, "irq=", 4) == 0)
298*74a4d8c2SCharles.Forsyth isa->irq = strtoul(p+4, &p, 0);
299*74a4d8c2SCharles.Forsyth else if(cistrncmp(p, "mem=", 4) == 0)
300*74a4d8c2SCharles.Forsyth isa->mem = strtoul(p+4, &p, 0);
301*74a4d8c2SCharles.Forsyth else if(cistrncmp(p, "size=", 5) == 0)
302*74a4d8c2SCharles.Forsyth isa->size = strtoul(p+5, &p, 0);
303*74a4d8c2SCharles.Forsyth else if(cistrncmp(p, "freq=", 5) == 0)
304*74a4d8c2SCharles.Forsyth isa->freq = strtoul(p+5, &p, 0);
305*74a4d8c2SCharles.Forsyth else if(cistrncmp(p, "dma=", 4) == 0)
306*74a4d8c2SCharles.Forsyth isa->dma = strtoul(p+4, &p, 0);
307*74a4d8c2SCharles.Forsyth }
308*74a4d8c2SCharles.Forsyth return 1;
309*74a4d8c2SCharles.Forsyth }
310*74a4d8c2SCharles.Forsyth
311*74a4d8c2SCharles.Forsyth /*
312*74a4d8c2SCharles.Forsyth * Save the mach dependent part of the process state.
313*74a4d8c2SCharles.Forsyth */
314*74a4d8c2SCharles.Forsyth void
procsave(Proc *)315*74a4d8c2SCharles.Forsyth procsave(Proc*)
316*74a4d8c2SCharles.Forsyth {
317*74a4d8c2SCharles.Forsyth }
318*74a4d8c2SCharles.Forsyth
319*74a4d8c2SCharles.Forsyth void
uartputs(char * s,int n)320*74a4d8c2SCharles.Forsyth uartputs(char *s, int n)
321*74a4d8c2SCharles.Forsyth {
322*74a4d8c2SCharles.Forsyth // screenputs(buf, n);
323*74a4d8c2SCharles.Forsyth putstrn(s, n);
324*74a4d8c2SCharles.Forsyth uartwait();
325*74a4d8c2SCharles.Forsyth }
326*74a4d8c2SCharles.Forsyth
327*74a4d8c2SCharles.Forsyth /* stubs */
328*74a4d8c2SCharles.Forsyth void
setfsr(ulong)329*74a4d8c2SCharles.Forsyth setfsr(ulong)
330*74a4d8c2SCharles.Forsyth {
331*74a4d8c2SCharles.Forsyth }
332*74a4d8c2SCharles.Forsyth
333*74a4d8c2SCharles.Forsyth ulong
getfsr()334*74a4d8c2SCharles.Forsyth getfsr()
335*74a4d8c2SCharles.Forsyth {
336*74a4d8c2SCharles.Forsyth return 0;
337*74a4d8c2SCharles.Forsyth }
338*74a4d8c2SCharles.Forsyth
339*74a4d8c2SCharles.Forsyth void
setfcr(ulong)340*74a4d8c2SCharles.Forsyth setfcr(ulong)
341*74a4d8c2SCharles.Forsyth {
342*74a4d8c2SCharles.Forsyth }
343*74a4d8c2SCharles.Forsyth
344*74a4d8c2SCharles.Forsyth ulong
getfcr()345*74a4d8c2SCharles.Forsyth getfcr()
346*74a4d8c2SCharles.Forsyth {
347*74a4d8c2SCharles.Forsyth return 0;
348*74a4d8c2SCharles.Forsyth }
349