xref: /inferno-os/os/ipengine/main.c (revision 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a)
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