M port/chan.c => port/chan.c +2 -0
@@ 78,6 78,8 @@ loop:
c->offset = 0;
c->mnt = 0;
c->stream = 0;
+ c->mchan = 0;
+ c->mqid = 0;
return c;
}
unlock(&chanalloc);
M port/dev.c => port/dev.c +2 -0
@@ 76,6 76,8 @@ devclone(Chan *c, Chan *nc)
nc->dev = c->dev;
nc->flag = c->flag;
nc->mnt = c->mnt;
+ nc->mchan = c->mchan;
+ nc->mqid = c->mqid;
return nc;
}
M port/devmnt.c => port/devmnt.c +25 -13
@@ 18,6 18,7 @@ struct Mnt
{
Ref; /* for number of chans, incl. mntpt but not msg */
QLock; /* for access */
+ ulong mntid; /* serial # */
Chan *msg; /* for reading and writing messages */
Chan *mntpt; /* channel in user's name space */
};
@@ 50,6 51,12 @@ struct
Mnthdr *free;
}mnthdralloc;
+struct
+{
+ Lock;
+ long id;
+}mntid;
+
Mnt *mnt;
void mntxmit(Mnt*, Mnthdr*);
@@ 119,19 126,17 @@ Mnt*
mntdev(int dev, int noerr)
{
Mnt *m;
+ int i;
- if(dev<0 || conf.nmntdev<=dev){
- if(noerr)
- return 0;
- panic("mntdev out of range");
- }
- m = &mnt[dev];
- if(m->msg == 0){
- if(noerr)
- return 0;
- error(0, Eshutdown);
- }
- return m;
+ for(m=mnt,i=0; i<conf.nmntdev; i++,m++) /* use a hash table some day */
+ if(m->mntid == dev){
+ if(m->msg == 0)
+ break;
+ return m;
+ }
+ if(noerr)
+ return 0;
+ error(0, Eshutdown);
}
void
@@ 187,8 192,11 @@ mntattach(char *spec)
Found:
m->ref = 1;
unlock(m);
+ lock(&mntid);
+ m->mntid = ++mntid.id;
+ unlock(&mntid);
c = devattach('M', spec);
- c->dev = m - mnt;
+ c->dev = m->mntid;
m->mntpt = c;
cm = bogus.chan;
m->msg = cm;
@@ 205,6 213,8 @@ mntattach(char *spec)
strcpy(mh->thdr.aname, spec);
mntxmit(m, mh);
c->qid = mh->rhdr.qid;
+ c->mchan = m->msg;
+ c->mqid = c->qid;
mhfree(mh);
poperror();
return c;
@@ 243,6 253,8 @@ mntclone(Chan *c, Chan *nc)
nc->flag = c->flag;
nc->offset = c->offset;
nc->mnt = c->mnt;
+ nc->mchan = c->mchan;
+ nc->mqid = c->qid;
if(new)
poperror();
mhfree(mh);
M port/page.c => port/page.c +14 -12
@@ 77,17 77,18 @@ audit(char *s)
{
int nf, nb;
Page *p;
+ static int here;
-static int here;
-do;while(here);
-here=1;
-
+ do;while(here);
+ here=1;
p = palloc.head;
nf=nb=0;
while(p){
-print("%lux %lux %d\n", p->pa, p->va, p->ref);
-if(p->o) print("\t%d %lux %c\n", p->o->nproc, p->o->qid, devchar[p->o->type]);
-delay(100);
+ print("%lux %lux %d\n", p->pa, p->va, p->ref);
+ if(p->o){
+ print("\t%d %lux %c\n", p->o->nproc, p->o->qid, devchar[p->o->type]);
+ delay(100); /* let it drain; there's a lot here */
+ }
nf++;
p = p->next;
}
@@ 98,7 99,7 @@ delay(100);
}
print("%s: nf: %d nb: %d\n", s, nf, nb);
delay(1000);
-here=0;
+ here=0;
}
void
@@ 187,7 188,6 @@ loop:
}
#endif
}
- audit("newpage");
print("no physical memory\n");
unlock(&palloc);
if(u == 0)
@@ 257,7 257,7 @@ lookorig(ulong va, ulong npte, int flag, Chan *c)
lock(o);
if(o->npage && o->qid==c->qid)
if(o->va==va && o->npte==npte && o->flag==flag)
- if(o->type==c->type && o->dev==c->dev){
+ if(o->mchan==c->mchan && o->mqid==c->mqid && o->type==c->type){
if(o->chan == 0){
o->chan = c;
incref(c);
@@ 289,13 289,15 @@ loop:
o->chan = c;
if(c){
o->type = c->type;
- o->dev = c->dev;
o->qid = c->qid;
+ o->mchan = c->mchan;
+ o->mqid = c->mqid;
incref(c);
}else{
o->type = -1;
- o->dev = -1;
o->qid = -1;
+ o->mqid = -1;
+ o->mchan = 0;
}
growpte(o, npte);
unlock(&origalloc);
M power/dat.h => power/dat.h +4 -1
@@ 94,6 94,8 @@ struct Chan
ulong mountid;
int fid; /* for devmnt */
Stream *stream; /* for stream channels */
+ Chan *mchan; /* channel to mounted server */
+ ulong mqid; /* qid of root of mount point */
};
struct FPsave
@@ 226,8 228,9 @@ struct Orig
PTE *pte;
Chan *chan; /* channel deriving segment (if open) */
ushort type; /* of channel (which could be non-open) */
- ushort dev;
ulong qid;
+ Chan *mchan;
+ ulong mqid;
ulong minca; /* base of region in chan */
ulong maxca; /* end of region in chan */
};
M power/io.h => power/io.h +0 -14
@@ 78,17 78,3 @@ struct INTVEC {
#define MPBERR0 IO2(ulong, 0xF48000)
#define MPBERR1 IO2(ulong, 0xF4C000)
#define SBEADDR ((ulong *)(UNCACHED|0x1f080000))
-
-/*
- * hsvme datakit board
- */
-struct hsvme {
- ushort version;
- ushort pad0x02;
- ushort vector;
- ushort pad0x06;
- ushort csr;
- ushort pad0x0A;
- ushort data;
-};
-#define HSVME VMEA24SUP(struct hsvme, 0xF90000)