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().
I dont think this is entirely true. An atomic operation is split into
two components and only the second component is
non-stallable. The first component should be handled as a store by the
logTM implementation and hence
should be properly logged and isolated.
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.
I believe a similar scenario occurs when Simics comes across double word
load/stores. Simics hands them to
Ruby as two separate single word transactions. Only the first is
stallable. Fortunately, sparc does not handle
misaligned memory operations. Hence double word operations dont span
multiple cache lines and the LogTM
implementation should work correctly. This could be true for multi-word
operations too. I haven't run across
them though.
Jayaram
|