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