#include "mem/mem_object.hh"
#include "mem/port.hh"
+class DefaultPeerPort : public Port
+{
+ protected:
+ void blowUp()
+ {
+ fatal("%s: Unconnected port!", peer->name());
+ }
+
+ public:
+ DefaultPeerPort()
+ : Port("default_port", NULL)
+ { }
+
+ bool recvTiming(PacketPtr)
+ {
+ blowUp();
+ return false;
+ }
+
+ Tick recvAtomic(PacketPtr)
+ {
+ blowUp();
+ return 0;
+ }
+
+ void recvFunctional(PacketPtr)
+ {
+ blowUp();
+ }
+
+ void recvStatusChange(Status)
+ {
+ blowUp();
+ }
+
+ int deviceBlockSize()
+ {
+ blowUp();
+ return 0;
+ }
+
+ void getDeviceAddressRanges(AddrRangeList &, bool &)
+ {
+ blowUp();
+ }
+
+ bool isDefaultPort() const { return true; }
+};
+
+DefaultPeerPort defaultPeerPort;
+
+Port::Port(const std::string &_name, MemObject *_owner)
+ : EventManager(_owner), portName(_name), peer(&defaultPeerPort),
+ owner(_owner)
+{
+}
+
+Port::~Port()
+{
+}
+
void
Port::setPeer(Port *port)
{
DPRINTF(Config, "setting peer to %s\n", port->name());
+
peer = port;
}
+void
+Port::setOwner(MemObject *_owner)
+{
+ eventq = _owner->queue();
+ owner = _owner;
+}
+
void
Port::removeConn()
{
if (peer->getOwner())
peer->getOwner()->deletePortRefs(peer);
- delete peer;
peer = NULL;
}
Port::blobHelper(Addr addr, uint8_t *p, int size, MemCmd cmd)
{
Request req;
- Packet pkt(&req, cmd, Packet::Broadcast);
for (ChunkGenerator gen(addr, size, peerBlockSize());
!gen.done(); gen.next()) {
req.setPhys(gen.addr(), gen.size(), 0);
- pkt.reinitFromRequest();
+ Packet pkt(&req, cmd, Packet::Broadcast);
pkt.dataStatic(p);
sendFunctional(&pkt);
p += gen.size();
delete [] buf;
}
+
+
+void
+Port::printAddr(Addr a)
+{
+ Request req(a, 1, 0);
+ Packet pkt(&req, MemCmd::PrintReq, Packet::Broadcast);
+ Packet::PrintReqState prs(std::cerr);
+ pkt.senderState = &prs;
+
+ sendFunctional(&pkt);
+}