diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/9/mtx/clock.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/9/mtx/clock.c')
-rwxr-xr-x | sys/src/9/mtx/clock.c | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/sys/src/9/mtx/clock.c b/sys/src/9/mtx/clock.c new file mode 100755 index 000000000..dacef88ed --- /dev/null +++ b/sys/src/9/mtx/clock.c @@ -0,0 +1,112 @@ +#include "u.h" +#include "../port/lib.h" +#include "mem.h" +#include "dat.h" +#include "fns.h" +#include "io.h" +#include "ureg.h" + +static ulong clkreload; + +void +delayloopinit(void) +{ + ulong v; + uvlong x; + + m->loopconst = 5000; + v = getdec(); + delay(1000); + v -= getdec(); + + x = m->loopconst; + x *= m->dechz; + x /= v; + m->loopconst = x; +} + +void +clockinit(void) +{ + /* XXX this should not be hard coded! */ + m->cpuhz = 300000000; + m->bushz = 66666666; + + m->dechz = m->bushz/4; /* true for all 604e */ + m->tbhz = m->dechz; /* conjecture; manual doesn't say */ + + delayloopinit(); + + clkreload = m->dechz/HZ-1; + putdec(clkreload); +} + +void +clockintr(Ureg *ureg) +{ + long v; + + v = -getdec(); + if(v > clkreload/2){ + if(v > clkreload) + m->ticks += v/clkreload; + v = 0; + } + putdec(clkreload-v); + + timerintr(ureg, 0); +} + +void +timerset(Tval) +{ +} + +void +delay(int l) +{ + ulong i, j; + + j = m->loopconst; + while(l-- > 0) + for(i=0; i < j; i++) + ; +} + +void +microdelay(int l) +{ + ulong i; + + l *= m->loopconst; + l += 500; + l /= 1000; + if(l <= 0) + l = 1; + for(i = 0; i < l; i++) + ; +} + +uvlong +fastticks(uvlong *hz) +{ + if(hz) + *hz = HZ; + return m->ticks; +} + +ulong +µs(void) +{ + return fastticks2us(m->ticks); +} + +/* + * performance measurement ticks. must be low overhead. + * doesn't have to count over a second. + */ +ulong +perfticks(void) +{ + return m->ticks; +} |