On Fri, Sep 02, 2022 at 11:42:03AM -0500, Scott Cheloha wrote: > The 8254 data sheet [1] says this about the Read-Back command: > > > The read-back command may be used to latch multi- > > ple counter output latches (OL) by setting the > > COUNT bit D5 = 0 and selecting the desired coun- > > ter(s). This single command is functionally equiva- > > lent to several counter latch commands, one for > > each counter latched. [...] > > This is a little ambiguous. But my hunch is that the intent here is > "you can latch multiple counters all at once". Simultaneously. > Otherwise the utility of the read-back command is suspect. > > To simulate a simultaneous latch, we should only call clock_gettime(2) > once and use that singular timestamp to compute olatch for each > counter. > > ok? > > [1] 8254 Programmable Interval Timer, p. 8 > https://www.scs.stanford.edu/10wi-cs140/pintos/specs/8254.pdf
Didn't see dv's reply earlier; I agree with what he said. > > Index: i8253.c > =================================================================== > RCS file: /cvs/src/usr.sbin/vmd/i8253.c,v > retrieving revision 1.34 > diff -u -p -r1.34 i8253.c > --- i8253.c 16 Jun 2021 16:55:02 -0000 1.34 > +++ i8253.c 2 Sep 2022 16:25:02 -0000 > @@ -128,6 +128,8 @@ i8253_do_readback(uint32_t data) > int readback_channel[3] = { TIMER_RB_C0, TIMER_RB_C1, TIMER_RB_C2 }; > int i; > > + clock_gettime(CLOCK_MONOTONIC, &now); > + > /* bits are inverted here - !TIMER_RB_STATUS == enable chan readback */ > if (data & ~TIMER_RB_STATUS) { > i8253_channel[0].rbs = (data & TIMER_RB_C0) ? 1 : 0; > @@ -139,7 +141,6 @@ i8253_do_readback(uint32_t data) > if (data & ~TIMER_RB_COUNT) { > for (i = 0; i < 3; i++) { > if (data & readback_channel[i]) { > - clock_gettime(CLOCK_MONOTONIC, &now); > timespecsub(&now, &i8253_channel[i].ts, &delta); > ns = delta.tv_sec * 1000000000 + delta.tv_nsec; > ticks = ns / NS_PER_TICK;