From c82a4de14fee442f72fd49b064c330db9733594a Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sat, 27 Mar 1999 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1999-03-27 --- carrera/clock.c | 37 +++++++++++++++++++++++++++++-------- carrera/fns.h | 2 ++ carrera/l.s | 5 +++++ carrera/mem.h | 2 +- carrera/screen.c | 3 --- ip/tcp.c | 2 +- mpc/fns.h | 1 + pc/fns.h | 1 + port/proc.c | 1 + 9 files changed, 41 insertions(+), 13 deletions(-) diff --git a/carrera/clock.c b/carrera/clock.c index 4f4def6c985ef7fa7e8557679b5f8aa09f28a91e..b671e7f2e419688acda60048020e4a3b0528ebcc 100644 --- a/carrera/clock.c +++ b/carrera/clock.c @@ -51,6 +51,8 @@ delay(int l) ; } +ulong lastcmp; + void clockinit(void) { @@ -72,18 +74,16 @@ clockinit(void) incr = (m->speed*1000000)/HZ; fasthz = m->speed*1000000; - wrcompare(rdcount()+incr); + wrcompare(lastcmp = rdcount()+incr); } uvlong updatefastclock(ulong count) { - vlong delta; + ulong delta; /* keep track of higher precision time */ delta = count - m->lastcyclecount; - if(delta < 0) - delta += 0x100000000LL; m->lastcyclecount = count; m->fastclock += delta; @@ -97,7 +97,7 @@ clock(Ureg *ur) ulong count; count = rdcount(); - wrcompare(count+incr); + wrcompare(lastcmp = count+incr); updatefastclock(count); m->ticks++; @@ -136,14 +136,14 @@ clock(Ureg *ur) if(up == 0 || up->state != Running) return; - if(anyready()) - sched(); - /* user profiling clock */ if(ur->status & KUSER) { (*(ulong*)(USTKTOP-BY2WD)) += TK2MS(1); segclock(ur->pc); } + + if(anyready()) + sched(); } vlong @@ -161,3 +161,24 @@ fastticks(uvlong *hz) return (vlong)cyclecount; } + +ulong timewarp; + +void +idlehands(void) +{ + ulong cnt, cmp, d; + int x; + + x = splhi(); + cnt = rdcount(); + cmp = rdcompare(); + cnt -= 100; /* to cover for time from splhi to rdcount */ + d = cmp - cnt; + if(d > incr+100){ + wrcompare(lastcmp = cnt+incr); + timewarp++; +// print("%lud %lud %d %lux\n", cnt, cmp, cnt-cmp, d); + } + splx(x); +} diff --git a/carrera/fns.h b/carrera/fns.h index 2efa5fa9cbe2f31bd888655c5604f6e29075e2c8..af43073d57a399c2d485449926fc3e364e80558b 100644 --- a/carrera/fns.h +++ b/carrera/fns.h @@ -25,6 +25,7 @@ void gettlb(int, ulong*); int gettlbp(ulong, ulong*); ulong gettlbvirt(int); void icflush(void *, ulong); +void idlehands(void); void intr(Ureg*); void ioinit(int); int iprint(char*, ...); @@ -48,6 +49,7 @@ Softtlb* putstlb(ulong, ulong); int puttlb(ulong, ulong, ulong); void puttlbx(int, ulong, ulong, ulong, int); void rdbginit(void); +ulong rdcompare(void); ulong rdcount(void); ulong* reg(Ureg*, int); void restfpregs(FPsave*, ulong); diff --git a/carrera/l.s b/carrera/l.s index 39c583e516e59ae9a76836cda0908e2e307d7192..0e2b0e032cab64db1dde6b831b6e0d099004dce4 100644 --- a/carrera/l.s +++ b/carrera/l.s @@ -797,3 +797,8 @@ TEXT rdcount(SB), $0 TEXT wrcompare(SB), $0 MOVW R1, M(COMPARE) RET + +TEXT rdcompare(SB), $0 + MOVW M(COMPARE), R1 + NOP + RET diff --git a/carrera/mem.h b/carrera/mem.h index c7a5e71d7c14bbaf720cdd4def865515abba2344..edf97580798d63cd7236fa6ad95e335ef97252e3 100644 --- a/carrera/mem.h +++ b/carrera/mem.h @@ -22,7 +22,7 @@ /* * Time */ -#define HZ 1000 /* clock frequency */ +#define HZ 250 /* clock frequency */ #define MS2HZ (1000/HZ) /* millisec per clock tick */ #define TK2SEC(t) ((t)/HZ) /* ticks to seconds */ #define TK2MS(t) ((t)*MS2HZ) /* ticks to milliseconds */ diff --git a/carrera/screen.c b/carrera/screen.c index a9823fb88e60a46b9ea6e73ddf664abb850aee06..58f8f5292604125fa5531ba90f5635de2f62297b 100644 --- a/carrera/screen.c +++ b/carrera/screen.c @@ -586,7 +586,6 @@ cursoron(int dolock) { Dac *d; Point p; - int s; p = mousexy(); @@ -594,7 +593,6 @@ cursoron(int dolock) if(dolock) lock(&cursor); - s = splhi(); p.x += 296; /* adjusted by experiment */ p.y += 9; /* adjusted by experiment */ @@ -605,7 +603,6 @@ cursoron(int dolock) d->cr2 = p.y&0xFF; d->cr2 = (p.y>>8)&0xF; - splx(s); if(dolock) unlock(&cursor); return 0; diff --git a/ip/tcp.c b/ip/tcp.c index 2c119c44559c685d200b359d4ab558dab5c540b9..e939913a2d74aa51d14003b2935d954e750fa774 100644 --- a/ip/tcp.c +++ b/ip/tcp.c @@ -454,7 +454,7 @@ static void tcpcreate(Conv *c) { c->rq = qopen(QMAX, 0, tcpacktimer, c); - c->wq = qopen(QMAX, 0, 0, 0); + c->wq = qopen(2*QMAX, 0, 0, 0); } void diff --git a/mpc/fns.h b/mpc/fns.h index 2ae180049ad5441ca7f0e58a96bfe4e2020665aa..ae6fc1c7fd84109ebf99b4c8d72573fd37e1e1c9 100644 --- a/mpc/fns.h +++ b/mpc/fns.h @@ -41,6 +41,7 @@ ulong gettbu(void); void gotopc(ulong); void icflush(void*, ulong); void idle(void); +#define idlehands() /* nothing to do in the runproc */ int iprint(char*, ...); void intr(Ureg*); void intrenable(int, void (*)(Ureg*, void*), void*, int); diff --git a/pc/fns.h b/pc/fns.h index 095eaafd9db9bb4bbd5045f9e3998ecc13ca993d..6bc6b480c32aa1933bf04dd16167cf71b30c4163 100644 --- a/pc/fns.h +++ b/pc/fns.h @@ -40,6 +40,7 @@ uvlong i8253read(uvlong*); void i8259init(void); int i8259enable(Vctl*); void idle(void); +#define idlehands() /* nothing to do in the runproc */ int inb(int); void insb(int, void*, int); ushort ins(int); diff --git a/port/proc.c b/port/proc.c index ea26f0afdbbaf68a9012ce91826cbf5547fd4635..c7ee02c77919f6230ef8d88251b0fc947aabcd70 100644 --- a/port/proc.c +++ b/port/proc.c @@ -200,6 +200,7 @@ loop: */ spllo(); for(;;){ + idlehands(); if((++(m->fairness) & 3) == 0){ /* * once in a while, run process that's been waiting longest