From 8ca921444d5e0578aa6bc28bb1e82e149734bc13 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sat, 28 Sep 2002 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2002-09-28 --- pc/clock.c | 60 ------------------------------------------------ pc/random.c | 3 ++- pc/sd53c8xx.c | 16 ++++++++----- port/devcons.c | 8 +++++-- port/devmouse.c | 3 ++- port/devnmouse.c | 3 ++- port/devuart.c | 6 ++++- port/portclock.c | 13 +++++++---- port/portfns.h | 2 +- port/tod.c | 4 ++-- 10 files changed, 38 insertions(+), 80 deletions(-) delete mode 100644 pc/clock.c diff --git a/pc/clock.c b/pc/clock.c deleted file mode 100644 index 6b65982a17777dd7c0205983716413a03d8d706e..0000000000000000000000000000000000000000 --- a/pc/clock.c +++ /dev/null @@ -1,60 +0,0 @@ -#include "u.h" -#include "../port/lib.h" -#include "mem.h" -#include "dat.h" -#include "fns.h" -#include "io.h" -#include "ureg.h" - -/* - * this is called both by the mp's clock interrupt and - * by the clockintr0 for the i8253 - */ -void -clockintr(Ureg* ureg, void*) -{ - /* this has to get called every tick or the 8253 timer will overflow */ - fastticks(nil); - - if(m->flushmmu){ - if(up) - flushmmu(); - m->flushmmu = 0; - } - - portclock(ureg); -} - -void -delay(int millisecs) -{ - millisecs *= m->loopconst; - if(millisecs <= 0) - millisecs = 1; - aamloop(millisecs); -} - -void -microdelay(int microsecs) -{ - microsecs *= m->loopconst; - microsecs /= 1000; - if(microsecs <= 0) - microsecs = 1; - aamloop(microsecs); -} - -/* - * performance measurement ticks. must be low overhead. - * doesn't have to count over a second. - */ -ulong -perfticks(void) -{ - uvlong x; - - if(!m->havetsc) - return ticks; - rdtsc(&x); - return x; -} diff --git a/pc/random.c b/pc/random.c index 282e8c99a29b625dc7be4b2b37f564c2ed8bf11b..40cf9fd1a641412e23a7e4ac42d4042f4c2e2174 100644 --- a/pc/random.c +++ b/pc/random.c @@ -84,7 +84,8 @@ randomclock(void) void randominit(void) { - addclock0link(randomclock); + /* Frequency close but not equal to HZ */ + addclock0link(randomclock, 13); rb.ep = rb.buf + sizeof(rb.buf); rb.rp = rb.wp = rb.buf; kproc("genrandom", genrandom, 0); diff --git a/pc/sd53c8xx.c b/pc/sd53c8xx.c index ae65f6027ba8dc3a8b89764a90cf9430aa882335..da1e50cfacd8c14de9223796863c62dbf14a4539 100644 --- a/pc/sd53c8xx.c +++ b/pc/sd53c8xx.c @@ -1004,8 +1004,7 @@ calcblockdma(Dsa *d, ulong base, ulong count) d->dmaaddr[2] = base >> 16; d->dmaaddr[3] = base >> 24; setmovedata(&d->data_buf, base + blocks * A_BSIZE, count - blocks * A_BSIZE); - if (legetl(d->data_buf.dbc) == 0) - d->flag = 1; + d->flag = legetl(d->data_buf.dbc) == 0; } static ulong @@ -1337,12 +1336,13 @@ sd53c8xxinterrupt(Ureg *ur, void *a) /* back up one in the data transfer */ IPRINT(PRINTPREFIX "%d/%d: ignore wide residue %d, WSR = %d\n", dsa->target, dsa->lun, n->scratcha[1], n->scntl2 & 1); - if (dsa->dmablks == 0 && dsa->flag) + if (dsa->flag == 2) IPRINT(PRINTPREFIX "%d/%d: transfer over; residue ignored\n", dsa->target, dsa->lun); - else + else { calcblockdma(dsa, legetl(dsa->dmaaddr) - 1, dsa->dmablks * A_BSIZE + legetl(dsa->data_buf.dbc) + 1); + } cont = -2; break; case A_SIR_ERROR_NOT_MSG_IN_AFTER_RESELECT: @@ -1730,10 +1730,14 @@ docheck: * adjust datalen */ r->rlen = r->dlen; - if (d->dmablks > 0) + if (DEBUG(0)) + KPRINT(PRINTPREFIX "%d/%d: exec: before rlen adjust: dmablks %d flag %d dbc %lud\n", + target, r->lun, d->dmablks, d->flag, legetl(d->data_buf.dbc)); + r->rlen = r->dlen; + if (d->flag != 2) { r->rlen -= d->dmablks * A_BSIZE; - else if (d->flag == 0) r->rlen -= legetl(d->data_buf.dbc); + } if(!r->write) dumpreaddata(r->data, r->rlen); if (DEBUG(0)) diff --git a/port/devcons.c b/port/devcons.c index 42005352572f9c5b16304733ef3aab89e44f178f..e325cf0f29293e34deb59fdb4c97dc8f7ca53e4a 100644 --- a/port/devcons.c +++ b/port/devcons.c @@ -33,7 +33,7 @@ static struct /* a place to save up characters at interrupt time before dumping them in the queue */ Lock lockputc; - char istage[512]; + char istage[1024]; char *iw; char *ir; char *ie; @@ -564,7 +564,11 @@ consinit(void) { todinit(); randominit(); - addclock0link(kbdputcclock); + /* + * at 115200 baud, the 1024 char buffer takes 56 ms to process, + * processing it every 22 ms should be fine + */ + addclock0link(kbdputcclock, 22); } static Chan* diff --git a/port/devmouse.c b/port/devmouse.c index 0c87963be31dee3d3dbe00a4b2bcdc231ae43b04..0065ca249084955c78b91a0b7ea1a131a258fcd0 100644 --- a/port/devmouse.c +++ b/port/devmouse.c @@ -97,7 +97,8 @@ mousereset(void) curs = arrow; Cursortocursor(&arrow); - addclock0link(mouseclock); + /* redraw cursor about 30 times per second */ + addclock0link(mouseclock, 33); } static void diff --git a/port/devnmouse.c b/port/devnmouse.c index ff1bf07c04861f23a7e10f247bfa4142e4b62394..887c66c7be88f4270e5a812adfa09ae4b84a5519 100644 --- a/port/devnmouse.c +++ b/port/devnmouse.c @@ -50,7 +50,8 @@ mousereset(void) curs = arrow; Cursortocursor(&arrow); - addclock0link(mouseclock); + /* redraw cursor about 30 times per second */ + addclock0link(mouseclock, 33); } static void diff --git a/port/devuart.c b/port/devuart.c index 65c915cc1f7c3ee90752201a7fa0c6ee359eb6a3..b7690bbfa5643430aee580ab185876453aa4bad5 100644 --- a/port/devuart.c +++ b/port/devuart.c @@ -212,7 +212,11 @@ uartreset(void) } if(uartnuart){ - addclock0link(uartclock); + /* + * at 115200 baud, the 1024 char buffer takes 56 ms to process, + * processing it every 22 ms should be fine + */ + addclock0link(uartclock, 22); } } diff --git a/port/portclock.c b/port/portclock.c index cb2250fc948290960433dcb5d9a5a40b3d17704d..c8610919b539b23f91a9062a008676d540ae0903 100644 --- a/port/portclock.c +++ b/port/portclock.c @@ -27,11 +27,14 @@ tadd(Timers *tt, Timer *nt) pt = nil; for(last = &tt->head; t = *last; last = &t->next){ if(t == nt){ + /* timer's changing, remove it before putting it back on */ *last = t->next; break; } - if (t->period == nt->period) + if (t->period == nt->period){ + /* look for another timer at same frequency for combining */ pt = t; + } } if(nt->when == 0){ @@ -195,16 +198,16 @@ timersinit(void) } void -addclock0link(void (*f)(void)) +addclock0link(void (*f)(void), int ms) { Timer *nt; /* Synchronize this to hztimer: reduces # of interrupts */ nt = malloc(sizeof(Timer)); nt->when = 0; - if (hzperiod == 0) - hzperiod = ms2fastticks(1000/HZ); - nt->period = hzperiod; + if (ms == 0) + ms = 1000/HZ; + nt->period = ms2fastticks(ms); nt->f = (void (*)(Ureg*, Timer*))f; ilock(&timers[0]); diff --git a/port/portfns.h b/port/portfns.h index 756640288bc0e524c203c0ec04af419aba7a44cd..d82e93cd579d44a867e43192e1ebf99fc488c29d 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -1,5 +1,5 @@ void accounttime(void); -void addclock0link(void (*)(void)); +void addclock0link(void (*)(void), int); int addphysseg(Physseg*); void addrootfile(char*, uchar*, ulong); Block* adjustblock(Block*, int); diff --git a/port/tod.c b/port/tod.c index f8eefb0169173bfb133c65b53e90b5eb4608c962..2cc0d29bfd143314c6024b38cb856d942d78cb22 100644 --- a/port/tod.c +++ b/port/tod.c @@ -50,7 +50,7 @@ todinit(void) tod.last = fastticks((uvlong*)&tod.hz); iunlock(&tod); todsetfreq(tod.hz); - addclock0link(todfix); + addclock0link(todfix, 100); } // @@ -145,7 +145,7 @@ todget(vlong *ticksp) } // -// called every clock tick to avoid calculation overflows +// called regularly to avoid calculation overflows // void todfix(void)