From e9b52b5c8540da44f6b57a099d39275c9f875b83 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 30 Mar 1990 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1990-03-30 --- gnot/devincon.c | 2 +- gnot/fns.h | 3 + gnot/screen.c | 41 +++++++++++- gnot/stream.c | 3 +- gnot/sysfile.c | 6 +- port/devbit.c | 17 +++-- port/devkprof.c | 166 ++++++++++++++++++++++++++++++++++++++++++++++++ port/proc.c | 7 +- port/stream.c | 12 ++-- port/sysfile.c | 4 -- port/sysproc.c | 2 +- 11 files changed, 229 insertions(+), 34 deletions(-) create mode 100644 port/devkprof.c diff --git a/gnot/devincon.c b/gnot/devincon.c index 803f23a9e172545bf0b57bedee242c669c8f0953..e7c7015a979339ca6f11b272726f6e02ea04bd2c 100644 --- a/gnot/devincon.c +++ b/gnot/devincon.c @@ -264,7 +264,7 @@ inconreset(void) incon[0].dev = INCON; incon[0].state = Selected; incon[0].ri = incon[0].wi = 0; - inconset(&incon[0], 8, 9); +/* inconset(&incon[0], 8, 9); /**/ for(i=1; i>8; + duart[0].ctlr = (Kptime)&255; + duart[0].is_imr = IM_IPC|IM_RRDYB|IM_XRDYB|IM_RRDYA|IM_CRDY; + x = duart[1].scc_sopbc; +} + +void +duartstoptimer(void) +{ + Duart *duart; + char x; + + duart = DUARTREG; + x = duart[1].scc_ropbc; + duart[0].is_imr = IM_IPC|IM_RRDYB|IM_XRDYB|IM_RRDYA; +} + void -duartintr(void) +duartintr(Ureg *ur) { int cause, status, c; Duart *duart; @@ -212,6 +240,17 @@ duartintr(void) /* * I can guess your interrupt. */ + /* + * Is it 0? + */ + if(cause & IM_CRDY){ + kproftimer(ur->pc); + c = duart[1].scc_ropbc; + duart[0].ctur = (Kptime)>>8; + duart[0].ctlr = (Kptime)&255; + c = duart[1].scc_sopbc; + return; + } /* * Is it 1? */ diff --git a/gnot/stream.c b/gnot/stream.c index 8fdc38ee9169d14ef767cf9642df55487da0f96e..349fcfa086fa6e2c468010e2a3f0f3d0b045c864 100644 --- a/gnot/stream.c +++ b/gnot/stream.c @@ -627,7 +627,6 @@ streamnew(Chan *c, Qinfo *qi) if(qi->open) (*qi->open)(RD(s->devq), s); - c->flag |= COPEN; unlock(s); poperror(); return s; @@ -681,7 +680,7 @@ streamclose(Chan *c) /* * if not open, ignore it */ - if(!(c->flag & COPEN)) + if(!c->stream) return; /* diff --git a/gnot/sysfile.c b/gnot/sysfile.c index f607a8852df8e24c591ad99a7e335c67adc86785..a3f1c6c8a535ee825be9a67316d69830e8662959 100644 --- a/gnot/sysfile.c +++ b/gnot/sysfile.c @@ -126,7 +126,7 @@ unionread(Chan *c, void *va, long n) mnt = c->mnt; lock(pg); if(c->mountid != mnt->mountid){ - print("unionread: changed underfoot?\n"); + pprint("unionread: changed underfoot?\n"); unlock(pg); return 0; } @@ -406,10 +406,6 @@ syspipe(ulong *arg) c[1] = (*d->clone)(c[0], 0); c[0] = (*d->open)(c[0], ORDWR); c[1] = (*d->open)(c[1], ORDWR); - c[0]->mode = 2; - c[1]->mode = 2; - c[0]->flag |= COPEN; - c[1]->flag |= COPEN; fd[0] = newfd(); u->fd[fd[0]] = c[0]; fd[1] = newfd(); diff --git a/port/devbit.c b/port/devbit.c index 843e134a85353e2cf4bd0d5c095613bb1171fafb..2d81e6a8c09d783e34a6f4b0b9e7bc86b873fda9 100644 --- a/port/devbit.c +++ b/port/devbit.c @@ -199,18 +199,19 @@ bitread(Chan *c, void *va, long n) /* * init: * 'I' 1 - * ldepth 2 + * ldepth 1 * rectangle 16 */ - if(n < 19) + if(n < 18) error(0, Ebadblt); p[0] = 'I'; - PSHORT(p+1, screen.ldepth); - PLONG(p+3, screen.r.min.x); - PLONG(p+7, screen.r.min.y); - PLONG(p+11, screen.r.max.x); - PLONG(p+15, screen.r.max.y); + p[1] = screen.ldepth; + PLONG(p+2, screen.r.min.x); + PLONG(p+6, screen.r.min.y); + PLONG(p+10, screen.r.max.x); + PLONG(p+14, screen.r.max.y); bit.init = 0; + n = 18; goto done; } if(bit.lastid > 0){ @@ -450,6 +451,8 @@ bitwrite(Chan *c, void *va, long n) error(0, Ebadbitmap); miny = GLONG(p+3); maxy = GLONG(p+7); + if(miny>maxy || minyr.min.y || maxy>dst->r.max.y) + error(0, Ebadblt); ws = 1<<(3-dst->ldepth); /* pixels per byte */ /* set l to number of bytes of incoming data per scan line */ if(dst->r.min.x >= 0) diff --git a/port/devkprof.c b/port/devkprof.c new file mode 100644 index 0000000000000000000000000000000000000000..282d84689d151c3b7d0e8782db75aad5b1c4af12 --- /dev/null +++ b/port/devkprof.c @@ -0,0 +1,166 @@ +#include "u.h" +#include "lib.h" +#include "mem.h" +#include "dat.h" +#include "fns.h" +#include "errno.h" + +#include "devtab.h" + +#define MAXPC (100*1024L) +#define RES 8 +#define LRES 3 +#define NBUF (MAXPC>>LRES) + +long timerbuf[NBUF]; + +enum{ + Kprofdirqid, + Kprofdataqid, + Kprofstartqid, + Kprofstartclrqid, + Kprofstopqid, + Nkproftab=Kprofstopqid, + Kprofmaxqid, +}; +Dirtab kproftab[Nkproftab]={ + "kpdata", Kprofdataqid, NBUF*sizeof timerbuf[0], 0600, + "kpstart", Kprofstartqid, 0, 0600, + "kpstartclr", Kprofstartclrqid, 0, 0600, + "kpstop", Kprofstopqid, 0, 0600, +}; + +void +kprofreset(void) +{ +} + +void +kprofinit(void) +{ + extern void *etext; + if((((unsigned long)&etext)-KTZERO)>MAXPC) + print("kernel profiling limited to %lud\n", MAXPC); +} + +Chan * +kprofattach(char *spec) +{ + return devattach('t', spec); +} +Chan * +kprofclone(Chan *c, Chan *nc) +{ + return devclone(c, nc); +} + +int +kprofwalk(Chan *c, char *name) +{ + return devwalk(c, name, kproftab, (long)Nkproftab, devgen); +} + +void +kprofstat(Chan *c, char *db) +{ + devstat(c, db, kproftab, (long)Nkproftab, devgen); +} + +Chan * +kprofopen(Chan *c, int omode) +{ + if(c->qid == CHDIR){ + if(omode != OREAD) + error(0, Eperm); + } + c->mode = openmode(omode); + c->flag |= COPEN; + c->offset = 0; + return c; +} + +void +kprofcreate(Chan *c, char *name, int omode, ulong perm) +{ + error(0, Eperm); +} + +void +kprofremove(Chan *c) +{ + error(0, Eperm); +} + +void +kprofwstat(Chan *c, char *dp) +{ + error(0, Eperm); +} + +void +kprofclose(Chan *c) +{ +} + +void +kprofuserstr(Error *e, char *buf) +{ + consuserstr(e, buf); +} + +void +kproferrstr(Error *e, char *buf) +{ + rooterrstr(e, buf); +} + +long +kprofread(Chan *c, void *a, long n) +{ + switch((int)(c->qid&~CHDIR)){ + case Kprofdirqid: + return devdirread(c, a, n, kproftab, Nkproftab, devgen); + case Kprofdataqid: + if(c->offset >= NBUF*sizeof timerbuf[0]){ + n = 0; + break; + } + if(c->offset+n > NBUF*sizeof timerbuf[0]) + n = NBUF*sizeof timerbuf[0]-c->offset; + memcpy(a, ((char *)timerbuf)+c->offset, n); + break; + default: + n=0; + break; + } + return n; +} + +long +kprofwrite(Chan *c, char *a, long n) +{ + switch((int)(c->qid&~CHDIR)){ + case Kprofstartclrqid: + memset((char *)timerbuf, 0, NBUF*sizeof timerbuf[0]); + case Kprofstartqid: + duartstarttimer(); + break; + case Kprofstopqid: + duartstoptimer(); + break; + default: + error(0, Ebadusefd); + } + return n; +} + +void +kproftimer(ulong pc) +{ + timerbuf[0]++; + if(KTZERO<=pc && pc>= LRES; + timerbuf[pc]++; + } +} diff --git a/port/proc.c b/port/proc.c index d889f0fe03aa77d745ec12c70b5d79a643bc5468..a10fc544ea0c33ddbb8fb098b2875b434c6a1268 100644 --- a/port/proc.c +++ b/port/proc.c @@ -518,7 +518,7 @@ proctab(int i) #include DEBUG() { - int i, j; + int i; Proc *p; Orig *o; @@ -529,11 +529,6 @@ DEBUG() print("%d:%s upc %lux %s ut %ld st %ld\n", p->pid, p->text, p->pc, statename[p->state], p->time[0], p->time[1]); - for(j=0; jseg[j].o; - if(o) - print(" s%d %d %d\n", j, o->nmod, o->npte); - } } } } diff --git a/port/stream.c b/port/stream.c index ac1f5211f759f93401b0b920b65f5a6427128641..349fcfa086fa6e2c468010e2a3f0f3d0b045c864 100644 --- a/port/stream.c +++ b/port/stream.c @@ -51,7 +51,7 @@ static Lock garbagelock; typedef struct { int size; Blist; - QLock q; /* qlock for sleepers on r */ + QLock; /* qlock for sleepers on r */ Rendez r; /* sleep here waiting for blocks */ } Bclass; Bclass bclass[Nclass]={ @@ -123,12 +123,11 @@ allocb(ulong size) lock(bcp); while(bcp->first == 0){ unlock(bcp); - print("waiting for block %d\n", size); if(loop++ > 10) - panic("waiting for blocks"); - qlock(&bcp->q); + panic("waiting for blocks\n"); + qlock(bcp); tsleep(&bcp->r, isblock, (void *)bcp, 250); - qunlock(&bcp->q); + qunlock(bcp); lock(bcp); } bp = bcp->first; @@ -628,7 +627,6 @@ streamnew(Chan *c, Qinfo *qi) if(qi->open) (*qi->open)(RD(s->devq), s); - c->flag |= COPEN; unlock(s); poperror(); return s; @@ -682,7 +680,7 @@ streamclose(Chan *c) /* * if not open, ignore it */ - if(!(c->flag & COPEN)) + if(!c->stream) return; /* diff --git a/port/sysfile.c b/port/sysfile.c index b0e2321397c2ec4eb4e90fe4d03bf9397bcab918..a3f1c6c8a535ee825be9a67316d69830e8662959 100644 --- a/port/sysfile.c +++ b/port/sysfile.c @@ -406,10 +406,6 @@ syspipe(ulong *arg) c[1] = (*d->clone)(c[0], 0); c[0] = (*d->open)(c[0], ORDWR); c[1] = (*d->open)(c[1], ORDWR); - c[0]->mode = 2; - c[1]->mode = 2; - c[0]->flag |= COPEN; - c[1]->flag |= COPEN; fd[0] = newfd(); u->fd[fd[0]] = c[0]; fd[1] = newfd(); diff --git a/port/sysproc.c b/port/sysproc.c index 271f3e0daaff7c7242cb239e34bd93c06c1a3b49..af45ad0c31ee9e3cf4fd339aeebf46a9c8873311 100644 --- a/port/sysproc.c +++ b/port/sysproc.c @@ -6,7 +6,7 @@ #include "ureg.h" #include "errno.h" -#include +#include int shargs(char*, int, char**);