ref: 94443daf8e248e65afc8d3f17f26efea22748b51
dir: /os/ks32/main.c/
#include "u.h"
#include "../port/lib.h"
#include "mem.h"
#include "io.h"
#include "dat.h"
#include "fns.h"
#include "../port/error.h"
#include "version.h"
Mach *m = (Mach*)MACHADDR;
Proc *up = 0;
Conf conf;
extern ulong kerndate;
extern int cflag;
extern int consoleprint;
extern int redirectconsole;
extern int main_pool_pcnt;
extern int heap_pool_pcnt;
extern int image_pool_pcnt;
extern int kernel_pool_pcnt;
int
segflush(void *p, ulong l)
{
USED(p, l);
return 1;
}
static void
poolsizeinit(void)
{
ulong nb;
nb = conf.npage*BY2PG;
iprint("free memory %ld\n", nb);
poolsize(mainmem, (nb*main_pool_pcnt)/100, 0);
poolsize(heapmem, (nb*heap_pool_pcnt)/100, 0);
poolsize(imagmem, (nb*image_pool_pcnt)/100, 1);
}
void
reboot(void)
{
exit(0);
}
void
halt(void)
{
spllo();
print("cpu halted\n");
while(1);
}
void
confinit(void)
{
ulong base;
archconfinit();
base = PGROUND((ulong)end);
conf.base0 = base;
conf.base1 = 0;
conf.npage1 = 0;
conf.npage0 = (conf.topofmem - base)/BY2PG;
conf.npage = conf.npage0 + conf.npage1;
conf.ialloc = (((conf.npage*(main_pool_pcnt))/100)/2)*BY2PG;
conf.nproc = 20;
// conf.nproc = 100 + ((conf.npage*BY2PG)/MB)*5;
conf.nmach = 1;
}
void
machinit(void)
{
memset(m, 0, sizeof(Mach)); /* clear the mach struct */
}
void
cachemode(int size, int cenable, int wbenable)
{
ulong sc = SYSCFG;
int cm;
switch (size) {
case 0:
default:
cm = 2;
break;
case 4096:
cm = 0;
break;
case 8192:
cm = 1;
break;
}
sc &= ~((3 << 4) | (1 << 2) | (1 << 1));
SYSCFG = sc | (cm << 4) | (cenable << 1) | (wbenable << 2);
}
void
serputc()
{
// dummy routine
}
void
main(void)
{
long *p, *ep;
/* clear the BSS by hand */
p = (long*)edata;
ep = (long*)end;
while(p < ep)
*p++ = 0;
// memset(edata, 0, end-edata); /* clear the BSS */
cachemode(8192, 1, 1);
machinit();
archreset();
confinit();
links();
xinit();
poolinit();
poolsizeinit();
trapinit();
// mmuctlregw(mmuctlregr() | CpCDcache | CpCwb | CpCi32 | CpCd32 | CpCIcache);
clockinit();
printinit();
// screeninit();
procinit();
chandevreset();
eve = strdup("inferno");
archconsole();
// else
// kbdinit();
print("\nInferno %s\n", VERSION);
print("conf %s (%lud) jit %d\n\n", conffile, kerndate, cflag);
userinit();
// print("userinit over\n");
schedinit();
}
void
init0(void)
{
Osenv *o;
// print("init0\n");
up->nerrlab = 0;
spllo();
if(waserror())
panic("init0 %r");
/*
* These are o.k. because rootinit is null.
* Then early kproc's will have a root and dot.
*/
o = up->env;
o->pgrp->slash = namec("#/", Atodir, 0, 0);
cnameclose(o->pgrp->slash->name);
o->pgrp->slash->name = newcname("/");
o->pgrp->dot = cclone(o->pgrp->slash);
chandevinit();
poperror();
// iprint("init0: disinit\n");
// print("CXXXYYYYYYYYZZZZZZZ\n");
disinit("/osinit.dis");
}
void
userinit()
{
Proc *p;
Osenv *o;
p = newproc();
o = p->env;
o->fgrp = newfgrp(nil);
o->pgrp = newpgrp();
kstrdup(&o->user, eve);
strcpy(p->text, "interp");
p->fpstate = FPINIT;
/*
* Kernel Stack
*
* N.B. The -12 for the stack pointer is important.
* 4 bytes for gotolabel's return PC
*/
p->sched.pc = (ulong)init0;
p->sched.sp = (ulong)p->kstack+KSTACK-8;
ready(p);
}
void
exit(int inpanic)
{
up = 0;
/* Shutdown running devices */
chandevshutdown();
if(inpanic){
print("Hit the reset button\n");
for(;;)clockpoll();
}
archreboot();
}
static void
linkproc(void)
{
spllo();
if (waserror())
print("error() underflow: %r\n");
else
(*up->kpfun)(up->arg);
pexit("end proc", 1);
}
void
kprocchild(Proc *p, void (*func)(void*), void *arg)
{
p->sched.pc = (ulong)linkproc;
p->sched.sp = (ulong)p->kstack+KSTACK-8;
p->kpfun = func;
p->arg = arg;
}
/* stubs */
void
setfsr(ulong x) {
USED(x);
}
ulong
getfsr(){
return 0;
}
void
setfcr(ulong x) {
USED(x);
}
ulong
getfcr(){
return 0;
}
void
fpinit(void)
{
}
void
FPsave(void*)
{
}
void
FPrestore(void*)
{
}
ulong
va2pa(void *v)
{
return (ulong)v;
}