From 48f43f725a88ff7d921ad6b029c668d2bf4d8c8f Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 1 Jul 1999 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1999-07-01 --- alphapc/dat.h | 1 + alphapc/trap.c | 1 + carrera/dat.h | 1 + carrera/trap.c | 2 + mpc/dat.h | 1 + mpc/trap.c | 1 + pc/dat.h | 1 + pc/fns.h | 1 - pc/trap.c | 5 +- port/devintrts.c | 134 ++++++++++++++++++++++++++++++++++++++++++++++ port/devns16552.c | 39 +------------- port/portfns.h | 1 + 12 files changed, 146 insertions(+), 42 deletions(-) create mode 100644 port/devintrts.c diff --git a/alphapc/dat.h b/alphapc/dat.h index 9ed070a0ce6d1dbea8e5cdbc73dae598a697cd2c..166d03eeab19d3c115f37a8fb0581c66f2ff4adf 100644 --- a/alphapc/dat.h +++ b/alphapc/dat.h @@ -148,6 +148,7 @@ struct Mach ulong cpuhz; /* hwrpb->cfreq */ ulong pcclast; uvlong fastclock; + vlong intrts; /* time stamp of last interrupt */ int pfault; int cs; diff --git a/alphapc/trap.c b/alphapc/trap.c index 60029acb520d2de46b379a0a85cf4a5952f33f46..e986ae165f8906a7fa52f19209a0f8e94b810580 100644 --- a/alphapc/trap.c +++ b/alphapc/trap.c @@ -41,6 +41,7 @@ trap(Ureg *ur) char buf[ERRLEN]; int user, x; + m->intrts = fastticks(nil); user = ur->status&UMODE; if(user){ diff --git a/carrera/dat.h b/carrera/dat.h index 3b68a1117ef64bd154a52935b7248521d84cd0e1..d14b4ee3f10777abba5e9c23a80e738ceb197249 100644 --- a/carrera/dat.h +++ b/carrera/dat.h @@ -117,6 +117,7 @@ struct Mach ulong fairness; /* for runproc */ ulong lastcyclecount; uvlong fastclock; + vlong intrts; /* time stamp of last interrupt */ int flushmmu; /* make current proc flush it's mmu state */ int pfault; diff --git a/carrera/trap.c b/carrera/trap.c index b1a23bbf3af6d2760acc220868fe8e250ef4bbd0..752ea0f3b9897e3703c999482171c27b6d08b3cc 100644 --- a/carrera/trap.c +++ b/carrera/trap.c @@ -196,6 +196,8 @@ trap(Ureg *ur) int user, cop, x, fpchk; char buf[2*ERRLEN], buf1[ERRLEN], *fpexcep; + m->intrts = fastticks(nil); + /* * Retry failed probes of legal addresses from tstbadvaddr * workaround for the R4400 >2.3 diff --git a/mpc/dat.h b/mpc/dat.h index 55321fc5f28aca2b170578eed636a222dc837e6e..8512b4616dce1d8e4ddea76eb2298b6d298e13de 100644 --- a/mpc/dat.h +++ b/mpc/dat.h @@ -140,6 +140,7 @@ struct Mach int load; int intr; vlong fastclock; /* last sampled value */ + vlong intrts; /* time stamp of last interrupt */ int flushmmu; /* make current proc flush it's mmu state */ /* MUST BE LAST */ diff --git a/mpc/trap.c b/mpc/trap.c index 39a0644ac22d3ddca11c2bae6acba1a9b5e0486d..8ce9d828a6b7c775f7fe25081e33a56fbde3909b 100644 --- a/mpc/trap.c +++ b/mpc/trap.c @@ -152,6 +152,7 @@ trap(Ureg *ur) int ecode; static struct {int callsched;} c = {1}; + m->intrts = fastticks(nil); ecode = (ur->cause >> 8) & 0xff; if(ecode < 0 || ecode >= 0x1F) ecode = 0x1F; diff --git a/pc/dat.h b/pc/dat.h index 6bb941028209254916bbee1857cdfb333d22cdd0..1cfc12ba3531be282a435b23c07d69b57c2425a9 100644 --- a/pc/dat.h +++ b/pc/dat.h @@ -171,6 +171,7 @@ struct Mach int load; int intr; vlong fastclock; /* last sampled value */ + vlong intrts; /* time stamp of last interrupt */ int flushmmu; /* make current proc flush it's mmu state */ ulong spuriousintr; diff --git a/pc/fns.h b/pc/fns.h index 2aa9baa6ae59b814f065aae075464127a2307147..e09aa4bd2cb9312e7468a209ad58b0cb235ade81 100644 --- a/pc/fns.h +++ b/pc/fns.h @@ -95,7 +95,6 @@ void procsetup(Proc*); void putcr3(ulong); void putcr4(ulong); void rdmsr(int, vlong*); -long readintrts(void*, int); void screeninit(void); int screenprint(char*, ...); /* debugging */ void (*screenputs)(char*, int); diff --git a/pc/trap.c b/pc/trap.c index 2926d4ea52329cf809955e2c4b72231392a74c2a..e678cc9d6ac098bc9fce2bbd1beac004d8d7adc3 100644 --- a/pc/trap.c +++ b/pc/trap.c @@ -15,9 +15,6 @@ static void fault386(Ureg*, void*); static Lock vctllock; static Vctl *vctl[256]; -/* interrupt timestamps, l.s fills intrts each interupt */ -uvlong intrts; - void intrenable(int irq, void (*f)(Ureg*, void*), void* a, int tbdf) { @@ -175,6 +172,7 @@ trap(Ureg* ureg) Vctl *ctl, *v; Mach *mach; + m->intrts = fastticks(nil); user = 0; if((ureg->cs & 0xFFFF) == UESEL){ user = 1; @@ -375,7 +373,6 @@ fault386(Ureg* ureg, void*) read = !(ureg->ecode & 2); insyscall = up->insyscall; up->insyscall = 1; - spllo(); n = fault(addr, read); if(n < 0){ if(!user){ diff --git a/port/devintrts.c b/port/devintrts.c new file mode 100644 index 0000000000000000000000000000000000000000..6ff3551825355827dfdb416e05cb9c1ed3499fff --- /dev/null +++ b/port/devintrts.c @@ -0,0 +1,134 @@ +/* + */ +#include "u.h" +#include "../port/lib.h" +#include "mem.h" +#include "dat.h" +#include "fns.h" +#include "../port/error.h" + +enum { + Qdir, + Qintrts, +}; + +static Dirtab intrtsdir[] = { + "intrts", { Qintrts, 0 }, 0, 0666, +}; + +void (*saveintrts)(void) = nil; + +/* interrupt timestamps, trap() fills intrts each interrupt */ +uvlong intrts; +static struct { + Lock; + int vno; /* vector to save timestamps for */ + int n; /* number of valid timestamps in ts[] */ + uvlong ts[128]; /* time stamps */ +} tsalloc; + +/* called with interrupts off by interrupt routine */ +void +_saveintrts(void) +{ + lock(&tsalloc); + if(tsalloc.n < nelem(tsalloc.ts)) + tsalloc.ts[tsalloc.n++] = m->intrts; + unlock(&tsalloc); +} + +/* read interrupt timestamps */ +static long +readintrts(void *buf, int n) +{ + n /= sizeof(uvlong); + if(n <= 0) + return 0; + ilock(&tsalloc); + if(n > tsalloc.n) + n = tsalloc.n; + memmove(buf, tsalloc.ts, n*sizeof(uvlong)); + tsalloc.n = 0; + iunlock(&tsalloc); + return n*sizeof(uvlong); +} + + +static void +intrtsreset(void) +{ + saveintrts = _saveintrts; +} + +static Chan* +intrtsattach(char* spec) +{ + return devattach('Z', spec); /* everything good was taken */ +} + +int +intrtswalk(Chan* c, char* name) +{ + return devwalk(c, name, intrtsdir, nelem(intrtsdir), devgen); +} + +static void +intrtsstat(Chan* c, char* dp) +{ + devstat(c, dp, intrtsdir, nelem(intrtsdir), devgen); +} + +static Chan* +intrtsopen(Chan* c, int omode) +{ + return devopen(c, omode, intrtsdir, nelem(intrtsdir), devgen); +} + +static void +intrtsclose(Chan*) +{ +} + +static long +intrtsread(Chan* c, void* a, long n, vlong) +{ + switch(c->qid.path & ~CHDIR){ + + case Qdir: + return devdirread(c, a, n, intrtsdir, nelem(intrtsdir), devgen); + + case Qintrts: + return readintrts(a, n); + } + + error(Eperm); + return 0; +} + +static long +intrtswrite(Chan*, void*, long, vlong) +{ + error(Eperm); + return 0; +} + +Dev intrtsdevtab = { + 'Z', + "intrts", + + intrtsreset, + devinit, + intrtsattach, + devclone, + intrtswalk, + intrtsstat, + intrtsopen, + devcreate, + intrtsclose, + intrtsread, + devbread, + intrtswrite, + devbwrite, + devremove, + devwstat, +}; diff --git a/port/devns16552.c b/port/devns16552.c index 5edbf0f9f77f233df49d713e1c034b51b525397b..d7a1cc32d28d3b5644c1a1c5003f367e9383bfdf 100644 --- a/port/devns16552.c +++ b/port/devns16552.c @@ -149,41 +149,6 @@ struct Uartalloc { void ns16552intr(int); -/* interrupt timestamps, l.s fills intrts each interupt */ -uvlong intrts; -static struct { - Lock; - int vno; /* vector to save timestamps for */ - int n; /* number of valid timestamps in ts[] */ - uvlong ts[128]; /* time stamps */ -} tsalloc; - -/* called with interrupts off by interrupt routine */ -static void -savets(void) -{ - lock(&tsalloc); - if(tsalloc.n < nelem(tsalloc.ts)) - tsalloc.ts[tsalloc.n++] = intrts; - unlock(&tsalloc); -} - -/* read interrupt timestamps */ -long -readintrts(void *buf, int n) -{ - n /= sizeof(uvlong); - if(n <= 0) - return 0; - ilock(&tsalloc); - if(n > tsalloc.n) - n = tsalloc.n; - memmove(buf, tsalloc.ts, n*sizeof(uvlong)); - tsalloc.n = 0; - iunlock(&tsalloc); - return n*sizeof(uvlong); -} - /* * pick up architecture specific routines and definitions */ @@ -713,8 +678,8 @@ ns16552intr(int dev) } if (ch & Dcdc) { l = ch & Dcd; - if(l == 0 && p->dcd != 0 && p->dcdts) - savets(); + if(l == 0 && p->dcd != 0 && p->dcdts && saveintrts != nil) + (*saveintrts)(); if(p->hup_dcd && p->dcd && !l){ ilock(&p->rlock); p->dohup = 1; diff --git a/port/portfns.h b/port/portfns.h index 4ab6393a6e8365b0c604d32a8db65350ab81b428..9e0e5dbfe250eb9d3a98c892965d775b96d62d7c 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -266,6 +266,7 @@ long rtctime(void); void runlock(RWlock*); Proc* runproc(void); void savefpregs(FPsave*); +void (*saveintrts)(void); void sched(void); void scheddump(void); void schedinit(void);