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