From 7037827dda2a12323899e0ddfcecd7208e0014b7 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 1 Dec 1993 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1993-12-01 --- carrera/dat.h | 1 + pc/dat.h | 1 + port/devmouse.c | 6 +-- port/devproc.c | 51 ++++++++++++++++++++- port/fault.c | 1 + port/portdat.h | 11 ++++- port/portfns.h | 1 + port/proc.c | 5 ++ port/queue.c | 118 ------------------------------------------------ port/systab.h | 6 +++ power/dat.h | 1 + power/main.c | 8 ---- power/trap.c | 1 + 13 files changed, 79 insertions(+), 132 deletions(-) delete mode 100644 port/queue.c diff --git a/carrera/dat.h b/carrera/dat.h index 0efa888a6d03501c7bd5fcb399c76689cdad95f5..bcf9070ecf7a427b94ca3add397818acff53c051 100644 --- a/carrera/dat.h +++ b/carrera/dat.h @@ -102,6 +102,7 @@ struct Mach int tlbpurge; /* MUST BE SIXTH */ /* the following is safe to move */ + ulong otlbfault; /* tlbfault at last sched */ ulong ticks; /* of the clock since boot time */ Label sched; /* scheduler wakeup */ Lock alarmlock; /* access to alarm list */ diff --git a/pc/dat.h b/pc/dat.h index c6fac5e3d6284f3c58c391aabf90fb54b6311414..e5d2bc9ec5ea50dd0db841b69b8a353c0d2b0500 100644 --- a/pc/dat.h +++ b/pc/dat.h @@ -125,6 +125,7 @@ struct Mach void *alarm; /* alarms bound to this clock */ int tlbfault; + int otlbfault; int tlbpurge; int pfault; int cs; diff --git a/port/devmouse.c b/port/devmouse.c index bfa7f8f8ccd75ef02e6a8319d927c94c0cccbd86..102ad05ed69524cc849b401262db281028e4fffd 100644 --- a/port/devmouse.c +++ b/port/devmouse.c @@ -516,7 +516,7 @@ mousetrack(int b, int dx, int dy) * shift & right button is the same as middle button (for 2 button mice) */ int -m3mouseputc(IOQ *q, int c) +m3mouseputc(int c) { static uchar msg[3]; static int nb; @@ -525,7 +525,6 @@ m3mouseputc(IOQ *q, int c) short x; int dx, dy, newbuttons; - USED(q); /* * check bit 6 for consistency */ @@ -557,14 +556,13 @@ m3mouseputc(IOQ *q, int c) * shift & right button is the same as middle button (for 2 button mice) */ int -mouseputc(IOQ *q, int c) +mouseputc(int c) { static short msg[5]; static int nb; static uchar b[] = {0, 4, 2, 6, 1, 5, 3, 7, 0, 2, 2, 6, 1, 5, 3, 7}; int dx, dy, newbuttons; - USED(q); if((c&0xF0) == 0x80) nb=0; msg[nb] = c; diff --git a/port/devproc.c b/port/devproc.c index de89cb9878e312ebdb6f34d9f235fa8aac173f31..0b6ecf709353ff5a612a733b39d1bf6b9997e78b 100644 --- a/port/devproc.c +++ b/port/devproc.c @@ -23,6 +23,7 @@ enum Qregs, Qsegment, Qstatus, + Qcounters, Qtext, Qwait, }; @@ -30,6 +31,7 @@ enum #define STATSIZE (2*NAMELEN+12+7*12) Dirtab procdir[] = { + "counters", {Qcounters}, 0, 0444, "ctl", {Qctl}, 0, 0000, "fpregs", {Qfpregs}, sizeof(FPsave), 0000, "kregs", {Qkregs}, sizeof(Ureg), 0000, @@ -71,6 +73,7 @@ Chan* proctext(Chan*, Proc*); Segment* txt2data(Proc*, Segment*); int procstopped(void*); void mntscan(Mntwalk*); +ulong readcounters(Proc*, ulong, void*, int); int procgen(Chan *c, Dirtab *tab, int ntab, int s, Dir *dp) @@ -118,6 +121,11 @@ procgen(Chan *c, Dirtab *tab, int ntab, int s, Dir *dp) void procinit(void) { + /* standard counters - this ordering is important */ + proccounter("sched"); + proccounter("fault"); + proccounter("tlbmiss"); + if(conf.nproc >= (1<<(16-QSHIFT))-1) print("warning: too many procs for devproc\n"); } @@ -188,6 +196,7 @@ procopen(Chan *c, int omode) error(Eperm); break; + case Qcounters: case Qctl: case Qnote: case Qnoteid: @@ -340,7 +349,6 @@ procread(Chan *c, void *va, long n, ulong offset) return n; case Qproc: - return readnum(offset, va, n, (ulong)p, NUMSIZE); case Qregs: @@ -366,6 +374,9 @@ procread(Chan *c, void *va, long n, ulong offset) memmove(a, rptr+offset, n); return n; + case Qcounters: + return readcounters(p, offset, va, n); + case Qstatus: if(offset >= STATSIZE) return 0; @@ -847,3 +858,41 @@ data2txt(Segment *s) return ps; } + +static char *counter[Pcounter]; +int ncounter; + +int +proccounter(char *name) +{ + if(ncounter >= Pcounter) + panic("too many process counters"); + counter[ncounter] = name; + return ncounter++; +} + +ulong +readcounters(Proc *p, ulong offset, void *va, int n) +{ + char *bp; + int i, j, m; + extern char *sysctab[]; + + bp = smalloc((NSYSCALL+ncounter)*(NAMELEN+8)); + m = 0; + for(i = 0; i < Pcounter; i++) + if(counter[i]) + m += sprint(bp+m, "%s\t%8d\n", counter[i], p->counter[i]); + j = 0; + for(i = 0; i < NSYSCALL; i++) + j += p->syscall[i]; + m += sprint(bp+m, "syscall\t%8d\n", j); + for(i = 0; i < NSYSCALL; i++) + if(p->syscall[i]) + m += sprint(bp+m, "%s\t%8d\n", sysctab[i], p->syscall[i]); + n = readstr(offset, va, n, bp); + free(bp); + memset(p->counter, 0, sizeof(p->counter)); + memset(p->syscall, 0, sizeof(p->syscall)); + return n; +} diff --git a/port/fault.c b/port/fault.c index 084abfe974e825ea738c04ece61ebff51229260c..1051d039f4baa9a67c90c4473a786ab839ecbd06 100644 --- a/port/fault.c +++ b/port/fault.c @@ -18,6 +18,7 @@ fault(ulong addr, int read) spllo(); m->pfault++; + up->counter[FAULTCNTR]++; for(;;) { s = seg(up, addr, 1); if(s == 0) { diff --git a/port/portdat.h b/port/portdat.h index 76c32d490290f9897d76d7cfacb64b04e77aeff6..fa17ef1965c4f6a1839a71d1f01b5dff0397fa94 100644 --- a/port/portdat.h +++ b/port/portdat.h @@ -8,7 +8,6 @@ typedef struct Egrp Egrp; typedef struct Evalue Evalue; typedef struct Fgrp Fgrp; typedef struct Image Image; -typedef struct IOQ IOQ; typedef struct List List; typedef struct Mntcache Mntcache; typedef struct Mount Mount; @@ -470,6 +469,12 @@ enum NERR = 15, NNOTE = 5, + + NSYSCALL = 37, /* MUST be equal to the real thing!!!! */ + Pcounter = 6, /* per process counters */ + CSCNTR = 0, /* sched counter */ + FAULTCNTR = 1, /* fault counter */ + TLBCNTR = 2, /* utlbmiss */ }; struct Proc @@ -552,6 +557,10 @@ struct Proc void *dbgreg; /* User registers for devproc */ Notsave; + /* statistics */ + ulong counter[Pcounter]; /* specialized per process counters */ + ulong syscall[NSYSCALL]; + /* * machine specific MMU */ diff --git a/port/portfns.h b/port/portfns.h index 456e2485fa954846e9e7ee73174cde6dceeb1571..c43ab493a93d5333096f7e56fb6588ff69bad30c 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -157,6 +157,7 @@ int postnote(Proc*, int, char*, int); int pprint(char*, ...); void printinit(void); ulong procalarm(ulong); +int proccounter(char *name); void procctl(Proc*); void procdump(void); void procinit0(void); diff --git a/port/proc.c b/port/proc.c index 26d3820923a3850e52221418fe4e7c999bee4e4d..443010ed67ed1ea493cc464bdbfd323a9f76a887 100644 --- a/port/proc.c +++ b/port/proc.c @@ -87,6 +87,9 @@ sched(void) if(up) { splhi(); m->cs++; + up->counter[CSCNTR]++; +up->counter[TLBCNTR] += m->tlbfault - m->otlbfault; +m->otlbfault = m->tlbfault; procsave(up); if(setlabel(&up->sched)) { procrestore(up); @@ -229,6 +232,8 @@ newproc(void) panic("pidalloc"); if(p->kstack == 0) p->kstack = smalloc(KSTACK); + memset(p->counter, 0, sizeof(p->counter)); + memset(p->syscall, 0, sizeof(p->syscall)); return p; } diff --git a/port/queue.c b/port/queue.c deleted file mode 100644 index 1a9f2ad71ef37681e01eb78537ca0a52e2c50a88..0000000000000000000000000000000000000000 --- a/port/queue.c +++ /dev/null @@ -1,118 +0,0 @@ -#include "u.h" -#include "../port/lib.h" -#include "mem.h" -#include "dat.h" -#include "fns.h" -#include "io.h" - -void -initq(IOQ *q) -{ - lock(q); - unlock(q); - q->in = q->out = q->buf; - q->puts = puts; - q->putc = putc; - q->gets = gets; - q->getc = getc; -} - -int -putc(IOQ *q, int c) -{ - uchar *nextin; - if(q->in >= &q->buf[sizeof(q->buf)-1]) - nextin = q->buf; - else - nextin = q->in+1; - if(nextin == q->out) - return -1; - *q->in = c; - q->in = nextin; - return 0; -} - -int -getc(IOQ *q) -{ - int c; - - if(q->in == q->out) - return -1; - c = *q->out; - if(q->out == q->buf+sizeof(q->buf)-1) - q->out = q->buf; - else - q->out++; - return c; -} - -void -puts(IOQ *q, void *buf, int n) -{ - int m; uchar *nextin; - uchar *s = buf; - - while(n){ - m = q->out - q->in - 1; - if(m < 0) - m = &q->buf[NQ] - q->in; - if(m == 0) - break; - if(m > n) - m = n; - memmove(q->in, s, m); - n -= m; - s += m; - nextin = q->in + m; - if(nextin >= &q->buf[NQ]) - q->in = q->buf; - else - q->in = nextin; - } -} - -int -gets(IOQ *q, void *buf, int n) -{ - int m, k = 0; uchar *nextout; - uchar *s = buf; - - while(n){ - m = q->in - q->out; - if(m < 0) - m = &q->buf[NQ] - q->out; - if(m == 0) - return k; - if(m > n) - m = n; - if(buf) - memmove(s, q->out, m); - s += m; - k += m; - n -= m; - nextout = q->out + m; - if(nextout >= &q->buf[NQ]) - q->out = q->buf; - else - q->out = nextout; - } - return k; -} - -int -cangetc(void *arg) -{ - IOQ *q = (IOQ *)arg; - int n = q->in - q->out; - if (n < 0) - n += sizeof(q->buf); - return n; -} - -int -canputc(void *arg) -{ - IOQ *q = (IOQ *)arg; - return sizeof(q->buf)-cangetc(q)-1; -} diff --git a/port/systab.h b/port/systab.h index 87188f5e56f6ade2985b48609eea1848997d6e67..5ee0a45d3280fcd193b127bde2d97a8f4bb51f5a 100644 --- a/port/systab.h +++ b/port/systab.h @@ -40,6 +40,8 @@ Syscall syssegflush; Syscall sysrendezvous; Syscall sysunmount; Syscall syswait; +Syscall ; +Syscall /* make sure port/portdat.h has nsyscall defined correctly!!! */; Syscall sysdeath; Syscall *systab[]={ @@ -80,6 +82,8 @@ Syscall *systab[]={ [RENDEZVOUS] sysrendezvous, [UNMOUNT] sysunmount, [WAIT] syswait, + +/* make sure port/portdat.h has NSYSCALL defined correctly!!! */ }; char *sysctab[]={ @@ -120,4 +124,6 @@ char *sysctab[]={ [RENDEZVOUS] "Rendez", [UNMOUNT] "Unmount", [WAIT] "Wait", + +/* make sure port/portdat.h has NSYSCALL defined correctly!!! */ }; diff --git a/power/dat.h b/power/dat.h index 236c455203d17b4f1141a4cca4df778e1aff03cb..18bee9f2581266a5d980133c7d1d4b41f4011089 100644 --- a/power/dat.h +++ b/power/dat.h @@ -130,6 +130,7 @@ struct Mach int load; int intr; int ledval; /* value last written to LED */ + int otlbfault; int stack[1]; }; diff --git a/power/main.c b/power/main.c index 2118870135398f980b82a1064ca1f66660faec02..757466fe340b73068d35b7cf06c34d43e56158ac 100644 --- a/power/main.c +++ b/power/main.c @@ -727,11 +727,3 @@ buzz(int f, int d) USED(f); USED(d); } - -int -mouseputc(IOQ *q, int c) -{ - USED(q); - USED(c); - return 0; -} diff --git a/power/trap.c b/power/trap.c index 2a06c77877356cb452b37f60f0fd2a2bb284dbee..c533e044d2f96b1c3af205a03f9cbec66cbc45d4 100644 --- a/power/trap.c +++ b/power/trap.c @@ -518,6 +518,7 @@ syscall(Ureg *aur) postnote(up, 1, "sys: bad sys call", NDebug); error(Ebadarg); } + up->syscall[up->scallnr]++; if(sp & (BY2WD-1)){ pprint("odd sp in sys call pc %lux sp %lux\n", ur->pc, ur->sp);