24.22.5.1.1. gem5 completeAcc

completeAcc is boring on most simple store memory instructions, e.g. a simple STR:

    Fault STRX64_IMM::completeAcc(PacketPtr pkt, ExecContext *xc,
                                      Trace::InstRecord *traceData) const
    {
        return NoFault;
    }

This is because the store does all of its job on completeAcc basically, creating the memory write request.

Loads however have non-trivial completeAcc, because now we have at the very least, to save the value read from memory into a CPU address.

Things are much more interesting however on more interesting loads, for example STXR (hand formatted here):

Fault STXRX64::completeAcc(PacketPtr pkt, ExecContext *xc,
                                    Trace::InstRecord *traceData) const {
    Fault fault = NoFault;
    uint64_t XResult = 0;
    uint32_t SevMailbox = 0;
    uint32_t LLSCLock = 0;
    uint64_t writeResult = pkt->req->getExtraData();
    XResult = !writeResult; SevMailbox = 1; LLSCLock = 0;
    if (fault == NoFault) {
        {
            uint64_t final_val = XResult;
            xc->setIntRegOperand(this, 0, (XResult) & mask(aarch64 ? 64 : 32));
            if (traceData) { traceData->setData(final_val); }
        }
        xc->setMiscRegOperand(this, 1, SevMailbox);
        if (traceData) { traceData->setData(SevMailbox); }
        xc->setMiscRegOperand(this, 2, LLSCLock);
        if (traceData) { traceData->setData(LLSCLock); }
    }
    return fault;
}

From GDB on TimingSimpleCPU analysis: LDR stall we see that completeAcc gets called from TimingSimpleCPU::completeDataAccess.