From 78fb2c1a5d5e422bf14f134d677a83e3022238f1 Mon Sep 17 00:00:00 2001 From: Tuan Ta Date: Mon, 22 Jan 2018 13:00:35 -0500 Subject: [PATCH] arch: support issuing Atomic Mem Operation (AMO) requests 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 Reviewed-by: Jason Lowe-Power Maintainer: Anthony Gutierrez --- src/arch/generic/memhelpers.hh | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/arch/generic/memhelpers.hh b/src/arch/generic/memhelpers.hh index 35e666b92..6fe1707a0 100644 --- a/src/arch/generic/memhelpers.hh +++ b/src/arch/generic/memhelpers.hh @@ -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 +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 +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 -- 2.30.2