diff options
Diffstat (limited to 'os/ks32/main.c')
| -rw-r--r-- | os/ks32/main.c | 289 |
1 files changed, 289 insertions, 0 deletions
diff --git a/os/ks32/main.c b/os/ks32/main.c new file mode 100644 index 00000000..f338c5ca --- /dev/null +++ b/os/ks32/main.c @@ -0,0 +1,289 @@ +#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; +} + |
