From ab3f03d8c78a03dccd267c3d93659836fc06280f Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 9 Feb 1995 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1995-02-09 --- pc/devi82365.c | 30 ++++++++++++++++++------------ pc/mmu.c | 4 ++-- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/pc/devi82365.c b/pc/devi82365.c index a5eb0c00a5ca1c319e36624b87976656b825c475..813f1777df2bca4731183b8a4f8c261c1c0ca529 100644 --- a/pc/devi82365.c +++ b/pc/devi82365.c @@ -117,7 +117,6 @@ enum }; struct I82365 { - QLock; int type; int dev; int nslot; @@ -130,6 +129,7 @@ static int ncontroller; /* a Slot slot */ struct Slot { + Lock; int ref; I82365 *cp; /* controller for this slot */ @@ -168,6 +168,7 @@ struct Slot ulong otherwait; /* memory maps */ + QLock mlock; /* lock down the maps */ int time; PCMmap mmap[Nmap]; }; @@ -322,10 +323,11 @@ getmap(Slot *pp, ulong offset, int attr) pp->gotmem = 1; /* grab ISA address space for memory maps */ - for(i = 0; i < Nmap; i++) + for(i = 0; i < Nmap; i++){ pp->mmap[i].isa = getisa(0, Mchunk, BY2PG); - if(pp->mmap[i].isa == 0) - panic("getmap"); + if(pp->mmap[i].isa == 0) + panic("getmap"); + } } /* look for a map that starts in the right place */ @@ -368,19 +370,19 @@ getmap(Slot *pp, ulong offset, int attr) static void increfp(Slot *pp) { - qlock(pp->cp); + lock(pp); if(pp->ref++ == 0) slotena(pp); - qunlock(pp->cp); + unlock(pp); } static void decrefp(Slot *pp) { - qlock(pp->cp); + lock(pp); if(pp->ref-- == 1) slotdis(pp); - qunlock(pp->cp); + unlock(pp); } char* @@ -653,7 +655,6 @@ pcmread(int dev, int attr, void *a, long n, ulong offset) pp = slot + dev; if(pp->memlen < offset) return 0; - qlock(pp->cp); ac = a; if(pp->memlen < offset + n) n = pp->memlen - offset; @@ -670,7 +671,6 @@ pcmread(int dev, int attr, void *a, long n, ulong offset) offset += i; ac += i; } - qunlock(pp->cp); return n; } @@ -687,7 +687,11 @@ i82365read(Chan *c, void *a, long n, ulong offset) return devdirread(c, a, n, 0, 0, pcmgen); case Qmem: case Qattr: + qlock(&pp->mlock); n = pcmread(DEV(c), p==Qattr, a, n, offset); + qunlock(&pp->mlock); + if(n < 0) + error(Eio); break; case Qctl: cp = buf; @@ -734,7 +738,6 @@ pcmwrite(int dev, int attr, void *a, long n, ulong offset) pp = slot + dev; if(pp->memlen < offset) return 0; - qlock(pp->cp); ac = a; if(pp->memlen < offset + n) n = pp->memlen - offset; @@ -749,7 +752,6 @@ pcmwrite(int dev, int attr, void *a, long n, ulong offset) offset += i; ac += i; } - qunlock(pp->cp); return n; } @@ -766,7 +768,11 @@ i82365write(Chan *c, void *a, long n, ulong offset) pp = slot + DEV(c); if(pp->occupied == 0 || pp->enabled == 0) error(Eio); + qlock(&pp->mlock); n = pcmwrite(pp->dev, p == Qattr, a, n, offset); + qunlock(&pp->mlock); + if(n < 0) + error(Eio); break; default: error(Ebadusefd); diff --git a/pc/mmu.c b/pc/mmu.c index 80be42025d5469900dddb73be7609e2d2c1ce49e..fca2fa7e534cbd4db1d117a71aed62218999361a 100644 --- a/pc/mmu.c +++ b/pc/mmu.c @@ -377,7 +377,7 @@ ulong getisa(ulong addr, int len, int align) { int i; - ulong os, s, e; + long os, s, e; lock(&isaalloc); os = s = e = 0; @@ -386,7 +386,7 @@ getisa(ulong addr, int len, int align) if(s == 0) continue; e = isaalloc.e[i]; - if(addr && addr >= s && addr < isaalloc.e[i]) + if(addr && addr >= s && addr < e) break; if(align > 0) s = ((s + align - 1)/align)*align;