arch,cpu,mem: Replace the mmmapped IPR mechanism with local accesses.
The new local access mechanism installs a callback in the request which implements what the mmapped IPR was doing. That avoids having to have stubs in ISAs that don't have mmapped IPRs, avoids having to encode what to do to communicate from the TLB and the mmapped IPR functions, and gets rid of another global ISA interface function and header files. Jira Issue: https://gem5.atlassian.net/browse/GEM5-187 Change-Id: I772c2ae2ca3830a4486919ce9804560c0f2d596a Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/23188 Reviewed-by: Matthew Poremba <matthew.poremba@amd.com> Maintainer: Gabe Black <gabeblack@google.com> Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
@@ -549,8 +549,8 @@ class LSQ
|
||||
/**
|
||||
* Memory mapped IPR accesses
|
||||
*/
|
||||
virtual void handleIprWrite(ThreadContext *thread, PacketPtr pkt) = 0;
|
||||
virtual Cycles handleIprRead(ThreadContext *thread, PacketPtr pkt) = 0;
|
||||
virtual Cycles handleLocalAccess(
|
||||
ThreadContext *thread, PacketPtr pkt) = 0;
|
||||
|
||||
/**
|
||||
* Test if the request accesses a particular cache line.
|
||||
@@ -737,8 +737,7 @@ class LSQ
|
||||
virtual bool recvTimingResp(PacketPtr pkt);
|
||||
virtual void sendPacketToCache();
|
||||
virtual void buildPackets();
|
||||
virtual void handleIprWrite(ThreadContext *thread, PacketPtr pkt);
|
||||
virtual Cycles handleIprRead(ThreadContext *thread, PacketPtr pkt);
|
||||
virtual Cycles handleLocalAccess(ThreadContext *thread, PacketPtr pkt);
|
||||
virtual bool isCacheBlockHit(Addr blockAddr, Addr cacheBlockMask);
|
||||
};
|
||||
|
||||
@@ -811,8 +810,7 @@ class LSQ
|
||||
virtual void sendPacketToCache();
|
||||
virtual void buildPackets();
|
||||
|
||||
virtual void handleIprWrite(ThreadContext *thread, PacketPtr pkt);
|
||||
virtual Cycles handleIprRead(ThreadContext *thread, PacketPtr pkt);
|
||||
virtual Cycles handleLocalAccess(ThreadContext *thread, PacketPtr pkt);
|
||||
virtual bool isCacheBlockHit(Addr blockAddr, Addr cacheBlockMask);
|
||||
|
||||
virtual RequestPtr mainRequest();
|
||||
|
||||
@@ -1093,48 +1093,26 @@ LSQ<Impl>::SplitDataRequest::sendPacketToCache()
|
||||
}
|
||||
|
||||
template<class Impl>
|
||||
void
|
||||
LSQ<Impl>::SingleDataRequest::handleIprWrite(ThreadContext *thread,
|
||||
PacketPtr pkt)
|
||||
Cycles
|
||||
LSQ<Impl>::SingleDataRequest::handleLocalAccess(
|
||||
ThreadContext *thread, PacketPtr pkt)
|
||||
{
|
||||
TheISA::handleIprWrite(thread, pkt);
|
||||
}
|
||||
|
||||
template<class Impl>
|
||||
void
|
||||
LSQ<Impl>::SplitDataRequest::handleIprWrite(ThreadContext *thread,
|
||||
PacketPtr mainPkt)
|
||||
{
|
||||
unsigned offset = 0;
|
||||
for (auto r: _requests) {
|
||||
PacketPtr pkt = new Packet(r, MemCmd::WriteReq);
|
||||
pkt->dataStatic(mainPkt->getPtr<uint8_t>() + offset);
|
||||
TheISA::handleIprWrite(thread, pkt);
|
||||
offset += r->getSize();
|
||||
delete pkt;
|
||||
}
|
||||
return pkt->req->localAccessor(thread, pkt);
|
||||
}
|
||||
|
||||
template<class Impl>
|
||||
Cycles
|
||||
LSQ<Impl>::SingleDataRequest::handleIprRead(ThreadContext *thread,
|
||||
PacketPtr pkt)
|
||||
{
|
||||
return TheISA::handleIprRead(thread, pkt);
|
||||
}
|
||||
|
||||
template<class Impl>
|
||||
Cycles
|
||||
LSQ<Impl>::SplitDataRequest::handleIprRead(ThreadContext *thread,
|
||||
PacketPtr mainPkt)
|
||||
LSQ<Impl>::SplitDataRequest::handleLocalAccess(
|
||||
ThreadContext *thread, PacketPtr mainPkt)
|
||||
{
|
||||
Cycles delay(0);
|
||||
unsigned offset = 0;
|
||||
|
||||
for (auto r: _requests) {
|
||||
PacketPtr pkt = new Packet(r, MemCmd::ReadReq);
|
||||
PacketPtr pkt =
|
||||
new Packet(r, isLoad() ? MemCmd::ReadReq : MemCmd::WriteReq);
|
||||
pkt->dataStatic(mainPkt->getPtr<uint8_t>() + offset);
|
||||
Cycles d = TheISA::handleIprRead(thread, pkt);
|
||||
Cycles d = r->localAccessor(thread, pkt);
|
||||
if (d > delay)
|
||||
delay = d;
|
||||
offset += r->getSize();
|
||||
|
||||
@@ -51,7 +51,6 @@
|
||||
#include "arch/generic/vec_reg.hh"
|
||||
#include "arch/isa_traits.hh"
|
||||
#include "arch/locked_mem.hh"
|
||||
#include "arch/mmapped_ipr.hh"
|
||||
#include "config/the_isa.hh"
|
||||
#include "cpu/inst_seq.hh"
|
||||
#include "cpu/timebuf.hh"
|
||||
@@ -665,7 +664,7 @@ LSQUnit<Impl>::read(LSQRequest *req, int load_idx)
|
||||
load_inst->recordResult(true);
|
||||
}
|
||||
|
||||
if (req->mainRequest()->isMmappedIpr()) {
|
||||
if (req->mainRequest()->isLocalAccess()) {
|
||||
assert(!load_inst->memData);
|
||||
load_inst->memData = new uint8_t[MaxDataBytes];
|
||||
|
||||
@@ -674,7 +673,7 @@ LSQUnit<Impl>::read(LSQRequest *req, int load_idx)
|
||||
|
||||
main_pkt->dataStatic(load_inst->memData);
|
||||
|
||||
Cycles delay = req->handleIprRead(thread, main_pkt);
|
||||
Cycles delay = req->mainRequest()->localAccessor(thread, main_pkt);
|
||||
|
||||
WritebackEvent *wb = new WritebackEvent(load_inst, main_pkt, this);
|
||||
cpu->schedule(wb, cpu->clockEdge(delay));
|
||||
|
||||
@@ -814,13 +814,13 @@ LSQUnit<Impl>::writebackStores()
|
||||
}
|
||||
}
|
||||
|
||||
if (req->request()->isMmappedIpr()) {
|
||||
if (req->request()->isLocalAccess()) {
|
||||
assert(!inst->isStoreConditional());
|
||||
ThreadContext *thread = cpu->tcBase(lsqID);
|
||||
PacketPtr main_pkt = new Packet(req->mainRequest(),
|
||||
MemCmd::WriteReq);
|
||||
main_pkt->dataStatic(inst->memData);
|
||||
req->handleIprWrite(thread, main_pkt);
|
||||
req->request()->localAccessor(thread, main_pkt);
|
||||
delete main_pkt;
|
||||
completeStore(storeWBIt);
|
||||
storeWBIt++;
|
||||
|
||||
Reference in New Issue
Block a user