* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Authors: Steve Reinhardt
*/
/**
- * @file Port object definitions.
+ * @file
+ * Port object definitions.
*/
+#include <cstring>
#include "base/chunk_generator.hh"
#include "base/trace.hh"
-#include "mem/packet_impl.hh"
+#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::blobHelper(Addr addr, uint8_t *p, int size, Packet::Command cmd)
+Port::setOwner(MemObject *_owner)
+{
+ eventq = _owner->queue();
+ owner = _owner;
+}
+
+void
+Port::removeConn()
{
- Request req(false);
- Packet pkt(&req, cmd, Packet::Broadcast);
+ if (peer->getOwner())
+ peer->getOwner()->deletePortRefs(peer);
+ peer = NULL;
+}
+
+void
+Port::blobHelper(Addr addr, uint8_t *p, int size, MemCmd cmd)
+{
+ Request req;
for (ChunkGenerator gen(addr, size, peerBlockSize());
!gen.done(); gen.next()) {
- req.setPaddr(gen.addr());
- req.setSize(gen.size());
- pkt.reinitFromRequest();
+ req.setPhys(gen.addr(), gen.size(), 0);
+ Packet pkt(&req, cmd, Packet::Broadcast);
pkt.dataStatic(p);
sendFunctional(&pkt);
p += gen.size();
void
Port::writeBlob(Addr addr, uint8_t *p, int size)
{
- blobHelper(addr, p, size, Packet::WriteReq);
+ blobHelper(addr, p, size, MemCmd::WriteReq);
}
void
Port::readBlob(Addr addr, uint8_t *p, int size)
{
- blobHelper(addr, p, size, Packet::ReadReq);
+ blobHelper(addr, p, size, MemCmd::ReadReq);
}
void
// quick and dirty...
uint8_t *buf = new uint8_t[size];
- memset(buf, val, size);
- blobHelper(addr, buf, size, Packet::WriteReq);
+ std::memset(buf, val, size);
+ blobHelper(addr, buf, size, MemCmd::WriteReq);
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);
+}