port.cc revision 5605
113759Sgiacomo.gabrielli@arm.com/*
213759Sgiacomo.gabrielli@arm.com * Copyright (c) 2002-2005 The Regents of The University of Michigan
313759Sgiacomo.gabrielli@arm.com * All rights reserved.
413759Sgiacomo.gabrielli@arm.com *
513759Sgiacomo.gabrielli@arm.com * Redistribution and use in source and binary forms, with or without
613759Sgiacomo.gabrielli@arm.com * modification, are permitted provided that the following conditions are
713759Sgiacomo.gabrielli@arm.com * met: redistributions of source code must retain the above copyright
813759Sgiacomo.gabrielli@arm.com * notice, this list of conditions and the following disclaimer;
913759Sgiacomo.gabrielli@arm.com * redistributions in binary form must reproduce the above copyright
1013759Sgiacomo.gabrielli@arm.com * notice, this list of conditions and the following disclaimer in the
1113759Sgiacomo.gabrielli@arm.com * documentation and/or other materials provided with the distribution;
1213759Sgiacomo.gabrielli@arm.com * neither the name of the copyright holders nor the names of its
1313759Sgiacomo.gabrielli@arm.com * contributors may be used to endorse or promote products derived from
1413759Sgiacomo.gabrielli@arm.com * this software without specific prior written permission.
1513759Sgiacomo.gabrielli@arm.com *
1613759Sgiacomo.gabrielli@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1713759Sgiacomo.gabrielli@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1813759Sgiacomo.gabrielli@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1913759Sgiacomo.gabrielli@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2013759Sgiacomo.gabrielli@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2113759Sgiacomo.gabrielli@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2213759Sgiacomo.gabrielli@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2313759Sgiacomo.gabrielli@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2413759Sgiacomo.gabrielli@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2513759Sgiacomo.gabrielli@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2613759Sgiacomo.gabrielli@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2713759Sgiacomo.gabrielli@arm.com *
2813759Sgiacomo.gabrielli@arm.com * Authors: Steve Reinhardt
2913759Sgiacomo.gabrielli@arm.com */
3013759Sgiacomo.gabrielli@arm.com
3113759Sgiacomo.gabrielli@arm.com/**
3213759Sgiacomo.gabrielli@arm.com * @file
3313759Sgiacomo.gabrielli@arm.com * Port object definitions.
3413759Sgiacomo.gabrielli@arm.com */
3513759Sgiacomo.gabrielli@arm.com#include <cstring>
3613759Sgiacomo.gabrielli@arm.com
3713759Sgiacomo.gabrielli@arm.com#include "base/chunk_generator.hh"
3813759Sgiacomo.gabrielli@arm.com#include "base/trace.hh"
3913759Sgiacomo.gabrielli@arm.com#include "mem/mem_object.hh"
4013759Sgiacomo.gabrielli@arm.com#include "mem/port.hh"
4113759Sgiacomo.gabrielli@arm.com
4213759Sgiacomo.gabrielli@arm.comclass DefaultPeerPort : public Port
4313759Sgiacomo.gabrielli@arm.com{
4413759Sgiacomo.gabrielli@arm.com  protected:
4513759Sgiacomo.gabrielli@arm.com    void blowUp()
4613759Sgiacomo.gabrielli@arm.com    {
4713759Sgiacomo.gabrielli@arm.com        fatal("%s: Unconnected port!", peer->name());
4813759Sgiacomo.gabrielli@arm.com    }
4913759Sgiacomo.gabrielli@arm.com
5013759Sgiacomo.gabrielli@arm.com  public:
5113759Sgiacomo.gabrielli@arm.com    DefaultPeerPort()
5213759Sgiacomo.gabrielli@arm.com        : Port("default_port", NULL)
5313759Sgiacomo.gabrielli@arm.com    { }
5413759Sgiacomo.gabrielli@arm.com
5513759Sgiacomo.gabrielli@arm.com    bool recvTiming(PacketPtr)
5613759Sgiacomo.gabrielli@arm.com    {
5713759Sgiacomo.gabrielli@arm.com        blowUp();
5813759Sgiacomo.gabrielli@arm.com        return false;
5913759Sgiacomo.gabrielli@arm.com    }
6013759Sgiacomo.gabrielli@arm.com
6113759Sgiacomo.gabrielli@arm.com    Tick recvAtomic(PacketPtr)
6213759Sgiacomo.gabrielli@arm.com    {
6313759Sgiacomo.gabrielli@arm.com        blowUp();
6413759Sgiacomo.gabrielli@arm.com        return 0;
6513759Sgiacomo.gabrielli@arm.com    }
6613759Sgiacomo.gabrielli@arm.com
6713759Sgiacomo.gabrielli@arm.com    void recvFunctional(PacketPtr)
6813759Sgiacomo.gabrielli@arm.com    {
6913759Sgiacomo.gabrielli@arm.com        blowUp();
7013759Sgiacomo.gabrielli@arm.com    }
7113759Sgiacomo.gabrielli@arm.com
7213759Sgiacomo.gabrielli@arm.com    void recvStatusChange(Status)
7313759Sgiacomo.gabrielli@arm.com    {
7413759Sgiacomo.gabrielli@arm.com        blowUp();
7513759Sgiacomo.gabrielli@arm.com    }
7613759Sgiacomo.gabrielli@arm.com
7713759Sgiacomo.gabrielli@arm.com    int deviceBlockSize()
7813759Sgiacomo.gabrielli@arm.com    {
7913759Sgiacomo.gabrielli@arm.com        blowUp();
8013759Sgiacomo.gabrielli@arm.com        return 0;
8113759Sgiacomo.gabrielli@arm.com    }
8213759Sgiacomo.gabrielli@arm.com
8313759Sgiacomo.gabrielli@arm.com    void getDeviceAddressRanges(AddrRangeList &, bool &)
8413759Sgiacomo.gabrielli@arm.com    {
8513759Sgiacomo.gabrielli@arm.com        blowUp();
8613759Sgiacomo.gabrielli@arm.com    }
8713759Sgiacomo.gabrielli@arm.com
8813759Sgiacomo.gabrielli@arm.com    bool isDefaultPort() const { return true; }
8913759Sgiacomo.gabrielli@arm.com};
9013759Sgiacomo.gabrielli@arm.com
9113759Sgiacomo.gabrielli@arm.comDefaultPeerPort defaultPeerPort;
9213759Sgiacomo.gabrielli@arm.com
9313759Sgiacomo.gabrielli@arm.comPort::Port(const std::string &_name, MemObject *_owner)
9413759Sgiacomo.gabrielli@arm.com    : EventManager(_owner), portName(_name), peer(&defaultPeerPort),
9513759Sgiacomo.gabrielli@arm.com      owner(_owner)
9613759Sgiacomo.gabrielli@arm.com{
9713759Sgiacomo.gabrielli@arm.com}
9813759Sgiacomo.gabrielli@arm.com
9913759Sgiacomo.gabrielli@arm.comPort::~Port()
10013759Sgiacomo.gabrielli@arm.com{
10113759Sgiacomo.gabrielli@arm.com}
10213759Sgiacomo.gabrielli@arm.com
10313759Sgiacomo.gabrielli@arm.comvoid
10413759Sgiacomo.gabrielli@arm.comPort::setPeer(Port *port)
10513759Sgiacomo.gabrielli@arm.com{
10613759Sgiacomo.gabrielli@arm.com    DPRINTF(Config, "setting peer to %s\n", port->name());
10713759Sgiacomo.gabrielli@arm.com
10813759Sgiacomo.gabrielli@arm.com    peer = port;
10913759Sgiacomo.gabrielli@arm.com}
11013759Sgiacomo.gabrielli@arm.com
11113759Sgiacomo.gabrielli@arm.comvoid
11213759Sgiacomo.gabrielli@arm.comPort::setOwner(MemObject *_owner)
11313759Sgiacomo.gabrielli@arm.com{
11413759Sgiacomo.gabrielli@arm.com    eventq = _owner->queue();
11513759Sgiacomo.gabrielli@arm.com    owner = _owner;
11613759Sgiacomo.gabrielli@arm.com}
11713759Sgiacomo.gabrielli@arm.com
11813759Sgiacomo.gabrielli@arm.comvoid
11913759Sgiacomo.gabrielli@arm.comPort::removeConn()
12013759Sgiacomo.gabrielli@arm.com{
12113759Sgiacomo.gabrielli@arm.com    if (peer->getOwner())
12213759Sgiacomo.gabrielli@arm.com        peer->getOwner()->deletePortRefs(peer);
12313759Sgiacomo.gabrielli@arm.com    peer = NULL;
12413759Sgiacomo.gabrielli@arm.com}
12513759Sgiacomo.gabrielli@arm.com
12613759Sgiacomo.gabrielli@arm.comvoid
12713759Sgiacomo.gabrielli@arm.comPort::blobHelper(Addr addr, uint8_t *p, int size, MemCmd cmd)
12813759Sgiacomo.gabrielli@arm.com{
12913759Sgiacomo.gabrielli@arm.com    Request req;
13013759Sgiacomo.gabrielli@arm.com
13113759Sgiacomo.gabrielli@arm.com    for (ChunkGenerator gen(addr, size, peerBlockSize());
13213759Sgiacomo.gabrielli@arm.com         !gen.done(); gen.next()) {
13313759Sgiacomo.gabrielli@arm.com        req.setPhys(gen.addr(), gen.size(), 0);
13413759Sgiacomo.gabrielli@arm.com        Packet pkt(&req, cmd, Packet::Broadcast);
13513759Sgiacomo.gabrielli@arm.com        pkt.dataStatic(p);
13613759Sgiacomo.gabrielli@arm.com        sendFunctional(&pkt);
13713759Sgiacomo.gabrielli@arm.com        p += gen.size();
13813759Sgiacomo.gabrielli@arm.com    }
13913759Sgiacomo.gabrielli@arm.com}
14013759Sgiacomo.gabrielli@arm.com
14113759Sgiacomo.gabrielli@arm.comvoid
14213759Sgiacomo.gabrielli@arm.comPort::writeBlob(Addr addr, uint8_t *p, int size)
14313759Sgiacomo.gabrielli@arm.com{
14413759Sgiacomo.gabrielli@arm.com    blobHelper(addr, p, size, MemCmd::WriteReq);
14513759Sgiacomo.gabrielli@arm.com}
14613759Sgiacomo.gabrielli@arm.com
14713759Sgiacomo.gabrielli@arm.comvoid
14813759Sgiacomo.gabrielli@arm.comPort::readBlob(Addr addr, uint8_t *p, int size)
14913759Sgiacomo.gabrielli@arm.com{
15013759Sgiacomo.gabrielli@arm.com    blobHelper(addr, p, size, MemCmd::ReadReq);
15113759Sgiacomo.gabrielli@arm.com}
15213759Sgiacomo.gabrielli@arm.com
15313759Sgiacomo.gabrielli@arm.comvoid
15413759Sgiacomo.gabrielli@arm.comPort::memsetBlob(Addr addr, uint8_t val, int size)
15513759Sgiacomo.gabrielli@arm.com{
15613759Sgiacomo.gabrielli@arm.com    // quick and dirty...
15713759Sgiacomo.gabrielli@arm.com    uint8_t *buf = new uint8_t[size];
15813759Sgiacomo.gabrielli@arm.com
15913759Sgiacomo.gabrielli@arm.com    std::memset(buf, val, size);
16013759Sgiacomo.gabrielli@arm.com    blobHelper(addr, buf, size, MemCmd::WriteReq);
16113759Sgiacomo.gabrielli@arm.com
16213759Sgiacomo.gabrielli@arm.com    delete [] buf;
16313759Sgiacomo.gabrielli@arm.com}
16413759Sgiacomo.gabrielli@arm.com
16513759Sgiacomo.gabrielli@arm.com
16613759Sgiacomo.gabrielli@arm.comvoid
16713759Sgiacomo.gabrielli@arm.comPort::printAddr(Addr a)
16813759Sgiacomo.gabrielli@arm.com{
16913759Sgiacomo.gabrielli@arm.com    Request req(a, 1, 0);
17013759Sgiacomo.gabrielli@arm.com    Packet pkt(&req, MemCmd::PrintReq, Packet::Broadcast);
17113759Sgiacomo.gabrielli@arm.com    Packet::PrintReqState prs(std::cerr);
17213759Sgiacomo.gabrielli@arm.com    pkt.senderState = &prs;
17313759Sgiacomo.gabrielli@arm.com
17413759Sgiacomo.gabrielli@arm.com    sendFunctional(&pkt);
17513759Sgiacomo.gabrielli@arm.com}
17613759Sgiacomo.gabrielli@arm.com