From 6df3aec7a369c6beae1e6399eb7cc41c2db8a014 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 10 Sep 1993 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1993-09-10 --- carrera/io.h | 4 +++- carrera/screen.c | 19 ++++++++++++++++--- port/devcons.c | 9 ++++++--- port/page.c | 25 ++++++++++++++----------- port/portdat.h | 5 ++--- port/swap.c | 17 ++++++++++------- 6 files changed, 51 insertions(+), 28 deletions(-) diff --git a/carrera/io.h b/carrera/io.h index 7f13ef1654821c6b4762906d7f551ca815c3b660..7a5ee5ab7cb6b222775c463c913a7fcda770af21 100644 --- a/carrera/io.h +++ b/carrera/io.h @@ -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 diff --git a/carrera/screen.c b/carrera/screen.c index d5a18253b75d0a49b56a671fbc389a8a04ed9099..5d6bc6ac6f12f4a5c6f7eae416fbd789246fbf53 100644 --- a/carrera/screen.c +++ b/carrera/screen.c @@ -190,10 +190,23 @@ 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); diff --git a/port/devcons.c b/port/devcons.c index 34aa3d3c17e945330268c68ae2c5779c38385b2b..aa04dfcbd91cd37dbdf26516ccca561faef369fd 100644 --- a/port/devcons.c +++ b/port/devcons.c @@ -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); diff --git a/port/page.c b/port/page.c index 006b357d6a273d45725f2242366cc1b6a36e0c4b..ee071d621942b1ced31044c68db2d9c68e37966e 100644 --- a/port/page.c +++ b/port/page.c @@ -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); diff --git a/port/portdat.h b/port/portdat.h index 6f00cf0bcb25722ff48d23a6a60041a3a91ef8f3..c3fe10c49ec52a54b572b4494b62db3ca33792af 100644 --- a/port/portdat.h +++ b/port/portdat.h @@ -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; diff --git a/port/swap.c b/port/swap.c index 0b84f2980f153b969486b1ed20484340b34a08f0..00a3e47ac3f7e533174db49bf607be9d10672cd3 100644 --- a/port/swap.c +++ b/port/swap.c @@ -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