M carrera/io.h => carrera/io.h +3 -1
@@ 70,5 70,7 @@ struct Tte
#define UNCACHED(type, v) (type*)((ulong)(v)|0xA0000000)
#define EISA(v) (Eisamvirt+(v))
-#define EISAOUTB(port, v) *(uchar*)((EisaControl+(port))^7) = v
#define EISAINB(port) (*(uchar*)((EisaControl+(port))^7))
+#define EISAINW(port) (*(ushort*)((EisaControl+(port))^7))
+#define EISAOUTB(port, v) EISAINB(port) = v
+#define EISAOUTW(port, v) EISAINW(port) = v
M carrera/screen.c => carrera/screen.c +16 -3
@@ 190,11 190,24 @@ screeninit(void)
int i, j;
uchar *scr;
- EISAOUTB(0x3c3, 1);
- delay(1);
- EISAOUTB(0x46e8, 0x8);
+EISAOUTB(0x3C3, 1);
+EISAOUTB(0x46e8, 8);
+EISAOUTB(0x3bf, 1);
+i = EISAINB(0x3b8);
+print("=%2.2ux\n", i);
+EISAOUTB(0x3bf, 3);
+i = EISAINB(0x3b8);
+print("=%2.2ux\n", i);
+EISAOUTB(0x3bf, 1);
+i = EISAINB(0x3d8);
+print("=%2.2ux\n", i);
+EISAOUTB(0x3bf, 3);
+i = EISAINB(0x3d8);
+print("=%2.2ux\n", i);
+EISAOUTB(0x3d8, 0xa0);
setmode(&dfltmode);
+ setmode(&dfltmode);
getvmode(&x);
writeregisters(&x);
return;
M port/devcons.c => port/devcons.c +6 -3
@@ 611,9 611,12 @@ consread(Chan *c, void *buf, long n, ulong offset)
return n;
case Qswap:
- sprint(tmp, "%d/%d memory %d/%d swap\n",
- palloc.user-palloc.freecount, palloc.user,
- conf.nswap-swapalloc.free, conf.nswap);
+ k = 0;
+ for(i = 0; i < NCOLOR; i++)
+ k += palloc.freecol[i];
+
+ sprint(tmp, "%d/%d memory %d/%d swap\n", palloc.user-k,
+ palloc.user, conf.nswap-swapalloc.free, conf.nswap);
return readstr(offset, buf, n, tmp);
M port/page.c => port/page.c +14 -11
@@ 87,17 87,17 @@ retry:
*s = 0;
dontalloc = 1;
}
- qlock(&palloc.pwait); /* Hold memory requesters here */
+ qlock(&palloc.pwait[color]); /* Hold memory requesters here */
while(waserror()) /* Ignore interrupts */
;
kickpager();
- tsleep(&palloc.r, ispages, 0, 1000);
+ tsleep(&palloc.r[color], ispages, (void*)color, 1000);
poperror();
- qunlock(&palloc.pwait);
+ qunlock(&palloc.pwait[color]);
/*
* If called from fault and we lost the segment from
@@ 130,7 130,6 @@ retry:
palloc.tail = p->prev;
- palloc.freecount--;
palloc.freecol[color]--;
unlock(&palloc);
@@ 160,13 159,17 @@ retry:
int
ispages(void *p)
{
- USED(p);
- return palloc.freecount >= swapalloc.highwater;
+ int color;
+
+ color = (int)p;
+ return palloc.freecol[color] >= swapalloc.highwater/NCOLOR;
}
void
putpage(Page *p)
{
+ Rendez *r;
+
if(onswap(p)) {
putswap(p);
return;
@@ 204,10 207,10 @@ putpage(Page *p)
p->prev = 0;
}
- palloc.freecount++; /* Release people waiting for memory */
palloc.freecol[p->color]++;
- if(palloc.r.p != 0)
- wakeup(&palloc.r);
+ r = &palloc.r[p->color];
+ if(r->p != 0)
+ wakeup(r);
unlock(&palloc);
unlock(p);
@@ 227,7 230,7 @@ duppage(Page *p) /* Always call with p locked */
lock(&palloc);
/* No freelist cache when memory is very low */
- if(palloc.freecount < swapalloc.highwater) {
+ if(palloc.freecol[p->color] < swapalloc.highwater/NCOLOR) {
unlock(&palloc);
uncachepage(p);
return;
@@ 385,7 388,7 @@ lookpage(Image *i, ulong daddr)
f->next->prev = f->prev;
else
palloc.tail = f->prev;
- palloc.freecount--;
+
palloc.freecol[f->color]--;
}
unlock(&palloc);
M port/portdat.h => port/portdat.h +2 -3
@@ 452,13 452,12 @@ struct Palloc
ulong np0, np1; /* number of pages in bank 0/1 */
Page *head; /* most recently used */
Page *tail; /* least recently used */
- ulong freecount;
ulong freecol[NCOLOR]; /* how many pages on free list now */
ulong user; /* how many user pages */
Page *hash[PGHSIZE];
Lock hashlock;
- Rendez r; /* Sleep for free mem */
- QLock pwait; /* Queue of procs waiting for memory */
+ Rendez r[NCOLOR]; /* Sleep for free mem */
+ QLock pwait[NCOLOR]; /* Queue of procs waiting for memory */
int wanted; /* Do the wakeup at free */
ulong cmembase; /* Key memory */
ulong cmemtop;
M port/swap.c => port/swap.c +10 -7
@@ 109,7 109,7 @@ loop:
up->psstate = "Idle";
sleep(&swapalloc.r, needpages, 0);
- for(;;) {
+ while(needpages(junk)) {
p++;
if(p >= ep)
p = proctab(0);
@@ 142,17 142,16 @@ loop:
}
}
}
- continue;
}
-
- if(palloc.freecount < swapalloc.highwater) {
+ else {
if(!cpuserver)
freebroken(); /* can use the memory */
/* Emulate the old system if no swap channel */
print("no physical memory\n");
tsleep(&swapalloc.r, return0, 0, 1000);
- wakeup(&palloc.r);
+ for(i = 0; i < NCOLOR; i++)
+ wakeup(&palloc.r[i]);
}
}
goto loop;
@@ 211,7 210,6 @@ out:
poperror();
qunlock(&s->lk);
putseg(s);
- wakeup(&palloc.r);
}
int
@@ 322,8 320,13 @@ executeio(void)
int
needpages(void *p)
{
+ int i;
+
USED(p);
- return palloc.freecount < swapalloc.headroom;
+ for(i = 0; i < NCOLOR; i++)
+ if(palloc.freecol[i] < swapalloc.headroom/NCOLOR)
+ return 1;
+ return 0;
}
void