if(userpcnt < 10)
userpcnt = 70;
kpages = conf.npage - (conf.npage*userpcnt)/100;
-
- /*
- * Hack for the big boys. Only good while physmem < 4GB.
- * Give the kernel fixed max + enough to allocate the
- * page pool.
- * This is an overestimate as conf.upages < conf.npages.
- * The patch of nimage is a band-aid, scanning the whole
- * page list in imagereclaim just takes too long.
- */
- if(getconf("*imagemaxmb") == 0)
- if(kpages > (64*MB + conf.npage*sizeof(Page))/BY2PG){
- kpages = (64*MB + conf.npage*sizeof(Page))/BY2PG;
- conf.nimage = 2000;
- kpages += (conf.nproc*KSTACK)/BY2PG;
- }
} else {
if(userpcnt < 10) {
if(conf.npage*BY2PG < 16*MB)
* (probably ~300KB).
*/
kpages *= BY2PG;
- kpages -= conf.upages*sizeof(Page)
- + conf.nproc*sizeof(Proc)
+ kpages -= conf.nproc*sizeof(Proc)
+ conf.nimage*sizeof(Image)
+ conf.nswap
+ conf.nswppo*sizeof(Page*);
}
}
+/*
+ * The palloc.pages array can be a large chunk out of the 2GB
+ * window above KZERO, so we allocate the array from
+ * upages and map in the VMAP window before pageinit()
+ */
+static void
+preallocpages(void)
+{
+ Pallocmem *pm;
+ uintptr va, base, top;
+ vlong size;
+ ulong np;
+ int i;
+
+ np = 0;
+ for(i=0; i<nelem(palloc.mem); i++){
+ pm = &palloc.mem[i];
+ np += pm->npage;
+ }
+ size = (uvlong)np * BY2PG;
+ size += sizeof(Page) + BY2PG; /* round up */
+ size = (size / (sizeof(Page) + BY2PG)) * sizeof(Page);
+ size = ROUND(size, PGLSZ(1));
+
+ for(i=0; i<nelem(palloc.mem); i++){
+ pm = &palloc.mem[i];
+ base = ROUND(pm->base, PGLSZ(1));
+ top = pm->base + (uvlong)pm->npage * BY2PG;
+ if((base + size) <= VMAPSIZE && (vlong)(top - base) >= size){
+ va = base + VMAP;
+ pmap(m->pml4, base | PTEGLOBAL|PTEWRITE|PTEVALID, va, size);
+ palloc.pages = (Page*)va;
+ pm->base = base + size;
+ pm->npage = (top - pm->base)/BY2PG;
+ break;
+ }
+ }
+}
void
machinit(void)
active.machs = 1;
active.exiting = 0;
- active.rebooting = 0;
}
i8250console();
quotefmtinstall();
screeninit();
+ print("\nPlan 9\n");
trapinit0();
kbdinit();
i8253init();
links();
conf.monitor = 1;
chandevreset();
+ preallocpages();
pageinit();
swapinit();
userinit();
procwired(up, 0);
sched();
}
-
- lock(&active);
- active.rebooting = 1;
- unlock(&active);
-
shutdown(0);
- /*
- * should be the only processor running now
- */
- if (m->machno != 0)
- iprint("on cpu%d (not 0)!\n", m->machno);
- if (active.machs)
- iprint("still have active ap processors!\n");
-
iprint("shutting down...\n");
delay(200);
mathnote(up->fpsave.fsw, up->fpsave.rip);
}
+/*
+ * SIMD error
+ */
+static void
+simderror(Ureg *ureg, void*)
+{
+ fpsave(&up->fpsave);
+ up->fpstate = FPinactive;
+ mathnote(up->fpsave.mxcsr & 0x3f, ureg->pc);
+}
+
/*
* math coprocessor emulation fault
*/
_fninit();
_fwait();
_fldcw(0x0232);
- /*
- * TODO: sse exceptions
- * _ldmxcsr(m->mxcsr);
- *
- */
+ _ldmxcsr(0x1900);
up->fpstate = FPactive;
break;
case FPinactive:
intrenable(IrqIRQ13, matherror, 0, BUSUNKNOWN, "matherror");
trapenable(VectorCNA, mathemu, 0, "mathemu");
trapenable(VectorCSO, mathover, 0, "mathover");
+ trapenable(VectorSIMD, simderror, 0, "simderror");
}
void