X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmem%2Fport.cc;h=4d44d486ddd2c4d37820e39f7925a3d049b8b766;hb=897247d63bf2ae8b799a867e891d862eec2bfa5d;hp=e75e50e4d43ec4e1460c0c1c8ccec88645ab2529;hpb=32368a2bd62409b303b0fcbe796fc94e4902657d;p=gem5.git diff --git a/src/mem/port.cc b/src/mem/port.cc index e75e50e4d..4d44d486d 100644 --- a/src/mem/port.cc +++ b/src/mem/port.cc @@ -39,19 +39,88 @@ #include "mem/mem_object.hh" #include "mem/port.hh" +class DefaultPeerPort : public Port +{ + protected: + void blowUp() const + { + 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(); + } + + unsigned + deviceBlockSize() const + { + 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; } @@ -59,12 +128,11 @@ void 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(); @@ -94,3 +162,15 @@ Port::memsetBlob(Addr addr, uint8_t val, int 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); +}