From 045b8506669b848ada0b2c20e6c65be518aab0d9 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sat, 3 Mar 1990 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1990-03-03 --- port/chan.c | 2 ++ port/dev.c | 2 ++ port/devmnt.c | 38 +++++++++++++++++++++++++------------- port/page.c | 26 ++++++++++++++------------ power/dat.h | 5 ++++- power/io.h | 14 -------------- 6 files changed, 47 insertions(+), 40 deletions(-) diff --git a/port/chan.c b/port/chan.c index 918d3b7c31ca2a22dbd470502432ac816fe5505b..1eacc10f0daa22f76b90e395e3ac3696864ffaf9 100644 --- a/port/chan.c +++ b/port/chan.c @@ -78,6 +78,8 @@ loop: c->offset = 0; c->mnt = 0; c->stream = 0; + c->mchan = 0; + c->mqid = 0; return c; } unlock(&chanalloc); diff --git a/port/dev.c b/port/dev.c index cac778c467536fa6af4bd82469fa68fa065f1858..03e8b481bdb54ac2dfc300eb20595dac6415e3d3 100644 --- a/port/dev.c +++ b/port/dev.c @@ -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; } diff --git a/port/devmnt.c b/port/devmnt.c index 867f76f48e9c0f20f790750d8755df44825cb019..0d7b689eeb24ede701181af7f5489e48282085bb 100644 --- a/port/devmnt.c +++ b/port/devmnt.c @@ -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; imntid == 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); diff --git a/port/page.c b/port/page.c index 8d6bf85a7cc6627f0a426b82b590dde7f5e23fd9..2889dcbeda970773d0016f2228fceb4cc93dd18c 100644 --- a/port/page.c +++ b/port/page.c @@ -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); diff --git a/power/dat.h b/power/dat.h index 5f44a9df4526d0c4fcc2d0f9a28c263e9cfcdbbb..821a2e724d9d919e6e33f8695b4c2b7a68d22e9b 100644 --- a/power/dat.h +++ b/power/dat.h @@ -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 */ }; diff --git a/power/io.h b/power/io.h index fc6fd02aaad8ada84e798bd600d0eb6e68f6cb21..c1a9b083c1b6a81196abb57e301297ccc0a0ee0f 100644 --- a/power/io.h +++ b/power/io.h @@ -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)