mshrs = 20
size = '1kB'
tgts_per_mshr = 12
- forward_snoops = False
class PageTableWalkerCache(Cache):
assoc = 2
mshrs = 10
size = '1kB'
tgts_per_mshr = 12
- forward_snoops = False
+
# the x86 table walker actually writes to the table-walker cache
if buildEnv['TARGET_ISA'] == 'x86':
is_read_only = False
tgts_per_mshr = 8
size = '32kB'
assoc = 2
- forward_snoops = False
is_read_only = True
# Writeback clean lines as well
writeback_clean = True
size = '1kB'
assoc = 8
write_buffers = 16
- forward_snoops = False
is_read_only = True
# Writeback clean lines as well
writeback_clean = True
: MasterPort(name_, &cpu_), cpu(cpu_)
{ }
- protected:
- /** Snooping a coherence request, do nothing. */
- virtual void recvTimingSnoopReq(PacketPtr pkt) { }
};
protected:
void recvReqRetry() { lsq.recvReqRetry(); }
+ bool isSnooping() const override { return true; }
+
void recvTimingSnoopReq(PacketPtr pkt)
{ return lsq.recvTimingSnoopReq(pkt); }
+
+ void recvFunctionalSnoop(PacketPtr pkt) { }
};
DcachePort dcachePort;
/** Timing version of receive. Handles setting fetch to the
* proper status to start fetching. */
virtual bool recvTimingResp(PacketPtr pkt);
- virtual void recvTimingSnoopReq(PacketPtr pkt) { }
/** Handles doing a retry of a failed fetch. */
virtual void recvReqRetry();
{ }
protected:
- virtual Tick recvAtomicSnoop(PacketPtr pkt) { return 0; }
bool recvTimingResp(PacketPtr pkt)
{
protected:
- /**
- * Snooping a coherence request, do nothing.
- */
- virtual void recvTimingSnoopReq(PacketPtr pkt) {}
-
TimingSimpleCPU* cpu;
struct TickEvent : public Event
tgts_per_mshr = Param.Unsigned("Max number of accesses per MSHR")
write_buffers = Param.Unsigned(8, "Number of write buffers")
- forward_snoops = Param.Bool(True,
- "Forward snoops from mem side to cpu side")
is_read_only = Param.Bool(False, "Is this cache read only (e.g. inst)")
prefetcher = Param.BasePrefetcher(NULL,"Prefetcher attached to cache")
fillLatency(p->response_latency),
responseLatency(p->response_latency),
numTarget(p->tgts_per_mshr),
- forwardSnoops(p->forward_snoops),
+ forwardSnoops(true),
isReadOnly(p->is_read_only),
blocked(0),
order(0),
addrRanges(p->addr_ranges.begin(), p->addr_ranges.end()),
system(p->system)
{
+ // forward snoops is overridden in init() once we can query
+ // whether the connected master is actually snooping or not
}
void
if (!cpuSidePort->isConnected() || !memSidePort->isConnected())
fatal("Cache ports on %s are not connected\n", name());
cpuSidePort->sendRangeChange();
+ forwardSnoops = cpuSidePort->isSnooping();
}
BaseMasterPort &
const int numTarget;
/** Do we forward snoops from mem side port through to cpu side port? */
- const bool forwardSnoops;
+ bool forwardSnoops;
/**
* Is this cache read only, for example the instruction cache, or