On Wed, 21 Nov 2018, Geert Uytterhoeven wrote:
This suggests that either 0 or N (the latched value) would result from
a read from the counter immediately following an interrupt. Who can
say which? Just have to try it. The answer should allow us to avoid
the risk of a clocksource that jumps forwards and backwards.
The code in amiga_gettimeoffset() does:
ticks = hi << 8 | lo;
if (ticks > jiffy_ticks / 2)
/* check for pending interrupt */
if (cia_set_irq(&ciab_base, 0) & CIA_ICR_TA)
offset = 10000;
That _suggests_ that there's no interrupt when ticks == 0.
But look what happens next:
ticks = jiffy_ticks - ticks;
ticks = (10000 * ticks) / jiffy_ticks;
return (ticks + offset) * 1000;
If (hi << 8 | lo) == 0, and you set offset = 10000, then the return value
would be maximal.
Let's immediately call this function again. This time (hi << 8 | lo) == N.
Let's add the offset again. I'm afraid the clock just jumped backwards.
So the logic you quoted has a rationale which is unrelated to the
question.
--