arch: support issuing Atomic Mem Operation (AMO) requests
authorTuan Ta <qtt2@cornell.edu>
Mon, 22 Jan 2018 18:00:35 +0000 (13:00 -0500)
committerTuan Ta <qtt2@cornell.edu>
Thu, 14 Jun 2018 22:41:23 +0000 (22:41 +0000)
This patch adds two new functions named amoMemAtomic used in Atomic CPU
model and initiateMemAMO used in Timing CPU models to issue AMO requests
to the memory system.

Change-Id: I962bdc0e5f25b72c170d96ebc136f29a2b230d5e
Reviewed-on: https://gem5-review.googlesource.com/8186
Reviewed-by: Anthony Gutierrez <anthony.gutierrez@amd.com>
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Maintainer: Anthony Gutierrez <anthony.gutierrez@amd.com>

src/arch/generic/memhelpers.hh

index 35e666b922c5de78ac816910650475c9fc7af044..6fe1707a0d36f5886d2b7a3dc67391ecf7f68f8a 100644 (file)
@@ -121,4 +121,36 @@ writeMemAtomic(XC *xc, Trace::InstRecord *traceData, const MemT &mem,
     return fault;
 }
 
+/// Do atomic read-modify-write (AMO) in atomic mode
+template <class XC, class MemT>
+Fault
+amoMemAtomic(XC *xc, Trace::InstRecord *traceData, MemT &mem, Addr addr,
+             Request::Flags flags, AtomicOpFunctor *amo_op)
+{
+    assert(amo_op);
+
+    // mem will hold the previous value at addr after the AMO completes
+    memset(&mem, 0, sizeof(mem));
+
+    Fault fault = xc->amoMem(addr, (uint8_t *)&mem, sizeof(MemT), flags,
+                             amo_op);
+
+    if (fault == NoFault) {
+        mem = TheISA::gtoh(mem);
+        if (traceData)
+            traceData->setData(mem);
+    }
+    return fault;
+}
+
+/// Do atomic read-modify-wrote (AMO) in timing mode
+template <class XC, class MemT>
+Fault
+initiateMemAMO(XC *xc, Trace::InstRecord *traceData, Addr addr, MemT& mem,
+               Request::Flags flags, AtomicOpFunctor *amo_op)
+{
+    assert(amo_op);
+    return xc->initiateMemAMO(addr, sizeof(MemT), flags, amo_op);
+}
+
 #endif