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
options(void)27 options(void)
28 {
29 nconf = archconfval(confname, confval, sizeof(confname));
30 }
31
32 void
doc(char * m)33 doc(char *m)
34 {
35 USED(m);
36 //iprint("%s...\n", m);
37 }
38
39 static void
poolsizeinit(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
serialconsole(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
main(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
machinit(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
init0(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
userinit(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
addconf(char * name,char * val)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*
getconf(char * name)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
confinit(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
exit(int ispanic)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
reboot(void)265 reboot(void)
266 {
267 exit(0);
268 }
269
270 void
halt(void)271 halt(void)
272 {
273 print("cpu halted\n");
274 microdelay(1000);
275 for(;;)
276 ;
277 }
278
279 int
isaconfig(char * class,int ctlrno,ISAConf * isa)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
procsave(Proc *)315 procsave(Proc*)
316 {
317 }
318
319 void
uartputs(char * s,int n)320 uartputs(char *s, int n)
321 {
322 // screenputs(buf, n);
323 putstrn(s, n);
324 uartwait();
325 }
326
327 /* stubs */
328 void
setfsr(ulong)329 setfsr(ulong)
330 {
331 }
332
333 ulong
getfsr()334 getfsr()
335 {
336 return 0;
337 }
338
339 void
setfcr(ulong)340 setfcr(ulong)
341 {
342 }
343
344 ulong
getfcr()345 getfcr()
346 {
347 return 0;
348 }
349