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:
Ron Dreslinski 2006-10-08 20:30:42 -04:00
parent e65f0cef3c
commit 5cb1840b31
8 changed files with 25 additions and 8 deletions

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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

View file

@ -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

View file

@ -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);
} }

View file

@ -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.