port.cc revision 5314
12405SN/A/*
28922Swilliam.wang@arm.com * Copyright (c) 2002-2005 The Regents of The University of Michigan
38922Swilliam.wang@arm.com * All rights reserved.
48922Swilliam.wang@arm.com *
58922Swilliam.wang@arm.com * Redistribution and use in source and binary forms, with or without
68922Swilliam.wang@arm.com * modification, are permitted provided that the following conditions are
78922Swilliam.wang@arm.com * met: redistributions of source code must retain the above copyright
88922Swilliam.wang@arm.com * notice, this list of conditions and the following disclaimer;
98922Swilliam.wang@arm.com * redistributions in binary form must reproduce the above copyright
108922Swilliam.wang@arm.com * notice, this list of conditions and the following disclaimer in the
118922Swilliam.wang@arm.com * documentation and/or other materials provided with the distribution;
128922Swilliam.wang@arm.com * neither the name of the copyright holders nor the names of its
138922Swilliam.wang@arm.com * contributors may be used to endorse or promote products derived from
142405SN/A * this software without specific prior written permission.
152405SN/A *
162405SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172405SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182405SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192405SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202405SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212405SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222405SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232405SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242405SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252405SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262405SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272405SN/A *
282405SN/A * Authors: Steve Reinhardt
292405SN/A */
302405SN/A
312405SN/A/**
322405SN/A * @file
332405SN/A * Port object definitions.
342405SN/A */
352405SN/A#include <cstring>
362405SN/A
372405SN/A#include "base/chunk_generator.hh"
382405SN/A#include "base/trace.hh"
392665Ssaidi@eecs.umich.edu#include "mem/mem_object.hh"
402665Ssaidi@eecs.umich.edu#include "mem/port.hh"
418922Swilliam.wang@arm.com
428922Swilliam.wang@arm.comclass defaultPeerPortClass: public Port
432405SN/A{
442405SN/A  protected:
452405SN/A    void blowUp()
462982Sstever@eecs.umich.edu    {
472982Sstever@eecs.umich.edu        fatal("Unconnected port!");
482405SN/A    }
492642Sstever@eecs.umich.edu
504190Ssaidi@eecs.umich.edu  public:
512405SN/A    defaultPeerPortClass() : Port("default_port")
522405SN/A    {}
539031Sandreas.hansson@arm.com
549087Sandreas.hansson@arm.com    bool recvTiming(PacketPtr)
555476Snate@binkert.org    {
565476Snate@binkert.org        blowUp();
575476Snate@binkert.org        return false;
585476Snate@binkert.org    }
595283Sgblack@eecs.umich.edu
605283Sgblack@eecs.umich.edu    Tick recvAtomic(PacketPtr)
615283Sgblack@eecs.umich.edu    {
628922Swilliam.wang@arm.com        blowUp();
638922Swilliam.wang@arm.com        return 0;
648922Swilliam.wang@arm.com    }
659031Sandreas.hansson@arm.com
668965Sandreas.hansson@arm.com    void recvFunctional(PacketPtr)
672642Sstever@eecs.umich.edu    {
688922Swilliam.wang@arm.com        blowUp();
695476Snate@binkert.org    }
708922Swilliam.wang@arm.com
718922Swilliam.wang@arm.com    void recvStatusChange(Status)
728922Swilliam.wang@arm.com    {
738922Swilliam.wang@arm.com        blowUp();
748922Swilliam.wang@arm.com    }
758922Swilliam.wang@arm.com
768922Swilliam.wang@arm.com    int deviceBlockSize()
778922Swilliam.wang@arm.com    {
788922Swilliam.wang@arm.com        blowUp();
798922Swilliam.wang@arm.com        return 0;
808922Swilliam.wang@arm.com    }
818922Swilliam.wang@arm.com
822642Sstever@eecs.umich.edu    void getDeviceAddressRanges(AddrRangeList &, bool &)
832642Sstever@eecs.umich.edu    {
842642Sstever@eecs.umich.edu        blowUp();
859178Sandreas.hansson@arm.com    }
869152Satgutier@umich.edu
879178Sandreas.hansson@arm.com    bool isDefaultPort() { return true; }
889178Sandreas.hansson@arm.com
899178Sandreas.hansson@arm.com} defaultPeerPort;
909178Sandreas.hansson@arm.com
919152Satgutier@umich.eduPort::Port() : peer(&defaultPeerPort), owner(NULL)
929152Satgutier@umich.edu{
939152Satgutier@umich.edu}
949152Satgutier@umich.edu
958922Swilliam.wang@arm.comPort::Port(const std::string &_name, MemObject *_owner) :
965605Snate@binkert.org    portName(_name), peer(&defaultPeerPort), owner(_owner)
979178Sandreas.hansson@arm.com{
989178Sandreas.hansson@arm.com}
999178Sandreas.hansson@arm.com
1009178Sandreas.hansson@arm.comvoid
1018922Swilliam.wang@arm.comPort::setPeer(Port *port)
1028922Swilliam.wang@arm.com{
1038922Swilliam.wang@arm.com    DPRINTF(Config, "setting peer to %s\n", port->name());
1048922Swilliam.wang@arm.com    peer = port;
1058922Swilliam.wang@arm.com}
1065605Snate@binkert.org
1075605Snate@binkert.orgvoid
1088922Swilliam.wang@arm.comPort::removeConn()
1098922Swilliam.wang@arm.com{
1108922Swilliam.wang@arm.com    if (peer->getOwner())
1118922Swilliam.wang@arm.com        peer->getOwner()->deletePortRefs(peer);
1128922Swilliam.wang@arm.com    peer = NULL;
1138922Swilliam.wang@arm.com}
1148922Swilliam.wang@arm.com
1158922Swilliam.wang@arm.comvoid
1168922Swilliam.wang@arm.comPort::blobHelper(Addr addr, uint8_t *p, int size, MemCmd cmd)
1178922Swilliam.wang@arm.com{
1188922Swilliam.wang@arm.com    Request req;
1198922Swilliam.wang@arm.com
1209089Sandreas.hansson@arm.com    for (ChunkGenerator gen(addr, size, peerBlockSize());
1219089Sandreas.hansson@arm.com         !gen.done(); gen.next()) {
1229089Sandreas.hansson@arm.com        req.setPhys(gen.addr(), gen.size(), 0);
1239089Sandreas.hansson@arm.com        Packet pkt(&req, cmd, Packet::Broadcast);
1249089Sandreas.hansson@arm.com        pkt.dataStatic(p);
1259089Sandreas.hansson@arm.com        sendFunctional(&pkt);
1268948Sandreas.hansson@arm.com        p += gen.size();
1278948Sandreas.hansson@arm.com    }
1288948Sandreas.hansson@arm.com}
1298975Sandreas.hansson@arm.com
1308948Sandreas.hansson@arm.comvoid
1318948Sandreas.hansson@arm.comPort::writeBlob(Addr addr, uint8_t *p, int size)
1328948Sandreas.hansson@arm.com{
1338948Sandreas.hansson@arm.com    blobHelper(addr, p, size, MemCmd::WriteReq);
1348948Sandreas.hansson@arm.com}
1358948Sandreas.hansson@arm.com
1368975Sandreas.hansson@arm.comvoid
1378948Sandreas.hansson@arm.comPort::readBlob(Addr addr, uint8_t *p, int size)
1388948Sandreas.hansson@arm.com{
1398948Sandreas.hansson@arm.com    blobHelper(addr, p, size, MemCmd::ReadReq);
1408975Sandreas.hansson@arm.com}
1418975Sandreas.hansson@arm.com
1428975Sandreas.hansson@arm.comvoid
1438975Sandreas.hansson@arm.comPort::memsetBlob(Addr addr, uint8_t val, int size)
1448975Sandreas.hansson@arm.com{
1458975Sandreas.hansson@arm.com    // quick and dirty...
1468975Sandreas.hansson@arm.com    uint8_t *buf = new uint8_t[size];
1478975Sandreas.hansson@arm.com
1488975Sandreas.hansson@arm.com    std::memset(buf, val, size);
1498975Sandreas.hansson@arm.com    blobHelper(addr, buf, size, MemCmd::WriteReq);
1508975Sandreas.hansson@arm.com
1518975Sandreas.hansson@arm.com    delete [] buf;
1528975Sandreas.hansson@arm.com}
1538975Sandreas.hansson@arm.com
1548948Sandreas.hansson@arm.com
1559087Sandreas.hansson@arm.comvoid
1569087Sandreas.hansson@arm.comPort::printAddr(Addr a)
1579087Sandreas.hansson@arm.com{
1589087Sandreas.hansson@arm.com    Request req(a, 1, 0);
1599087Sandreas.hansson@arm.com    Packet pkt(&req, MemCmd::PrintReq, Packet::Broadcast);
1609087Sandreas.hansson@arm.com    Packet::PrintReqState prs(std::cerr);
1618922Swilliam.wang@arm.com    pkt.senderState = &prs;
1625314Sstever@gmail.com
1638832SAli.Saidi@ARM.com    sendFunctional(&pkt);
1648949Sandreas.hansson@arm.com}
1655314Sstever@gmail.com