Subject: Re: /dev/clock pseudodevice
To: <>
From: Bill Sommerfeld <sommerfeld@netbsd.org>
List: tech-kern
Date: 07/28/2001 19:02:08
> An interesting idea.  You'd lose the ability to get sub-tick timings out of
> it like that, though, and anything calling gettimeofday() hundreds of times
> a second probably wants better than 10ms resolution.

Actually, on architectures with userland-readable cycle counters, this
page could also contain cycle-counter base and scaling values for each
cpu, allowing userland to compute a exact time.

(see sys/arch/alpha/alpha/microtime.c for an example of what would
have to be replicated into userland).

To be completely usable, you need a fast userland "which cpu am i".

you'd then do something like the following:

(this is intended to be pseudocode..)

	do {
		beforecpu=whichcpu()
		beforescaling = beforecpu->scaling
		read cycle counter
		afterscaling = beforecpu->scaling
		aftercpu=whichcpu()
	} while ((beforescaling != afterscaling) || (beforecpu != aftercpu))
	time = beforescaling.base + counter / beforescaling.denominator

I think this handles (a) clock interrupt in the middle of the
operation, and (b) preemption and cpu switch in the middle.

					- Bill