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