Fixes for functional path.
If the cpu needs to update any state when it gets a functional write (LSQ??) then that code needs to be written. src/cpu/o3/fetch_impl.hh: src/cpu/o3/lsq_impl.hh: src/cpu/ozone/front_end_impl.hh: src/cpu/ozone/lw_lsq_impl.hh: src/cpu/simple/atomic.cc: src/cpu/simple/timing.cc: CPU's can recieve functional accesses, they need to determine if they need to do anything with them. src/mem/bus.cc: src/mem/bus.hh: Make the fuctional path do the correct tye of snoop --HG-- extra : convert_revision : 70d09f954b907a8aa9b8137579cd2b06e02ae2ff
This commit is contained in:
parent
e65f0cef3c
commit
5cb1840b31
|
@ -63,7 +63,7 @@ template<class Impl>
|
||||||
void
|
void
|
||||||
DefaultFetch<Impl>::IcachePort::recvFunctional(PacketPtr pkt)
|
DefaultFetch<Impl>::IcachePort::recvFunctional(PacketPtr pkt)
|
||||||
{
|
{
|
||||||
panic("DefaultFetch doesn't expect recvFunctional callback!");
|
warn("Default fetch doesn't update it's state from a functional call.");
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class Impl>
|
template<class Impl>
|
||||||
|
|
|
@ -46,7 +46,7 @@ template <class Impl>
|
||||||
void
|
void
|
||||||
LSQ<Impl>::DcachePort::recvFunctional(PacketPtr pkt)
|
LSQ<Impl>::DcachePort::recvFunctional(PacketPtr pkt)
|
||||||
{
|
{
|
||||||
panic("O3CPU doesn't expect recvFunctional callback!");
|
warn("O3CPU doesn't update things on a recvFunctional.");
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Impl>
|
template <class Impl>
|
||||||
|
|
|
@ -59,7 +59,7 @@ template<class Impl>
|
||||||
void
|
void
|
||||||
FrontEnd<Impl>::IcachePort::recvFunctional(PacketPtr pkt)
|
FrontEnd<Impl>::IcachePort::recvFunctional(PacketPtr pkt)
|
||||||
{
|
{
|
||||||
panic("FrontEnd doesn't expect recvFunctional callback!");
|
warn("FrontEnd doesn't update state from functional calls");
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class Impl>
|
template<class Impl>
|
||||||
|
|
|
@ -72,7 +72,7 @@ template <class Impl>
|
||||||
void
|
void
|
||||||
OzoneLWLSQ<Impl>::DcachePort::recvFunctional(PacketPtr pkt)
|
OzoneLWLSQ<Impl>::DcachePort::recvFunctional(PacketPtr pkt)
|
||||||
{
|
{
|
||||||
panic("O3CPU doesn't expect recvFunctional callback!");
|
warn("O3CPU doesn't update things on a recvFunctional");
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Impl>
|
template <class Impl>
|
||||||
|
|
|
@ -94,7 +94,7 @@ AtomicSimpleCPU::init()
|
||||||
bool
|
bool
|
||||||
AtomicSimpleCPU::CpuPort::recvTiming(Packet *pkt)
|
AtomicSimpleCPU::CpuPort::recvTiming(Packet *pkt)
|
||||||
{
|
{
|
||||||
panic("AtomicSimpleCPU doesn't expect recvAtomic callback!");
|
panic("AtomicSimpleCPU doesn't expect recvTiming callback!");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,7 +108,8 @@ AtomicSimpleCPU::CpuPort::recvAtomic(Packet *pkt)
|
||||||
void
|
void
|
||||||
AtomicSimpleCPU::CpuPort::recvFunctional(Packet *pkt)
|
AtomicSimpleCPU::CpuPort::recvFunctional(Packet *pkt)
|
||||||
{
|
{
|
||||||
panic("AtomicSimpleCPU doesn't expect recvFunctional callback!");
|
//No internal storage to update, just return
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -74,7 +74,8 @@ TimingSimpleCPU::CpuPort::recvAtomic(Packet *pkt)
|
||||||
void
|
void
|
||||||
TimingSimpleCPU::CpuPort::recvFunctional(Packet *pkt)
|
TimingSimpleCPU::CpuPort::recvFunctional(Packet *pkt)
|
||||||
{
|
{
|
||||||
panic("TimingSimpleCPU doesn't expect recvFunctional callback!");
|
//No internal storage to update, jusst return
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -200,6 +200,18 @@ Bus::atomicSnoop(Packet *pkt)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Bus::functionalSnoop(Packet *pkt)
|
||||||
|
{
|
||||||
|
std::vector<int> ports = findSnoopPorts(pkt->getAddr(), pkt->getSrc());
|
||||||
|
|
||||||
|
while (!ports.empty())
|
||||||
|
{
|
||||||
|
interfaces[ports.back()]->sendFunctional(pkt);
|
||||||
|
ports.pop_back();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Bus::timingSnoop(Packet *pkt)
|
Bus::timingSnoop(Packet *pkt)
|
||||||
{
|
{
|
||||||
|
@ -236,7 +248,7 @@ Bus::recvFunctional(Packet *pkt)
|
||||||
DPRINTF(Bus, "recvFunctional: packet src %d dest %d addr 0x%x cmd %s\n",
|
DPRINTF(Bus, "recvFunctional: packet src %d dest %d addr 0x%x cmd %s\n",
|
||||||
pkt->getSrc(), pkt->getDest(), pkt->getAddr(), pkt->cmdString());
|
pkt->getSrc(), pkt->getDest(), pkt->getAddr(), pkt->cmdString());
|
||||||
assert(pkt->getDest() == Packet::Broadcast);
|
assert(pkt->getDest() == Packet::Broadcast);
|
||||||
atomicSnoop(pkt);
|
functionalSnoop(pkt);
|
||||||
findPort(pkt->getAddr(), pkt->getSrc())->sendFunctional(pkt);
|
findPort(pkt->getAddr(), pkt->getSrc())->sendFunctional(pkt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -102,6 +102,9 @@ class Bus : public MemObject
|
||||||
/** Snoop all relevant ports atomicly. */
|
/** Snoop all relevant ports atomicly. */
|
||||||
void atomicSnoop(Packet *pkt);
|
void atomicSnoop(Packet *pkt);
|
||||||
|
|
||||||
|
/** Snoop all relevant ports functionally. */
|
||||||
|
void functionalSnoop(Packet *pkt);
|
||||||
|
|
||||||
/** Call snoop on caches, be sure to set SNOOP_COMMIT bit if you want
|
/** Call snoop on caches, be sure to set SNOOP_COMMIT bit if you want
|
||||||
* the snoop to happen
|
* the snoop to happen
|
||||||
* @return True if succeds.
|
* @return True if succeds.
|
||||||
|
|
Loading…
Reference in a new issue