Re: ACPI patch (was Re: 'microuptime() went backwards ...' using ACPI...)

2002-02-17 Thread Michael Smith

 Ok, here is a patch that executes a brute-force solution to the
 asynchronous counter problem.
 
 Basically it figures out a mask and then the timer code loops until two
 masked reads yield the same value, guarenteeing that we haven't caught
 the timer during a carry.
 
 On my system, the mask I got was: 0xFFFC which means I lost only 2
 bits of accuracy in order to be able to retrieve accurate counter values.
 This gives my particular box an approximately 1uS accuracy.
 
 I think this may be the only safe way to do it.  It looks like it is
 possible to catch the ripple and/or fast-carry on *any* bit, with the
 statistical chance of it occuring on higher bits dropping by 2x per bit.
 
 My proposed (tested) patch is below.  Mike?

I have some reservations about this, because I'm not sure that 10 
successive reads will catch the ripple-counter problem that the old PIIX4s
have.

I think that if this code detects a need for the mask technique, it 
should set the handler to a function that will deal with the mask.  If it 
doesn't, it should assume that we need the 'safe' function as it 
currently exists (I'm not sure why it's not the default, unless there's a 
log message to explain it, it must have been a mistake on my part).

I'd also like to see the description include the number of bits, rather 
than the mask, if we are using a mask.

Thanks for taking the time to track this one down.

-- 
To announce that there must be no criticism of the president,
or that we are to stand by the president, right or wrong, is not
only unpatriotic and servile, but is morally treasonable to 
the American public.  - Theodore Roosevelt



To Unsubscribe: send mail to [EMAIL PROTECTED]
with unsubscribe freebsd-current in the body of the message



Re: ACPI patch (was Re: 'microuptime() went backwards ...' using ACPI...)

2002-02-17 Thread Matthew Dillon

:
:I have some reservations about this, because I'm not sure that 10 
:successive reads will catch the ripple-counter problem that the old PIIX4s
:have.

Just goes to show that I need to document my code :-)

Those reads are not detecting the ripple-counter problem, they are
figuring out the mask required to guarentee that two successive reads
will return the same counter value so the counter read in the later
code doesn't end up in an infinite loop.

i.e. on a slow cpu the mask might have to remove more bits because the
counter increments a number of times between reads.  On a fast cpu,
fewer bits would have to be chopped off.  That's all.

:I'd also like to see the description include the number of bits, rather 
:than the mask, if we are using a mask.
:
:Thanks for taking the time to track this one down.

Well, I don't want to spend too much time on it because this was
incidental to other work I'm doing on -current.  If you think it's worth
comitting I'll commit it, otherwise you can use it as a template for your
own fix/commit.  It would be nice if some sort of solution were comitted
to the tree relatively soon.

-Matt
Matthew Dillon 
[EMAIL PROTECTED]

To Unsubscribe: send mail to [EMAIL PROTECTED]
with unsubscribe freebsd-current in the body of the message