From 2b010f019af18a989e4ff72d7ee51ee491fdabaf Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 18 Aug 1993 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1993-08-18 --- port/devproc.c | 136 +++++++++++++++++++++++++++++++++---------------- port/error.h | 2 +- port/page.c | 12 +---- port/portdat.h | 3 -- power/mem.h | 2 + power/trap.c | 1 + 6 files changed, 99 insertions(+), 57 deletions(-) diff --git a/port/devproc.c b/port/devproc.c index 628f645fc69751455acd21ffb641791948b4d0f3..959060a5e88fda1c0adbec9306878f332749a42c 100644 --- a/port/devproc.c +++ b/port/devproc.c @@ -10,32 +10,36 @@ enum { - Qdir, Qctl, + Qdir, + Qfpregs, + Qkregs, Qmem, Qnote, Qnotepg, - Qproc, + Qns, + Qregs, Qsegment, Qstatus, Qtext, Qwait, - Qns, }; #define STATSIZE (2*NAMELEN+12+7*12) Dirtab procdir[] = { "ctl", {Qctl}, 0, 0000, + "fpregs", {Qfpregs}, sizeof(FPsave), 0000, + "kregs", {Qkregs}, sizeof(Ureg), 0000, "mem", {Qmem}, 0, 0000, "note", {Qnote}, 0, 0000, "notepg", {Qnotepg}, 0, 0000, - "proc", {Qproc}, sizeof(Proc), 0000, + "ns", {Qns}, 0, 0400, + "regs", {Qregs}, sizeof(Ureg), 0000, "segment", {Qsegment}, 0, 0444, "status", {Qstatus}, STATSIZE, 0444, "text", {Qtext}, 0, 0000, "wait", {Qwait}, 0, 0400, - "ns", {Qns}, 0, 0400, }; /* Segment type from portdat.h */ @@ -173,16 +177,24 @@ procopen(Chan *c, int omode) tc->offset = 0; return tc; + case Qkregs: + case Qsegment: + if(omode != OREAD) + error(Eperm); + break; + case Qctl: case Qnote: case Qmem: - case Qsegment: - case Qproc: case Qstatus: case Qwait: + case Qregs: + case Qfpregs: break; case Qns: + if(omode != OREAD) + error(Eperm); c->aux = malloc(sizeof(Mntwalk)); break; @@ -251,9 +263,11 @@ procread(Chan *c, void *va, long n, ulong offset) { long l; Proc *p; - int i, j; Waitq *wq; + Ureg kur; + uchar *rptr; Mntwalk *mw; + int i, j, rsize; Segment *sg, *s; char *a = va, *sps; char statbuf[NSEG*32]; @@ -267,33 +281,33 @@ procread(Chan *c, void *va, long n, ulong offset) switch(QID(c->qid)){ case Qmem: - if(offset >= KZERO) { - /* Protect crypt key memory */ - if(offset >= palloc.cmembase&&offset < palloc.cmemtop) - error(Eperm); - - /* validate physical kernel addresses */ - if(offset < (ulong)end) { - if(offset+n > (ulong)end) - n = (ulong)end - offset; - memmove(a, (char*)offset, n); - return n; - } - if(offset >= conf.base0 && offset < conf.npage0){ - if(offset+n > conf.npage0) - n = conf.npage0 - offset; - memmove(a, (char*)offset, n); - return n; - } - if(offset >= conf.base1 && offset < conf.npage1){ - if(offset+n > conf.npage1) - n = conf.npage1 - offset; - memmove(a, (char*)offset, n); - return n; - } - } + if(offset < KZERO) + return procctlmemio(p, offset, n, va, 1); + + /* Protect crypt key memory */ + if(offset >= palloc.cmembase&&offset < palloc.cmemtop) + error(Eperm); - return procctlmemio(p, offset, n, va, 1); + /* validate physical kernel addresses */ + if(offset < (ulong)end) { + if(offset+n > (ulong)end) + n = (ulong)end - offset; + memmove(a, (char*)offset, n); + break; + } + if(offset >= conf.base0 && offset < conf.npage0){ + if(offset+n > conf.npage0) + n = conf.npage0 - offset; + memmove(a, (char*)offset, n); + break; + } + if(offset >= conf.base1 && offset < conf.npage1){ + if(offset+n > conf.npage1) + n = conf.npage1 - offset; + memmove(a, (char*)offset, n); + break; + } + error(Ebadarg); case Qnote: qlock(&p->debug); @@ -319,12 +333,28 @@ procread(Chan *c, void *va, long n, ulong offset) qunlock(&p->debug); return n; - case Qproc: - if(offset >= sizeof(Proc)) + case Qregs: + rptr = (uchar*)p->dbgreg; + rsize = sizeof(Ureg); + goto regread; + + case Qkregs: + memset(&kur, 0, sizeof(Ureg)); + kur.pc = p->sched.pc; + kur.sp = p->sched.sp; + rptr = (uchar*)&kur; + rsize = sizeof(Ureg); + goto regread; + + case Qfpregs: + rptr = (uchar*)&p->fpsave; + rsize = sizeof(FPsave); + regread: + if(offset >= rsize) return 0; - if(offset+n > sizeof(Proc)) - n = sizeof(Proc) - offset; - memmove(a, ((char*)p)+offset, n); + if(offset+n > rsize) + n = rsize - offset; + memmove(a, rptr+offset, n); return n; case Qstatus: @@ -362,11 +392,15 @@ procread(Chan *c, void *va, long n, ulong offset) case Qsegment: j = 0; - for(i = 0; i < NSEG; i++) - if(sg = p->seg[i]) - j += sprint(&statbuf[j], "%-6s %c %.8lux %.8lux %4d\n", - sname[sg->type&SG_TYPE], sg->type&SG_RONLY ? 'R' : ' ', + for(i = 0; i < NSEG; i++) { + sg = p->seg[i]; + if(sg == 0) + continue; + j += sprint(&statbuf[j], "%-6s %c %.8lux %.8lux %4d\n", + sname[sg->type&SG_TYPE], + sg->type&SG_RONLY ? 'R' : ' ', sg->base, sg->top, sg->ref); + } if(offset >= j) return 0; if(offset+n > j) @@ -506,6 +540,22 @@ procwrite(Chan *c, void *va, long n, ulong offset) n = procctlmemio(p, offset, n, va, 0); break; + case Qregs: + if(offset >= sizeof(Ureg)) + return 0; + if(offset+n > sizeof(Ureg)) + n = sizeof(Ureg) - offset; + setregisters(p->dbgreg, (char*)(p->dbgreg)+offset, va, n); + break; + + case Qfpregs: + if(offset >= sizeof(FPsave)) + return 0; + if(offset+n > sizeof(FPsave)) + n = sizeof(FPsave) - offset; + memmove((uchar*)&p->fpsave+offset, va, n); + break; + case Qctl: procctlreq(p, va, n); break; diff --git a/port/error.h b/port/error.h index c18abfecdaabdc3a9ac0c6b0d37be01eb8ccf77b..f9625e127fe85f1011ef98577b19c7f59379bdd7 100644 --- a/port/error.h +++ b/port/error.h @@ -52,7 +52,7 @@ extern char Eintr[]; /* interrupted */ extern char Eneedservice[]; /* service required for tcp/udp/il calls */ extern char Enomem[]; /* kernel allocate failed */ extern char Esfnotcached[]; /* subfont not cached */ -extern char Egreg[]; /* it's a thermal problem */ extern char Esoverlap[]; /* segments overlap */ extern char Emouseset[]; /* mouse type already set */ extern char Erecover[]; /* failed to recover fd */ +extern char Egreg[]; /* coherency problem */ diff --git a/port/page.c b/port/page.c index 46cbc4d4f84b55d9e73467900067d152026c8609..1a7bd794165082a8553aab58ce7685a639c8bc84 100644 --- a/port/page.c +++ b/port/page.c @@ -140,11 +140,6 @@ retry: goto retry; } -if(p->log == 0) { - p->log = smalloc(8192); - p->lptr = 0; -} - uncachepage(p); p->ref++; p->va = va; @@ -260,7 +255,8 @@ duppage(Page *p) /* Always call with p locked */ else palloc.tail = np->prev; - if(palloc.tail) { /* Link back onto tail to give us lru */ + /* Link back onto tail to give us lru in the free list */ + if(palloc.tail) { np->prev = palloc.tail; palloc.tail->next = np; np->next = 0; @@ -279,10 +275,6 @@ duppage(Page *p) /* Always call with p locked */ unlock(np); return; } -if(np->log == 0) { - np->log = smalloc(8192); - np->lptr = 0; -} uncachepage(np); np->va = p->va; diff --git a/port/portdat.h b/port/portdat.h index 5871449de05d4a1dd9fd859df8ddc957a0f1675e..54fdd891e1a5213d844b63362261aa7393287a9a 100644 --- a/port/portdat.h +++ b/port/portdat.h @@ -312,9 +312,6 @@ struct Page Page *next; /* Lru free list */ Page *prev; Page *hash; /* Image hash chains */ - - uchar *log; - int lptr; }; struct Swapalloc diff --git a/power/mem.h b/power/mem.h index 7c65ba058f5a76c0e81ca0946f16e23e90596651..93f3220e7835a92b7c1b2110e610f7bcc0a62f61 100644 --- a/power/mem.h +++ b/power/mem.h @@ -113,6 +113,8 @@ #define NTLB 64 /* number of entries */ #define TLBROFF 8 /* offset of first randomly indexed entry */ +#define NCOLOR 1 +#define getcolor(a) 0 /* * Address spaces */ diff --git a/power/trap.c b/power/trap.c index 230844dfcc89ddfbabf210caf415b611d4eee7e4..80e8a61e80a036fe186c20c919b345e0289dd673 100644 --- a/power/trap.c +++ b/power/trap.c @@ -80,6 +80,7 @@ trap(Ureg *ur) fpchk = 1; } } + switch(ecode){ case CINT: if(ur->cause&INTR3) { /* FP trap */