[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [MiNT] Fix wrong size of outgoing packets in the FEC driver
On 04/09/2014 21:14, email@example.com a wrote:
I have looked before into the TAS() macro, but didn't see anything
suspicuous - frankly, I didn't know tas is behaving bad on the Firebee.
The Coldfire manual doesn't say anything special about it (the text is
the same as for m68k processors), do you know more?
Now I remember! That's a data cache issue.
If I understand correctly:
The special read-modify-write operation occurs at the bus level, to deal
with multiple bus master devices. That's exactly the job of TAS.
But that operation does not care about the data cache!
If you set a variable to 0 to release a lock, its value will be 0 in the
data cache, but will stay to the old value in the actual memory (at
least when the data cache is in copy-back mode).
Then if you use TAS to read the variable, you will read the old stale
value instead of your 0. This means that the lock may appear to be
locked from another task, while it is actually our old lock.
Then the OS does other things (did you remember my report about
improvements with sustained screen activity?). Finally, the data cache
line is flushed, the 0 is pushed to memory and the algorithm unlocks.
This is exactly what I experienced with the NFS client on the FireBee.
On the other side, the BSET instruction only works in the the data
cache, it doesn't care about the actual memory.
As a conclusion, the TAS instruction can't be used in memory areas
configured with data cache in copy-back mode. However, that should work
with write-through or cache-inhibited areas.
It would be interesting to know if the NFS client also had trouble with
other processors (68060?) in copy-back mode...