Dear List,
I have been making some
changes to Ruby on the LogTM protocols, and I have found a problem that might
also affect the original protocol in some corner cases. When a non-stallable memory operation is executed
(such as a casxa, swap or ldda instruction), the mem_trans->s.may_stall bit
is set to 0 by Simics. This means that the timing model (Ruby) is not allowed
to model the timing of the request, it is directly executed. This case is
considered in SimicsDriver::isUnhandledTransaction().
This
is not a serious problem in ordinary protocols, as the global image view of the
memory makes the operation coherent (given that cache data is not modelled). However,
in transactional protocols, this becomes quite a serious concern, as the possible collisions or the log entries that would
be generated by the access are not considered. This would mean, for
example, that an aborting transaction would not restore the original value of
the line modified by the casxa instruction. I know this is a corner case, but
it migh affect, for example, to code that acquires and releases locks in the middle
of a transaction.
This
is clearly a limitation of Simics, not Ruby, that does not allow stalling
certain memory transactions. Anyway, has someone ever experienced a similar situation
and can give some hints on how to avoid the problem? I would really appreciate
some help with the problem.
Thanks
in advance,
Enrique Vallejo
University of Cantabria, Spain
http://www.atc.unican.es/~enrique/