arch: don't call *Timing functions from *Atomic versions
The readMemAtomic/writeMemAtomic helper functions were calling readMemTiming/writeMemTiming respectively. This is functionally correct, since the *Timing functions are doing the same access initiation operation as the *Atomic functions (just that the *Atomic versions also complete the access in line). It also provides for some (very minimal) code reuse. Unfortunately, it's potentially pretty confusing, since it makes it look like the atomic accesses are somehow being converted to timing accesses. It also gets in the way of specializing the timing interface (as will be done in a future patch).
This commit is contained in:
@@ -74,7 +74,7 @@ readMemAtomic(XC *xc, Trace::InstRecord *traceData, Addr addr, MemT &mem,
|
||||
unsigned flags)
|
||||
{
|
||||
memset(&mem, 0, sizeof(mem));
|
||||
Fault fault = readMemTiming(xc, traceData, addr, mem, flags);
|
||||
Fault fault = xc->readMem(addr, (uint8_t *)&mem, sizeof(MemT), flags);
|
||||
if (fault == NoFault) {
|
||||
mem = TheISA::gtoh(mem);
|
||||
if (traceData)
|
||||
@@ -102,7 +102,12 @@ Fault
|
||||
writeMemAtomic(XC *xc, Trace::InstRecord *traceData, const MemT &mem,
|
||||
Addr addr, unsigned flags, uint64_t *res)
|
||||
{
|
||||
Fault fault = writeMemTiming(xc, traceData, mem, addr, flags, res);
|
||||
if (traceData) {
|
||||
traceData->setData(mem);
|
||||
}
|
||||
MemT host_mem = TheISA::htog(mem);
|
||||
Fault fault =
|
||||
xc->writeMem((uint8_t *)&host_mem, sizeof(MemT), addr, flags, res);
|
||||
if (fault == NoFault && res != NULL) {
|
||||
if (flags & Request::MEM_SWAP || flags & Request::MEM_SWAP_COND)
|
||||
*res = TheISA::gtoh((MemT)*res);
|
||||
|
||||
Reference in New Issue
Block a user